xref: /rockchip-linux_mpp/mpp/codec/enc/h265/h265e_dpb.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG  "h265e_dpb"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_mem.h"
22*437bfbebSnyanmisaka #include "mpp_debug.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka #include "h265e_codec.h"
26*437bfbebSnyanmisaka #include "h265e_dpb.h"
27*437bfbebSnyanmisaka #include "h265e_slice.h"
28*437bfbebSnyanmisaka 
h265e_dpb_dump_frm(H265eDpb * dpb,const char * fmt)29*437bfbebSnyanmisaka void h265e_dpb_dump_frm(H265eDpb *dpb, const char *fmt)
30*437bfbebSnyanmisaka {
31*437bfbebSnyanmisaka     RK_S32 i = 0;
32*437bfbebSnyanmisaka     char buf[256];
33*437bfbebSnyanmisaka     RK_S32 pos = 0;
34*437bfbebSnyanmisaka     RK_S32 frm_cnt = MPP_ARRAY_ELEMS(dpb->frame_list);
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka     pos += snprintf(buf, sizeof(buf) - 1, "total %2d ", frm_cnt);
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka     for (i = 0; i < frm_cnt; i++) {
39*437bfbebSnyanmisaka         H265eDpbFrm *frm = &dpb->frame_list[i];
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka         pos += snprintf(buf + pos, sizeof(buf) - 1 - pos, "%04x ", frm->on_used);
42*437bfbebSnyanmisaka     }
43*437bfbebSnyanmisaka     mpp_log("%20s %s", fmt, buf);
44*437bfbebSnyanmisaka }
45*437bfbebSnyanmisaka 
calc_ref_pic_set_idxl0(H265eDpb * dpb,H265eSlice * slice,RK_S32 ref_idx)46*437bfbebSnyanmisaka MPP_RET calc_ref_pic_set_idxl0(H265eDpb *dpb, H265eSlice *slice, RK_S32 ref_idx)
47*437bfbebSnyanmisaka {
48*437bfbebSnyanmisaka     H265eReferencePictureSet * rps = (H265eReferencePictureSet*)&slice->m_localRPS;
49*437bfbebSnyanmisaka     H265eDpbFrm *frame_list = dpb->frame_list;
50*437bfbebSnyanmisaka     H265eRpsList *RpsList = &dpb->RpsList;
51*437bfbebSnyanmisaka     RK_S32 poc_idx = rps->m_RealPoc[ref_idx];
52*437bfbebSnyanmisaka     H265eDpbFrm* refPicSetLtCurr[MAX_REFS];
53*437bfbebSnyanmisaka     H265eDpbFrm* refPic = NULL;
54*437bfbebSnyanmisaka     RK_S32 numPocLtCurr = 0;
55*437bfbebSnyanmisaka     RK_S32 i = 0;
56*437bfbebSnyanmisaka 
57*437bfbebSnyanmisaka     for (i = rps->num_negative_pic + rps->num_positive_pic + rps->num_long_term_pic - 1;
58*437bfbebSnyanmisaka          i > rps->num_negative_pic + rps->num_positive_pic - 1; i--) {
59*437bfbebSnyanmisaka         if (rps->m_used[i]) {
60*437bfbebSnyanmisaka             refPic = get_lt_ref_pic(frame_list, slice, rps->m_RealPoc[i], rps->check_lt_msb[i]);
61*437bfbebSnyanmisaka             refPicSetLtCurr[numPocLtCurr] = refPic;
62*437bfbebSnyanmisaka             numPocLtCurr++;
63*437bfbebSnyanmisaka         }
64*437bfbebSnyanmisaka     }
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka     RpsList->m_RefPicListModification->m_RefPicSetIdxL0[0] = ref_idx;
67*437bfbebSnyanmisaka     for (i = 0; i < numPocLtCurr; i++) {
68*437bfbebSnyanmisaka         if (poc_idx == refPicSetLtCurr[i]->poc)
69*437bfbebSnyanmisaka             RpsList->m_RefPicListModification->m_RefPicSetIdxL0[0] = rps->m_numberOfPictures - rps->num_long_term_pic + i;
70*437bfbebSnyanmisaka     }
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     return MPP_OK;
73*437bfbebSnyanmisaka }
74*437bfbebSnyanmisaka 
h265e_dpb_set_ref_list(H265eDpb * dpb,H265eSlice * slice,RK_S32 delta_poc)75*437bfbebSnyanmisaka void h265e_dpb_set_ref_list(H265eDpb *dpb, H265eSlice *slice, RK_S32 delta_poc)
76*437bfbebSnyanmisaka {
77*437bfbebSnyanmisaka     RK_S32 i;
78*437bfbebSnyanmisaka     RK_S32 ref_idx = -1;
79*437bfbebSnyanmisaka     RK_S32 lt_cnt = 0, st_cnt = 0;
80*437bfbebSnyanmisaka     H265eRpsList *RpsList = &dpb->RpsList;
81*437bfbebSnyanmisaka     H265eReferencePictureSet * m_pRps = (H265eReferencePictureSet*)&slice->m_localRPS;
82*437bfbebSnyanmisaka     H265eRefPicListModification* refPicListModification = RpsList->m_RefPicListModification;
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
85*437bfbebSnyanmisaka     refPicListModification->m_refPicListModificationFlagL0 = 0;
86*437bfbebSnyanmisaka     refPicListModification->m_refPicListModificationFlagL1 = 0;
87*437bfbebSnyanmisaka 
88*437bfbebSnyanmisaka     for (i = 0; i < REF_PIC_LIST_NUM_IDX; i ++) {
89*437bfbebSnyanmisaka         refPicListModification->m_RefPicSetIdxL0[i] = 0;
90*437bfbebSnyanmisaka         refPicListModification->m_RefPicSetIdxL0[i] = 0;
91*437bfbebSnyanmisaka     }
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka     refPicListModification->m_refPicListModificationFlagL0 = 0;
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka     if (m_pRps->m_numberOfPictures > 1) {
96*437bfbebSnyanmisaka         for (i = 0; i < m_pRps->m_numberOfPictures; i++) {
97*437bfbebSnyanmisaka             h265e_dbg_dpb("m_pRps->delta_poc[%d] = %d", i, m_pRps->delta_poc[i]);
98*437bfbebSnyanmisaka             if (m_pRps->delta_poc[i] == delta_poc) {
99*437bfbebSnyanmisaka                 ref_idx = i;
100*437bfbebSnyanmisaka                 if (i > m_pRps->m_numberOfPictures - m_pRps->num_long_term_pic - 1)
101*437bfbebSnyanmisaka                     lt_cnt++;
102*437bfbebSnyanmisaka                 else
103*437bfbebSnyanmisaka                     st_cnt++;
104*437bfbebSnyanmisaka                 h265e_dbg_dpb("get %s ref ref_idx %d delta_poc %d", st_cnt ? "st" : "lt", ref_idx, delta_poc);
105*437bfbebSnyanmisaka             }
106*437bfbebSnyanmisaka         }
107*437bfbebSnyanmisaka         if (lt_cnt != 1 && st_cnt == 0) {
108*437bfbebSnyanmisaka             mpp_err("Warning: Did not find the right long term reference picture or more than one.");
109*437bfbebSnyanmisaka             return;
110*437bfbebSnyanmisaka         } else if (ref_idx != 0) {
111*437bfbebSnyanmisaka             refPicListModification->m_refPicListModificationFlagL0 = 1;
112*437bfbebSnyanmisaka             calc_ref_pic_set_idxl0(dpb, slice, ref_idx);
113*437bfbebSnyanmisaka         }
114*437bfbebSnyanmisaka     }
115*437bfbebSnyanmisaka     refPicListModification->m_refPicListModificationFlagL1 = 0;
116*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
117*437bfbebSnyanmisaka }
118*437bfbebSnyanmisaka 
119*437bfbebSnyanmisaka /* get buffer at init */
h265e_dpb_init_curr(H265eDpb * dpb,H265eDpbFrm * frm)120*437bfbebSnyanmisaka MPP_RET h265e_dpb_init_curr(H265eDpb *dpb, H265eDpbFrm *frm)
121*437bfbebSnyanmisaka {
122*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
123*437bfbebSnyanmisaka     mpp_assert(!frm->on_used);
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka     frm->dpb = dpb;
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka     if (!frm->slice) {
128*437bfbebSnyanmisaka         frm->slice = mpp_calloc(H265eSlice, 1);
129*437bfbebSnyanmisaka     }
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka     frm->inited = 1;
132*437bfbebSnyanmisaka     frm->dpb_used = 1;
133*437bfbebSnyanmisaka     frm->seq_idx = dpb->seq_idx;
134*437bfbebSnyanmisaka     dpb->seq_idx++;
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
137*437bfbebSnyanmisaka     return MPP_OK;
138*437bfbebSnyanmisaka }
139*437bfbebSnyanmisaka 
h265e_dpb_get_curr(H265eDpb * dpb)140*437bfbebSnyanmisaka MPP_RET h265e_dpb_get_curr(H265eDpb *dpb)
141*437bfbebSnyanmisaka {
142*437bfbebSnyanmisaka     RK_U32 i;
143*437bfbebSnyanmisaka 
144*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
145*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(dpb->frame_list); i++) {
146*437bfbebSnyanmisaka         if (!dpb->frame_list[i].on_used) {
147*437bfbebSnyanmisaka             dpb->curr = &dpb->frame_list[i];
148*437bfbebSnyanmisaka             h265e_dbg_dpb("get free dpb slot_index %d", dpb->curr->slot_idx);
149*437bfbebSnyanmisaka             break;
150*437bfbebSnyanmisaka         }
151*437bfbebSnyanmisaka     }
152*437bfbebSnyanmisaka     h265e_dpb_init_curr(dpb, dpb->curr);
153*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
154*437bfbebSnyanmisaka     return MPP_OK;
155*437bfbebSnyanmisaka }
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka /* put buffer at deinit */
h265e_dpb_frm_deinit(H265eDpbFrm * frm)158*437bfbebSnyanmisaka MPP_RET h265e_dpb_frm_deinit(H265eDpbFrm *frm)
159*437bfbebSnyanmisaka {
160*437bfbebSnyanmisaka     MPP_FREE(frm->slice);
161*437bfbebSnyanmisaka     frm->inited = 0;
162*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
163*437bfbebSnyanmisaka     return MPP_OK;
164*437bfbebSnyanmisaka }
165*437bfbebSnyanmisaka 
h265e_dpb_init(H265eDpb ** dpb)166*437bfbebSnyanmisaka MPP_RET h265e_dpb_init(H265eDpb **dpb)
167*437bfbebSnyanmisaka {
168*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
169*437bfbebSnyanmisaka     H265eDpb *p = NULL;
170*437bfbebSnyanmisaka     RK_U32 i;
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
173*437bfbebSnyanmisaka     if (NULL == dpb) {
174*437bfbebSnyanmisaka         mpp_err_f("invalid parameter %p \n", dpb);
175*437bfbebSnyanmisaka         return MPP_ERR_VALUE;
176*437bfbebSnyanmisaka     }
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka     p = mpp_calloc_size(H265eDpb, sizeof(H265eDpb));
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka     if (NULL == p)
181*437bfbebSnyanmisaka         return MPP_ERR_MALLOC;
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka     p->last_idr = 0;
184*437bfbebSnyanmisaka     p->poc_cra = 0;
185*437bfbebSnyanmisaka     p->max_ref_l0 = 1;
186*437bfbebSnyanmisaka     p->max_ref_l1 = 0;
187*437bfbebSnyanmisaka 
188*437bfbebSnyanmisaka     H265eRpsList *rps_list = &p->RpsList;
189*437bfbebSnyanmisaka 
190*437bfbebSnyanmisaka     rps_list->lt_num = 0;
191*437bfbebSnyanmisaka     rps_list->st_num = 0;
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka     memset(rps_list->poc, 0, sizeof(rps_list->poc));
194*437bfbebSnyanmisaka 
195*437bfbebSnyanmisaka     rps_list->m_RefPicListModification = mpp_calloc(H265eRefPicListModification, 1);
196*437bfbebSnyanmisaka 
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(p->frame_list); i++)
199*437bfbebSnyanmisaka         p->frame_list[i].slot_idx = i;
200*437bfbebSnyanmisaka 
201*437bfbebSnyanmisaka     mpp_assert(dpb);
202*437bfbebSnyanmisaka     *dpb = p;
203*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
204*437bfbebSnyanmisaka     return ret;
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka 
h265e_dpb_deinit(H265eDpb * dpb)207*437bfbebSnyanmisaka MPP_RET h265e_dpb_deinit(H265eDpb *dpb)
208*437bfbebSnyanmisaka {
209*437bfbebSnyanmisaka     RK_U32 i;
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka     if (NULL == dpb)
212*437bfbebSnyanmisaka         return MPP_OK;
213*437bfbebSnyanmisaka 
214*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
215*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(dpb->frame_list); i++) {
216*437bfbebSnyanmisaka         if (dpb->frame_list[i].inited)
217*437bfbebSnyanmisaka             h265e_dpb_frm_deinit(&dpb->frame_list[i]);
218*437bfbebSnyanmisaka     }
219*437bfbebSnyanmisaka 
220*437bfbebSnyanmisaka     MPP_FREE(dpb->RpsList.m_RefPicListModification);
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka     MPP_FREE(dpb);
223*437bfbebSnyanmisaka 
224*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
225*437bfbebSnyanmisaka     return MPP_OK;
226*437bfbebSnyanmisaka }
227*437bfbebSnyanmisaka 
get_nal_unit_type(H265eDpb * dpb,int curPOC)228*437bfbebSnyanmisaka enum NALUnitType get_nal_unit_type(H265eDpb *dpb, int curPOC)
229*437bfbebSnyanmisaka {
230*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
231*437bfbebSnyanmisaka     if (curPOC == 0) {
232*437bfbebSnyanmisaka         return NAL_IDR_W_RADL;
233*437bfbebSnyanmisaka     }
234*437bfbebSnyanmisaka     if (dpb->curr->is_key_frame) {
235*437bfbebSnyanmisaka         return NAL_IDR_W_RADL;
236*437bfbebSnyanmisaka     }
237*437bfbebSnyanmisaka     if (dpb->poc_cra > 0) {
238*437bfbebSnyanmisaka         if (curPOC < dpb->poc_cra) {
239*437bfbebSnyanmisaka             // All leading pictures are being marked as TFD pictures here since current encoder uses all
240*437bfbebSnyanmisaka             // reference pictures while encoding leading pictures. An encoder can ensure that a leading
241*437bfbebSnyanmisaka             // picture can be still decodable when random accessing to a CRA/CRANT/BLA/BLANT picture by
242*437bfbebSnyanmisaka             // controlling the reference pictures used for encoding that leading picture. Such a leading
243*437bfbebSnyanmisaka             // picture need not be marked as a TFD picture.
244*437bfbebSnyanmisaka             return NAL_RASL_R;
245*437bfbebSnyanmisaka         }
246*437bfbebSnyanmisaka     }
247*437bfbebSnyanmisaka     if (dpb->last_idr > 0) {
248*437bfbebSnyanmisaka         if (curPOC < dpb->last_idr) {
249*437bfbebSnyanmisaka             return NAL_RADL_R;
250*437bfbebSnyanmisaka         }
251*437bfbebSnyanmisaka     }
252*437bfbebSnyanmisaka 
253*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
254*437bfbebSnyanmisaka     return NAL_TRAIL_R;
255*437bfbebSnyanmisaka }
256*437bfbebSnyanmisaka 
getLSB(int poc,int maxLSB)257*437bfbebSnyanmisaka static inline int getLSB(int poc, int maxLSB)
258*437bfbebSnyanmisaka {
259*437bfbebSnyanmisaka     if (poc >= 0) {
260*437bfbebSnyanmisaka         return poc % maxLSB;
261*437bfbebSnyanmisaka     } else {
262*437bfbebSnyanmisaka         return (maxLSB - ((-poc) % maxLSB)) % maxLSB;
263*437bfbebSnyanmisaka     }
264*437bfbebSnyanmisaka }
265*437bfbebSnyanmisaka 
sort_delta_poc(H265eReferencePictureSet * rps)266*437bfbebSnyanmisaka void sort_delta_poc(H265eReferencePictureSet *rps)
267*437bfbebSnyanmisaka {
268*437bfbebSnyanmisaka     // sort in increasing order (smallest first)
269*437bfbebSnyanmisaka     RK_S32 j, k;
270*437bfbebSnyanmisaka     for (j = 1; j < rps->m_numberOfPictures; j++) {
271*437bfbebSnyanmisaka         RK_S32 deltaPOC = rps->delta_poc[j];
272*437bfbebSnyanmisaka         RK_U32 used = rps->m_used[j];
273*437bfbebSnyanmisaka         RK_U32 refed = rps->m_ref[j];
274*437bfbebSnyanmisaka 
275*437bfbebSnyanmisaka         for (k = j - 1; k >= 0; k--) {
276*437bfbebSnyanmisaka             int temp = rps->delta_poc[k];
277*437bfbebSnyanmisaka             if (deltaPOC < temp) {
278*437bfbebSnyanmisaka                 rps->delta_poc[k + 1] = temp;
279*437bfbebSnyanmisaka                 rps->m_used[k + 1] =  rps->m_used[k];
280*437bfbebSnyanmisaka                 rps->m_ref[k + 1] = rps->m_ref[k];
281*437bfbebSnyanmisaka                 rps->delta_poc[k] = deltaPOC;
282*437bfbebSnyanmisaka                 rps->m_used[k] = used;
283*437bfbebSnyanmisaka                 rps->m_ref[k] = refed;
284*437bfbebSnyanmisaka             }
285*437bfbebSnyanmisaka         }
286*437bfbebSnyanmisaka     }
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka     // flip the negative values to largest first
289*437bfbebSnyanmisaka     RK_S32 numNegPics =  rps->num_negative_pic;
290*437bfbebSnyanmisaka     for (j = 0, k = numNegPics - 1; j < numNegPics >> 1; j++, k--) {
291*437bfbebSnyanmisaka         RK_S32 deltaPOC = rps->delta_poc[j];
292*437bfbebSnyanmisaka         RK_U32 used = rps->m_used[j];
293*437bfbebSnyanmisaka         RK_U32 refed = rps->m_ref[j];
294*437bfbebSnyanmisaka         rps->delta_poc[j] = rps->delta_poc[k];
295*437bfbebSnyanmisaka         rps->m_used[j] = rps->m_used[k];
296*437bfbebSnyanmisaka         rps->m_ref[j] = rps->m_ref[k];
297*437bfbebSnyanmisaka         rps->delta_poc[k] =  deltaPOC;
298*437bfbebSnyanmisaka         rps->m_used[k] = used;
299*437bfbebSnyanmisaka         rps->m_ref[k] = refed;
300*437bfbebSnyanmisaka     }
301*437bfbebSnyanmisaka }
302*437bfbebSnyanmisaka 
h265e_dpb_apply_rps(H265eDpb * dpb,H265eReferencePictureSet * rps,int curPoc)303*437bfbebSnyanmisaka void h265e_dpb_apply_rps(H265eDpb *dpb, H265eReferencePictureSet *rps, int curPoc)
304*437bfbebSnyanmisaka {
305*437bfbebSnyanmisaka     H265eDpbFrm *outPic = NULL;
306*437bfbebSnyanmisaka     RK_S32 i;
307*437bfbebSnyanmisaka     // loop through all pictures in the reference picture buffer
308*437bfbebSnyanmisaka     RK_U32 index = 0;
309*437bfbebSnyanmisaka     H265eDpbFrm *frame_list = &dpb->frame_list[0];
310*437bfbebSnyanmisaka 
311*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
312*437bfbebSnyanmisaka 
313*437bfbebSnyanmisaka     for (index = 0; index < MPP_ARRAY_ELEMS(dpb->frame_list); index++) {
314*437bfbebSnyanmisaka         outPic = &frame_list[index];
315*437bfbebSnyanmisaka         if (!outPic->inited || !outPic->slice->is_referenced) {
316*437bfbebSnyanmisaka             continue;
317*437bfbebSnyanmisaka         }
318*437bfbebSnyanmisaka 
319*437bfbebSnyanmisaka         // loop through all pictures in the Reference Picture Set
320*437bfbebSnyanmisaka         // to see if the picture should be kept as reference picture
321*437bfbebSnyanmisaka         for (i = 0; i < rps->num_positive_pic + rps->num_negative_pic; i++) {
322*437bfbebSnyanmisaka             h265e_dbg_dpb("outPic->slice->poc %d,curPoc %d dealt %d", outPic->slice->poc, curPoc, rps->delta_poc[i]);
323*437bfbebSnyanmisaka             if (!outPic->is_long_term && outPic->slice->poc == curPoc + rps->delta_poc[i]) {
324*437bfbebSnyanmisaka                 outPic->used_by_cur = (rps->m_used[i] == 1);
325*437bfbebSnyanmisaka                 outPic->is_long_term = 0;
326*437bfbebSnyanmisaka             }
327*437bfbebSnyanmisaka         }
328*437bfbebSnyanmisaka 
329*437bfbebSnyanmisaka         for (; i < rps->m_numberOfPictures; i++) {
330*437bfbebSnyanmisaka             if (rps->check_lt_msb[i] == 0) {
331*437bfbebSnyanmisaka                 if (outPic->is_long_term && (outPic->slice->poc == rps->m_RealPoc[i])) {
332*437bfbebSnyanmisaka                     outPic->used_by_cur = (rps->m_used[i] == 1);
333*437bfbebSnyanmisaka                 }
334*437bfbebSnyanmisaka             } else {
335*437bfbebSnyanmisaka                 if (outPic->is_long_term && (outPic->slice->poc == rps->m_RealPoc[i])) {
336*437bfbebSnyanmisaka                     outPic->used_by_cur = (rps->m_used[i] == 1);
337*437bfbebSnyanmisaka                 }
338*437bfbebSnyanmisaka             }
339*437bfbebSnyanmisaka         }
340*437bfbebSnyanmisaka     }
341*437bfbebSnyanmisaka 
342*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
343*437bfbebSnyanmisaka }
344*437bfbebSnyanmisaka 
h265e_dpb_dec_refresh_marking(H265eDpb * dpb,RK_S32 poc_cur,enum NALUnitType nalUnitType)345*437bfbebSnyanmisaka void h265e_dpb_dec_refresh_marking(H265eDpb *dpb, RK_S32 poc_cur, enum NALUnitType nalUnitType)
346*437bfbebSnyanmisaka {
347*437bfbebSnyanmisaka     RK_U32 index = 0;
348*437bfbebSnyanmisaka 
349*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
350*437bfbebSnyanmisaka 
351*437bfbebSnyanmisaka     if (nalUnitType == NAL_BLA_W_LP
352*437bfbebSnyanmisaka         || nalUnitType == NAL_BLA_W_RADL
353*437bfbebSnyanmisaka         || nalUnitType == NAL_BLA_N_LP
354*437bfbebSnyanmisaka         || nalUnitType == NAL_IDR_W_RADL
355*437bfbebSnyanmisaka         || nalUnitType == NAL_IDR_N_LP) { // IDR or BLA picture
356*437bfbebSnyanmisaka         // mark all pictures as not used for reference
357*437bfbebSnyanmisaka         H265eDpbFrm *frame_List = &dpb->frame_list[0];
358*437bfbebSnyanmisaka         for (index = 0; index < MPP_ARRAY_ELEMS(dpb->frame_list); index++) {
359*437bfbebSnyanmisaka             H265eDpbFrm *frame = &frame_List[index];
360*437bfbebSnyanmisaka             if (frame->inited && (frame->poc != poc_cur)) {
361*437bfbebSnyanmisaka                 frame->slice->is_referenced = 0;
362*437bfbebSnyanmisaka                 frame->is_long_term = 0;
363*437bfbebSnyanmisaka                 if (frame->poc < poc_cur) {
364*437bfbebSnyanmisaka                     frame->used_by_cur = 0;
365*437bfbebSnyanmisaka                     frame->dpb_used = 0;
366*437bfbebSnyanmisaka                     frame->status.val = 0;
367*437bfbebSnyanmisaka                 }
368*437bfbebSnyanmisaka             }
369*437bfbebSnyanmisaka         }
370*437bfbebSnyanmisaka 
371*437bfbebSnyanmisaka         if (nalUnitType == NAL_BLA_W_LP
372*437bfbebSnyanmisaka             || nalUnitType == NAL_BLA_W_RADL
373*437bfbebSnyanmisaka             || nalUnitType == NAL_BLA_N_LP) {
374*437bfbebSnyanmisaka             dpb->poc_cra = poc_cur;
375*437bfbebSnyanmisaka         }
376*437bfbebSnyanmisaka     } else { // CRA or No DR
377*437bfbebSnyanmisaka         if (dpb->refresh_pending == 1 && poc_cur > dpb->poc_cra) { // CRA reference marking pending
378*437bfbebSnyanmisaka             H265eDpbFrm *frame_list = &dpb->frame_list[0];
379*437bfbebSnyanmisaka             for (index = 0; index < MPP_ARRAY_ELEMS(dpb->frame_list); index++) {
380*437bfbebSnyanmisaka 
381*437bfbebSnyanmisaka                 H265eDpbFrm *frame = &frame_list[index];
382*437bfbebSnyanmisaka                 if (frame->inited && frame->poc != poc_cur && frame->poc != dpb->poc_cra) {
383*437bfbebSnyanmisaka                     frame->slice->is_referenced = 0;
384*437bfbebSnyanmisaka                     frame->dpb_used = 0;
385*437bfbebSnyanmisaka                 }
386*437bfbebSnyanmisaka             }
387*437bfbebSnyanmisaka 
388*437bfbebSnyanmisaka             dpb->refresh_pending = 0;
389*437bfbebSnyanmisaka         }
390*437bfbebSnyanmisaka         if (nalUnitType == NAL_CRA_NUT) { // CRA picture found
391*437bfbebSnyanmisaka             dpb->refresh_pending = 1;
392*437bfbebSnyanmisaka             dpb->poc_cra = poc_cur;
393*437bfbebSnyanmisaka         }
394*437bfbebSnyanmisaka     }
395*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
396*437bfbebSnyanmisaka }
397*437bfbebSnyanmisaka 
398*437bfbebSnyanmisaka // Function will arrange the long-term pictures in the decreasing order of poc_lsb_lt,
399*437bfbebSnyanmisaka // and among the pictures with the same lsb, it arranges them in increasing delta_poc_msb_cycle_lt value
h265e_dpb_arrange_lt_rps(H265eDpb * dpb,H265eSlice * slice)400*437bfbebSnyanmisaka void h265e_dpb_arrange_lt_rps(H265eDpb *dpb, H265eSlice *slice)
401*437bfbebSnyanmisaka {
402*437bfbebSnyanmisaka     H265eReferencePictureSet *rps = slice->m_rps;
403*437bfbebSnyanmisaka     RK_U32 tempArray[MAX_REFS];
404*437bfbebSnyanmisaka     RK_S32 offset = rps->num_negative_pic + rps->num_positive_pic;
405*437bfbebSnyanmisaka     RK_S32 i, j, ctr = 0;
406*437bfbebSnyanmisaka     RK_S32 maxPicOrderCntLSB = 1 << slice->m_sps->m_bitsForPOC;
407*437bfbebSnyanmisaka     RK_S32 numLongPics;
408*437bfbebSnyanmisaka     RK_S32 currMSB = 0, currLSB = 0;
409*437bfbebSnyanmisaka     (void)dpb;
410*437bfbebSnyanmisaka 
411*437bfbebSnyanmisaka     // Arrange long-term reference pictures in the correct order of LSB and MSB,
412*437bfbebSnyanmisaka     // and assign values for pocLSBLT and MSB present flag
413*437bfbebSnyanmisaka     RK_S32 longtermPicsPoc[MAX_REFS], longtermPicsLSB[MAX_REFS], indices[MAX_REFS];
414*437bfbebSnyanmisaka     RK_S32 longtermPicsRealPoc[MAX_REFS];
415*437bfbebSnyanmisaka     RK_S32 longtermPicsMSB[MAX_REFS];
416*437bfbebSnyanmisaka     RK_U32 mSBPresentFlag[MAX_REFS];
417*437bfbebSnyanmisaka 
418*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
419*437bfbebSnyanmisaka     if (!rps->num_long_term_pic) {
420*437bfbebSnyanmisaka         return;
421*437bfbebSnyanmisaka     }
422*437bfbebSnyanmisaka     memset(longtermPicsPoc, 0, sizeof(longtermPicsPoc));  // Store POC values of LTRP
423*437bfbebSnyanmisaka     memset(longtermPicsLSB, 0, sizeof(longtermPicsLSB));  // Store POC LSB values of LTRP
424*437bfbebSnyanmisaka     memset(longtermPicsMSB, 0, sizeof(longtermPicsMSB));  // Store POC LSB values of LTRP
425*437bfbebSnyanmisaka     memset(longtermPicsRealPoc, 0, sizeof(longtermPicsRealPoc));
426*437bfbebSnyanmisaka     memset(indices, 0, sizeof(indices));                  // Indices to aid in tracking sorted LTRPs
427*437bfbebSnyanmisaka     memset(mSBPresentFlag, 0, sizeof(mSBPresentFlag));    // Indicate if MSB needs to be present
428*437bfbebSnyanmisaka 
429*437bfbebSnyanmisaka     // Get the long-term reference pictures
430*437bfbebSnyanmisaka 
431*437bfbebSnyanmisaka     for (i = rps->m_numberOfPictures - 1; i >= offset; i--, ctr++) {
432*437bfbebSnyanmisaka         longtermPicsPoc[ctr] = rps->poc[i];                                  // LTRP POC
433*437bfbebSnyanmisaka         longtermPicsRealPoc[ctr] = rps->m_RealPoc[i];
434*437bfbebSnyanmisaka         longtermPicsLSB[ctr] = getLSB(longtermPicsPoc[ctr], maxPicOrderCntLSB); // LTRP POC LSB
435*437bfbebSnyanmisaka         indices[ctr] = i;
436*437bfbebSnyanmisaka         longtermPicsMSB[ctr] = longtermPicsPoc[ctr] - longtermPicsLSB[ctr];
437*437bfbebSnyanmisaka     }
438*437bfbebSnyanmisaka 
439*437bfbebSnyanmisaka     numLongPics = rps->num_long_term_pic;
440*437bfbebSnyanmisaka     mpp_assert(ctr == numLongPics);
441*437bfbebSnyanmisaka 
442*437bfbebSnyanmisaka     // Arrange pictures in decreasing order of MSB;
443*437bfbebSnyanmisaka     for (i = 0; i < numLongPics; i++) {
444*437bfbebSnyanmisaka         for (j = 0; j < numLongPics - 1; j++) {
445*437bfbebSnyanmisaka             if (longtermPicsMSB[j] < longtermPicsMSB[j + 1]) {
446*437bfbebSnyanmisaka                 MPP_SWAP(RK_S32, longtermPicsPoc[j], longtermPicsPoc[j + 1]);
447*437bfbebSnyanmisaka                 MPP_SWAP(RK_S32, longtermPicsRealPoc[j], longtermPicsRealPoc[j + 1]);
448*437bfbebSnyanmisaka                 MPP_SWAP(RK_S32, longtermPicsLSB[j], longtermPicsLSB[j + 1]);
449*437bfbebSnyanmisaka                 MPP_SWAP(RK_S32, longtermPicsMSB[j], longtermPicsMSB[j + 1]);
450*437bfbebSnyanmisaka                 MPP_SWAP(RK_S32, indices[j], indices[j + 1]);
451*437bfbebSnyanmisaka             }
452*437bfbebSnyanmisaka         }
453*437bfbebSnyanmisaka     }
454*437bfbebSnyanmisaka 
455*437bfbebSnyanmisaka     for (i = 0; i < numLongPics; i++) {
456*437bfbebSnyanmisaka         if (slice->gop_idx / maxPicOrderCntLSB > 0) {
457*437bfbebSnyanmisaka             mSBPresentFlag[i] = 1;
458*437bfbebSnyanmisaka         }
459*437bfbebSnyanmisaka     }
460*437bfbebSnyanmisaka 
461*437bfbebSnyanmisaka     // tempArray for usedByCurr flag
462*437bfbebSnyanmisaka     memset(tempArray, 0, sizeof(tempArray));
463*437bfbebSnyanmisaka     for (i = 0; i < numLongPics; i++) {
464*437bfbebSnyanmisaka         tempArray[i] = rps->m_used[indices[i]] ? 1 : 0;
465*437bfbebSnyanmisaka     }
466*437bfbebSnyanmisaka 
467*437bfbebSnyanmisaka     // Now write the final values;
468*437bfbebSnyanmisaka     ctr = 0;
469*437bfbebSnyanmisaka     // currPicPoc = currMSB + currLSB
470*437bfbebSnyanmisaka     currLSB = getLSB(slice->gop_idx, maxPicOrderCntLSB);
471*437bfbebSnyanmisaka     currMSB = slice->gop_idx - currLSB;
472*437bfbebSnyanmisaka 
473*437bfbebSnyanmisaka     for (i = rps->m_numberOfPictures - 1; i >= offset; i--, ctr++) {
474*437bfbebSnyanmisaka         rps->poc[i] = longtermPicsPoc[ctr];
475*437bfbebSnyanmisaka         rps->delta_poc[i] = -slice->poc + longtermPicsRealPoc[ctr];
476*437bfbebSnyanmisaka 
477*437bfbebSnyanmisaka         rps->m_used[i] = tempArray[ctr];
478*437bfbebSnyanmisaka         rps->m_pocLSBLT[i] = longtermPicsLSB[ctr];
479*437bfbebSnyanmisaka         rps->m_deltaPOCMSBCycleLT[i] = (currMSB - (longtermPicsPoc[ctr] - longtermPicsLSB[ctr])) / maxPicOrderCntLSB;
480*437bfbebSnyanmisaka         rps->m_deltaPocMSBPresentFlag[i] = mSBPresentFlag[ctr];
481*437bfbebSnyanmisaka 
482*437bfbebSnyanmisaka         mpp_assert(rps->m_deltaPOCMSBCycleLT[i] >= 0); // Non-negative value
483*437bfbebSnyanmisaka     }
484*437bfbebSnyanmisaka 
485*437bfbebSnyanmisaka     for (i = rps->m_numberOfPictures - 1, ctr = 1; i >= offset; i--, ctr++) {
486*437bfbebSnyanmisaka         for (j = rps->m_numberOfPictures - 1 - ctr; j >= offset; j--) {
487*437bfbebSnyanmisaka             // Here at the encoder we know that we have set the full POC value for the LTRPs, hence we
488*437bfbebSnyanmisaka             // don't have to check the MSB present flag values for this constraint.
489*437bfbebSnyanmisaka             mpp_assert(rps->m_RealPoc[i] != rps->m_RealPoc[j]); // If assert fails, LTRP entry repeated in RPS!!!
490*437bfbebSnyanmisaka         }
491*437bfbebSnyanmisaka     }
492*437bfbebSnyanmisaka 
493*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
494*437bfbebSnyanmisaka }
495*437bfbebSnyanmisaka 
h265e_find_cpb_in_dpb(H265eDpbFrm * frms,RK_S32 cnt,EncFrmStatus * frm)496*437bfbebSnyanmisaka static H265eDpbFrm *h265e_find_cpb_in_dpb(H265eDpbFrm *frms, RK_S32 cnt, EncFrmStatus *frm)
497*437bfbebSnyanmisaka {
498*437bfbebSnyanmisaka     RK_S32 seq_idx = frm->seq_idx;
499*437bfbebSnyanmisaka     RK_S32 i;
500*437bfbebSnyanmisaka 
501*437bfbebSnyanmisaka     if (!frm->valid)
502*437bfbebSnyanmisaka         return NULL;
503*437bfbebSnyanmisaka 
504*437bfbebSnyanmisaka     h265e_dbg_dpb("frm %d start finding slot \n", frm->seq_idx);
505*437bfbebSnyanmisaka     for (i = 0; i < cnt; i++) {
506*437bfbebSnyanmisaka         if (!frms[i].inited) {
507*437bfbebSnyanmisaka             continue;
508*437bfbebSnyanmisaka         }
509*437bfbebSnyanmisaka         EncFrmStatus *p = &frms[i].status;
510*437bfbebSnyanmisaka 
511*437bfbebSnyanmisaka         if (p->valid && p->seq_idx == seq_idx) {
512*437bfbebSnyanmisaka             h265e_dbg_dpb("frm %d match slot %d valid %d\n",
513*437bfbebSnyanmisaka                           p->seq_idx, i, p->valid);
514*437bfbebSnyanmisaka             return &frms[i];
515*437bfbebSnyanmisaka         }
516*437bfbebSnyanmisaka     }
517*437bfbebSnyanmisaka     mpp_err_f("can not find match frm %d\n", seq_idx);
518*437bfbebSnyanmisaka     return NULL;
519*437bfbebSnyanmisaka }
520*437bfbebSnyanmisaka 
h265e_find_cpb_frame(H265eDpbFrm * frms,RK_S32 cnt,EncFrmStatus * frm)521*437bfbebSnyanmisaka static H265eDpbFrm *h265e_find_cpb_frame(H265eDpbFrm *frms, RK_S32 cnt, EncFrmStatus *frm)
522*437bfbebSnyanmisaka {
523*437bfbebSnyanmisaka     RK_S32 seq_idx = frm->seq_idx;
524*437bfbebSnyanmisaka     RK_S32 i;
525*437bfbebSnyanmisaka 
526*437bfbebSnyanmisaka     if (!frm->valid)
527*437bfbebSnyanmisaka         return NULL;
528*437bfbebSnyanmisaka 
529*437bfbebSnyanmisaka     h265e_dbg_dpb("frm %d start finding slot \n", frm->seq_idx);
530*437bfbebSnyanmisaka     for (i = 0; i < cnt; i++) {
531*437bfbebSnyanmisaka         if (!frms[i].dpb_used) {
532*437bfbebSnyanmisaka             continue;
533*437bfbebSnyanmisaka         }
534*437bfbebSnyanmisaka 
535*437bfbebSnyanmisaka         EncFrmStatus *p = &frms[i].status;
536*437bfbebSnyanmisaka 
537*437bfbebSnyanmisaka         if (p->valid && p->seq_idx == seq_idx) {
538*437bfbebSnyanmisaka             h265e_dbg_dpb("frm %d match slot %d valid %d\n",
539*437bfbebSnyanmisaka                           p->seq_idx, i, p->valid);
540*437bfbebSnyanmisaka             if (frm->save_pass1)
541*437bfbebSnyanmisaka                 return &frms[i];
542*437bfbebSnyanmisaka             mpp_assert(p->is_non_ref == frm->is_non_ref);
543*437bfbebSnyanmisaka             mpp_assert(p->is_lt_ref == frm->is_lt_ref);
544*437bfbebSnyanmisaka             mpp_assert(p->lt_idx == frm->lt_idx);
545*437bfbebSnyanmisaka             mpp_assert(p->temporal_id == frm->temporal_id);
546*437bfbebSnyanmisaka             return &frms[i];
547*437bfbebSnyanmisaka         }
548*437bfbebSnyanmisaka     }
549*437bfbebSnyanmisaka 
550*437bfbebSnyanmisaka     mpp_err_f("can not find match frm %d\n", seq_idx);
551*437bfbebSnyanmisaka 
552*437bfbebSnyanmisaka     return NULL;
553*437bfbebSnyanmisaka }
554*437bfbebSnyanmisaka 
h265e_check_frame_cpb(H265eDpbFrm * frm,RK_S32 cnt,EncFrmStatus * frms)555*437bfbebSnyanmisaka static MPP_RET h265e_check_frame_cpb(H265eDpbFrm *frm, RK_S32 cnt, EncFrmStatus *frms)
556*437bfbebSnyanmisaka {
557*437bfbebSnyanmisaka     EncFrmStatus *p = &frm->status;
558*437bfbebSnyanmisaka     RK_S32 seq_idx, i;
559*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
560*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
561*437bfbebSnyanmisaka 
562*437bfbebSnyanmisaka     seq_idx = p->seq_idx;
563*437bfbebSnyanmisaka     for (i = 0; i < cnt; i++) {
564*437bfbebSnyanmisaka 
565*437bfbebSnyanmisaka         if (!frms[i].valid) {
566*437bfbebSnyanmisaka             continue;
567*437bfbebSnyanmisaka         }
568*437bfbebSnyanmisaka 
569*437bfbebSnyanmisaka         if (frms[i].seq_idx == seq_idx) {
570*437bfbebSnyanmisaka             ret =  MPP_OK;
571*437bfbebSnyanmisaka         }
572*437bfbebSnyanmisaka     }
573*437bfbebSnyanmisaka 
574*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
575*437bfbebSnyanmisaka     return ret;
576*437bfbebSnyanmisaka }
577*437bfbebSnyanmisaka 
578*437bfbebSnyanmisaka 
h265e_dpb_cpb2rps(H265eDpb * dpb,RK_S32 curPoc,H265eSlice * slice,EncCpbStatus * cpb)579*437bfbebSnyanmisaka void h265e_dpb_cpb2rps(H265eDpb *dpb, RK_S32 curPoc, H265eSlice *slice, EncCpbStatus *cpb)
580*437bfbebSnyanmisaka {
581*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
582*437bfbebSnyanmisaka     RK_S32 i;
583*437bfbebSnyanmisaka     RK_S32 st_size = 0;
584*437bfbebSnyanmisaka     RK_S32 lt_size = 0;
585*437bfbebSnyanmisaka     RK_S32 nLongTermRefPicPoc[MAX_NUM_LONG_TERM_REF_PIC_POC];
586*437bfbebSnyanmisaka     RK_S32 nLongTermRefPicRealPoc[MAX_NUM_LONG_TERM_REF_PIC_POC];
587*437bfbebSnyanmisaka     RK_S32 nLongTermDealtPoc[MAX_NUM_LONG_TERM_REF_PIC_POC];
588*437bfbebSnyanmisaka     RK_U32 isMsbValid[MAX_NUM_LONG_TERM_REF_PIC_POC];
589*437bfbebSnyanmisaka     RK_U32 isShortTermValid[MAX_REFS];
590*437bfbebSnyanmisaka     H265eRpsList *RpsList = &dpb->RpsList;
591*437bfbebSnyanmisaka     H265eReferencePictureSet * rps = (H265eReferencePictureSet*)&slice->m_localRPS;
592*437bfbebSnyanmisaka     RK_S32 idx_rps;
593*437bfbebSnyanmisaka     H265eDpbFrm *p = NULL;
594*437bfbebSnyanmisaka     RK_S32 ref_dealt_poc = 0;
595*437bfbebSnyanmisaka     slice->m_bdIdx = -1;
596*437bfbebSnyanmisaka 
597*437bfbebSnyanmisaka     memset(isShortTermValid, 1, sizeof(RK_U32)*MAX_REFS);
598*437bfbebSnyanmisaka     memset(rps, 0, sizeof(H265eReferencePictureSet));
599*437bfbebSnyanmisaka     for (idx_rps = 0; idx_rps < 16; idx_rps++) {
600*437bfbebSnyanmisaka         rps->delta_poc[idx_rps] = 0;
601*437bfbebSnyanmisaka         rps->m_used[idx_rps] = 0;
602*437bfbebSnyanmisaka         rps->m_ref[idx_rps] = 0;
603*437bfbebSnyanmisaka     }
604*437bfbebSnyanmisaka 
605*437bfbebSnyanmisaka     memset(rps->delta_poc, 0, MAX_REFS * sizeof(int));
606*437bfbebSnyanmisaka 
607*437bfbebSnyanmisaka     if (cpb->curr.is_lt_ref)
608*437bfbebSnyanmisaka         mpp_assert(slice->m_sps->m_bLongTermRefsPresent);
609*437bfbebSnyanmisaka 
610*437bfbebSnyanmisaka     idx_rps = 0;
611*437bfbebSnyanmisaka     for (i = 0; i < MAX_CPB_REFS; i++) {
612*437bfbebSnyanmisaka         EncFrmStatus *frm = &cpb->init[i];
613*437bfbebSnyanmisaka 
614*437bfbebSnyanmisaka         if (!frm->valid)
615*437bfbebSnyanmisaka             continue;
616*437bfbebSnyanmisaka 
617*437bfbebSnyanmisaka         mpp_assert(!frm->is_non_ref);
618*437bfbebSnyanmisaka 
619*437bfbebSnyanmisaka         h265e_dbg_dpb("idx %d frm %d valid %d is_non_ref %d lt_ref %d\n",
620*437bfbebSnyanmisaka                       i, frm->seq_idx, frm->valid, frm->is_non_ref, frm->is_lt_ref);
621*437bfbebSnyanmisaka 
622*437bfbebSnyanmisaka         p = h265e_find_cpb_frame(dpb->frame_list, MAX_REFS, frm);
623*437bfbebSnyanmisaka         if (p) {
624*437bfbebSnyanmisaka             if (!frm->is_lt_ref) {
625*437bfbebSnyanmisaka                 p->status.val = frm->val;
626*437bfbebSnyanmisaka                 rps->delta_poc[idx_rps] = p->poc - curPoc;
627*437bfbebSnyanmisaka                 rps->m_used[idx_rps] = 1;
628*437bfbebSnyanmisaka                 idx_rps++;
629*437bfbebSnyanmisaka                 st_size++;
630*437bfbebSnyanmisaka                 h265e_dbg_dpb("found st %d st_size %d %p deat_poc %d\n", i, st_size,
631*437bfbebSnyanmisaka                               frm,  rps->delta_poc[idx_rps - 1]);
632*437bfbebSnyanmisaka             } else {
633*437bfbebSnyanmisaka                 nLongTermRefPicPoc[lt_size] = p->gop_idx;
634*437bfbebSnyanmisaka                 nLongTermRefPicRealPoc[lt_size] = p->poc;
635*437bfbebSnyanmisaka                 nLongTermDealtPoc[lt_size] = p->poc - curPoc;
636*437bfbebSnyanmisaka                 isMsbValid[lt_size] = p->gop_idx >= (RK_S32)(1 << p->slice->m_sps->m_bitsForPOC);
637*437bfbebSnyanmisaka                 p->status.val = frm->val;
638*437bfbebSnyanmisaka                 h265e_dbg_dpb("found lt %d lt_size %d %p dealt poc %d\n", i, lt_size,
639*437bfbebSnyanmisaka                               frm, nLongTermDealtPoc[lt_size]);
640*437bfbebSnyanmisaka                 lt_size++;
641*437bfbebSnyanmisaka             }
642*437bfbebSnyanmisaka         }
643*437bfbebSnyanmisaka     }
644*437bfbebSnyanmisaka     sort_delta_poc(rps);
645*437bfbebSnyanmisaka 
646*437bfbebSnyanmisaka     if (slice->m_sliceType == I_SLICE) {
647*437bfbebSnyanmisaka         rps->m_interRPSPrediction = 0;
648*437bfbebSnyanmisaka         rps->num_long_term_pic = 0;
649*437bfbebSnyanmisaka         rps->num_negative_pic = 0;
650*437bfbebSnyanmisaka         rps->num_positive_pic = 0;
651*437bfbebSnyanmisaka         rps->m_numberOfPictures = 0;
652*437bfbebSnyanmisaka 
653*437bfbebSnyanmisaka     } else {
654*437bfbebSnyanmisaka         p = h265e_find_cpb_frame(dpb->frame_list, MAX_REFS, &cpb->refr);
655*437bfbebSnyanmisaka         if (p == NULL) {
656*437bfbebSnyanmisaka             mpp_err("ref frame no found in refer index %d", cpb->refr.seq_idx);
657*437bfbebSnyanmisaka         } else {
658*437bfbebSnyanmisaka             ref_dealt_poc = p->poc - curPoc;
659*437bfbebSnyanmisaka         }
660*437bfbebSnyanmisaka 
661*437bfbebSnyanmisaka         for (i = 0; i < st_size; i++) {
662*437bfbebSnyanmisaka             rps->m_ref[i] = (rps->delta_poc[i] == ref_dealt_poc);
663*437bfbebSnyanmisaka         }
664*437bfbebSnyanmisaka     }
665*437bfbebSnyanmisaka 
666*437bfbebSnyanmisaka     if (lt_size > 0) {
667*437bfbebSnyanmisaka         for ( i = 0; i < lt_size; i++) {
668*437bfbebSnyanmisaka             h265e_dbg_dpb("numLongTermRefPic %d nShortTerm %d", lt_size, st_size);
669*437bfbebSnyanmisaka             rps->poc[i + st_size] = nLongTermRefPicPoc[i];
670*437bfbebSnyanmisaka             rps->m_RealPoc[i + st_size] = nLongTermRefPicRealPoc[i];
671*437bfbebSnyanmisaka             rps->m_used[i + st_size] = 1;
672*437bfbebSnyanmisaka             rps->delta_poc[i + st_size] = nLongTermDealtPoc[i];
673*437bfbebSnyanmisaka             rps->check_lt_msb[i + st_size] = isMsbValid[i];
674*437bfbebSnyanmisaka             if (cpb->refr.seq_idx == rps->poc[i + st_size])
675*437bfbebSnyanmisaka                 rps->m_ref[i + st_size] = 1;
676*437bfbebSnyanmisaka             else
677*437bfbebSnyanmisaka                 rps->m_ref[i + st_size] = 0;
678*437bfbebSnyanmisaka         }
679*437bfbebSnyanmisaka     }
680*437bfbebSnyanmisaka 
681*437bfbebSnyanmisaka     rps->num_negative_pic = st_size;
682*437bfbebSnyanmisaka     rps->num_positive_pic = 0;
683*437bfbebSnyanmisaka     rps->num_long_term_pic = lt_size;
684*437bfbebSnyanmisaka     rps->m_numberOfPictures = st_size + lt_size;
685*437bfbebSnyanmisaka     slice->m_rps = rps;
686*437bfbebSnyanmisaka     h265e_dpb_apply_rps(dpb, slice->m_rps, curPoc);
687*437bfbebSnyanmisaka     h265e_dpb_arrange_lt_rps(dpb, slice);
688*437bfbebSnyanmisaka     h265e_dpb_set_ref_list(dpb, slice, ref_dealt_poc);
689*437bfbebSnyanmisaka     memcpy(&slice->m_RefPicListModification, RpsList->m_RefPicListModification,
690*437bfbebSnyanmisaka            sizeof(H265eRefPicListModification));
691*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
692*437bfbebSnyanmisaka }
693*437bfbebSnyanmisaka 
h265e_pskip_ref_check(H265eDpb * dpb,EncCpbStatus * cpb,H265eDpbFrm * frm)694*437bfbebSnyanmisaka MPP_RET h265e_pskip_ref_check(H265eDpb *dpb, EncCpbStatus *cpb, H265eDpbFrm *frm)
695*437bfbebSnyanmisaka {
696*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
697*437bfbebSnyanmisaka 
698*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
699*437bfbebSnyanmisaka 
700*437bfbebSnyanmisaka     if ((cpb->curr.force_pskip_is_ref) && (frm->slot_idx == dpb->curr->slice->m_refPicList[0][0]->slot_idx)) {
701*437bfbebSnyanmisaka         h265e_dbg_dpb("hold refr buf as skip frm recon buf, poc %d slot idx %d.", frm->slice->poc, frm->slot_idx);
702*437bfbebSnyanmisaka         ret = MPP_NOK;
703*437bfbebSnyanmisaka     }
704*437bfbebSnyanmisaka 
705*437bfbebSnyanmisaka     if ((cpb->refr.force_pskip_is_ref) && (frm->slot_idx == dpb->curr->slice->m_refPicList[0][0]->prev_ref_idx)) {
706*437bfbebSnyanmisaka         h265e_dbg_dpb("hold refr buf as skip frm recon buf, poc %d slot idx %d.", frm->slice->poc, frm->slot_idx);
707*437bfbebSnyanmisaka         ret = MPP_NOK;
708*437bfbebSnyanmisaka     }
709*437bfbebSnyanmisaka 
710*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
711*437bfbebSnyanmisaka     return ret;
712*437bfbebSnyanmisaka }
713*437bfbebSnyanmisaka 
h265e_dpb_free_unsed(H265eDpb * dpb,EncCpbStatus * cpb)714*437bfbebSnyanmisaka void h265e_dpb_free_unsed(H265eDpb *dpb, EncCpbStatus *cpb)
715*437bfbebSnyanmisaka {
716*437bfbebSnyanmisaka     RK_S32 i = 0;
717*437bfbebSnyanmisaka 
718*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
719*437bfbebSnyanmisaka 
720*437bfbebSnyanmisaka     if (cpb->curr.is_non_ref) {
721*437bfbebSnyanmisaka         H265eDpbFrm *frm = h265e_find_cpb_frame(dpb->frame_list, MAX_REFS, &cpb->curr);
722*437bfbebSnyanmisaka         if (frm) {
723*437bfbebSnyanmisaka             h265e_dbg_dpb("free curr unreference buf poc %d", frm->slice->poc);
724*437bfbebSnyanmisaka             frm->is_long_term = 0;
725*437bfbebSnyanmisaka             frm->used_by_cur = 0;
726*437bfbebSnyanmisaka             frm->dpb_used = 0;
727*437bfbebSnyanmisaka             frm->slice->is_referenced = 0;
728*437bfbebSnyanmisaka         }
729*437bfbebSnyanmisaka     }
730*437bfbebSnyanmisaka 
731*437bfbebSnyanmisaka     for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(dpb->frame_list); i++) {
732*437bfbebSnyanmisaka         H265eDpbFrm *frm = &dpb->frame_list[i];
733*437bfbebSnyanmisaka         if (!frm->dpb_used)
734*437bfbebSnyanmisaka             continue;
735*437bfbebSnyanmisaka         if (h265e_check_frame_cpb(frm, MAX_REFS, &cpb->final[0])) {
736*437bfbebSnyanmisaka             if (!h265e_pskip_ref_check(dpb, cpb, frm)) {
737*437bfbebSnyanmisaka                 h265e_dbg_dpb("cpb final unreference buf poc %d", frm->slice->poc);
738*437bfbebSnyanmisaka                 frm->is_long_term = 0;
739*437bfbebSnyanmisaka                 frm->used_by_cur = 0;
740*437bfbebSnyanmisaka                 frm->dpb_used = 0;
741*437bfbebSnyanmisaka                 frm->slice->is_referenced = 0;
742*437bfbebSnyanmisaka             }
743*437bfbebSnyanmisaka         }
744*437bfbebSnyanmisaka     }
745*437bfbebSnyanmisaka 
746*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
747*437bfbebSnyanmisaka }
748*437bfbebSnyanmisaka 
h265e_dpb_proc_cpb(H265eDpb * dpb,EncCpbStatus * cpb)749*437bfbebSnyanmisaka void h265e_dpb_proc_cpb(H265eDpb *dpb, EncCpbStatus *cpb)
750*437bfbebSnyanmisaka {
751*437bfbebSnyanmisaka     EncFrmStatus *curr = &cpb->curr;
752*437bfbebSnyanmisaka     RK_U32 index = 0, i = 0;
753*437bfbebSnyanmisaka     H265eDpbFrm *p = NULL;
754*437bfbebSnyanmisaka     RK_U32 need_rebuild = 0;
755*437bfbebSnyanmisaka     RK_S32 max_gop_id = 0, max_poc = 0;
756*437bfbebSnyanmisaka 
757*437bfbebSnyanmisaka     if (!dpb || !cpb)
758*437bfbebSnyanmisaka         return;
759*437bfbebSnyanmisaka 
760*437bfbebSnyanmisaka     if (curr->is_idr) {
761*437bfbebSnyanmisaka         for (index = 0; index < MPP_ARRAY_ELEMS(dpb->frame_list); index++) {
762*437bfbebSnyanmisaka             H265eDpbFrm *frame = &dpb->frame_list[index];
763*437bfbebSnyanmisaka             if (frame->inited) {
764*437bfbebSnyanmisaka                 frame->slice->is_referenced = 0;
765*437bfbebSnyanmisaka                 frame->is_long_term = 0;
766*437bfbebSnyanmisaka                 frame->used_by_cur = 0;
767*437bfbebSnyanmisaka                 frame->dpb_used = 0;
768*437bfbebSnyanmisaka                 frame->status.val = 0;
769*437bfbebSnyanmisaka             }
770*437bfbebSnyanmisaka         }
771*437bfbebSnyanmisaka         return;
772*437bfbebSnyanmisaka     }
773*437bfbebSnyanmisaka 
774*437bfbebSnyanmisaka     for (i = 0; i < MAX_CPB_REFS; i++) {
775*437bfbebSnyanmisaka         EncFrmStatus *frm = &cpb->init[i];
776*437bfbebSnyanmisaka 
777*437bfbebSnyanmisaka         if (!frm->valid)
778*437bfbebSnyanmisaka             continue;
779*437bfbebSnyanmisaka 
780*437bfbebSnyanmisaka         mpp_assert(!frm->is_non_ref);
781*437bfbebSnyanmisaka 
782*437bfbebSnyanmisaka         h265e_dbg_dpb("idx %d frm %d valid %d is_non_ref %d lt_ref %d\n",
783*437bfbebSnyanmisaka                       i, frm->seq_idx, frm->valid, frm->is_non_ref, frm->is_lt_ref);
784*437bfbebSnyanmisaka 
785*437bfbebSnyanmisaka         p = h265e_find_cpb_in_dpb(dpb->frame_list, MAX_REFS, frm);
786*437bfbebSnyanmisaka         if (!p->dpb_used) {
787*437bfbebSnyanmisaka             p->dpb_used = 1;
788*437bfbebSnyanmisaka             p->status.val = frm->val;
789*437bfbebSnyanmisaka             p->slice->is_referenced = 1;
790*437bfbebSnyanmisaka             need_rebuild = 1;
791*437bfbebSnyanmisaka         }
792*437bfbebSnyanmisaka     }
793*437bfbebSnyanmisaka 
794*437bfbebSnyanmisaka     if (need_rebuild) {
795*437bfbebSnyanmisaka         h265e_dbg_dpb("cpb roll back found");
796*437bfbebSnyanmisaka         for (index = 0; index < MPP_ARRAY_ELEMS(dpb->frame_list); index++) {
797*437bfbebSnyanmisaka             H265eDpbFrm *frame = &dpb->frame_list[index];
798*437bfbebSnyanmisaka 
799*437bfbebSnyanmisaka             if (frame->dpb_used) {
800*437bfbebSnyanmisaka                 if (max_poc < frame->slice->poc) {
801*437bfbebSnyanmisaka                     max_poc = frame->slice->poc;
802*437bfbebSnyanmisaka                 }
803*437bfbebSnyanmisaka                 if (max_gop_id < frame->slice->gop_idx) {
804*437bfbebSnyanmisaka                     max_gop_id = frame->slice->gop_idx;
805*437bfbebSnyanmisaka                 }
806*437bfbebSnyanmisaka             }
807*437bfbebSnyanmisaka         }
808*437bfbebSnyanmisaka 
809*437bfbebSnyanmisaka         H265eDpbFrm *frame = dpb->curr;
810*437bfbebSnyanmisaka 
811*437bfbebSnyanmisaka         if (frame->inited) {
812*437bfbebSnyanmisaka             frame->slice->is_referenced = 0;
813*437bfbebSnyanmisaka             frame->is_long_term = 0;
814*437bfbebSnyanmisaka             frame->used_by_cur = 0;
815*437bfbebSnyanmisaka             frame->dpb_used = 0;
816*437bfbebSnyanmisaka             frame->status.val = 0;
817*437bfbebSnyanmisaka         }
818*437bfbebSnyanmisaka         dpb->seq_idx = max_poc;
819*437bfbebSnyanmisaka         dpb->gop_idx = max_gop_id;
820*437bfbebSnyanmisaka     }
821*437bfbebSnyanmisaka 
822*437bfbebSnyanmisaka     for (index = 0; index < MPP_ARRAY_ELEMS(dpb->frame_list); index++) {
823*437bfbebSnyanmisaka         H265eDpbFrm *frame = &dpb->frame_list[index];
824*437bfbebSnyanmisaka 
825*437bfbebSnyanmisaka         if (frame->inited && !frame->dpb_used) {
826*437bfbebSnyanmisaka             h265e_dbg_dpb("reset index %d frame->inited %d rame->on_used %x",
827*437bfbebSnyanmisaka                           index, frame->inited, frame->on_used);
828*437bfbebSnyanmisaka             frame->status.val = 0;
829*437bfbebSnyanmisaka         }
830*437bfbebSnyanmisaka     }
831*437bfbebSnyanmisaka }
832*437bfbebSnyanmisaka 
h265e_dpb_build_list(H265eDpb * dpb,EncCpbStatus * cpb)833*437bfbebSnyanmisaka void h265e_dpb_build_list(H265eDpb *dpb, EncCpbStatus *cpb)
834*437bfbebSnyanmisaka {
835*437bfbebSnyanmisaka     RK_S32 poc_cur = dpb->curr->slice->poc;
836*437bfbebSnyanmisaka     H265eSlice* slice = dpb->curr->slice;
837*437bfbebSnyanmisaka     RK_U32 bGPBcheck = 0;
838*437bfbebSnyanmisaka     RK_S32 i;
839*437bfbebSnyanmisaka 
840*437bfbebSnyanmisaka     h265e_dbg_func("enter\n");
841*437bfbebSnyanmisaka     if (get_nal_unit_type(dpb, poc_cur) == NAL_IDR_W_RADL ||
842*437bfbebSnyanmisaka         get_nal_unit_type(dpb, poc_cur) == NAL_IDR_N_LP) {
843*437bfbebSnyanmisaka         dpb->last_idr = poc_cur;
844*437bfbebSnyanmisaka     }
845*437bfbebSnyanmisaka 
846*437bfbebSnyanmisaka     slice->last_idr = dpb->last_idr;
847*437bfbebSnyanmisaka     slice->m_temporalLayerNonReferenceFlag = !slice->is_referenced;
848*437bfbebSnyanmisaka     // Set the nal unit type
849*437bfbebSnyanmisaka     slice->m_nalUnitType = get_nal_unit_type(dpb, poc_cur);
850*437bfbebSnyanmisaka 
851*437bfbebSnyanmisaka     // If the slice is un-referenced, change from _R "referenced" to _N "non-referenced" NAL unit type
852*437bfbebSnyanmisaka     if (slice->m_temporalLayerNonReferenceFlag) {
853*437bfbebSnyanmisaka         switch (slice->m_nalUnitType) {
854*437bfbebSnyanmisaka         case NAL_TRAIL_R:
855*437bfbebSnyanmisaka             slice->m_nalUnitType = NAL_TRAIL_N;
856*437bfbebSnyanmisaka             break;
857*437bfbebSnyanmisaka         case NAL_RADL_R:
858*437bfbebSnyanmisaka             slice->m_nalUnitType = NAL_RADL_N;
859*437bfbebSnyanmisaka             break;
860*437bfbebSnyanmisaka         case NAL_RASL_R:
861*437bfbebSnyanmisaka             slice->m_nalUnitType  = NAL_RASL_N;
862*437bfbebSnyanmisaka             break;
863*437bfbebSnyanmisaka         default:
864*437bfbebSnyanmisaka             break;
865*437bfbebSnyanmisaka         }
866*437bfbebSnyanmisaka     }
867*437bfbebSnyanmisaka 
868*437bfbebSnyanmisaka     // Do decoding refresh marking if any
869*437bfbebSnyanmisaka     h265e_dpb_dec_refresh_marking(dpb, poc_cur, slice->m_nalUnitType);
870*437bfbebSnyanmisaka     h265e_dpb_cpb2rps(dpb, poc_cur, slice, cpb);
871*437bfbebSnyanmisaka 
872*437bfbebSnyanmisaka     slice->m_numRefIdx[L0] =  MPP_MIN(dpb->max_ref_l0, slice->m_rps->m_numberOfPictures); // Ensuring L0 contains just the -ve POC
873*437bfbebSnyanmisaka     slice->m_numRefIdx[L1] =  MPP_MIN(dpb->max_ref_l1, slice->m_rps->m_numberOfPictures);
874*437bfbebSnyanmisaka 
875*437bfbebSnyanmisaka     h265e_slice_set_ref_list(dpb->frame_list, slice);
876*437bfbebSnyanmisaka 
877*437bfbebSnyanmisaka     // Slice type refinement
878*437bfbebSnyanmisaka     if ((slice->m_sliceType == B_SLICE) && (slice->m_numRefIdx[L1] == 0)) {
879*437bfbebSnyanmisaka         slice->m_sliceType = P_SLICE;
880*437bfbebSnyanmisaka     }
881*437bfbebSnyanmisaka 
882*437bfbebSnyanmisaka     if (slice->m_sliceType == B_SLICE) {
883*437bfbebSnyanmisaka         // TODO: Can we estimate this from lookahead?
884*437bfbebSnyanmisaka         slice->m_colFromL0Flag = 0;
885*437bfbebSnyanmisaka 
886*437bfbebSnyanmisaka         RK_U32 bLowDelay = 1;
887*437bfbebSnyanmisaka         RK_S32 curPOC = slice->poc;
888*437bfbebSnyanmisaka         RK_S32 refIdx = 0;
889*437bfbebSnyanmisaka 
890*437bfbebSnyanmisaka         for (refIdx = 0; refIdx < slice->m_numRefIdx[L0] && bLowDelay; refIdx++) {
891*437bfbebSnyanmisaka             if (slice->m_refPicList[L0][refIdx]->poc > curPOC) {
892*437bfbebSnyanmisaka                 bLowDelay = 0;
893*437bfbebSnyanmisaka             }
894*437bfbebSnyanmisaka         }
895*437bfbebSnyanmisaka 
896*437bfbebSnyanmisaka         for (refIdx = 0; refIdx < slice->m_numRefIdx[L1] && bLowDelay; refIdx++) {
897*437bfbebSnyanmisaka             if (slice->m_refPicList[L1][refIdx]->poc > curPOC) {
898*437bfbebSnyanmisaka                 bLowDelay = 0;
899*437bfbebSnyanmisaka             }
900*437bfbebSnyanmisaka         }
901*437bfbebSnyanmisaka 
902*437bfbebSnyanmisaka         slice->m_bCheckLDC = bLowDelay;
903*437bfbebSnyanmisaka     } else {
904*437bfbebSnyanmisaka         slice->m_bCheckLDC = 1;
905*437bfbebSnyanmisaka     }
906*437bfbebSnyanmisaka 
907*437bfbebSnyanmisaka     h265e_slice_set_ref_poc_list(slice);
908*437bfbebSnyanmisaka     if (slice->m_sliceType == B_SLICE) {
909*437bfbebSnyanmisaka         if (slice->m_numRefIdx[L0] == slice->m_numRefIdx[L1]) {
910*437bfbebSnyanmisaka             bGPBcheck = 0;
911*437bfbebSnyanmisaka             for (i = 0; i < slice->m_numRefIdx[L1]; i++) {
912*437bfbebSnyanmisaka                 if (slice->m_refPOCList[L1][i] != slice->m_refPOCList[L0][i]) {
913*437bfbebSnyanmisaka                     bGPBcheck = 0;
914*437bfbebSnyanmisaka                     break;
915*437bfbebSnyanmisaka                 }
916*437bfbebSnyanmisaka             }
917*437bfbebSnyanmisaka         }
918*437bfbebSnyanmisaka     }
919*437bfbebSnyanmisaka 
920*437bfbebSnyanmisaka     slice->m_bLMvdL1Zero = bGPBcheck;
921*437bfbebSnyanmisaka     slice->m_nextSlice = 0;
922*437bfbebSnyanmisaka     if (slice->m_sliceType == I_SLICE) {
923*437bfbebSnyanmisaka         slice->tot_poc_num = 0;
924*437bfbebSnyanmisaka     } else {
925*437bfbebSnyanmisaka         slice->tot_poc_num = slice->m_localRPS.m_numberOfPictures;
926*437bfbebSnyanmisaka     }
927*437bfbebSnyanmisaka     h265e_dpb_free_unsed(dpb, cpb);
928*437bfbebSnyanmisaka     h265e_dbg_func("leave\n");
929*437bfbebSnyanmisaka }
930*437bfbebSnyanmisaka 
h265e_dpb_hal_start(H265eDpb * dpb,RK_S32 slot_idx)931*437bfbebSnyanmisaka MPP_RET h265e_dpb_hal_start(H265eDpb *dpb, RK_S32 slot_idx)
932*437bfbebSnyanmisaka {
933*437bfbebSnyanmisaka     H265eDpbFrm *frm = &dpb->frame_list[slot_idx];
934*437bfbebSnyanmisaka 
935*437bfbebSnyanmisaka     frm->hal_used++;
936*437bfbebSnyanmisaka     //h265e_dpb_dump_frms(dpb);
937*437bfbebSnyanmisaka     return MPP_OK;
938*437bfbebSnyanmisaka }
939*437bfbebSnyanmisaka 
h265e_dpb_hal_end(H265eDpb * dpb,RK_S32 slot_idx)940*437bfbebSnyanmisaka MPP_RET h265e_dpb_hal_end(H265eDpb *dpb, RK_S32 slot_idx)
941*437bfbebSnyanmisaka {
942*437bfbebSnyanmisaka     H265eDpbFrm *frm = &dpb->frame_list[slot_idx];
943*437bfbebSnyanmisaka 
944*437bfbebSnyanmisaka     frm->hal_used--;
945*437bfbebSnyanmisaka     //h265e_dpb_dump_frms(dpb);
946*437bfbebSnyanmisaka     return MPP_OK;
947*437bfbebSnyanmisaka }
948