1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2020 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include <stddef.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <stdio.h>
13*fb1b10abSAndroid Build Coastguard Worker
14*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_ext_ratectrl.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_encoder.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_common.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/psnr.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_ext_ratectrl.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_tpl.h"
21*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_init(EXT_RATECTRL * ext_ratectrl)22*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_init(EXT_RATECTRL *ext_ratectrl) {
23*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL) {
24*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
25*fb1b10abSAndroid Build Coastguard Worker }
26*fb1b10abSAndroid Build Coastguard Worker vp9_zero(*ext_ratectrl);
27*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK;
28*fb1b10abSAndroid Build Coastguard Worker }
29*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_create(vpx_rc_funcs_t funcs,vpx_rc_config_t ratectrl_config,EXT_RATECTRL * ext_ratectrl)30*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_create(vpx_rc_funcs_t funcs,
31*fb1b10abSAndroid Build Coastguard Worker vpx_rc_config_t ratectrl_config,
32*fb1b10abSAndroid Build Coastguard Worker EXT_RATECTRL *ext_ratectrl) {
33*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status;
34*fb1b10abSAndroid Build Coastguard Worker vpx_rc_firstpass_stats_t *rc_firstpass_stats;
35*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL) {
36*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
37*fb1b10abSAndroid Build Coastguard Worker }
38*fb1b10abSAndroid Build Coastguard Worker vp9_extrc_delete(ext_ratectrl);
39*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->funcs = funcs;
40*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->ratectrl_config = ratectrl_config;
41*fb1b10abSAndroid Build Coastguard Worker rc_status = ext_ratectrl->funcs.create_model(ext_ratectrl->funcs.priv,
42*fb1b10abSAndroid Build Coastguard Worker &ext_ratectrl->ratectrl_config,
43*fb1b10abSAndroid Build Coastguard Worker &ext_ratectrl->model);
44*fb1b10abSAndroid Build Coastguard Worker if (rc_status == VPX_RC_ERROR) {
45*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
46*fb1b10abSAndroid Build Coastguard Worker }
47*fb1b10abSAndroid Build Coastguard Worker rc_firstpass_stats = &ext_ratectrl->rc_firstpass_stats;
48*fb1b10abSAndroid Build Coastguard Worker rc_firstpass_stats->num_frames = ratectrl_config.show_frame_count;
49*fb1b10abSAndroid Build Coastguard Worker rc_firstpass_stats->frame_stats =
50*fb1b10abSAndroid Build Coastguard Worker vpx_malloc(sizeof(*rc_firstpass_stats->frame_stats) *
51*fb1b10abSAndroid Build Coastguard Worker rc_firstpass_stats->num_frames);
52*fb1b10abSAndroid Build Coastguard Worker if (rc_firstpass_stats->frame_stats == NULL) {
53*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_MEM_ERROR;
54*fb1b10abSAndroid Build Coastguard Worker }
55*fb1b10abSAndroid Build Coastguard Worker if (funcs.rate_ctrl_log_path != NULL) {
56*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->log_file = fopen(funcs.rate_ctrl_log_path, "w");
57*fb1b10abSAndroid Build Coastguard Worker if (!ext_ratectrl->log_file) {
58*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
59*fb1b10abSAndroid Build Coastguard Worker }
60*fb1b10abSAndroid Build Coastguard Worker } else {
61*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->log_file = NULL;
62*fb1b10abSAndroid Build Coastguard Worker }
63*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->ready = 1;
64*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK;
65*fb1b10abSAndroid Build Coastguard Worker }
66*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_delete(EXT_RATECTRL * ext_ratectrl)67*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_delete(EXT_RATECTRL *ext_ratectrl) {
68*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL) {
69*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
70*fb1b10abSAndroid Build Coastguard Worker }
71*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl->ready) {
72*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl->log_file) {
73*fb1b10abSAndroid Build Coastguard Worker fclose(ext_ratectrl->log_file);
74*fb1b10abSAndroid Build Coastguard Worker }
75*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status =
76*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->funcs.delete_model(ext_ratectrl->model);
77*fb1b10abSAndroid Build Coastguard Worker if (rc_status == VPX_RC_ERROR) {
78*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
79*fb1b10abSAndroid Build Coastguard Worker }
80*fb1b10abSAndroid Build Coastguard Worker vpx_free(ext_ratectrl->rc_firstpass_stats.frame_stats);
81*fb1b10abSAndroid Build Coastguard Worker }
82*fb1b10abSAndroid Build Coastguard Worker return vp9_extrc_init(ext_ratectrl);
83*fb1b10abSAndroid Build Coastguard Worker }
84*fb1b10abSAndroid Build Coastguard Worker
gen_rc_firstpass_stats(const FIRSTPASS_STATS * stats,vpx_rc_frame_stats_t * rc_frame_stats)85*fb1b10abSAndroid Build Coastguard Worker static void gen_rc_firstpass_stats(const FIRSTPASS_STATS *stats,
86*fb1b10abSAndroid Build Coastguard Worker vpx_rc_frame_stats_t *rc_frame_stats) {
87*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->frame = stats->frame;
88*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->weight = stats->weight;
89*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->intra_error = stats->intra_error;
90*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->coded_error = stats->coded_error;
91*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->sr_coded_error = stats->sr_coded_error;
92*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->frame_noise_energy = stats->frame_noise_energy;
93*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->pcnt_inter = stats->pcnt_inter;
94*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->pcnt_motion = stats->pcnt_motion;
95*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->pcnt_second_ref = stats->pcnt_second_ref;
96*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->pcnt_neutral = stats->pcnt_neutral;
97*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->pcnt_intra_low = stats->pcnt_intra_low;
98*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->pcnt_intra_high = stats->pcnt_intra_high;
99*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->intra_skip_pct = stats->intra_skip_pct;
100*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->intra_smooth_pct = stats->intra_smooth_pct;
101*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->inactive_zone_rows = stats->inactive_zone_rows;
102*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->inactive_zone_cols = stats->inactive_zone_cols;
103*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->MVr = stats->MVr;
104*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->mvr_abs = stats->mvr_abs;
105*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->MVc = stats->MVc;
106*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->mvc_abs = stats->mvc_abs;
107*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->MVrv = stats->MVrv;
108*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->MVcv = stats->MVcv;
109*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->mv_in_out_count = stats->mv_in_out_count;
110*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->duration = stats->duration;
111*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->count = stats->count;
112*fb1b10abSAndroid Build Coastguard Worker rc_frame_stats->new_mv_count = stats->new_mv_count;
113*fb1b10abSAndroid Build Coastguard Worker }
114*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_send_firstpass_stats(EXT_RATECTRL * ext_ratectrl,const FIRST_PASS_INFO * first_pass_info)115*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_send_firstpass_stats(
116*fb1b10abSAndroid Build Coastguard Worker EXT_RATECTRL *ext_ratectrl, const FIRST_PASS_INFO *first_pass_info) {
117*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL) {
118*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
119*fb1b10abSAndroid Build Coastguard Worker }
120*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl->ready) {
121*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status;
122*fb1b10abSAndroid Build Coastguard Worker vpx_rc_firstpass_stats_t *rc_firstpass_stats =
123*fb1b10abSAndroid Build Coastguard Worker &ext_ratectrl->rc_firstpass_stats;
124*fb1b10abSAndroid Build Coastguard Worker int i;
125*fb1b10abSAndroid Build Coastguard Worker assert(rc_firstpass_stats->num_frames == first_pass_info->num_frames);
126*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < rc_firstpass_stats->num_frames; ++i) {
127*fb1b10abSAndroid Build Coastguard Worker gen_rc_firstpass_stats(&first_pass_info->stats[i],
128*fb1b10abSAndroid Build Coastguard Worker &rc_firstpass_stats->frame_stats[i]);
129*fb1b10abSAndroid Build Coastguard Worker }
130*fb1b10abSAndroid Build Coastguard Worker rc_status = ext_ratectrl->funcs.send_firstpass_stats(ext_ratectrl->model,
131*fb1b10abSAndroid Build Coastguard Worker rc_firstpass_stats);
132*fb1b10abSAndroid Build Coastguard Worker if (rc_status == VPX_RC_ERROR) {
133*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
134*fb1b10abSAndroid Build Coastguard Worker }
135*fb1b10abSAndroid Build Coastguard Worker }
136*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK;
137*fb1b10abSAndroid Build Coastguard Worker }
138*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_send_tpl_stats(EXT_RATECTRL * ext_ratectrl,const VpxTplGopStats * tpl_gop_stats)139*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_send_tpl_stats(EXT_RATECTRL *ext_ratectrl,
140*fb1b10abSAndroid Build Coastguard Worker const VpxTplGopStats *tpl_gop_stats) {
141*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL) {
142*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
143*fb1b10abSAndroid Build Coastguard Worker }
144*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl->ready && ext_ratectrl->funcs.send_tpl_gop_stats != NULL) {
145*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status = ext_ratectrl->funcs.send_tpl_gop_stats(
146*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->model, tpl_gop_stats);
147*fb1b10abSAndroid Build Coastguard Worker if (rc_status == VPX_RC_ERROR) {
148*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
149*fb1b10abSAndroid Build Coastguard Worker }
150*fb1b10abSAndroid Build Coastguard Worker }
151*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK;
152*fb1b10abSAndroid Build Coastguard Worker }
153*fb1b10abSAndroid Build Coastguard Worker
extrc_get_frame_type(FRAME_UPDATE_TYPE update_type)154*fb1b10abSAndroid Build Coastguard Worker static int extrc_get_frame_type(FRAME_UPDATE_TYPE update_type) {
155*fb1b10abSAndroid Build Coastguard Worker // TODO(angiebird): Add unit test to make sure this function behaves like
156*fb1b10abSAndroid Build Coastguard Worker // get_frame_type_from_update_type()
157*fb1b10abSAndroid Build Coastguard Worker // TODO(angiebird): Merge this function with get_frame_type_from_update_type()
158*fb1b10abSAndroid Build Coastguard Worker switch (update_type) {
159*fb1b10abSAndroid Build Coastguard Worker case KF_UPDATE: return 0; // kFrameTypeKey;
160*fb1b10abSAndroid Build Coastguard Worker case ARF_UPDATE: return 2; // kFrameTypeAltRef;
161*fb1b10abSAndroid Build Coastguard Worker case GF_UPDATE: return 4; // kFrameTypeGolden;
162*fb1b10abSAndroid Build Coastguard Worker case OVERLAY_UPDATE: return 3; // kFrameTypeOverlay;
163*fb1b10abSAndroid Build Coastguard Worker case LF_UPDATE: return 1; // kFrameTypeInter;
164*fb1b10abSAndroid Build Coastguard Worker default:
165*fb1b10abSAndroid Build Coastguard Worker fprintf(stderr, "Unsupported update_type %d\n", update_type);
166*fb1b10abSAndroid Build Coastguard Worker abort();
167*fb1b10abSAndroid Build Coastguard Worker }
168*fb1b10abSAndroid Build Coastguard Worker }
169*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_get_encodeframe_decision(EXT_RATECTRL * ext_ratectrl,int gop_index,vpx_rc_encodeframe_decision_t * encode_frame_decision)170*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_get_encodeframe_decision(
171*fb1b10abSAndroid Build Coastguard Worker EXT_RATECTRL *ext_ratectrl, int gop_index,
172*fb1b10abSAndroid Build Coastguard Worker vpx_rc_encodeframe_decision_t *encode_frame_decision) {
173*fb1b10abSAndroid Build Coastguard Worker assert(ext_ratectrl != NULL);
174*fb1b10abSAndroid Build Coastguard Worker assert(ext_ratectrl->ready && (ext_ratectrl->funcs.rc_type & VPX_RC_QP) != 0);
175*fb1b10abSAndroid Build Coastguard Worker
176*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status = ext_ratectrl->funcs.get_encodeframe_decision(
177*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->model, gop_index, encode_frame_decision);
178*fb1b10abSAndroid Build Coastguard Worker if (rc_status == VPX_RC_ERROR) {
179*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
180*fb1b10abSAndroid Build Coastguard Worker }
181*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK;
182*fb1b10abSAndroid Build Coastguard Worker }
183*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_update_encodeframe_result(EXT_RATECTRL * ext_ratectrl,int64_t bit_count,int actual_encoding_qindex)184*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_update_encodeframe_result(
185*fb1b10abSAndroid Build Coastguard Worker EXT_RATECTRL *ext_ratectrl, int64_t bit_count, int actual_encoding_qindex) {
186*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL) {
187*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
188*fb1b10abSAndroid Build Coastguard Worker }
189*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl->ready) {
190*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status;
191*fb1b10abSAndroid Build Coastguard Worker vpx_rc_encodeframe_result_t encode_frame_result;
192*fb1b10abSAndroid Build Coastguard Worker encode_frame_result.bit_count = bit_count;
193*fb1b10abSAndroid Build Coastguard Worker encode_frame_result.actual_encoding_qindex = actual_encoding_qindex;
194*fb1b10abSAndroid Build Coastguard Worker rc_status = ext_ratectrl->funcs.update_encodeframe_result(
195*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->model, &encode_frame_result);
196*fb1b10abSAndroid Build Coastguard Worker if (rc_status == VPX_RC_ERROR) {
197*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
198*fb1b10abSAndroid Build Coastguard Worker }
199*fb1b10abSAndroid Build Coastguard Worker }
200*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK;
201*fb1b10abSAndroid Build Coastguard Worker }
202*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_get_gop_decision(EXT_RATECTRL * ext_ratectrl,vpx_rc_gop_decision_t * gop_decision)203*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_get_gop_decision(
204*fb1b10abSAndroid Build Coastguard Worker EXT_RATECTRL *ext_ratectrl, vpx_rc_gop_decision_t *gop_decision) {
205*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status;
206*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL || !ext_ratectrl->ready ||
207*fb1b10abSAndroid Build Coastguard Worker (ext_ratectrl->funcs.rc_type & VPX_RC_GOP) == 0) {
208*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
209*fb1b10abSAndroid Build Coastguard Worker }
210*fb1b10abSAndroid Build Coastguard Worker rc_status =
211*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->funcs.get_gop_decision(ext_ratectrl->model, gop_decision);
212*fb1b10abSAndroid Build Coastguard Worker if (rc_status == VPX_RC_ERROR) {
213*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
214*fb1b10abSAndroid Build Coastguard Worker }
215*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK;
216*fb1b10abSAndroid Build Coastguard Worker }
217*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_get_key_frame_decision(EXT_RATECTRL * ext_ratectrl,vpx_rc_key_frame_decision_t * key_frame_decision)218*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_get_key_frame_decision(
219*fb1b10abSAndroid Build Coastguard Worker EXT_RATECTRL *ext_ratectrl,
220*fb1b10abSAndroid Build Coastguard Worker vpx_rc_key_frame_decision_t *key_frame_decision) {
221*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL || !ext_ratectrl->ready ||
222*fb1b10abSAndroid Build Coastguard Worker (ext_ratectrl->funcs.rc_type & VPX_RC_GOP) == 0) {
223*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
224*fb1b10abSAndroid Build Coastguard Worker }
225*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status = ext_ratectrl->funcs.get_key_frame_decision(
226*fb1b10abSAndroid Build Coastguard Worker ext_ratectrl->model, key_frame_decision);
227*fb1b10abSAndroid Build Coastguard Worker return rc_status == VPX_RC_OK ? VPX_CODEC_OK : VPX_CODEC_ERROR;
228*fb1b10abSAndroid Build Coastguard Worker }
229*fb1b10abSAndroid Build Coastguard Worker
vp9_extrc_get_frame_rdmult(EXT_RATECTRL * ext_ratectrl,int show_index,int coding_index,int gop_index,FRAME_UPDATE_TYPE update_type,int gop_size,int use_alt_ref,RefCntBuffer * ref_frame_bufs[MAX_INTER_REF_FRAMES],int ref_frame_flags,int * rdmult)230*fb1b10abSAndroid Build Coastguard Worker vpx_codec_err_t vp9_extrc_get_frame_rdmult(
231*fb1b10abSAndroid Build Coastguard Worker EXT_RATECTRL *ext_ratectrl, int show_index, int coding_index, int gop_index,
232*fb1b10abSAndroid Build Coastguard Worker FRAME_UPDATE_TYPE update_type, int gop_size, int use_alt_ref,
233*fb1b10abSAndroid Build Coastguard Worker RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES], int ref_frame_flags,
234*fb1b10abSAndroid Build Coastguard Worker int *rdmult) {
235*fb1b10abSAndroid Build Coastguard Worker vpx_rc_status_t rc_status;
236*fb1b10abSAndroid Build Coastguard Worker vpx_rc_encodeframe_info_t encode_frame_info;
237*fb1b10abSAndroid Build Coastguard Worker if (ext_ratectrl == NULL || !ext_ratectrl->ready ||
238*fb1b10abSAndroid Build Coastguard Worker (ext_ratectrl->funcs.rc_type & VPX_RC_RDMULT) == 0) {
239*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_INVALID_PARAM;
240*fb1b10abSAndroid Build Coastguard Worker }
241*fb1b10abSAndroid Build Coastguard Worker encode_frame_info.show_index = show_index;
242*fb1b10abSAndroid Build Coastguard Worker encode_frame_info.coding_index = coding_index;
243*fb1b10abSAndroid Build Coastguard Worker encode_frame_info.gop_index = gop_index;
244*fb1b10abSAndroid Build Coastguard Worker encode_frame_info.frame_type = extrc_get_frame_type(update_type);
245*fb1b10abSAndroid Build Coastguard Worker encode_frame_info.gop_size = gop_size;
246*fb1b10abSAndroid Build Coastguard Worker encode_frame_info.use_alt_ref = use_alt_ref;
247*fb1b10abSAndroid Build Coastguard Worker
248*fb1b10abSAndroid Build Coastguard Worker vp9_get_ref_frame_info(update_type, ref_frame_flags, ref_frame_bufs,
249*fb1b10abSAndroid Build Coastguard Worker encode_frame_info.ref_frame_coding_indexes,
250*fb1b10abSAndroid Build Coastguard Worker encode_frame_info.ref_frame_valid_list);
251*fb1b10abSAndroid Build Coastguard Worker rc_status = ext_ratectrl->funcs.get_frame_rdmult(ext_ratectrl->model,
252*fb1b10abSAndroid Build Coastguard Worker &encode_frame_info, rdmult);
253*fb1b10abSAndroid Build Coastguard Worker if (rc_status == VPX_RC_ERROR) {
254*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_ERROR;
255*fb1b10abSAndroid Build Coastguard Worker }
256*fb1b10abSAndroid Build Coastguard Worker return VPX_CODEC_OK;
257*fb1b10abSAndroid Build Coastguard Worker }
258