xref: /rockchip-linux_mpp/mpp/base/mpp_enc_ref.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_enc_ref"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <string.h>
9*437bfbebSnyanmisaka 
10*437bfbebSnyanmisaka #include "mpp_env.h"
11*437bfbebSnyanmisaka #include "mpp_log.h"
12*437bfbebSnyanmisaka #include "mpp_mem.h"
13*437bfbebSnyanmisaka #include "mpp_time.h"
14*437bfbebSnyanmisaka 
15*437bfbebSnyanmisaka #include "mpp_rc_defs.h"
16*437bfbebSnyanmisaka #include "mpp_enc_ref.h"
17*437bfbebSnyanmisaka #include "mpp_enc_refs.h"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #define setup_mpp_enc_ref_cfg(ref) \
20*437bfbebSnyanmisaka     ((MppEncRefCfgImpl*)ref)->name = MODULE_TAG;
21*437bfbebSnyanmisaka 
_check_is_mpp_enc_ref_cfg(const char * func,void * ref)22*437bfbebSnyanmisaka MPP_RET _check_is_mpp_enc_ref_cfg(const char *func, void *ref)
23*437bfbebSnyanmisaka {
24*437bfbebSnyanmisaka     if (NULL == ref) {
25*437bfbebSnyanmisaka         mpp_err("%s input ref check NULL failed\n", func);
26*437bfbebSnyanmisaka         return MPP_NOK;
27*437bfbebSnyanmisaka     }
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka     if (strcmp(((MppEncRefCfgImpl*)(ref))->name, MODULE_TAG) != 0) {
30*437bfbebSnyanmisaka         mpp_err("%s input ref check %p %p failed\n", func, ((MppEncRefCfgImpl*)(ref))->name);
31*437bfbebSnyanmisaka         return MPP_NOK;
32*437bfbebSnyanmisaka     }
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka     return MPP_OK;
35*437bfbebSnyanmisaka }
36*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_init(MppEncRefCfg * ref)37*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_init(MppEncRefCfg *ref)
38*437bfbebSnyanmisaka {
39*437bfbebSnyanmisaka     if (NULL == ref) {
40*437bfbebSnyanmisaka         mpp_err_f("invalid NULL input ref_cfg\n");
41*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
42*437bfbebSnyanmisaka     }
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = mpp_calloc(MppEncRefCfgImpl, 1);
45*437bfbebSnyanmisaka     *ref = p;
46*437bfbebSnyanmisaka     if (NULL == p) {
47*437bfbebSnyanmisaka         mpp_err_f("malloc failed\n");
48*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
49*437bfbebSnyanmisaka     }
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka     mpp_env_get_u32("enc_ref_cfg_debug", &p->debug, 0);
52*437bfbebSnyanmisaka 
53*437bfbebSnyanmisaka     setup_mpp_enc_ref_cfg(p);
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka     return MPP_OK;
56*437bfbebSnyanmisaka }
57*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_deinit(MppEncRefCfg * ref)58*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_deinit(MppEncRefCfg *ref)
59*437bfbebSnyanmisaka {
60*437bfbebSnyanmisaka     if (!ref || check_is_mpp_enc_ref_cfg(*ref)) {
61*437bfbebSnyanmisaka         mpp_err_f("input %p check failed\n", ref);
62*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
63*437bfbebSnyanmisaka     }
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = (MppEncRefCfgImpl *)(*ref);
66*437bfbebSnyanmisaka     MPP_FREE(p->lt_cfg);
67*437bfbebSnyanmisaka     MPP_FREE(p->st_cfg);
68*437bfbebSnyanmisaka     MPP_FREE(p);
69*437bfbebSnyanmisaka 
70*437bfbebSnyanmisaka     return MPP_OK;
71*437bfbebSnyanmisaka }
72*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_reset(MppEncRefCfg ref)73*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_reset(MppEncRefCfg ref)
74*437bfbebSnyanmisaka {
75*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(ref))
76*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = (MppEncRefCfgImpl *)ref;
79*437bfbebSnyanmisaka     MPP_FREE(p->lt_cfg);
80*437bfbebSnyanmisaka     MPP_FREE(p->st_cfg);
81*437bfbebSnyanmisaka     memset(p, 0, sizeof(*p));
82*437bfbebSnyanmisaka     setup_mpp_enc_ref_cfg(p);
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     return MPP_OK;
85*437bfbebSnyanmisaka }
86*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_set_cfg_cnt(MppEncRefCfg ref,RK_S32 lt_cnt,RK_S32 st_cnt)87*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_set_cfg_cnt(MppEncRefCfg ref, RK_S32 lt_cnt, RK_S32 st_cnt)
88*437bfbebSnyanmisaka {
89*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(ref))
90*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
91*437bfbebSnyanmisaka 
92*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = (MppEncRefCfgImpl *)ref;
93*437bfbebSnyanmisaka     MppEncRefLtFrmCfg *lt_cfg = p->lt_cfg;
94*437bfbebSnyanmisaka     MppEncRefStFrmCfg *st_cfg = p->st_cfg;;
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka     if (lt_cfg || st_cfg) {
97*437bfbebSnyanmisaka         mpp_err_f("do call reset before setup new cnout\n");
98*437bfbebSnyanmisaka         MPP_FREE(lt_cfg);
99*437bfbebSnyanmisaka         MPP_FREE(st_cfg);
100*437bfbebSnyanmisaka     }
101*437bfbebSnyanmisaka 
102*437bfbebSnyanmisaka     if (lt_cnt) {
103*437bfbebSnyanmisaka         lt_cfg = mpp_calloc(MppEncRefLtFrmCfg, lt_cnt);
104*437bfbebSnyanmisaka         if (NULL == lt_cfg)
105*437bfbebSnyanmisaka             mpp_log_f("failed to create %d lt ref cfg\n", lt_cnt);
106*437bfbebSnyanmisaka     }
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     if (st_cnt) {
109*437bfbebSnyanmisaka         st_cfg = mpp_calloc(MppEncRefStFrmCfg, st_cnt);
110*437bfbebSnyanmisaka         if (NULL == st_cfg)
111*437bfbebSnyanmisaka             mpp_log_f("failed to create %d st ref cfg\n", lt_cnt);
112*437bfbebSnyanmisaka     }
113*437bfbebSnyanmisaka 
114*437bfbebSnyanmisaka     p->max_lt_cfg = lt_cnt;
115*437bfbebSnyanmisaka     p->max_st_cfg = st_cnt;
116*437bfbebSnyanmisaka     p->lt_cfg_cnt = 0;
117*437bfbebSnyanmisaka     p->st_cfg_cnt = 0;
118*437bfbebSnyanmisaka     p->lt_cfg = lt_cfg;
119*437bfbebSnyanmisaka     p->st_cfg = st_cfg;
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     return MPP_OK;
122*437bfbebSnyanmisaka }
123*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_add_lt_cfg(MppEncRefCfg ref,RK_S32 cnt,MppEncRefLtFrmCfg * frm)124*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_add_lt_cfg(MppEncRefCfg ref, RK_S32 cnt, MppEncRefLtFrmCfg *frm)
125*437bfbebSnyanmisaka {
126*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(ref))
127*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
128*437bfbebSnyanmisaka 
129*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = (MppEncRefCfgImpl *)ref;
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka     if (p->debug)
132*437bfbebSnyanmisaka         mpp_log("ref %p add lt %d cfg idx %d tid %d gap %d delay %d ref mode %x\n",
133*437bfbebSnyanmisaka                 ref, p->lt_cfg_cnt, frm->lt_idx, frm->temporal_id,
134*437bfbebSnyanmisaka                 frm->lt_gap, frm->lt_delay, frm->ref_mode);
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka     memcpy(&p->lt_cfg[p->lt_cfg_cnt], frm, sizeof(*frm) * cnt);
137*437bfbebSnyanmisaka     p->lt_cfg_cnt += cnt;
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka     return MPP_OK;
140*437bfbebSnyanmisaka }
141*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_add_st_cfg(MppEncRefCfg ref,RK_S32 cnt,MppEncRefStFrmCfg * frm)142*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_add_st_cfg(MppEncRefCfg ref, RK_S32 cnt, MppEncRefStFrmCfg *frm)
143*437bfbebSnyanmisaka {
144*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(ref)) {
145*437bfbebSnyanmisaka         mpp_err_f("input %p check failed\n", ref);
146*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
147*437bfbebSnyanmisaka     }
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = (MppEncRefCfgImpl *)ref;
150*437bfbebSnyanmisaka 
151*437bfbebSnyanmisaka     if (p->debug)
152*437bfbebSnyanmisaka         mpp_log("ref %p add lt %d cfg non %d tid %d gap repeat %d ref mode %x arg %d\n",
153*437bfbebSnyanmisaka                 ref, p->st_cfg_cnt, frm->is_non_ref, frm->temporal_id,
154*437bfbebSnyanmisaka                 frm->repeat, frm->ref_mode, frm->ref_arg);
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka     memcpy(&p->st_cfg[p->st_cfg_cnt], frm, sizeof(*frm) * cnt);
157*437bfbebSnyanmisaka     p->st_cfg_cnt += cnt;
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka     return MPP_OK;
160*437bfbebSnyanmisaka }
161*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_check(MppEncRefCfg ref)162*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_check(MppEncRefCfg ref)
163*437bfbebSnyanmisaka {
164*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(ref))
165*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
166*437bfbebSnyanmisaka 
167*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = (MppEncRefCfgImpl *)ref;
168*437bfbebSnyanmisaka     RK_S32 lt_cfg_cnt = p->lt_cfg_cnt;
169*437bfbebSnyanmisaka     RK_S32 st_cfg_cnt = p->st_cfg_cnt;
170*437bfbebSnyanmisaka     RK_S32 max_lt_ref_cnt   = 0;
171*437bfbebSnyanmisaka     RK_S32 max_lt_ref_idx   = 0;
172*437bfbebSnyanmisaka     RK_S32 lt_idx_used_mask = 0;
173*437bfbebSnyanmisaka     RK_S32 lt_dryrun_length = 0;
174*437bfbebSnyanmisaka     RK_S32 max_st_ref_cnt   = 0;
175*437bfbebSnyanmisaka     RK_S32 max_st_tid       = 0;
176*437bfbebSnyanmisaka     RK_S32 st_tid_used_mask = 0;
177*437bfbebSnyanmisaka     RK_S32 st_dryrun_length = 0;
178*437bfbebSnyanmisaka     RK_S32 ready = 1;
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka     /* parse and check gop config for encoder */
181*437bfbebSnyanmisaka     if (lt_cfg_cnt) {
182*437bfbebSnyanmisaka         RK_S32 pos = 0;
183*437bfbebSnyanmisaka         MppEncRefLtFrmCfg *cfg = p->lt_cfg;
184*437bfbebSnyanmisaka 
185*437bfbebSnyanmisaka         for (pos = 0; pos < lt_cfg_cnt; pos++, cfg++) {
186*437bfbebSnyanmisaka             MppEncRefMode ref_mode = cfg->ref_mode;
187*437bfbebSnyanmisaka             RK_S32 temporal_id = cfg->temporal_id;
188*437bfbebSnyanmisaka             RK_S32 lt_idx = cfg->lt_idx;
189*437bfbebSnyanmisaka             RK_U32 lt_idx_mask = 1 << lt_idx;
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka             /* check lt idx */
192*437bfbebSnyanmisaka             if (lt_idx >= MPP_ENC_MAX_LT_REF_NUM) {
193*437bfbebSnyanmisaka                 mpp_err_f("ref cfg %p lt cfg %d with invalid lt_idx %d larger than MPP_ENC_MAX_LT_REF_NUM\n",
194*437bfbebSnyanmisaka                           ref, pos, lt_idx);
195*437bfbebSnyanmisaka                 ready = 0;
196*437bfbebSnyanmisaka             }
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka             if (lt_idx_used_mask & lt_idx_mask) {
199*437bfbebSnyanmisaka                 mpp_err_f("ref cfg %p lt cfg %d with redefined lt_idx %d config\n",
200*437bfbebSnyanmisaka                           ref, pos, lt_idx);
201*437bfbebSnyanmisaka                 ready = 0;
202*437bfbebSnyanmisaka             }
203*437bfbebSnyanmisaka 
204*437bfbebSnyanmisaka             if (!(lt_idx_used_mask & lt_idx_mask)) {
205*437bfbebSnyanmisaka                 lt_idx_used_mask |= lt_idx_mask;
206*437bfbebSnyanmisaka                 max_lt_ref_cnt++;
207*437bfbebSnyanmisaka             }
208*437bfbebSnyanmisaka 
209*437bfbebSnyanmisaka             if (lt_idx > max_lt_ref_idx)
210*437bfbebSnyanmisaka                 max_lt_ref_idx = lt_idx;
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka             /* check temporal id */
213*437bfbebSnyanmisaka             if (temporal_id != 0) {
214*437bfbebSnyanmisaka                 mpp_err_f("ref cfg %p lt cfg %d with invalid temporal_id %d is non-zero\n",
215*437bfbebSnyanmisaka                           ref, pos, temporal_id);
216*437bfbebSnyanmisaka                 ready = 0;
217*437bfbebSnyanmisaka             }
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka             /* check gop mode */
220*437bfbebSnyanmisaka             if (!REF_MODE_IS_GLOBAL(ref_mode) && !REF_MODE_IS_LT_MODE(ref_mode)) {
221*437bfbebSnyanmisaka                 mpp_err_f("ref cfg %p lt cfg %d with invalid ref mode %x\n",
222*437bfbebSnyanmisaka                           ref, pos, ref_mode);
223*437bfbebSnyanmisaka                 ready = 0;
224*437bfbebSnyanmisaka             }
225*437bfbebSnyanmisaka 
226*437bfbebSnyanmisaka             /* if check failed just quit */
227*437bfbebSnyanmisaka             if (!ready)
228*437bfbebSnyanmisaka                 break;
229*437bfbebSnyanmisaka 
230*437bfbebSnyanmisaka             if (cfg->lt_gap && (cfg->lt_gap + cfg->lt_delay > lt_dryrun_length))
231*437bfbebSnyanmisaka                 lt_dryrun_length = cfg->lt_gap + cfg->lt_delay;
232*437bfbebSnyanmisaka         }
233*437bfbebSnyanmisaka     }
234*437bfbebSnyanmisaka 
235*437bfbebSnyanmisaka     /* check st-ref config */
236*437bfbebSnyanmisaka     if (ready && st_cfg_cnt) {
237*437bfbebSnyanmisaka         RK_S32 pos = 0;
238*437bfbebSnyanmisaka         MppEncRefStFrmCfg *cfg = p->st_cfg;
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka         for (pos = 0; pos < st_cfg_cnt; pos++, cfg++) {
241*437bfbebSnyanmisaka             MppEncRefMode ref_mode = cfg->ref_mode;
242*437bfbebSnyanmisaka             RK_S32 temporal_id = cfg->temporal_id;
243*437bfbebSnyanmisaka             RK_U32 tid_mask = 1 << temporal_id;
244*437bfbebSnyanmisaka 
245*437bfbebSnyanmisaka             /* check temporal_id */
246*437bfbebSnyanmisaka             if (temporal_id > MPP_ENC_MAX_TEMPORAL_LAYER_NUM - 1) {
247*437bfbebSnyanmisaka                 mpp_err_f("ref cfg %p st cfg %d with invalid temporal_id %d larger than MPP_ENC_MAX_TEMPORAL_LAYER_NUM\n",
248*437bfbebSnyanmisaka                           ref, pos, temporal_id);
249*437bfbebSnyanmisaka                 ready = 0;
250*437bfbebSnyanmisaka             }
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka             /* check gop mode */
253*437bfbebSnyanmisaka             if (!REF_MODE_IS_GLOBAL(ref_mode) && !REF_MODE_IS_ST_MODE(ref_mode)) {
254*437bfbebSnyanmisaka                 mpp_err_f("ref cfg %p st cfg %d with invalid ref mode %x\n",
255*437bfbebSnyanmisaka                           ref, pos, ref_mode);
256*437bfbebSnyanmisaka                 ready = 0;
257*437bfbebSnyanmisaka             }
258*437bfbebSnyanmisaka 
259*437bfbebSnyanmisaka             if (cfg->repeat < 0) {
260*437bfbebSnyanmisaka                 mpp_err_f("ref cfg %p st cfg %d with negative repeat %d set to zero\n",
261*437bfbebSnyanmisaka                           ref, pos, cfg->repeat);
262*437bfbebSnyanmisaka                 cfg->repeat = 0;
263*437bfbebSnyanmisaka             }
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka             /* constrain on head and tail frame */
266*437bfbebSnyanmisaka             if (pos == 0 || (pos == st_cfg_cnt - 1)) {
267*437bfbebSnyanmisaka                 if (cfg->is_non_ref) {
268*437bfbebSnyanmisaka                     mpp_err_f("ref cfg %p st cfg %d with invalid non-ref frame on head/tail frame\n",
269*437bfbebSnyanmisaka                               ref, pos);
270*437bfbebSnyanmisaka                     ready = 0;
271*437bfbebSnyanmisaka                 }
272*437bfbebSnyanmisaka 
273*437bfbebSnyanmisaka                 if (temporal_id > 0) {
274*437bfbebSnyanmisaka                     mpp_err_f("ref cfg %p st cfg %d with invalid non-zero temporal id %d on head/tail frame\n",
275*437bfbebSnyanmisaka                               ref, pos, temporal_id);
276*437bfbebSnyanmisaka                     ready = 0;
277*437bfbebSnyanmisaka                 }
278*437bfbebSnyanmisaka             }
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka             if (!ready)
281*437bfbebSnyanmisaka                 break;
282*437bfbebSnyanmisaka 
283*437bfbebSnyanmisaka             if (!cfg->is_non_ref && !(st_tid_used_mask & tid_mask)) {
284*437bfbebSnyanmisaka                 max_st_ref_cnt++;
285*437bfbebSnyanmisaka                 st_tid_used_mask |= tid_mask;
286*437bfbebSnyanmisaka             }
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka             if (temporal_id > max_st_tid)
289*437bfbebSnyanmisaka                 max_st_tid = temporal_id;
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka             st_dryrun_length++;
292*437bfbebSnyanmisaka             st_dryrun_length += cfg->repeat;
293*437bfbebSnyanmisaka         }
294*437bfbebSnyanmisaka     }
295*437bfbebSnyanmisaka 
296*437bfbebSnyanmisaka     if (ready) {
297*437bfbebSnyanmisaka         MppEncCpbInfo *cpb_info = &p->cpb_info;
298*437bfbebSnyanmisaka         MppEncRefs refs = NULL;
299*437bfbebSnyanmisaka         MPP_RET ret = MPP_OK;
300*437bfbebSnyanmisaka 
301*437bfbebSnyanmisaka         cpb_info->dpb_size = 0;
302*437bfbebSnyanmisaka         cpb_info->max_lt_cnt = max_lt_ref_cnt;
303*437bfbebSnyanmisaka         cpb_info->max_st_cnt = max_st_ref_cnt;
304*437bfbebSnyanmisaka         cpb_info->max_lt_idx = max_lt_ref_idx;
305*437bfbebSnyanmisaka         cpb_info->max_st_tid = max_st_tid;
306*437bfbebSnyanmisaka         cpb_info->lt_gop     = lt_dryrun_length;
307*437bfbebSnyanmisaka         cpb_info->st_gop     = st_dryrun_length - 1;
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka         ret = mpp_enc_refs_init(&refs);
310*437bfbebSnyanmisaka         ready = (ret) ? 0 : (ready);
311*437bfbebSnyanmisaka         ret = mpp_enc_refs_set_cfg(refs, ref);
312*437bfbebSnyanmisaka         ready = (ret) ? 0 : (ready);
313*437bfbebSnyanmisaka         ret = mpp_enc_refs_dryrun(refs);
314*437bfbebSnyanmisaka         ready = (ret) ? 0 : (ready);
315*437bfbebSnyanmisaka 
316*437bfbebSnyanmisaka         /* update dpb size */
317*437bfbebSnyanmisaka         ret = mpp_enc_refs_get_cpb_info(refs, cpb_info);
318*437bfbebSnyanmisaka         ready = (ret) ? 0 : (ready);
319*437bfbebSnyanmisaka 
320*437bfbebSnyanmisaka         ret = mpp_enc_refs_deinit(&refs);
321*437bfbebSnyanmisaka         ready = (ret) ? 0 : (ready);
322*437bfbebSnyanmisaka     } else {
323*437bfbebSnyanmisaka         mpp_err_f("check ref cfg %p failed\n", ref);
324*437bfbebSnyanmisaka     }
325*437bfbebSnyanmisaka     p->ready = ready;
326*437bfbebSnyanmisaka 
327*437bfbebSnyanmisaka     return ready ? MPP_OK : MPP_NOK;
328*437bfbebSnyanmisaka }
329*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_set_keep_cpb(MppEncRefCfg ref,RK_S32 keep)330*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_set_keep_cpb(MppEncRefCfg ref, RK_S32 keep)
331*437bfbebSnyanmisaka {
332*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(ref))
333*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
334*437bfbebSnyanmisaka 
335*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = (MppEncRefCfgImpl *)ref;
336*437bfbebSnyanmisaka     p->keep_cpb = keep;
337*437bfbebSnyanmisaka 
338*437bfbebSnyanmisaka     return MPP_OK;
339*437bfbebSnyanmisaka }
340*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_show(MppEncRefCfg ref)341*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_show(MppEncRefCfg ref)
342*437bfbebSnyanmisaka {
343*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(ref))
344*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka     return MPP_OK;
347*437bfbebSnyanmisaka }
348*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_copy(MppEncRefCfg dst,MppEncRefCfg src)349*437bfbebSnyanmisaka MPP_RET mpp_enc_ref_cfg_copy(MppEncRefCfg dst, MppEncRefCfg src)
350*437bfbebSnyanmisaka {
351*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(dst) || check_is_mpp_enc_ref_cfg(src))
352*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
355*437bfbebSnyanmisaka     MppEncRefCfgImpl *d = (MppEncRefCfgImpl *)dst;
356*437bfbebSnyanmisaka     MppEncRefCfgImpl *s = (MppEncRefCfgImpl *)src;
357*437bfbebSnyanmisaka     RK_S32 max_lt_cfg = s->max_lt_cfg;
358*437bfbebSnyanmisaka     RK_S32 max_st_cfg = s->max_st_cfg;
359*437bfbebSnyanmisaka 
360*437bfbebSnyanmisaka     /* step 1 - free cfg in dst */
361*437bfbebSnyanmisaka     MPP_FREE(d->lt_cfg);
362*437bfbebSnyanmisaka     MPP_FREE(d->st_cfg);
363*437bfbebSnyanmisaka 
364*437bfbebSnyanmisaka     /* step 2 - copy contex from src */
365*437bfbebSnyanmisaka     memcpy(d, s, sizeof(*d));
366*437bfbebSnyanmisaka 
367*437bfbebSnyanmisaka     /* step 3 - create new storage and copy lt/st cfg */
368*437bfbebSnyanmisaka     if (max_lt_cfg) {
369*437bfbebSnyanmisaka         MppEncRefLtFrmCfg *lt_cfg = mpp_calloc(MppEncRefLtFrmCfg, max_lt_cfg);
370*437bfbebSnyanmisaka 
371*437bfbebSnyanmisaka         if (NULL == lt_cfg) {
372*437bfbebSnyanmisaka             mpp_log_f("failed to create %d lt ref cfg\n", max_lt_cfg);
373*437bfbebSnyanmisaka             ret = MPP_NOK;
374*437bfbebSnyanmisaka         } else
375*437bfbebSnyanmisaka             memcpy(lt_cfg, s->lt_cfg, sizeof(lt_cfg[0]) * s->max_lt_cfg);
376*437bfbebSnyanmisaka 
377*437bfbebSnyanmisaka         d->lt_cfg = lt_cfg;
378*437bfbebSnyanmisaka     }
379*437bfbebSnyanmisaka 
380*437bfbebSnyanmisaka     if (max_st_cfg) {
381*437bfbebSnyanmisaka         MppEncRefStFrmCfg *st_cfg = mpp_calloc(MppEncRefStFrmCfg, max_st_cfg);
382*437bfbebSnyanmisaka 
383*437bfbebSnyanmisaka         if (NULL == st_cfg) {
384*437bfbebSnyanmisaka             mpp_log_f("failed to create %d st ref cfg\n", max_st_cfg);
385*437bfbebSnyanmisaka             ret = MPP_NOK;
386*437bfbebSnyanmisaka         } else
387*437bfbebSnyanmisaka             memcpy(st_cfg, s->st_cfg, sizeof(st_cfg[0]) * s->max_st_cfg);
388*437bfbebSnyanmisaka 
389*437bfbebSnyanmisaka         d->st_cfg = st_cfg;
390*437bfbebSnyanmisaka     }
391*437bfbebSnyanmisaka 
392*437bfbebSnyanmisaka     if (ret)
393*437bfbebSnyanmisaka         mpp_enc_ref_cfg_reset(dst);
394*437bfbebSnyanmisaka 
395*437bfbebSnyanmisaka     return ret;
396*437bfbebSnyanmisaka }
397*437bfbebSnyanmisaka 
mpp_enc_ref_cfg_get_cpb_info(MppEncRefCfg ref)398*437bfbebSnyanmisaka MppEncCpbInfo *mpp_enc_ref_cfg_get_cpb_info(MppEncRefCfg ref)
399*437bfbebSnyanmisaka {
400*437bfbebSnyanmisaka     if (check_is_mpp_enc_ref_cfg(ref))
401*437bfbebSnyanmisaka         return NULL;
402*437bfbebSnyanmisaka 
403*437bfbebSnyanmisaka     MppEncRefCfgImpl *p = (MppEncRefCfgImpl *)ref;
404*437bfbebSnyanmisaka     return &p->cpb_info;
405*437bfbebSnyanmisaka }
406*437bfbebSnyanmisaka 
407*437bfbebSnyanmisaka static MppEncRefStFrmCfg default_st_ref_cfg = {
408*437bfbebSnyanmisaka     .is_non_ref         = 0,
409*437bfbebSnyanmisaka     .temporal_id        = 0,
410*437bfbebSnyanmisaka     .ref_mode           = REF_TO_PREV_REF_FRM,
411*437bfbebSnyanmisaka     .ref_arg            = 0,
412*437bfbebSnyanmisaka     .repeat             = 0,
413*437bfbebSnyanmisaka };
414*437bfbebSnyanmisaka 
415*437bfbebSnyanmisaka static const MppEncRefCfgImpl default_ref_cfg = {
416*437bfbebSnyanmisaka     .name               = MODULE_TAG,
417*437bfbebSnyanmisaka     .ready              = 1,
418*437bfbebSnyanmisaka     .debug              = 0,
419*437bfbebSnyanmisaka     .keep_cpb           = 0,
420*437bfbebSnyanmisaka     .max_lt_cfg         = 0,
421*437bfbebSnyanmisaka     .max_st_cfg         = 1,
422*437bfbebSnyanmisaka     .lt_cfg_cnt         = 0,
423*437bfbebSnyanmisaka     .st_cfg_cnt         = 1,
424*437bfbebSnyanmisaka     .max_tlayers        = 1,
425*437bfbebSnyanmisaka     .lt_cfg             = NULL,
426*437bfbebSnyanmisaka     .st_cfg             = &default_st_ref_cfg,
427*437bfbebSnyanmisaka     .cpb_info           = { 1, 0, 1, 0, 0, 0, 0 },
428*437bfbebSnyanmisaka };
429*437bfbebSnyanmisaka 
mpp_enc_ref_default(void)430*437bfbebSnyanmisaka MppEncRefCfg mpp_enc_ref_default(void)
431*437bfbebSnyanmisaka {
432*437bfbebSnyanmisaka     return (MppEncRefCfg)&default_ref_cfg;
433*437bfbebSnyanmisaka }
434