xref: /rockchip-linux_mpp/mpp/codec/dec/h265/h265d_parser.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  *
3*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka  *
5*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka  * You may obtain a copy of the License at
8*437bfbebSnyanmisaka  *
9*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka  *
11*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka  * limitations under the License.
16*437bfbebSnyanmisaka  */
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka /*
19*437bfbebSnyanmisaka  * @file       h265d_parser.c
20*437bfbebSnyanmisaka  * @brief
21*437bfbebSnyanmisaka  * @author      csy(csy@rock-chips.com)
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka  * @version     1.0.0
24*437bfbebSnyanmisaka  * @history
25*437bfbebSnyanmisaka  *   2015.7.15 : Create
26*437bfbebSnyanmisaka  */
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #define MODULE_TAG "H265D_PARSER"
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka #include "mpp_env.h"
31*437bfbebSnyanmisaka #include "mpp_mem.h"
32*437bfbebSnyanmisaka #include "mpp_bitread.h"
33*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
34*437bfbebSnyanmisaka #include "rk_hdr_meta_com.h"
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka #include "h265d_parser.h"
37*437bfbebSnyanmisaka #include "h265d_syntax.h"
38*437bfbebSnyanmisaka #include "h265d_api.h"
39*437bfbebSnyanmisaka #include "h2645d_sei.h"
40*437bfbebSnyanmisaka 
41*437bfbebSnyanmisaka #define START_CODE 0x000001 ///< start_code_prefix_one_3bytes
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka RK_U32 h265d_debug;
44*437bfbebSnyanmisaka #ifdef dump
45*437bfbebSnyanmisaka FILE *fp = NULL;
46*437bfbebSnyanmisaka #endif
47*437bfbebSnyanmisaka //static RK_U32 start_write = 0, value = 0;
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka // for hevc max ctu size 64
rkv_ctu_64_align(RK_U32 val)50*437bfbebSnyanmisaka static RK_U32 rkv_ctu_64_align(RK_U32 val)
51*437bfbebSnyanmisaka {
52*437bfbebSnyanmisaka     return MPP_ALIGN(val, 64);
53*437bfbebSnyanmisaka }
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka /**
56*437bfbebSnyanmisaka  * Find the end of the current frame in the bitstream.
57*437bfbebSnyanmisaka  * @return the position of the first byte of the next frame, or END_NOT_FOUND
58*437bfbebSnyanmisaka  */
hevc_find_frame_end(SplitContext_t * sc,const RK_U8 * buf,int buf_size)59*437bfbebSnyanmisaka static RK_S32 hevc_find_frame_end(SplitContext_t *sc, const RK_U8 *buf,
60*437bfbebSnyanmisaka                                   int buf_size)
61*437bfbebSnyanmisaka {
62*437bfbebSnyanmisaka     RK_S32 i;
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka     for (i = 0; i < buf_size; i++) {
65*437bfbebSnyanmisaka         int nut, layer_id;
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka         sc->state64 = (sc->state64 << 8) | buf[i];
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka         if (((sc->state64 >> 3 * 8) & 0xFFFFFF) != START_CODE)
70*437bfbebSnyanmisaka             continue;
71*437bfbebSnyanmisaka         nut = (sc->state64 >> (2 * 8 + 1)) & 0x3F;
72*437bfbebSnyanmisaka         layer_id  =  (((sc->state64 >> 2 * 8) & 0x01) << 5) + (((sc->state64 >> 1 * 8) & 0xF8) >> 3);
73*437bfbebSnyanmisaka         //mpp_log("nut = %d layer_id = %d\n",nut,layer_id);
74*437bfbebSnyanmisaka         // Beginning of access unit
75*437bfbebSnyanmisaka         if ((nut >= NAL_VPS && nut <= NAL_AUD) || nut == NAL_SEI_PREFIX ||
76*437bfbebSnyanmisaka             (nut >= 41 && nut <= 44) || (nut >= 48 && nut <= 55)) {
77*437bfbebSnyanmisaka             if (sc->frame_start_found && !layer_id) {
78*437bfbebSnyanmisaka                 sc->frame_start_found = 0;
79*437bfbebSnyanmisaka                 return i - 5;
80*437bfbebSnyanmisaka             }
81*437bfbebSnyanmisaka         } else if (nut <= NAL_RASL_R ||
82*437bfbebSnyanmisaka                    (nut >= NAL_BLA_W_LP && nut <= NAL_CRA_NUT)) {
83*437bfbebSnyanmisaka             int first_slice_segment_in_pic_flag = buf[i] >> 7;
84*437bfbebSnyanmisaka             //mpp_log("nut = %d first_slice_segment_in_pic_flag %d layer_id = %d \n",nut,
85*437bfbebSnyanmisaka             //    first_slice_segment_in_pic_flag,
86*437bfbebSnyanmisaka             //     layer_id);
87*437bfbebSnyanmisaka             if (first_slice_segment_in_pic_flag && !layer_id) {
88*437bfbebSnyanmisaka                 if (!sc->frame_start_found) {
89*437bfbebSnyanmisaka                     sc->frame_start_found = 1;
90*437bfbebSnyanmisaka                 } else { // First slice of next frame found
91*437bfbebSnyanmisaka                     sc->frame_start_found = 0;
92*437bfbebSnyanmisaka                     return i - 5;
93*437bfbebSnyanmisaka                 }
94*437bfbebSnyanmisaka             }
95*437bfbebSnyanmisaka         }
96*437bfbebSnyanmisaka     }
97*437bfbebSnyanmisaka     return END_NOT_FOUND;
98*437bfbebSnyanmisaka }
99*437bfbebSnyanmisaka 
mpp_combine_frame(SplitContext_t * sc,RK_S32 next,const RK_U8 ** buf,RK_S32 * buf_size)100*437bfbebSnyanmisaka static RK_S32 mpp_combine_frame(SplitContext_t *sc, RK_S32 next, const RK_U8 **buf, RK_S32 *buf_size)
101*437bfbebSnyanmisaka {
102*437bfbebSnyanmisaka     if (sc->overread) {
103*437bfbebSnyanmisaka         mpp_log("overread %d, state:%X next:%d index:%d o_index:%d\n",
104*437bfbebSnyanmisaka                 sc->overread, sc->state, next, sc->index, sc->overread_index);
105*437bfbebSnyanmisaka         mpp_log("%X %X %X %X\n", (*buf)[0], (*buf)[1], (*buf)[2], (*buf)[3]);
106*437bfbebSnyanmisaka     }
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka     /* Copy overread bytes from last frame into buffer. */
109*437bfbebSnyanmisaka     for (; sc->overread > 0; sc->overread--) {
110*437bfbebSnyanmisaka         sc->buffer[sc->index++] = sc->buffer[sc->overread_index++];
111*437bfbebSnyanmisaka     }
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     /* flush remaining if EOF */
114*437bfbebSnyanmisaka     if (!*buf_size && next == END_NOT_FOUND) {
115*437bfbebSnyanmisaka         next = 0;
116*437bfbebSnyanmisaka     }
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     sc->last_index = sc->index;
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka     /* copy into buffer end return */
121*437bfbebSnyanmisaka     if (next == END_NOT_FOUND) {
122*437bfbebSnyanmisaka         RK_U32 min_size = (*buf_size) + sc->index + MPP_INPUT_BUFFER_PADDING_SIZE;
123*437bfbebSnyanmisaka         void* new_buffer;
124*437bfbebSnyanmisaka         if (min_size > sc->buffer_size) {
125*437bfbebSnyanmisaka             min_size = MPP_MAX(17 * min_size / 16 + 32, min_size);
126*437bfbebSnyanmisaka             new_buffer = mpp_realloc(sc->buffer, RK_U8, min_size);
127*437bfbebSnyanmisaka             if (!new_buffer) {
128*437bfbebSnyanmisaka                 sc->buffer_size = 0;
129*437bfbebSnyanmisaka                 return MPP_ERR_NOMEM;
130*437bfbebSnyanmisaka             }
131*437bfbebSnyanmisaka             sc->buffer_size = min_size;
132*437bfbebSnyanmisaka             sc->buffer = new_buffer;
133*437bfbebSnyanmisaka         }
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka         memcpy(&sc->buffer[sc->index], *buf, *buf_size);
136*437bfbebSnyanmisaka         sc->index += *buf_size;
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka         return -1;
139*437bfbebSnyanmisaka     }
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka     *buf_size =
142*437bfbebSnyanmisaka         sc->overread_index = sc->index + next;
143*437bfbebSnyanmisaka 
144*437bfbebSnyanmisaka     /* append to buffer */
145*437bfbebSnyanmisaka     if (sc->index) {
146*437bfbebSnyanmisaka         RK_U32 min_size = next + sc->index + MPP_INPUT_BUFFER_PADDING_SIZE;
147*437bfbebSnyanmisaka         void* new_buffer;
148*437bfbebSnyanmisaka         if (min_size > sc->buffer_size) {
149*437bfbebSnyanmisaka             min_size = MPP_MAX(17 * min_size / 16 + 32, min_size);
150*437bfbebSnyanmisaka             new_buffer = mpp_realloc(sc->buffer, RK_U8, min_size);
151*437bfbebSnyanmisaka             if (!new_buffer) {
152*437bfbebSnyanmisaka                 sc->buffer_size = 0;
153*437bfbebSnyanmisaka                 return MPP_ERR_NOMEM;
154*437bfbebSnyanmisaka             }
155*437bfbebSnyanmisaka             sc->buffer_size = min_size;
156*437bfbebSnyanmisaka             sc->buffer = new_buffer;
157*437bfbebSnyanmisaka         }
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka         if (next > -MPP_INPUT_BUFFER_PADDING_SIZE)
160*437bfbebSnyanmisaka             memcpy(&sc->buffer[sc->index], *buf,
161*437bfbebSnyanmisaka                    next + MPP_INPUT_BUFFER_PADDING_SIZE);
162*437bfbebSnyanmisaka         sc->index = 0;
163*437bfbebSnyanmisaka         *buf = sc->buffer;
164*437bfbebSnyanmisaka     }
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka     /* store overread bytes */
167*437bfbebSnyanmisaka     for (; next < 0; next++) {
168*437bfbebSnyanmisaka         sc->state = (sc->state << 8) | sc->buffer[sc->last_index + next];
169*437bfbebSnyanmisaka         sc->state64 = (sc->state64 << 8) | sc->buffer[sc->last_index + next];
170*437bfbebSnyanmisaka         sc->overread++;
171*437bfbebSnyanmisaka     }
172*437bfbebSnyanmisaka 
173*437bfbebSnyanmisaka     if (sc->overread) {
174*437bfbebSnyanmisaka         mpp_log("overread %d, state:%X next:%d index:%d o_index:%d\n",
175*437bfbebSnyanmisaka                 sc->overread, sc->state, next, sc->index, sc->overread_index);
176*437bfbebSnyanmisaka         mpp_log("%X %X %X %X\n", (*buf)[0], (*buf)[1], (*buf)[2], (*buf)[3]);
177*437bfbebSnyanmisaka     }
178*437bfbebSnyanmisaka 
179*437bfbebSnyanmisaka     return 0;
180*437bfbebSnyanmisaka }
181*437bfbebSnyanmisaka 
h265d_split_init(void ** sc)182*437bfbebSnyanmisaka static RK_S32 h265d_split_init(void **sc)
183*437bfbebSnyanmisaka {
184*437bfbebSnyanmisaka     SplitContext_t *s = NULL;
185*437bfbebSnyanmisaka     if (s == NULL) {
186*437bfbebSnyanmisaka         s = mpp_calloc(SplitContext_t, 1);
187*437bfbebSnyanmisaka         if (s != NULL) {
188*437bfbebSnyanmisaka             *sc = s;
189*437bfbebSnyanmisaka         } else {
190*437bfbebSnyanmisaka             mpp_err("split alloc context fail");
191*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
192*437bfbebSnyanmisaka         }
193*437bfbebSnyanmisaka     }
194*437bfbebSnyanmisaka     s->buffer = mpp_malloc(RK_U8, MAX_FRAME_SIZE);
195*437bfbebSnyanmisaka     s->buffer_size = MAX_FRAME_SIZE;
196*437bfbebSnyanmisaka     s->fetch_timestamp = 1;
197*437bfbebSnyanmisaka     return MPP_OK;
198*437bfbebSnyanmisaka }
199*437bfbebSnyanmisaka 
mpp_fetch_timestamp(SplitContext_t * s,RK_S32 off)200*437bfbebSnyanmisaka static void mpp_fetch_timestamp(SplitContext_t *s, RK_S32 off)
201*437bfbebSnyanmisaka {
202*437bfbebSnyanmisaka     RK_S32 i;
203*437bfbebSnyanmisaka 
204*437bfbebSnyanmisaka     s->dts = s->pts = -1;
205*437bfbebSnyanmisaka     s->offset = 0;
206*437bfbebSnyanmisaka     for (i = 0; i < MPP_PARSER_PTS_NB; i++) {
207*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_TIME, "s->cur_offset %lld s->cur_frame_offset[%d] %lld s->frame_offset %lld s->next_frame_offset %lld",
208*437bfbebSnyanmisaka                   s->cur_offset, i, s->cur_frame_offset[i], s->frame_offset, s->next_frame_offset);
209*437bfbebSnyanmisaka         if ( s->cur_offset + off >= s->cur_frame_offset[i]
210*437bfbebSnyanmisaka              && (s->frame_offset < s->cur_frame_offset[i] ||
211*437bfbebSnyanmisaka                  (!s->frame_offset && !s->next_frame_offset)) // first field/frame
212*437bfbebSnyanmisaka              // check disabled since MPEG-TS does not send complete PES packets
213*437bfbebSnyanmisaka              && /*s->next_frame_offset + off <*/  s->cur_frame_end[i]) {
214*437bfbebSnyanmisaka             s->dts = s->cur_frame_dts[i];
215*437bfbebSnyanmisaka             s->pts = s->cur_frame_pts[i];
216*437bfbebSnyanmisaka             s->offset = s->next_frame_offset - s->cur_frame_offset[i];
217*437bfbebSnyanmisaka             if (s->cur_offset + off < s->cur_frame_end[i])
218*437bfbebSnyanmisaka                 break;
219*437bfbebSnyanmisaka         }
220*437bfbebSnyanmisaka     }
221*437bfbebSnyanmisaka }
h265d_split_frame(void * sc,const RK_U8 ** poutbuf,RK_S32 * poutbuf_size,const RK_U8 * buf,RK_S32 buf_size,RK_S64 pts,RK_S64 dts)222*437bfbebSnyanmisaka static RK_S32 h265d_split_frame(void *sc,
223*437bfbebSnyanmisaka                                 const RK_U8 **poutbuf, RK_S32 *poutbuf_size,
224*437bfbebSnyanmisaka                                 const RK_U8 *buf, RK_S32 buf_size, RK_S64 pts,
225*437bfbebSnyanmisaka                                 RK_S64 dts)
226*437bfbebSnyanmisaka {
227*437bfbebSnyanmisaka     RK_S32 next, i;
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka     SplitContext_t *s = (SplitContext_t*)sc;
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka     if (s->cur_offset + buf_size !=
232*437bfbebSnyanmisaka         s->cur_frame_end[s->cur_frame_start_index]) { /* skip remainder packets */
233*437bfbebSnyanmisaka         /* add a new packet descriptor */
234*437bfbebSnyanmisaka         i = (s->cur_frame_start_index + 1) & (MPP_PARSER_PTS_NB - 1);
235*437bfbebSnyanmisaka         s->cur_frame_start_index = i;
236*437bfbebSnyanmisaka         s->cur_frame_offset[i] = s->cur_offset;
237*437bfbebSnyanmisaka         s->cur_frame_end[i] = s->cur_offset + buf_size;
238*437bfbebSnyanmisaka         s->cur_frame_pts[i] = pts;
239*437bfbebSnyanmisaka         s->cur_frame_dts[i] = dts;
240*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_TIME, "s->cur_frame_start_index = %d,cur_frame_offset = %lld,s->cur_frame_end = %lld pts = %lld",
241*437bfbebSnyanmisaka                   s->cur_frame_start_index, s->cur_frame_offset[i], s->cur_frame_end[i], pts);
242*437bfbebSnyanmisaka     }
243*437bfbebSnyanmisaka 
244*437bfbebSnyanmisaka     if (s->fetch_timestamp) {
245*437bfbebSnyanmisaka         s->fetch_timestamp = 0;
246*437bfbebSnyanmisaka         s->last_pts = s->pts;
247*437bfbebSnyanmisaka         s->last_dts = s->dts;
248*437bfbebSnyanmisaka         mpp_fetch_timestamp(s, 0);
249*437bfbebSnyanmisaka     }
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka     if (s->eos && !buf_size) {
252*437bfbebSnyanmisaka         *poutbuf      = s->buffer;
253*437bfbebSnyanmisaka         *poutbuf_size = s->index;
254*437bfbebSnyanmisaka         return 0;
255*437bfbebSnyanmisaka     }
256*437bfbebSnyanmisaka 
257*437bfbebSnyanmisaka     next = hevc_find_frame_end(s, buf, buf_size);
258*437bfbebSnyanmisaka     if (s->eos && buf_size && next == END_NOT_FOUND) {
259*437bfbebSnyanmisaka         next = buf_size;
260*437bfbebSnyanmisaka     }
261*437bfbebSnyanmisaka 
262*437bfbebSnyanmisaka     if (mpp_combine_frame(s, next, &buf, &buf_size) < 0) {
263*437bfbebSnyanmisaka         *poutbuf      = NULL;
264*437bfbebSnyanmisaka         *poutbuf_size = 0;
265*437bfbebSnyanmisaka         s->cur_offset += buf_size;
266*437bfbebSnyanmisaka         return buf_size;
267*437bfbebSnyanmisaka     }
268*437bfbebSnyanmisaka 
269*437bfbebSnyanmisaka     *poutbuf      = buf;
270*437bfbebSnyanmisaka     *poutbuf_size = buf_size;
271*437bfbebSnyanmisaka 
272*437bfbebSnyanmisaka     if (next < 0)
273*437bfbebSnyanmisaka         next = 0;
274*437bfbebSnyanmisaka 
275*437bfbebSnyanmisaka     if (*poutbuf_size) {
276*437bfbebSnyanmisaka         /* fill the data for the current frame */
277*437bfbebSnyanmisaka         s->frame_offset = s->next_frame_offset;
278*437bfbebSnyanmisaka 
279*437bfbebSnyanmisaka         /* offset of the next frame */
280*437bfbebSnyanmisaka         s->next_frame_offset = s->cur_offset + next;
281*437bfbebSnyanmisaka         s->fetch_timestamp = 1;
282*437bfbebSnyanmisaka     }
283*437bfbebSnyanmisaka 
284*437bfbebSnyanmisaka     s->cur_offset += next;
285*437bfbebSnyanmisaka     return next;
286*437bfbebSnyanmisaka }
287*437bfbebSnyanmisaka 
h265d_split_reset(void * sc)288*437bfbebSnyanmisaka static RK_S32 h265d_split_reset(void *sc)
289*437bfbebSnyanmisaka {
290*437bfbebSnyanmisaka     RK_U8 *buf = NULL;
291*437bfbebSnyanmisaka     RK_U32 size = 0;
292*437bfbebSnyanmisaka     SplitContext_t *s = (SplitContext_t*)sc;
293*437bfbebSnyanmisaka     if (sc == NULL) {
294*437bfbebSnyanmisaka         return MPP_OK;
295*437bfbebSnyanmisaka     }
296*437bfbebSnyanmisaka     buf = s->buffer;
297*437bfbebSnyanmisaka     size = s->buffer_size;
298*437bfbebSnyanmisaka     memset(s, 0, sizeof(SplitContext_t));
299*437bfbebSnyanmisaka     s->fetch_timestamp = 1;
300*437bfbebSnyanmisaka     s->buffer = buf;
301*437bfbebSnyanmisaka     s->buffer_size = size;
302*437bfbebSnyanmisaka     s->eos = 0;
303*437bfbebSnyanmisaka     return MPP_OK;
304*437bfbebSnyanmisaka }
305*437bfbebSnyanmisaka 
306*437bfbebSnyanmisaka 
h265d_split_deinit(void * sc)307*437bfbebSnyanmisaka static RK_S32 h265d_split_deinit(void *sc)
308*437bfbebSnyanmisaka {
309*437bfbebSnyanmisaka     SplitContext_t *s = (SplitContext_t *)sc;
310*437bfbebSnyanmisaka     if (s->buffer) {
311*437bfbebSnyanmisaka         mpp_free(s->buffer);
312*437bfbebSnyanmisaka         s->buffer = NULL;
313*437bfbebSnyanmisaka     }
314*437bfbebSnyanmisaka     if (s) {
315*437bfbebSnyanmisaka         mpp_free(s);
316*437bfbebSnyanmisaka         s = NULL;
317*437bfbebSnyanmisaka     }
318*437bfbebSnyanmisaka     return MPP_OK;
319*437bfbebSnyanmisaka }
320*437bfbebSnyanmisaka 
pred_weight_table(HEVCContext * s,BitReadCtx_t * gb)321*437bfbebSnyanmisaka static RK_S32 pred_weight_table(HEVCContext *s, BitReadCtx_t *gb)
322*437bfbebSnyanmisaka {
323*437bfbebSnyanmisaka     RK_U32 i = 0;
324*437bfbebSnyanmisaka     RK_U32 j = 0;
325*437bfbebSnyanmisaka     RK_U8  luma_weight_l0_flag[16];
326*437bfbebSnyanmisaka     RK_U8  chroma_weight_l0_flag[16];
327*437bfbebSnyanmisaka     RK_U8  luma_weight_l1_flag[16];
328*437bfbebSnyanmisaka     RK_U8  chroma_weight_l1_flag[16];
329*437bfbebSnyanmisaka 
330*437bfbebSnyanmisaka     READ_UE(gb, &s->sh.luma_log2_weight_denom);
331*437bfbebSnyanmisaka     if (s->sps->chroma_format_idc != 0) {
332*437bfbebSnyanmisaka         RK_S32 delta = 0;
333*437bfbebSnyanmisaka         READ_SE(gb, &delta);
334*437bfbebSnyanmisaka         s->sh.chroma_log2_weight_denom = mpp_clip(s->sh.luma_log2_weight_denom + delta, 0, 7);
335*437bfbebSnyanmisaka     }
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka     for (i = 0; i < s->sh.nb_refs[L0]; i++) {
338*437bfbebSnyanmisaka         READ_ONEBIT(gb, &luma_weight_l0_flag[i]);
339*437bfbebSnyanmisaka         if (!luma_weight_l0_flag[i]) {
340*437bfbebSnyanmisaka             s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
341*437bfbebSnyanmisaka             s->sh.luma_offset_l0[i] = 0;
342*437bfbebSnyanmisaka         }
343*437bfbebSnyanmisaka     }
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka     if (s->sps->chroma_format_idc != 0) { // FIXME: invert "if" and "for"
346*437bfbebSnyanmisaka         for (i = 0; i < s->sh.nb_refs[L0]; i++) {
347*437bfbebSnyanmisaka             READ_ONEBIT(gb, &chroma_weight_l0_flag[i]);
348*437bfbebSnyanmisaka         }
349*437bfbebSnyanmisaka     } else {
350*437bfbebSnyanmisaka         for (i = 0; i < s->sh.nb_refs[L0]; i++)
351*437bfbebSnyanmisaka             chroma_weight_l0_flag[i] = 0;
352*437bfbebSnyanmisaka     }
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka     for (i = 0; i < s->sh.nb_refs[L0]; i++) {
355*437bfbebSnyanmisaka         if (luma_weight_l0_flag[i]) {
356*437bfbebSnyanmisaka             RK_S32 delta_luma_weight_l0 = 0;
357*437bfbebSnyanmisaka             READ_SE(gb, &delta_luma_weight_l0);
358*437bfbebSnyanmisaka             s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
359*437bfbebSnyanmisaka             READ_SE(gb, &s->sh.luma_offset_l0[i]);
360*437bfbebSnyanmisaka         }
361*437bfbebSnyanmisaka         if (chroma_weight_l0_flag[i]) {
362*437bfbebSnyanmisaka             for (j = 0; j < 2; j++) {
363*437bfbebSnyanmisaka                 RK_S32 delta_chroma_weight_l0 = 0;
364*437bfbebSnyanmisaka                 RK_S32 delta_chroma_offset_l0 = 0;
365*437bfbebSnyanmisaka                 READ_SE(gb, &delta_chroma_weight_l0);
366*437bfbebSnyanmisaka                 READ_SE(gb, &delta_chroma_offset_l0);
367*437bfbebSnyanmisaka                 s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
368*437bfbebSnyanmisaka                 s->sh.chroma_offset_l0[i][j] = mpp_clip((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
369*437bfbebSnyanmisaka                                                                                    >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
370*437bfbebSnyanmisaka             }
371*437bfbebSnyanmisaka         } else {
372*437bfbebSnyanmisaka             s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
373*437bfbebSnyanmisaka             s->sh.chroma_offset_l0[i][0] = 0;
374*437bfbebSnyanmisaka             s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
375*437bfbebSnyanmisaka             s->sh.chroma_offset_l0[i][1] = 0;
376*437bfbebSnyanmisaka         }
377*437bfbebSnyanmisaka     }
378*437bfbebSnyanmisaka 
379*437bfbebSnyanmisaka     if (s->sh.slice_type == B_SLICE) {
380*437bfbebSnyanmisaka         for (i = 0; i < s->sh.nb_refs[L1]; i++) {
381*437bfbebSnyanmisaka             READ_ONEBIT(gb, &luma_weight_l1_flag[i]);
382*437bfbebSnyanmisaka             if (!luma_weight_l1_flag[i]) {
383*437bfbebSnyanmisaka                 s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
384*437bfbebSnyanmisaka                 s->sh.luma_offset_l1[i] = 0;
385*437bfbebSnyanmisaka             }
386*437bfbebSnyanmisaka         }
387*437bfbebSnyanmisaka         if (s->sps->chroma_format_idc != 0) {
388*437bfbebSnyanmisaka             for (i = 0; i < s->sh.nb_refs[L1]; i++)
389*437bfbebSnyanmisaka                 READ_ONEBIT(gb, &chroma_weight_l1_flag[i]);
390*437bfbebSnyanmisaka         } else {
391*437bfbebSnyanmisaka             for (i = 0; i < s->sh.nb_refs[L1]; i++)
392*437bfbebSnyanmisaka                 chroma_weight_l1_flag[i] = 0;
393*437bfbebSnyanmisaka         }
394*437bfbebSnyanmisaka         for (i = 0; i < s->sh.nb_refs[L1]; i++) {
395*437bfbebSnyanmisaka             if (luma_weight_l1_flag[i]) {
396*437bfbebSnyanmisaka                 RK_S32 delta_luma_weight_l1 = 0;
397*437bfbebSnyanmisaka                 READ_UE(gb, &delta_luma_weight_l1);
398*437bfbebSnyanmisaka                 s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
399*437bfbebSnyanmisaka                 READ_SE(gb, &s->sh.luma_offset_l1[i]);
400*437bfbebSnyanmisaka             }
401*437bfbebSnyanmisaka             if (chroma_weight_l1_flag[i]) {
402*437bfbebSnyanmisaka                 for (j = 0; j < 2; j++) {
403*437bfbebSnyanmisaka                     RK_S32 delta_chroma_weight_l1 = 0;
404*437bfbebSnyanmisaka                     RK_S32 delta_chroma_offset_l1 = 0;
405*437bfbebSnyanmisaka                     READ_SE(gb, &delta_chroma_weight_l1);
406*437bfbebSnyanmisaka                     READ_SE(gb, &delta_chroma_offset_l1);
407*437bfbebSnyanmisaka                     s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
408*437bfbebSnyanmisaka                     s->sh.chroma_offset_l1[i][j] = mpp_clip((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
409*437bfbebSnyanmisaka                                                                                        >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
410*437bfbebSnyanmisaka                 }
411*437bfbebSnyanmisaka             } else {
412*437bfbebSnyanmisaka                 s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
413*437bfbebSnyanmisaka                 s->sh.chroma_offset_l1[i][0] = 0;
414*437bfbebSnyanmisaka                 s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
415*437bfbebSnyanmisaka                 s->sh.chroma_offset_l1[i][1] = 0;
416*437bfbebSnyanmisaka             }
417*437bfbebSnyanmisaka         }
418*437bfbebSnyanmisaka     }
419*437bfbebSnyanmisaka     return 0;
420*437bfbebSnyanmisaka __BITREAD_ERR:
421*437bfbebSnyanmisaka     return  MPP_ERR_STREAM;
422*437bfbebSnyanmisaka }
423*437bfbebSnyanmisaka 
decode_lt_rps(HEVCContext * s,LongTermRPS * rps,BitReadCtx_t * gb)424*437bfbebSnyanmisaka static RK_S32 decode_lt_rps(HEVCContext *s, LongTermRPS *rps, BitReadCtx_t *gb)
425*437bfbebSnyanmisaka {
426*437bfbebSnyanmisaka     const HEVCSPS *sps = s->sps;
427*437bfbebSnyanmisaka     RK_S32 max_poc_lsb    = 1 << sps->log2_max_poc_lsb;
428*437bfbebSnyanmisaka     RK_S32 prev_delta_msb = 0;
429*437bfbebSnyanmisaka     RK_U32 nb_sps = 0, nb_sh;
430*437bfbebSnyanmisaka     RK_S32 i;
431*437bfbebSnyanmisaka 
432*437bfbebSnyanmisaka     RK_S32 bit_begin = gb->used_bits;
433*437bfbebSnyanmisaka     s->rps_bit_offset[s->slice_idx] =
434*437bfbebSnyanmisaka         s->rps_bit_offset_st[s->slice_idx];
435*437bfbebSnyanmisaka 
436*437bfbebSnyanmisaka     rps->nb_refs = 0;
437*437bfbebSnyanmisaka     if (!sps->long_term_ref_pics_present_flag)
438*437bfbebSnyanmisaka         return 0;
439*437bfbebSnyanmisaka 
440*437bfbebSnyanmisaka     if (sps->num_long_term_ref_pics_sps > 0)
441*437bfbebSnyanmisaka         READ_UE(gb, &nb_sps);
442*437bfbebSnyanmisaka 
443*437bfbebSnyanmisaka     READ_UE(gb, &nb_sh);
444*437bfbebSnyanmisaka 
445*437bfbebSnyanmisaka     if (nb_sh + nb_sps > MPP_ARRAY_ELEMS(rps->poc))
446*437bfbebSnyanmisaka         return  MPP_ERR_STREAM;
447*437bfbebSnyanmisaka 
448*437bfbebSnyanmisaka     rps->nb_refs = nb_sh + nb_sps;
449*437bfbebSnyanmisaka 
450*437bfbebSnyanmisaka     for (i = 0; i < rps->nb_refs; i++) {
451*437bfbebSnyanmisaka         RK_U8 delta_poc_msb_present;
452*437bfbebSnyanmisaka 
453*437bfbebSnyanmisaka         if ((RK_U32)i < nb_sps) {
454*437bfbebSnyanmisaka             RK_U8 lt_idx_sps = 0;
455*437bfbebSnyanmisaka 
456*437bfbebSnyanmisaka             if (sps->num_long_term_ref_pics_sps > 1)
457*437bfbebSnyanmisaka                 READ_BITS(gb, mpp_ceil_log2(sps->num_long_term_ref_pics_sps), &lt_idx_sps);
458*437bfbebSnyanmisaka 
459*437bfbebSnyanmisaka             rps->poc[i]  = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
460*437bfbebSnyanmisaka             rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
461*437bfbebSnyanmisaka         } else {
462*437bfbebSnyanmisaka             READ_BITS(gb, sps->log2_max_poc_lsb, &rps->poc[i]);
463*437bfbebSnyanmisaka             READ_ONEBIT(gb, &rps->used[i]);
464*437bfbebSnyanmisaka         }
465*437bfbebSnyanmisaka 
466*437bfbebSnyanmisaka         READ_ONEBIT(gb, &delta_poc_msb_present);
467*437bfbebSnyanmisaka         if (delta_poc_msb_present) {
468*437bfbebSnyanmisaka             RK_S32 delta = 0;
469*437bfbebSnyanmisaka 
470*437bfbebSnyanmisaka             READ_UE(gb, &delta);
471*437bfbebSnyanmisaka 
472*437bfbebSnyanmisaka             if (i && (RK_U32)i != nb_sps)
473*437bfbebSnyanmisaka                 delta += prev_delta_msb;
474*437bfbebSnyanmisaka 
475*437bfbebSnyanmisaka             rps->poc[i] += s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
476*437bfbebSnyanmisaka             prev_delta_msb = delta;
477*437bfbebSnyanmisaka         }
478*437bfbebSnyanmisaka     }
479*437bfbebSnyanmisaka 
480*437bfbebSnyanmisaka     s->rps_bit_offset[s->slice_idx]
481*437bfbebSnyanmisaka     += (gb->used_bits - bit_begin);
482*437bfbebSnyanmisaka 
483*437bfbebSnyanmisaka     return 0;
484*437bfbebSnyanmisaka __BITREAD_ERR:
485*437bfbebSnyanmisaka     return  MPP_ERR_STREAM;
486*437bfbebSnyanmisaka }
487*437bfbebSnyanmisaka 
set_sps(HEVCContext * s,const HEVCSPS * sps)488*437bfbebSnyanmisaka static RK_S32 set_sps(HEVCContext *s, const HEVCSPS *sps)
489*437bfbebSnyanmisaka {
490*437bfbebSnyanmisaka     RK_U32 num = 0, den = 0;
491*437bfbebSnyanmisaka     MppFrameFormat fmt = s->h265dctx->cfg->base.out_fmt & (~MPP_FRAME_FMT_MASK);
492*437bfbebSnyanmisaka 
493*437bfbebSnyanmisaka     s->h265dctx->coded_width         = sps->width;
494*437bfbebSnyanmisaka     s->h265dctx->coded_height        = sps->height;
495*437bfbebSnyanmisaka     s->h265dctx->width               = sps->output_width;
496*437bfbebSnyanmisaka     s->h265dctx->height              = sps->output_height;
497*437bfbebSnyanmisaka     s->h265dctx->pix_fmt             = fmt | sps->pix_fmt;
498*437bfbebSnyanmisaka     s->h265dctx->nBitDepth           = sps->bit_depth;
499*437bfbebSnyanmisaka     s->h265dctx->sample_aspect_ratio = sps->vui.sar;
500*437bfbebSnyanmisaka 
501*437bfbebSnyanmisaka     if (sps->vui.video_signal_type_present_flag)
502*437bfbebSnyanmisaka         s->h265dctx->color_range = sps->vui.video_full_range_flag ?
503*437bfbebSnyanmisaka                                    MPP_FRAME_RANGE_JPEG : MPP_FRAME_RANGE_MPEG;
504*437bfbebSnyanmisaka     else
505*437bfbebSnyanmisaka         s->h265dctx->color_range = MPP_FRAME_RANGE_MPEG;
506*437bfbebSnyanmisaka 
507*437bfbebSnyanmisaka     if (sps->vui.colour_description_present_flag) {
508*437bfbebSnyanmisaka         s->h265dctx->colorspace      = sps->vui.matrix_coeffs;
509*437bfbebSnyanmisaka     } else {
510*437bfbebSnyanmisaka         s->h265dctx->colorspace      = MPP_FRAME_SPC_UNSPECIFIED;
511*437bfbebSnyanmisaka     }
512*437bfbebSnyanmisaka 
513*437bfbebSnyanmisaka     s->sps = sps;
514*437bfbebSnyanmisaka     s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id];
515*437bfbebSnyanmisaka 
516*437bfbebSnyanmisaka     if (s->vps->vps_timing_info_present_flag) {
517*437bfbebSnyanmisaka         num = s->vps->vps_num_units_in_tick;
518*437bfbebSnyanmisaka         den = s->vps->vps_time_scale;
519*437bfbebSnyanmisaka     } else if (sps->vui.vui_timing_info_present_flag) {
520*437bfbebSnyanmisaka         num = sps->vui.vui_num_units_in_tick;
521*437bfbebSnyanmisaka         den = sps->vui.vui_time_scale;
522*437bfbebSnyanmisaka     }
523*437bfbebSnyanmisaka 
524*437bfbebSnyanmisaka     if (num != 0 && den != 0) {
525*437bfbebSnyanmisaka         // s->h265dctx->time_base.num = num;
526*437bfbebSnyanmisaka         // s->h265dctx->time_base.den = den;
527*437bfbebSnyanmisaka         // av_reduce(&s->h265dctx->time_base.num, &s->h265dctx->time_base.den,
528*437bfbebSnyanmisaka         //        num, den, 1 << 30);
529*437bfbebSnyanmisaka     }
530*437bfbebSnyanmisaka 
531*437bfbebSnyanmisaka     return 0;
532*437bfbebSnyanmisaka 
533*437bfbebSnyanmisaka }
compare_sliceheader(SliceHeader * openhevc_sh,SliceHeader * sh)534*437bfbebSnyanmisaka static RK_S32 compare_sliceheader(SliceHeader *openhevc_sh, SliceHeader *sh)
535*437bfbebSnyanmisaka {
536*437bfbebSnyanmisaka 
537*437bfbebSnyanmisaka     if (openhevc_sh->pps_id != sh->pps_id) {
538*437bfbebSnyanmisaka         mpp_log(" pps_id diff \n");
539*437bfbebSnyanmisaka         return -1;
540*437bfbebSnyanmisaka     }
541*437bfbebSnyanmisaka 
542*437bfbebSnyanmisaka     if (openhevc_sh->slice_type != sh->slice_type) {
543*437bfbebSnyanmisaka         mpp_log(" slice_type diff \n");
544*437bfbebSnyanmisaka         return -1;
545*437bfbebSnyanmisaka     }
546*437bfbebSnyanmisaka 
547*437bfbebSnyanmisaka     if (openhevc_sh->pic_order_cnt_lsb != sh->pic_order_cnt_lsb) {
548*437bfbebSnyanmisaka         mpp_log(" pic_order_cnt_lsb diff \n");
549*437bfbebSnyanmisaka         return -1;
550*437bfbebSnyanmisaka     }
551*437bfbebSnyanmisaka 
552*437bfbebSnyanmisaka     if (openhevc_sh->first_slice_in_pic_flag != sh->first_slice_in_pic_flag) {
553*437bfbebSnyanmisaka         mpp_log(" first_slice_in_pic_flag diff \n");
554*437bfbebSnyanmisaka         return -1;
555*437bfbebSnyanmisaka     }
556*437bfbebSnyanmisaka 
557*437bfbebSnyanmisaka     if (openhevc_sh->dependent_slice_segment_flag != sh->dependent_slice_segment_flag) {
558*437bfbebSnyanmisaka         mpp_log(" dependent_slice_segment_flag diff \n");
559*437bfbebSnyanmisaka         return -1;
560*437bfbebSnyanmisaka     }
561*437bfbebSnyanmisaka 
562*437bfbebSnyanmisaka     if (openhevc_sh->pic_output_flag != sh->pic_output_flag) {
563*437bfbebSnyanmisaka         mpp_log(" pic_output_flag diff \n");
564*437bfbebSnyanmisaka         return -1;
565*437bfbebSnyanmisaka     }
566*437bfbebSnyanmisaka 
567*437bfbebSnyanmisaka     if (openhevc_sh->colour_plane_id != sh->colour_plane_id) {
568*437bfbebSnyanmisaka         mpp_log(" colour_plane_id diff \n");
569*437bfbebSnyanmisaka         return -1;
570*437bfbebSnyanmisaka     }
571*437bfbebSnyanmisaka 
572*437bfbebSnyanmisaka     if (openhevc_sh->rpl_modification_flag[0] != sh->rpl_modification_flag[0]) {
573*437bfbebSnyanmisaka         mpp_log(" rpl_modification_flag[0] diff \n");
574*437bfbebSnyanmisaka         return -1;
575*437bfbebSnyanmisaka     }
576*437bfbebSnyanmisaka 
577*437bfbebSnyanmisaka     if (openhevc_sh->rpl_modification_flag[1] != sh->rpl_modification_flag[1]) {
578*437bfbebSnyanmisaka         mpp_log(" rpl_modification_flag[1] diff \n");
579*437bfbebSnyanmisaka         return -1;
580*437bfbebSnyanmisaka     }
581*437bfbebSnyanmisaka 
582*437bfbebSnyanmisaka     if (openhevc_sh->no_output_of_prior_pics_flag != sh->no_output_of_prior_pics_flag) {
583*437bfbebSnyanmisaka         mpp_log(" no_output_of_prior_pics_flag diff \n");
584*437bfbebSnyanmisaka         return -1;
585*437bfbebSnyanmisaka     }
586*437bfbebSnyanmisaka 
587*437bfbebSnyanmisaka     if (openhevc_sh->slice_temporal_mvp_enabled_flag != sh->slice_temporal_mvp_enabled_flag) {
588*437bfbebSnyanmisaka         mpp_log(" slice_temporal_mvp_enabled_flag diff \n");
589*437bfbebSnyanmisaka         return -1;
590*437bfbebSnyanmisaka     }
591*437bfbebSnyanmisaka 
592*437bfbebSnyanmisaka     if (openhevc_sh->nb_refs[0] != sh->nb_refs[0]) {
593*437bfbebSnyanmisaka         mpp_log(" nb_refs[0] diff \n");
594*437bfbebSnyanmisaka         return -1;
595*437bfbebSnyanmisaka     }
596*437bfbebSnyanmisaka 
597*437bfbebSnyanmisaka     if (openhevc_sh->nb_refs[1] != sh->nb_refs[1]) {
598*437bfbebSnyanmisaka         mpp_log(" nb_refs[1] diff \n");
599*437bfbebSnyanmisaka         return -1;
600*437bfbebSnyanmisaka     }
601*437bfbebSnyanmisaka 
602*437bfbebSnyanmisaka     if (openhevc_sh->slice_sample_adaptive_offset_flag[0] !=
603*437bfbebSnyanmisaka         sh->slice_sample_adaptive_offset_flag[0]) {
604*437bfbebSnyanmisaka         mpp_log(" slice_sample_adaptive_offset_flag[0] diff \n");
605*437bfbebSnyanmisaka         return -1;
606*437bfbebSnyanmisaka     }
607*437bfbebSnyanmisaka 
608*437bfbebSnyanmisaka     if (openhevc_sh->slice_sample_adaptive_offset_flag[1] !=
609*437bfbebSnyanmisaka         sh->slice_sample_adaptive_offset_flag[1]) {
610*437bfbebSnyanmisaka         mpp_log(" slice_sample_adaptive_offset_flag[1] diff \n");
611*437bfbebSnyanmisaka         return -1;
612*437bfbebSnyanmisaka     }
613*437bfbebSnyanmisaka 
614*437bfbebSnyanmisaka     if (openhevc_sh->slice_sample_adaptive_offset_flag[2] !=
615*437bfbebSnyanmisaka         sh->slice_sample_adaptive_offset_flag[2]) {
616*437bfbebSnyanmisaka         mpp_log(" slice_sample_adaptive_offset_flag[2] diff \n");
617*437bfbebSnyanmisaka         return -1;
618*437bfbebSnyanmisaka     }
619*437bfbebSnyanmisaka 
620*437bfbebSnyanmisaka     if (openhevc_sh->mvd_l1_zero_flag != sh->mvd_l1_zero_flag) {
621*437bfbebSnyanmisaka         mpp_log(" mvd_l1_zero_flag diff \n");
622*437bfbebSnyanmisaka         return -1;
623*437bfbebSnyanmisaka     }
624*437bfbebSnyanmisaka     if (openhevc_sh->cabac_init_flag != sh->cabac_init_flag) {
625*437bfbebSnyanmisaka         mpp_log(" cabac_init_flag diff \n");
626*437bfbebSnyanmisaka         return -1;
627*437bfbebSnyanmisaka     }
628*437bfbebSnyanmisaka 
629*437bfbebSnyanmisaka     if (openhevc_sh->disable_deblocking_filter_flag !=
630*437bfbebSnyanmisaka         sh->disable_deblocking_filter_flag) {
631*437bfbebSnyanmisaka         mpp_log(" disable_deblocking_filter_flag diff \n");
632*437bfbebSnyanmisaka         return -1;
633*437bfbebSnyanmisaka     }
634*437bfbebSnyanmisaka 
635*437bfbebSnyanmisaka     if (openhevc_sh->slice_loop_filter_across_slices_enabled_flag !=
636*437bfbebSnyanmisaka         sh->slice_loop_filter_across_slices_enabled_flag) {
637*437bfbebSnyanmisaka         mpp_log(" slice_loop_filter_across_slices_enable diff \n");
638*437bfbebSnyanmisaka         return -1;
639*437bfbebSnyanmisaka     }
640*437bfbebSnyanmisaka 
641*437bfbebSnyanmisaka     if (openhevc_sh->collocated_list != sh->collocated_list) {
642*437bfbebSnyanmisaka         mpp_log(" collocated_list diff \n");
643*437bfbebSnyanmisaka         return -1;
644*437bfbebSnyanmisaka     }
645*437bfbebSnyanmisaka 
646*437bfbebSnyanmisaka     if (openhevc_sh->collocated_ref_idx != sh->collocated_ref_idx) {
647*437bfbebSnyanmisaka         mpp_log(" collocated_ref_idx diff \n");
648*437bfbebSnyanmisaka         return -1;
649*437bfbebSnyanmisaka     }
650*437bfbebSnyanmisaka 
651*437bfbebSnyanmisaka     if (openhevc_sh->slice_qp_delta != sh->slice_qp_delta) {
652*437bfbebSnyanmisaka         mpp_log(" slice_qp_delta diff \n");
653*437bfbebSnyanmisaka         return -1;
654*437bfbebSnyanmisaka     }
655*437bfbebSnyanmisaka 
656*437bfbebSnyanmisaka     if (openhevc_sh->slice_cb_qp_offset != sh->slice_cb_qp_offset) {
657*437bfbebSnyanmisaka         mpp_log(" slice_cb_qp_offset diff \n");
658*437bfbebSnyanmisaka         return -1;
659*437bfbebSnyanmisaka     }
660*437bfbebSnyanmisaka 
661*437bfbebSnyanmisaka     if (openhevc_sh->slice_cr_qp_offset != sh->slice_cr_qp_offset) {
662*437bfbebSnyanmisaka         mpp_log(" slice_cr_qp_offset diff \n");
663*437bfbebSnyanmisaka         return -1;
664*437bfbebSnyanmisaka     }
665*437bfbebSnyanmisaka 
666*437bfbebSnyanmisaka     if (openhevc_sh->beta_offset != sh->beta_offset) {
667*437bfbebSnyanmisaka         mpp_log(" beta_offset diff \n");
668*437bfbebSnyanmisaka         return -1;
669*437bfbebSnyanmisaka     }
670*437bfbebSnyanmisaka 
671*437bfbebSnyanmisaka     if (openhevc_sh->tc_offset != sh->tc_offset) {
672*437bfbebSnyanmisaka         mpp_log(" tc_offset diff \n");
673*437bfbebSnyanmisaka         return -1;
674*437bfbebSnyanmisaka     }
675*437bfbebSnyanmisaka 
676*437bfbebSnyanmisaka     if (openhevc_sh->max_num_merge_cand != sh->max_num_merge_cand) {
677*437bfbebSnyanmisaka         mpp_log(" max_num_merge_cand diff \n");
678*437bfbebSnyanmisaka         return -1;
679*437bfbebSnyanmisaka     }
680*437bfbebSnyanmisaka 
681*437bfbebSnyanmisaka     if (openhevc_sh->num_entry_point_offsets != sh->num_entry_point_offsets) {
682*437bfbebSnyanmisaka         mpp_log(" num_entry_point_offsets diff \n");
683*437bfbebSnyanmisaka         return -1;
684*437bfbebSnyanmisaka     }
685*437bfbebSnyanmisaka 
686*437bfbebSnyanmisaka     if (openhevc_sh->slice_qp != sh->slice_qp) {
687*437bfbebSnyanmisaka         mpp_log(" slice_qp diff \n");
688*437bfbebSnyanmisaka         return -1;
689*437bfbebSnyanmisaka     }
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka     if (openhevc_sh->luma_log2_weight_denom != sh->luma_log2_weight_denom) {
692*437bfbebSnyanmisaka         mpp_log(" luma_log2_weight_denom diff \n");
693*437bfbebSnyanmisaka         return -1;
694*437bfbebSnyanmisaka     }
695*437bfbebSnyanmisaka 
696*437bfbebSnyanmisaka     if (openhevc_sh->chroma_log2_weight_denom != sh->chroma_log2_weight_denom) {
697*437bfbebSnyanmisaka         mpp_log(" chroma_log2_weight_denom diff \n");
698*437bfbebSnyanmisaka         return -1;
699*437bfbebSnyanmisaka     }
700*437bfbebSnyanmisaka 
701*437bfbebSnyanmisaka     /* if (openhevc_sh->slice_ctb_addr_rs != sh->slice_ctb_addr_rs) {
702*437bfbebSnyanmisaka          mpp_log(" slice_ctb_addr_rs diff \n");
703*437bfbebSnyanmisaka          return -1;
704*437bfbebSnyanmisaka      }*/
705*437bfbebSnyanmisaka     return 0;
706*437bfbebSnyanmisaka }
707*437bfbebSnyanmisaka 
hls_slice_header(HEVCContext * s)708*437bfbebSnyanmisaka static RK_S32 hls_slice_header(HEVCContext *s)
709*437bfbebSnyanmisaka {
710*437bfbebSnyanmisaka 
711*437bfbebSnyanmisaka     BitReadCtx_t *gb = &s->HEVClc->gb;
712*437bfbebSnyanmisaka     SliceHeader *sh   = &s->sh;
713*437bfbebSnyanmisaka     RK_S32 i, ret;
714*437bfbebSnyanmisaka     RK_S32 value;
715*437bfbebSnyanmisaka     RK_U32 pps_id;
716*437bfbebSnyanmisaka     RK_S32 bit_begin;
717*437bfbebSnyanmisaka 
718*437bfbebSnyanmisaka #ifdef JCTVC_M0458_INTERLAYER_RPS_SIG
719*437bfbebSnyanmisaka     int NumILRRefIdx;
720*437bfbebSnyanmisaka #endif
721*437bfbebSnyanmisaka 
722*437bfbebSnyanmisaka     // Coded parameters
723*437bfbebSnyanmisaka 
724*437bfbebSnyanmisaka     READ_ONEBIT(gb, &sh->first_slice_in_pic_flag);
725*437bfbebSnyanmisaka     if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
726*437bfbebSnyanmisaka         s->seq_decode = (s->seq_decode + 1) & 0xff;
727*437bfbebSnyanmisaka         s->max_ra     = INT_MAX;
728*437bfbebSnyanmisaka         if (IS_IDR(s))
729*437bfbebSnyanmisaka             mpp_hevc_clear_refs(s);
730*437bfbebSnyanmisaka     }
731*437bfbebSnyanmisaka     if (s->nal_unit_type >= 16 && s->nal_unit_type <= 23)
732*437bfbebSnyanmisaka         READ_ONEBIT(gb, &sh->no_output_of_prior_pics_flag);
733*437bfbebSnyanmisaka 
734*437bfbebSnyanmisaka     if (IS_IRAP(s) && s->miss_ref_flag && sh->first_slice_in_pic_flag) {
735*437bfbebSnyanmisaka         //     mpp_err("s->nal_unit_type = %d s->poc %d",s->nal_unit_type,s->poc);
736*437bfbebSnyanmisaka         s->max_ra     = INT_MAX;
737*437bfbebSnyanmisaka         s->miss_ref_flag = 0;
738*437bfbebSnyanmisaka     }
739*437bfbebSnyanmisaka     READ_UE(gb, &pps_id);
740*437bfbebSnyanmisaka 
741*437bfbebSnyanmisaka     if (pps_id >= MAX_PPS_COUNT || !s->pps_list[pps_id]) {
742*437bfbebSnyanmisaka         mpp_err( "PPS id out of range: %d\n", pps_id);
743*437bfbebSnyanmisaka         return  MPP_ERR_STREAM;
744*437bfbebSnyanmisaka     } else {
745*437bfbebSnyanmisaka         sh->pps_id = pps_id;
746*437bfbebSnyanmisaka         if (pps_id != s->pre_pps_id) {
747*437bfbebSnyanmisaka             s->ps_need_upate = 1;
748*437bfbebSnyanmisaka             s->pre_pps_id = pps_id;
749*437bfbebSnyanmisaka         }
750*437bfbebSnyanmisaka     }
751*437bfbebSnyanmisaka 
752*437bfbebSnyanmisaka     if (!sh->first_slice_in_pic_flag &&
753*437bfbebSnyanmisaka         s->pps != (HEVCPPS*)s->pps_list[sh->pps_id]) {
754*437bfbebSnyanmisaka         mpp_err( "PPS changed between slices.\n");
755*437bfbebSnyanmisaka         return  MPP_ERR_STREAM;
756*437bfbebSnyanmisaka     }
757*437bfbebSnyanmisaka     s->pps = (HEVCPPS*)s->pps_list[sh->pps_id];
758*437bfbebSnyanmisaka 
759*437bfbebSnyanmisaka     if (s->sps_need_upate || s->sps != (HEVCSPS*)s->sps_list[s->pps->sps_id]) {
760*437bfbebSnyanmisaka         s->sps = (HEVCSPS*)s->sps_list[s->pps->sps_id];
761*437bfbebSnyanmisaka         mpp_hevc_clear_refs(s);
762*437bfbebSnyanmisaka 
763*437bfbebSnyanmisaka         s->ps_need_upate = 1;
764*437bfbebSnyanmisaka         s->sps_need_upate = 0;
765*437bfbebSnyanmisaka         ret = set_sps(s, s->sps);
766*437bfbebSnyanmisaka         if (ret < 0)
767*437bfbebSnyanmisaka             return ret;
768*437bfbebSnyanmisaka 
769*437bfbebSnyanmisaka         s->seq_decode = (s->seq_decode + 1) & 0xff;
770*437bfbebSnyanmisaka         s->max_ra     = INT_MAX;
771*437bfbebSnyanmisaka     }
772*437bfbebSnyanmisaka 
773*437bfbebSnyanmisaka     // s->h265dctx->profile = s->sps->ptl.general_ptl.profile_idc;
774*437bfbebSnyanmisaka     // s->h265dctx->level   = s->sps->ptl.general_ptl.level_idc;
775*437bfbebSnyanmisaka 
776*437bfbebSnyanmisaka     sh->dependent_slice_segment_flag = 0;
777*437bfbebSnyanmisaka     if (!sh->first_slice_in_pic_flag) {
778*437bfbebSnyanmisaka         RK_S32 slice_address_length;
779*437bfbebSnyanmisaka 
780*437bfbebSnyanmisaka         if (s->pps->dependent_slice_segments_enabled_flag)
781*437bfbebSnyanmisaka             READ_ONEBIT(gb, &sh->dependent_slice_segment_flag);
782*437bfbebSnyanmisaka 
783*437bfbebSnyanmisaka         slice_address_length = mpp_ceil_log2(s->sps->ctb_width *
784*437bfbebSnyanmisaka                                              s->sps->ctb_height);
785*437bfbebSnyanmisaka 
786*437bfbebSnyanmisaka         READ_BITS(gb, slice_address_length, &sh->slice_segment_addr);
787*437bfbebSnyanmisaka 
788*437bfbebSnyanmisaka         if (sh->slice_segment_addr >= (RK_U32)(s->sps->ctb_width * s->sps->ctb_height)) {
789*437bfbebSnyanmisaka             mpp_err(
790*437bfbebSnyanmisaka                 "Invalid slice segment address: %u.\n",
791*437bfbebSnyanmisaka                 sh->slice_segment_addr);
792*437bfbebSnyanmisaka             return  MPP_ERR_STREAM;
793*437bfbebSnyanmisaka         }
794*437bfbebSnyanmisaka 
795*437bfbebSnyanmisaka         if (!sh->dependent_slice_segment_flag) {
796*437bfbebSnyanmisaka             sh->slice_addr = sh->slice_segment_addr;
797*437bfbebSnyanmisaka             s->slice_idx++;
798*437bfbebSnyanmisaka         }
799*437bfbebSnyanmisaka     } else {
800*437bfbebSnyanmisaka         sh->slice_segment_addr = sh->slice_addr = 0;
801*437bfbebSnyanmisaka         s->slice_idx           = 0;
802*437bfbebSnyanmisaka         s->slice_initialized   = 0;
803*437bfbebSnyanmisaka     }
804*437bfbebSnyanmisaka 
805*437bfbebSnyanmisaka     if (!sh->dependent_slice_segment_flag) {
806*437bfbebSnyanmisaka         s->slice_initialized = 0;
807*437bfbebSnyanmisaka 
808*437bfbebSnyanmisaka         for (i = 0; i < s->pps->num_extra_slice_header_bits; i++)
809*437bfbebSnyanmisaka             SKIP_BITS(gb, 1);  // slice_reserved_undetermined_flag[]
810*437bfbebSnyanmisaka 
811*437bfbebSnyanmisaka         READ_UE(gb, &sh->slice_type);
812*437bfbebSnyanmisaka         if (!(sh->slice_type == I_SLICE ||
813*437bfbebSnyanmisaka               sh->slice_type == P_SLICE ||
814*437bfbebSnyanmisaka               sh->slice_type == B_SLICE)) {
815*437bfbebSnyanmisaka             mpp_err( "Unknown slice type: %d.\n",
816*437bfbebSnyanmisaka                      sh->slice_type);
817*437bfbebSnyanmisaka             return  MPP_ERR_STREAM;
818*437bfbebSnyanmisaka         }
819*437bfbebSnyanmisaka         if (!s->decoder_id && IS_IRAP(s) && sh->slice_type != I_SLICE) {
820*437bfbebSnyanmisaka             mpp_err( "Inter slices in an IRAP frame.\n");
821*437bfbebSnyanmisaka             return  MPP_ERR_STREAM;
822*437bfbebSnyanmisaka         }
823*437bfbebSnyanmisaka 
824*437bfbebSnyanmisaka         if (s->pps->output_flag_present_flag)
825*437bfbebSnyanmisaka             READ_ONEBIT(gb, &sh->pic_output_flag);
826*437bfbebSnyanmisaka 
827*437bfbebSnyanmisaka         if (s->sps->separate_colour_plane_flag)
828*437bfbebSnyanmisaka             READ_BITS(gb, 2, &sh->colour_plane_id );
829*437bfbebSnyanmisaka 
830*437bfbebSnyanmisaka         if (!IS_IDR(s)) {
831*437bfbebSnyanmisaka             int  poc;
832*437bfbebSnyanmisaka 
833*437bfbebSnyanmisaka             READ_BITS(gb, s->sps->log2_max_poc_lsb, &sh->pic_order_cnt_lsb);
834*437bfbebSnyanmisaka             poc = mpp_hevc_compute_poc(s, sh->pic_order_cnt_lsb);
835*437bfbebSnyanmisaka             if (!sh->first_slice_in_pic_flag && poc != s->poc) {
836*437bfbebSnyanmisaka                 mpp_log("Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
837*437bfbebSnyanmisaka #if 0
838*437bfbebSnyanmisaka                 if (s->h265dctx->err_recognition & AV_EF_EXPLODE)
839*437bfbebSnyanmisaka                     return  MPP_ERR_STREAM;
840*437bfbebSnyanmisaka #endif
841*437bfbebSnyanmisaka                 poc = s->poc;
842*437bfbebSnyanmisaka             }
843*437bfbebSnyanmisaka             s->poc = poc;
844*437bfbebSnyanmisaka 
845*437bfbebSnyanmisaka             READ_ONEBIT(gb, &sh->short_term_ref_pic_set_sps_flag);
846*437bfbebSnyanmisaka 
847*437bfbebSnyanmisaka             bit_begin = gb->used_bits;
848*437bfbebSnyanmisaka 
849*437bfbebSnyanmisaka             if (!sh->short_term_ref_pic_set_sps_flag) {
850*437bfbebSnyanmisaka 
851*437bfbebSnyanmisaka                 ret = mpp_hevc_decode_short_term_rps(s, &sh->slice_rps, s->sps, 1);
852*437bfbebSnyanmisaka                 if (ret < 0)
853*437bfbebSnyanmisaka                     return ret;
854*437bfbebSnyanmisaka 
855*437bfbebSnyanmisaka                 sh->short_term_rps = &sh->slice_rps;
856*437bfbebSnyanmisaka             } else {
857*437bfbebSnyanmisaka                 RK_S32 numbits, rps_idx;
858*437bfbebSnyanmisaka 
859*437bfbebSnyanmisaka                 if (!s->sps->nb_st_rps) {
860*437bfbebSnyanmisaka                     mpp_err( "No ref lists in the SPS.\n");
861*437bfbebSnyanmisaka                     return  MPP_ERR_STREAM;
862*437bfbebSnyanmisaka                 }
863*437bfbebSnyanmisaka 
864*437bfbebSnyanmisaka                 numbits = mpp_ceil_log2(s->sps->nb_st_rps);
865*437bfbebSnyanmisaka                 rps_idx = 0;
866*437bfbebSnyanmisaka                 if (numbits > 0)
867*437bfbebSnyanmisaka                     READ_BITS(gb, numbits, &rps_idx);
868*437bfbebSnyanmisaka 
869*437bfbebSnyanmisaka                 if (sh->short_term_rps != &s->sps->st_rps[rps_idx])
870*437bfbebSnyanmisaka                     s->rps_need_upate = 1;
871*437bfbebSnyanmisaka                 sh->short_term_rps = &s->sps->st_rps[rps_idx];
872*437bfbebSnyanmisaka             }
873*437bfbebSnyanmisaka 
874*437bfbebSnyanmisaka             s->rps_bit_offset_st[s->slice_idx] = gb->used_bits - bit_begin;
875*437bfbebSnyanmisaka 
876*437bfbebSnyanmisaka             sh->short_term_ref_pic_set_size = s->rps_bit_offset_st[s->slice_idx];
877*437bfbebSnyanmisaka 
878*437bfbebSnyanmisaka             ret = decode_lt_rps(s, &sh->long_term_rps, gb);
879*437bfbebSnyanmisaka             if (ret < 0) {
880*437bfbebSnyanmisaka                 mpp_log("Invalid long term RPS.\n");
881*437bfbebSnyanmisaka                 // if (s->h265dctx->err_recognition & AV_EF_EXPLODE)
882*437bfbebSnyanmisaka                 //   return  MPP_ERR_STREAM;
883*437bfbebSnyanmisaka             }
884*437bfbebSnyanmisaka 
885*437bfbebSnyanmisaka             if (s->sps->sps_temporal_mvp_enabled_flag)
886*437bfbebSnyanmisaka                 READ_ONEBIT(gb, &sh->slice_temporal_mvp_enabled_flag);
887*437bfbebSnyanmisaka             else
888*437bfbebSnyanmisaka                 sh->slice_temporal_mvp_enabled_flag = 0;
889*437bfbebSnyanmisaka         } else {
890*437bfbebSnyanmisaka             s->sh.short_term_rps = NULL;
891*437bfbebSnyanmisaka             s->poc               = 0;
892*437bfbebSnyanmisaka         }
893*437bfbebSnyanmisaka 
894*437bfbebSnyanmisaka         /* 8.3.1 */
895*437bfbebSnyanmisaka         if (s->temporal_id == 0 &&
896*437bfbebSnyanmisaka             s->nal_unit_type != NAL_TRAIL_N &&
897*437bfbebSnyanmisaka             s->nal_unit_type != NAL_TSA_N   &&
898*437bfbebSnyanmisaka             s->nal_unit_type != NAL_STSA_N  &&
899*437bfbebSnyanmisaka             s->nal_unit_type != NAL_RADL_N  &&
900*437bfbebSnyanmisaka             s->nal_unit_type != NAL_RADL_R  &&
901*437bfbebSnyanmisaka             s->nal_unit_type != NAL_RASL_N  &&
902*437bfbebSnyanmisaka             s->nal_unit_type != NAL_RASL_R)
903*437bfbebSnyanmisaka             s->pocTid0 = s->poc;
904*437bfbebSnyanmisaka 
905*437bfbebSnyanmisaka         if (s->sps->sao_enabled) {
906*437bfbebSnyanmisaka             READ_ONEBIT(gb, &sh->slice_sample_adaptive_offset_flag[0]);
907*437bfbebSnyanmisaka             if (s->sps->chroma_format_idc) {
908*437bfbebSnyanmisaka                 READ_ONEBIT(gb, &sh->slice_sample_adaptive_offset_flag[1]);
909*437bfbebSnyanmisaka                 sh->slice_sample_adaptive_offset_flag[2] =
910*437bfbebSnyanmisaka                     sh->slice_sample_adaptive_offset_flag[1];
911*437bfbebSnyanmisaka             } else {
912*437bfbebSnyanmisaka                 sh->slice_sample_adaptive_offset_flag[1] = 0;
913*437bfbebSnyanmisaka                 sh->slice_sample_adaptive_offset_flag[2] = 0;
914*437bfbebSnyanmisaka             }
915*437bfbebSnyanmisaka         } else {
916*437bfbebSnyanmisaka             sh->slice_sample_adaptive_offset_flag[0] = 0;
917*437bfbebSnyanmisaka             sh->slice_sample_adaptive_offset_flag[1] = 0;
918*437bfbebSnyanmisaka             sh->slice_sample_adaptive_offset_flag[2] = 0;
919*437bfbebSnyanmisaka         }
920*437bfbebSnyanmisaka 
921*437bfbebSnyanmisaka         sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
922*437bfbebSnyanmisaka         if (sh->slice_type == P_SLICE || sh->slice_type == B_SLICE) {
923*437bfbebSnyanmisaka             int nb_refs;
924*437bfbebSnyanmisaka 
925*437bfbebSnyanmisaka             sh->nb_refs[L0] = s->pps->num_ref_idx_l0_default_active;
926*437bfbebSnyanmisaka             if (sh->slice_type == B_SLICE)
927*437bfbebSnyanmisaka                 sh->nb_refs[L1] = s->pps->num_ref_idx_l1_default_active;
928*437bfbebSnyanmisaka 
929*437bfbebSnyanmisaka             READ_ONEBIT(gb, &value);
930*437bfbebSnyanmisaka 
931*437bfbebSnyanmisaka             if (value) { // num_ref_idx_active_override_flag
932*437bfbebSnyanmisaka                 READ_UE(gb, &sh->nb_refs[L0]);
933*437bfbebSnyanmisaka                 sh->nb_refs[L0] += 1;
934*437bfbebSnyanmisaka                 if (sh->slice_type == B_SLICE) {
935*437bfbebSnyanmisaka                     READ_UE(gb, &sh->nb_refs[L1]);
936*437bfbebSnyanmisaka                     sh->nb_refs[L1] += 1;
937*437bfbebSnyanmisaka                 }
938*437bfbebSnyanmisaka             }
939*437bfbebSnyanmisaka             if (sh->nb_refs[L0] > MAX_REFS || sh->nb_refs[L1] > MAX_REFS) {
940*437bfbebSnyanmisaka                 mpp_err( "Too many refs: %d/%d.\n",
941*437bfbebSnyanmisaka                          sh->nb_refs[L0], sh->nb_refs[L1]);
942*437bfbebSnyanmisaka                 return  MPP_ERR_STREAM;
943*437bfbebSnyanmisaka             }
944*437bfbebSnyanmisaka 
945*437bfbebSnyanmisaka             sh->rpl_modification_flag[0] = 0;
946*437bfbebSnyanmisaka             sh->rpl_modification_flag[1] = 0;
947*437bfbebSnyanmisaka             nb_refs = mpp_hevc_frame_nb_refs(s);
948*437bfbebSnyanmisaka             if (!nb_refs) {
949*437bfbebSnyanmisaka                 mpp_err( "Zero refs for a frame with P or B slices.\n");
950*437bfbebSnyanmisaka                 return  MPP_ERR_STREAM;
951*437bfbebSnyanmisaka             }
952*437bfbebSnyanmisaka 
953*437bfbebSnyanmisaka             if (s->pps->lists_modification_present_flag && nb_refs > 1) {
954*437bfbebSnyanmisaka                 READ_ONEBIT(gb, &sh->rpl_modification_flag[0]);
955*437bfbebSnyanmisaka                 if (sh->rpl_modification_flag[0]) {
956*437bfbebSnyanmisaka                     for (i = 0; (RK_U32)i < sh->nb_refs[L0]; i++)
957*437bfbebSnyanmisaka                         READ_BITS(gb, mpp_ceil_log2(nb_refs), &sh->list_entry_lx[0][i]);
958*437bfbebSnyanmisaka                 }
959*437bfbebSnyanmisaka 
960*437bfbebSnyanmisaka                 if (sh->slice_type == B_SLICE) {
961*437bfbebSnyanmisaka                     READ_ONEBIT(gb, &sh->rpl_modification_flag[1]);
962*437bfbebSnyanmisaka                     if (sh->rpl_modification_flag[1] == 1)
963*437bfbebSnyanmisaka                         for (i = 0; (RK_U32)i < sh->nb_refs[L1]; i++)
964*437bfbebSnyanmisaka                             READ_BITS(gb, mpp_ceil_log2(nb_refs), &sh->list_entry_lx[1][i]);
965*437bfbebSnyanmisaka                 }
966*437bfbebSnyanmisaka             }
967*437bfbebSnyanmisaka 
968*437bfbebSnyanmisaka             if (sh->slice_type == B_SLICE)
969*437bfbebSnyanmisaka                 READ_ONEBIT(gb, &sh->mvd_l1_zero_flag);
970*437bfbebSnyanmisaka 
971*437bfbebSnyanmisaka             if (s->pps->cabac_init_present_flag)
972*437bfbebSnyanmisaka                 READ_ONEBIT(gb, &sh->cabac_init_flag);
973*437bfbebSnyanmisaka             else
974*437bfbebSnyanmisaka                 sh->cabac_init_flag = 0;
975*437bfbebSnyanmisaka 
976*437bfbebSnyanmisaka             sh->collocated_ref_idx = 0;
977*437bfbebSnyanmisaka             if (sh->slice_temporal_mvp_enabled_flag) {
978*437bfbebSnyanmisaka                 sh->collocated_list = L0;
979*437bfbebSnyanmisaka                 if (sh->slice_type == B_SLICE) {
980*437bfbebSnyanmisaka                     READ_ONEBIT(gb, &value);
981*437bfbebSnyanmisaka                     sh->collocated_list = !value;
982*437bfbebSnyanmisaka                 }
983*437bfbebSnyanmisaka 
984*437bfbebSnyanmisaka                 if (sh->nb_refs[sh->collocated_list] > 1) {
985*437bfbebSnyanmisaka                     READ_UE(gb, &sh->collocated_ref_idx);
986*437bfbebSnyanmisaka                     if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
987*437bfbebSnyanmisaka                         mpp_err(
988*437bfbebSnyanmisaka                             "Invalid collocated_ref_idx: %d.\n",
989*437bfbebSnyanmisaka                             sh->collocated_ref_idx);
990*437bfbebSnyanmisaka                         return  MPP_ERR_STREAM;
991*437bfbebSnyanmisaka                     }
992*437bfbebSnyanmisaka                 }
993*437bfbebSnyanmisaka             }
994*437bfbebSnyanmisaka 
995*437bfbebSnyanmisaka             if ((s->pps->weighted_pred_flag   && sh->slice_type == P_SLICE) ||
996*437bfbebSnyanmisaka                 (s->pps->weighted_bipred_flag && sh->slice_type == B_SLICE)) {
997*437bfbebSnyanmisaka                 pred_weight_table(s, gb);
998*437bfbebSnyanmisaka             }
999*437bfbebSnyanmisaka 
1000*437bfbebSnyanmisaka             READ_UE(gb, &value);
1001*437bfbebSnyanmisaka             sh->max_num_merge_cand = 5 - value;
1002*437bfbebSnyanmisaka             if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
1003*437bfbebSnyanmisaka                 mpp_err(
1004*437bfbebSnyanmisaka                     "Invalid number of merging MVP candidates: %d.\n",
1005*437bfbebSnyanmisaka                     sh->max_num_merge_cand);
1006*437bfbebSnyanmisaka                 return  MPP_ERR_STREAM;
1007*437bfbebSnyanmisaka             }
1008*437bfbebSnyanmisaka         }
1009*437bfbebSnyanmisaka         READ_SE(gb, &sh->slice_qp_delta );
1010*437bfbebSnyanmisaka         if (s->pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1011*437bfbebSnyanmisaka             READ_SE(gb, &sh->slice_cb_qp_offset);
1012*437bfbebSnyanmisaka             READ_SE(gb, &sh->slice_cr_qp_offset);
1013*437bfbebSnyanmisaka         } else {
1014*437bfbebSnyanmisaka             sh->slice_cb_qp_offset = 0;
1015*437bfbebSnyanmisaka             sh->slice_cr_qp_offset = 0;
1016*437bfbebSnyanmisaka         }
1017*437bfbebSnyanmisaka 
1018*437bfbebSnyanmisaka         if (s->pps->deblocking_filter_control_present_flag) {
1019*437bfbebSnyanmisaka             int deblocking_filter_override_flag = 0;
1020*437bfbebSnyanmisaka 
1021*437bfbebSnyanmisaka             if (s->pps->deblocking_filter_override_enabled_flag)
1022*437bfbebSnyanmisaka                 READ_ONEBIT(gb, & deblocking_filter_override_flag);
1023*437bfbebSnyanmisaka 
1024*437bfbebSnyanmisaka             if (deblocking_filter_override_flag) {
1025*437bfbebSnyanmisaka                 READ_ONEBIT(gb, &sh->disable_deblocking_filter_flag);
1026*437bfbebSnyanmisaka                 if (!sh->disable_deblocking_filter_flag) {
1027*437bfbebSnyanmisaka                     READ_SE(gb, &sh->beta_offset);
1028*437bfbebSnyanmisaka                     sh->beta_offset = sh->beta_offset * 2;
1029*437bfbebSnyanmisaka                     READ_SE(gb, &sh->tc_offset);
1030*437bfbebSnyanmisaka                     sh->tc_offset = sh->tc_offset * 2;
1031*437bfbebSnyanmisaka                 }
1032*437bfbebSnyanmisaka             } else {
1033*437bfbebSnyanmisaka                 sh->disable_deblocking_filter_flag = s->pps->disable_dbf;
1034*437bfbebSnyanmisaka                 sh->beta_offset                    = s->pps->beta_offset;
1035*437bfbebSnyanmisaka                 sh->tc_offset                      = s->pps->tc_offset;
1036*437bfbebSnyanmisaka             }
1037*437bfbebSnyanmisaka         } else {
1038*437bfbebSnyanmisaka             sh->disable_deblocking_filter_flag = 0;
1039*437bfbebSnyanmisaka             sh->beta_offset                    = 0;
1040*437bfbebSnyanmisaka             sh->tc_offset                      = 0;
1041*437bfbebSnyanmisaka         }
1042*437bfbebSnyanmisaka 
1043*437bfbebSnyanmisaka         if (s->pps->seq_loop_filter_across_slices_enabled_flag &&
1044*437bfbebSnyanmisaka             (sh->slice_sample_adaptive_offset_flag[0] ||
1045*437bfbebSnyanmisaka              sh->slice_sample_adaptive_offset_flag[1] ||
1046*437bfbebSnyanmisaka              !sh->disable_deblocking_filter_flag)) {
1047*437bfbebSnyanmisaka             READ_ONEBIT(gb, &sh->slice_loop_filter_across_slices_enabled_flag);
1048*437bfbebSnyanmisaka         } else {
1049*437bfbebSnyanmisaka             sh->slice_loop_filter_across_slices_enabled_flag = s->pps->seq_loop_filter_across_slices_enabled_flag;
1050*437bfbebSnyanmisaka         }
1051*437bfbebSnyanmisaka     } else if (!s->slice_initialized) {
1052*437bfbebSnyanmisaka         mpp_err( "Independent slice segment missing.\n");
1053*437bfbebSnyanmisaka         return  MPP_ERR_STREAM;
1054*437bfbebSnyanmisaka     }
1055*437bfbebSnyanmisaka 
1056*437bfbebSnyanmisaka     sh->num_entry_point_offsets = 0;
1057*437bfbebSnyanmisaka     if (s->pps->tiles_enabled_flag || s->pps->entropy_coding_sync_enabled_flag) {
1058*437bfbebSnyanmisaka         READ_UE(gb, &sh->num_entry_point_offsets);
1059*437bfbebSnyanmisaka         if (s->pps->entropy_coding_sync_enabled_flag) {
1060*437bfbebSnyanmisaka             if (sh->num_entry_point_offsets > s->sps->ctb_height || sh->num_entry_point_offsets < 0) {
1061*437bfbebSnyanmisaka                 mpp_err("The number of entries %d is higher than the number of CTB rows %d \n",
1062*437bfbebSnyanmisaka                         sh->num_entry_point_offsets,
1063*437bfbebSnyanmisaka                         s->sps->ctb_height);
1064*437bfbebSnyanmisaka                 return  MPP_ERR_STREAM;
1065*437bfbebSnyanmisaka             }
1066*437bfbebSnyanmisaka         } else {
1067*437bfbebSnyanmisaka             if (sh->num_entry_point_offsets > s->sps->ctb_height * s->sps->ctb_width || sh->num_entry_point_offsets < 0) {
1068*437bfbebSnyanmisaka                 mpp_err("The number of entries %d is higher than the number of CTBs %d \n",
1069*437bfbebSnyanmisaka                         sh->num_entry_point_offsets,
1070*437bfbebSnyanmisaka                         s->sps->ctb_height * s->sps->ctb_width);
1071*437bfbebSnyanmisaka                 return  MPP_ERR_STREAM;
1072*437bfbebSnyanmisaka             }
1073*437bfbebSnyanmisaka         }
1074*437bfbebSnyanmisaka         if (sh->num_entry_point_offsets) {
1075*437bfbebSnyanmisaka             RK_U32 offset_len_minus1 = 0;
1076*437bfbebSnyanmisaka 
1077*437bfbebSnyanmisaka             READ_UE(gb, &offset_len_minus1);
1078*437bfbebSnyanmisaka             for (i = 0; i < sh->num_entry_point_offsets; i++)
1079*437bfbebSnyanmisaka                 SKIP_BITS(gb, offset_len_minus1 + 1);
1080*437bfbebSnyanmisaka         }
1081*437bfbebSnyanmisaka     }
1082*437bfbebSnyanmisaka     if (s->pps->slice_header_extension_present_flag) {
1083*437bfbebSnyanmisaka         //if slice_header_extension_present_flag is 1, we should cut the extension data.
1084*437bfbebSnyanmisaka         RK_U32 length = 0;
1085*437bfbebSnyanmisaka 
1086*437bfbebSnyanmisaka         s->start_bit = gb->used_bits;
1087*437bfbebSnyanmisaka         READ_UE(gb, &length);
1088*437bfbebSnyanmisaka         for (i = 0; (RK_U32)i < length; i++) {
1089*437bfbebSnyanmisaka             SKIP_BITS(gb, 8);  // slice_header_extension_data_byte
1090*437bfbebSnyanmisaka         }
1091*437bfbebSnyanmisaka         s->end_bit = gb->used_bits;
1092*437bfbebSnyanmisaka     }
1093*437bfbebSnyanmisaka 
1094*437bfbebSnyanmisaka     // Inferred parameters
1095*437bfbebSnyanmisaka     sh->slice_qp = 26U + s->pps->pic_init_qp_minus26 + sh->slice_qp_delta;
1096*437bfbebSnyanmisaka     if (sh->slice_qp > 51 ||
1097*437bfbebSnyanmisaka         sh->slice_qp < -s->sps->qp_bd_offset) {
1098*437bfbebSnyanmisaka         mpp_err("The slice_qp %d is outside the valid range "
1099*437bfbebSnyanmisaka                 "[%d, 51].\n",
1100*437bfbebSnyanmisaka                 sh->slice_qp,
1101*437bfbebSnyanmisaka                 -s->sps->qp_bd_offset);
1102*437bfbebSnyanmisaka         return  MPP_ERR_STREAM;
1103*437bfbebSnyanmisaka     }
1104*437bfbebSnyanmisaka     if (s->h265dctx->compare_info != NULL && sh->first_slice_in_pic_flag) {
1105*437bfbebSnyanmisaka         CurrentFameInf_t *info = (CurrentFameInf_t *)s->h265dctx->compare_info;
1106*437bfbebSnyanmisaka         SliceHeader *openhevc_sh = (SliceHeader *)&info->sh;
1107*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_FUNCTION, "compare_sliceheader in");
1108*437bfbebSnyanmisaka         if (compare_sliceheader(openhevc_sh, &s->sh) < 0) {
1109*437bfbebSnyanmisaka             mpp_log("compare sliceHeader with openhevc diff\n");
1110*437bfbebSnyanmisaka             mpp_assert(0);
1111*437bfbebSnyanmisaka         }
1112*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_FUNCTION, "compare_sliceheader ok");
1113*437bfbebSnyanmisaka     }
1114*437bfbebSnyanmisaka 
1115*437bfbebSnyanmisaka     sh->slice_ctb_addr_rs = sh->slice_segment_addr;
1116*437bfbebSnyanmisaka 
1117*437bfbebSnyanmisaka     if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) {
1118*437bfbebSnyanmisaka         mpp_err("Impossible slice segment.\n");
1119*437bfbebSnyanmisaka         return  MPP_ERR_STREAM;
1120*437bfbebSnyanmisaka     }
1121*437bfbebSnyanmisaka 
1122*437bfbebSnyanmisaka     s->slice_initialized = 1;
1123*437bfbebSnyanmisaka 
1124*437bfbebSnyanmisaka     return 0;
1125*437bfbebSnyanmisaka __BITREAD_ERR:
1126*437bfbebSnyanmisaka     return  MPP_ERR_STREAM;
1127*437bfbebSnyanmisaka }
1128*437bfbebSnyanmisaka 
1129*437bfbebSnyanmisaka /**
1130*437bfbebSnyanmisaka  * @return AV MPP_ERR_STREAM if the packet is not a valid NAL unit,
1131*437bfbebSnyanmisaka  * 0 if the unit should be skipped, 1 otherwise
1132*437bfbebSnyanmisaka  */
hls_nal_unit(HEVCContext * s)1133*437bfbebSnyanmisaka static RK_S32 hls_nal_unit(HEVCContext *s)
1134*437bfbebSnyanmisaka {
1135*437bfbebSnyanmisaka     BitReadCtx_t*gb = &s->HEVClc->gb;
1136*437bfbebSnyanmisaka     RK_S32 value = 0;
1137*437bfbebSnyanmisaka 
1138*437bfbebSnyanmisaka     READ_ONEBIT(gb, &value); /*this bit should be zero*/
1139*437bfbebSnyanmisaka 
1140*437bfbebSnyanmisaka     READ_BITS(gb, 6, &s->nal_unit_type);
1141*437bfbebSnyanmisaka 
1142*437bfbebSnyanmisaka     READ_BITS(gb, 6, &s->nuh_layer_id);
1143*437bfbebSnyanmisaka 
1144*437bfbebSnyanmisaka     READ_BITS(gb, 3, &s->temporal_id);
1145*437bfbebSnyanmisaka 
1146*437bfbebSnyanmisaka     s->temporal_id = s->temporal_id - 1;
1147*437bfbebSnyanmisaka 
1148*437bfbebSnyanmisaka     h265d_dbg(H265D_DBG_GLOBAL,
1149*437bfbebSnyanmisaka               "nal_unit_type: %d, nuh_layer_id: %d temporal_id: %d\n",
1150*437bfbebSnyanmisaka               s->nal_unit_type, s->nuh_layer_id, s->temporal_id);
1151*437bfbebSnyanmisaka 
1152*437bfbebSnyanmisaka     if (s->temporal_id < 0)
1153*437bfbebSnyanmisaka         return  MPP_ERR_STREAM;
1154*437bfbebSnyanmisaka 
1155*437bfbebSnyanmisaka     return (s->nuh_layer_id);
1156*437bfbebSnyanmisaka __BITREAD_ERR:
1157*437bfbebSnyanmisaka     return  MPP_ERR_STREAM;
1158*437bfbebSnyanmisaka }
1159*437bfbebSnyanmisaka 
mpp_hevc_out_dec_order(void * ctx)1160*437bfbebSnyanmisaka static RK_S32 mpp_hevc_out_dec_order(void *ctx)
1161*437bfbebSnyanmisaka {
1162*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
1163*437bfbebSnyanmisaka     HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
1164*437bfbebSnyanmisaka 
1165*437bfbebSnyanmisaka     if (s->ref && (s->ref->flags & HEVC_FRAME_FLAG_OUTPUT)) {
1166*437bfbebSnyanmisaka         s->ref->flags &= ~(HEVC_FRAME_FLAG_OUTPUT);
1167*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(s->slots, s->ref->slot_index, SLOT_QUEUE_USE);
1168*437bfbebSnyanmisaka         mpp_buf_slot_enqueue(s->slots, s->ref->slot_index, QUEUE_DISPLAY);
1169*437bfbebSnyanmisaka     }
1170*437bfbebSnyanmisaka 
1171*437bfbebSnyanmisaka     return 0;
1172*437bfbebSnyanmisaka }
1173*437bfbebSnyanmisaka 
mpp_hevc_output_frame(void * ctx,int flush)1174*437bfbebSnyanmisaka static RK_S32 mpp_hevc_output_frame(void *ctx, int flush)
1175*437bfbebSnyanmisaka {
1176*437bfbebSnyanmisaka 
1177*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
1178*437bfbebSnyanmisaka     HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
1179*437bfbebSnyanmisaka     MppDecCfgSet *cfg = h265dctx->cfg;
1180*437bfbebSnyanmisaka     RK_U32 find_next_ready = 0;
1181*437bfbebSnyanmisaka 
1182*437bfbebSnyanmisaka     if (cfg->base.fast_out)
1183*437bfbebSnyanmisaka         return mpp_hevc_out_dec_order(ctx);
1184*437bfbebSnyanmisaka 
1185*437bfbebSnyanmisaka     do {
1186*437bfbebSnyanmisaka         RK_S32 nb_output = 0;
1187*437bfbebSnyanmisaka         RK_S32 min_poc   = INT_MAX;
1188*437bfbebSnyanmisaka         RK_S32 min_idx = 0;
1189*437bfbebSnyanmisaka         RK_U32 i;
1190*437bfbebSnyanmisaka 
1191*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(s->DPB); i++) {
1192*437bfbebSnyanmisaka             HEVCFrame *frame = &s->DPB[i];
1193*437bfbebSnyanmisaka             if ((frame->flags & HEVC_FRAME_FLAG_OUTPUT) &&
1194*437bfbebSnyanmisaka                 frame->sequence == s->seq_output) {
1195*437bfbebSnyanmisaka                 nb_output++;
1196*437bfbebSnyanmisaka                 if (frame->poc < min_poc) {
1197*437bfbebSnyanmisaka                     min_poc = frame->poc;
1198*437bfbebSnyanmisaka                     min_idx = i;
1199*437bfbebSnyanmisaka                 }
1200*437bfbebSnyanmisaka             }
1201*437bfbebSnyanmisaka         }
1202*437bfbebSnyanmisaka 
1203*437bfbebSnyanmisaka         /* wait for more frames before output */
1204*437bfbebSnyanmisaka         if (!flush && s->seq_output == s->seq_decode && s->sps &&
1205*437bfbebSnyanmisaka             nb_output <= s->sps->temporal_layer[s->sps->max_sub_layers - 1].num_reorder_pics) {
1206*437bfbebSnyanmisaka             if (cfg->base.enable_fast_play && (IS_IDR(s) ||
1207*437bfbebSnyanmisaka                                                (IS_BLA(s) && !s->first_i_fast_play))) {
1208*437bfbebSnyanmisaka                 s->first_i_fast_play = 1;
1209*437bfbebSnyanmisaka             } else {
1210*437bfbebSnyanmisaka                 return 0;
1211*437bfbebSnyanmisaka             }
1212*437bfbebSnyanmisaka         }
1213*437bfbebSnyanmisaka 
1214*437bfbebSnyanmisaka         if (nb_output) {
1215*437bfbebSnyanmisaka             HEVCFrame *frame = &s->DPB[min_idx];
1216*437bfbebSnyanmisaka 
1217*437bfbebSnyanmisaka             frame->flags &= ~(HEVC_FRAME_FLAG_OUTPUT);
1218*437bfbebSnyanmisaka             s->output_frame_idx = min_idx;
1219*437bfbebSnyanmisaka 
1220*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(s->slots, frame->slot_index, SLOT_QUEUE_USE);
1221*437bfbebSnyanmisaka             mpp_buf_slot_enqueue(s->slots, frame->slot_index, QUEUE_DISPLAY);
1222*437bfbebSnyanmisaka 
1223*437bfbebSnyanmisaka             h265d_dbg(H265D_DBG_REF,
1224*437bfbebSnyanmisaka                       "Output frame with POC %d frame->slot_index = %d\n", frame->poc, frame->slot_index);
1225*437bfbebSnyanmisaka 
1226*437bfbebSnyanmisaka             do {
1227*437bfbebSnyanmisaka                 find_next_ready = 0;
1228*437bfbebSnyanmisaka                 for (i = 0; i < MPP_ARRAY_ELEMS(s->DPB); i++) {
1229*437bfbebSnyanmisaka                     HEVCFrame *frame_next_ready = &s->DPB[i];
1230*437bfbebSnyanmisaka                     if ((frame_next_ready->flags & HEVC_FRAME_FLAG_OUTPUT) &&
1231*437bfbebSnyanmisaka                         frame_next_ready->sequence == s->seq_output) {
1232*437bfbebSnyanmisaka                         if (frame_next_ready->poc == frame->poc + 1) {
1233*437bfbebSnyanmisaka                             find_next_ready = 1;
1234*437bfbebSnyanmisaka                             s->output_frame_idx = i;
1235*437bfbebSnyanmisaka                             frame_next_ready->flags &= ~(HEVC_FRAME_FLAG_OUTPUT);
1236*437bfbebSnyanmisaka                             frame = frame_next_ready;
1237*437bfbebSnyanmisaka                             mpp_buf_slot_set_flag(s->slots, frame->slot_index, SLOT_QUEUE_USE);
1238*437bfbebSnyanmisaka                             mpp_buf_slot_enqueue(s->slots, frame->slot_index, QUEUE_DISPLAY);
1239*437bfbebSnyanmisaka                             h265d_dbg(H265D_DBG_REF,
1240*437bfbebSnyanmisaka                                       "Output frame with POC %d frm_next_ready->slot_index = %d\n",
1241*437bfbebSnyanmisaka                                       frame_next_ready->poc, frame_next_ready->slot_index);
1242*437bfbebSnyanmisaka                             /* release any frames that are now unused */
1243*437bfbebSnyanmisaka                             for (i = 0; i < MPP_ARRAY_ELEMS(s->DPB); i++) {
1244*437bfbebSnyanmisaka                                 mpp_hevc_unref_frame(s, &s->DPB[i], 0);
1245*437bfbebSnyanmisaka                             }
1246*437bfbebSnyanmisaka                         }
1247*437bfbebSnyanmisaka                     }
1248*437bfbebSnyanmisaka                 }
1249*437bfbebSnyanmisaka             } while (find_next_ready);
1250*437bfbebSnyanmisaka 
1251*437bfbebSnyanmisaka             return 1;
1252*437bfbebSnyanmisaka         }
1253*437bfbebSnyanmisaka 
1254*437bfbebSnyanmisaka         if (s->seq_output != s->seq_decode)
1255*437bfbebSnyanmisaka             s->seq_output = (s->seq_output + 1) & 0xff;
1256*437bfbebSnyanmisaka         else
1257*437bfbebSnyanmisaka             break;
1258*437bfbebSnyanmisaka     } while (1);
1259*437bfbebSnyanmisaka 
1260*437bfbebSnyanmisaka     return 0;
1261*437bfbebSnyanmisaka }
1262*437bfbebSnyanmisaka 
hevc_frame_start(HEVCContext * s)1263*437bfbebSnyanmisaka static RK_S32 hevc_frame_start(HEVCContext *s)
1264*437bfbebSnyanmisaka {
1265*437bfbebSnyanmisaka     int ret;
1266*437bfbebSnyanmisaka 
1267*437bfbebSnyanmisaka     if (s->ref) {
1268*437bfbebSnyanmisaka         mpp_log_f("found two frame in one packet do nothing!\n");
1269*437bfbebSnyanmisaka         return 0;
1270*437bfbebSnyanmisaka     }
1271*437bfbebSnyanmisaka 
1272*437bfbebSnyanmisaka     s->is_decoded        = 0;
1273*437bfbebSnyanmisaka     s->first_nal_type    = s->nal_unit_type;
1274*437bfbebSnyanmisaka     s->miss_ref_flag = 0;
1275*437bfbebSnyanmisaka 
1276*437bfbebSnyanmisaka     ret = mpp_hevc_frame_rps(s);
1277*437bfbebSnyanmisaka     if (ret < 0) {
1278*437bfbebSnyanmisaka         mpp_err("Error constructing the frame RPS.\n");
1279*437bfbebSnyanmisaka         goto fail;
1280*437bfbebSnyanmisaka     }
1281*437bfbebSnyanmisaka 
1282*437bfbebSnyanmisaka     ret = mpp_hevc_set_new_ref(s, &s->frame, s->poc);
1283*437bfbebSnyanmisaka     if (ret < 0)
1284*437bfbebSnyanmisaka         goto fail;
1285*437bfbebSnyanmisaka 
1286*437bfbebSnyanmisaka     if (!s->h265dctx->cfg->base.disable_error && s->recovery.valid_flag &&
1287*437bfbebSnyanmisaka         s->recovery.first_frm_valid && s->recovery.first_frm_ref_missing &&
1288*437bfbebSnyanmisaka         s->poc < s->recovery.recovery_pic_id && s->poc >= s->recovery.first_frm_id) {
1289*437bfbebSnyanmisaka         mpp_frame_set_discard(s->frame, 1);
1290*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_REF, "mark recovery frame discard, poc %d\n", mpp_frame_get_poc(s->frame));
1291*437bfbebSnyanmisaka     }
1292*437bfbebSnyanmisaka 
1293*437bfbebSnyanmisaka     if (!s->h265dctx->cfg->base.disable_error && s->miss_ref_flag) {
1294*437bfbebSnyanmisaka         if (!IS_IRAP(s)) {
1295*437bfbebSnyanmisaka             if (s->recovery.valid_flag && s->recovery.first_frm_valid && s->recovery.first_frm_id == s->poc) {
1296*437bfbebSnyanmisaka                 s->recovery.first_frm_ref_missing = 1;
1297*437bfbebSnyanmisaka                 mpp_frame_set_discard(s->frame, 1);
1298*437bfbebSnyanmisaka                 h265d_dbg(H265D_DBG_REF, "recovery frame missing ref mark discard, poc %d\n",
1299*437bfbebSnyanmisaka                           mpp_frame_get_poc(s->frame));
1300*437bfbebSnyanmisaka             } else {
1301*437bfbebSnyanmisaka                 mpp_frame_set_errinfo(s->frame, MPP_FRAME_ERR_UNKNOW);
1302*437bfbebSnyanmisaka                 s->ref->error_flag = 1;
1303*437bfbebSnyanmisaka                 h265d_dbg(H265D_DBG_REF, "missing ref mark error, poc %d\n", mpp_frame_get_poc(s->frame));
1304*437bfbebSnyanmisaka             }
1305*437bfbebSnyanmisaka         } else {
1306*437bfbebSnyanmisaka             /*when found current I frame have miss refer
1307*437bfbebSnyanmisaka               may be stream have error so first set current frame
1308*437bfbebSnyanmisaka               no output and flush other frame output from dpb
1309*437bfbebSnyanmisaka               then set current frame can as output
1310*437bfbebSnyanmisaka             */
1311*437bfbebSnyanmisaka             HEVCFrame *frame = NULL;
1312*437bfbebSnyanmisaka             RK_U32 i = 0;
1313*437bfbebSnyanmisaka             for (i = 0; i < MPP_ARRAY_ELEMS(s->DPB); i++) {
1314*437bfbebSnyanmisaka                 frame = &s->DPB[i];
1315*437bfbebSnyanmisaka                 if (frame->poc == s->poc ) {
1316*437bfbebSnyanmisaka                     frame->flags &= ~(HEVC_FRAME_FLAG_OUTPUT);
1317*437bfbebSnyanmisaka                     break;
1318*437bfbebSnyanmisaka                 } else {
1319*437bfbebSnyanmisaka                     frame = NULL;
1320*437bfbebSnyanmisaka                 }
1321*437bfbebSnyanmisaka             }
1322*437bfbebSnyanmisaka             do {
1323*437bfbebSnyanmisaka                 ret = mpp_hevc_output_frame(s->h265dctx, 1);
1324*437bfbebSnyanmisaka             } while (ret);
1325*437bfbebSnyanmisaka             if (frame) {
1326*437bfbebSnyanmisaka                 frame->flags |= HEVC_FRAME_FLAG_OUTPUT;
1327*437bfbebSnyanmisaka             }
1328*437bfbebSnyanmisaka         }
1329*437bfbebSnyanmisaka     }
1330*437bfbebSnyanmisaka 
1331*437bfbebSnyanmisaka     mpp_buf_slot_set_prop(s->slots, s->ref->slot_index, SLOT_FRAME, s->ref->frame);
1332*437bfbebSnyanmisaka 
1333*437bfbebSnyanmisaka     return 0;
1334*437bfbebSnyanmisaka 
1335*437bfbebSnyanmisaka fail:
1336*437bfbebSnyanmisaka     s->ref = NULL;
1337*437bfbebSnyanmisaka     return ret;
1338*437bfbebSnyanmisaka }
1339*437bfbebSnyanmisaka 
parser_nal_unit(HEVCContext * s,const RK_U8 * nal,int length)1340*437bfbebSnyanmisaka static RK_S32 parser_nal_unit(HEVCContext *s, const RK_U8 *nal, int length)
1341*437bfbebSnyanmisaka {
1342*437bfbebSnyanmisaka 
1343*437bfbebSnyanmisaka     HEVCLocalContext *lc = s->HEVClc;
1344*437bfbebSnyanmisaka     BitReadCtx_t *gb    = &lc->gb;
1345*437bfbebSnyanmisaka     RK_S32 ret;
1346*437bfbebSnyanmisaka     mpp_set_bitread_ctx(gb, (RK_U8*)nal, length);
1347*437bfbebSnyanmisaka     mpp_set_bitread_pseudo_code_type(gb, PSEUDO_CODE_H264_H265);
1348*437bfbebSnyanmisaka     ret = hls_nal_unit(s);
1349*437bfbebSnyanmisaka     if (ret < 0) {
1350*437bfbebSnyanmisaka         mpp_err("Invalid NAL unit %d, skipping.\n",
1351*437bfbebSnyanmisaka                 s->nal_unit_type);
1352*437bfbebSnyanmisaka         goto fail;
1353*437bfbebSnyanmisaka     } else if (ret != (s->decoder_id) && s->nal_unit_type != NAL_VPS)
1354*437bfbebSnyanmisaka         return 0;
1355*437bfbebSnyanmisaka 
1356*437bfbebSnyanmisaka     if (s->temporal_id > s->temporal_layer_id)
1357*437bfbebSnyanmisaka         return 0;
1358*437bfbebSnyanmisaka 
1359*437bfbebSnyanmisaka     s->nuh_layer_id = ret;
1360*437bfbebSnyanmisaka     h265d_dbg(H265D_DBG_GLOBAL, "s->nal_unit_type = %d,len = %d \n", s->nal_unit_type, length);
1361*437bfbebSnyanmisaka 
1362*437bfbebSnyanmisaka     if (s->deny_flag && (s->nal_unit_type != NAL_VPS && s->nal_unit_type != NAL_SPS)) {
1363*437bfbebSnyanmisaka         ret = MPP_ERR_STREAM;
1364*437bfbebSnyanmisaka         goto fail;
1365*437bfbebSnyanmisaka     }
1366*437bfbebSnyanmisaka 
1367*437bfbebSnyanmisaka     switch (s->nal_unit_type) {
1368*437bfbebSnyanmisaka     case NAL_VPS:
1369*437bfbebSnyanmisaka         ret = mpp_hevc_decode_nal_vps(s);
1370*437bfbebSnyanmisaka         if (ret < 0 && !s->is_decoded) {
1371*437bfbebSnyanmisaka             mpp_err("mpp_hevc_decode_nal_vps error ret = %d", ret);
1372*437bfbebSnyanmisaka             goto fail;
1373*437bfbebSnyanmisaka         }
1374*437bfbebSnyanmisaka         break;
1375*437bfbebSnyanmisaka     case NAL_SPS:
1376*437bfbebSnyanmisaka         ret = mpp_hevc_decode_nal_sps(s);
1377*437bfbebSnyanmisaka         if (ret < 0 && !s->is_decoded) {
1378*437bfbebSnyanmisaka             mpp_err("mpp_hevc_decode_nal_sps error ret = %d", ret);
1379*437bfbebSnyanmisaka             goto fail;
1380*437bfbebSnyanmisaka         }
1381*437bfbebSnyanmisaka 
1382*437bfbebSnyanmisaka         s->deny_flag = 0;
1383*437bfbebSnyanmisaka         break;
1384*437bfbebSnyanmisaka     case NAL_PPS:
1385*437bfbebSnyanmisaka         if (s->pre_pps_data == NULL) {
1386*437bfbebSnyanmisaka             s->pre_pps_data = mpp_calloc(RK_U8, length + 128);
1387*437bfbebSnyanmisaka             memcpy(s->pre_pps_data, nal, length);
1388*437bfbebSnyanmisaka             s->pps_len = length;
1389*437bfbebSnyanmisaka             s->pps_buf_size = length + 128;
1390*437bfbebSnyanmisaka             s->ps_need_upate = 1;
1391*437bfbebSnyanmisaka         } else if (s->pps_len == length) {
1392*437bfbebSnyanmisaka             if (memcmp(s->pre_pps_data, nal, length)) {
1393*437bfbebSnyanmisaka                 s->ps_need_upate = 1;
1394*437bfbebSnyanmisaka                 memcpy(s->pre_pps_data, nal, length);
1395*437bfbebSnyanmisaka             }
1396*437bfbebSnyanmisaka         } else {
1397*437bfbebSnyanmisaka             if (s->pps_buf_size < length) {
1398*437bfbebSnyanmisaka                 MPP_FREE(s->pre_pps_data);
1399*437bfbebSnyanmisaka                 s->pre_pps_data = mpp_calloc(RK_U8, length + 128);
1400*437bfbebSnyanmisaka                 memcpy(s->pre_pps_data, nal, length);
1401*437bfbebSnyanmisaka                 s->pps_buf_size = length + 128;
1402*437bfbebSnyanmisaka                 s->pps_len = length;
1403*437bfbebSnyanmisaka             }
1404*437bfbebSnyanmisaka             s->ps_need_upate = 1;
1405*437bfbebSnyanmisaka         }
1406*437bfbebSnyanmisaka         ret = mpp_hevc_decode_nal_pps(s);
1407*437bfbebSnyanmisaka         if (ret < 0 && !s->is_decoded) {
1408*437bfbebSnyanmisaka             mpp_err("mpp_hevc_decode_nal_pps error ret = %d", ret);
1409*437bfbebSnyanmisaka             goto fail;
1410*437bfbebSnyanmisaka         }
1411*437bfbebSnyanmisaka         break;
1412*437bfbebSnyanmisaka     case NAL_SEI_PREFIX:
1413*437bfbebSnyanmisaka     case NAL_SEI_SUFFIX:
1414*437bfbebSnyanmisaka         ret = mpp_hevc_decode_nal_sei(s);
1415*437bfbebSnyanmisaka         if (ret < 0) {
1416*437bfbebSnyanmisaka             mpp_err("mpp_hevc_decode_nal_sei error ret = %d", ret);
1417*437bfbebSnyanmisaka             //goto fail;
1418*437bfbebSnyanmisaka         }
1419*437bfbebSnyanmisaka         break;
1420*437bfbebSnyanmisaka     case NAL_TRAIL_R:
1421*437bfbebSnyanmisaka     case NAL_TRAIL_N:
1422*437bfbebSnyanmisaka     case NAL_TSA_N:
1423*437bfbebSnyanmisaka     case NAL_TSA_R:
1424*437bfbebSnyanmisaka     case NAL_STSA_N:
1425*437bfbebSnyanmisaka     case NAL_STSA_R:
1426*437bfbebSnyanmisaka     case NAL_BLA_W_LP:
1427*437bfbebSnyanmisaka     case NAL_BLA_W_RADL:
1428*437bfbebSnyanmisaka     case NAL_BLA_N_LP:
1429*437bfbebSnyanmisaka     case NAL_IDR_W_RADL:
1430*437bfbebSnyanmisaka     case NAL_IDR_N_LP:
1431*437bfbebSnyanmisaka     case NAL_CRA_NUT:
1432*437bfbebSnyanmisaka     case NAL_RADL_N:
1433*437bfbebSnyanmisaka     case NAL_RADL_R:
1434*437bfbebSnyanmisaka     case NAL_RASL_N:
1435*437bfbebSnyanmisaka     case NAL_RASL_R:
1436*437bfbebSnyanmisaka         if (s->task == NULL) {
1437*437bfbebSnyanmisaka             s->extra_has_frame = 1;
1438*437bfbebSnyanmisaka             break;
1439*437bfbebSnyanmisaka         }
1440*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_FUNCTION, "hls_slice_header in");
1441*437bfbebSnyanmisaka         ret = hls_slice_header(s);
1442*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_FUNCTION, "hls_slice_header out");
1443*437bfbebSnyanmisaka 
1444*437bfbebSnyanmisaka         if (ret < 0) {
1445*437bfbebSnyanmisaka             mpp_err("hls_slice_header error ret = %d", ret);
1446*437bfbebSnyanmisaka             /*s->first_nal_type == -1 means first nal is still not parsed.*/
1447*437bfbebSnyanmisaka             if ((s->first_nal_type != s->nal_unit_type) && (s->first_nal_type != NAL_INIT_VALUE))
1448*437bfbebSnyanmisaka                 return 0;
1449*437bfbebSnyanmisaka 
1450*437bfbebSnyanmisaka             return ret;
1451*437bfbebSnyanmisaka         }
1452*437bfbebSnyanmisaka 
1453*437bfbebSnyanmisaka         if (s->recovery.valid_flag) {
1454*437bfbebSnyanmisaka             if (!s->recovery.first_frm_valid) {
1455*437bfbebSnyanmisaka                 s->recovery.first_frm_id = s->poc;
1456*437bfbebSnyanmisaka                 s->recovery.first_frm_valid = 1;
1457*437bfbebSnyanmisaka                 s->recovery.recovery_pic_id = s->recovery.first_frm_id + s->recovery.recovery_frame_cnt;
1458*437bfbebSnyanmisaka                 h265d_dbg(H265D_DBG_SEI, "First recovery frame found, poc %d", s->recovery.first_frm_id);
1459*437bfbebSnyanmisaka             } else {
1460*437bfbebSnyanmisaka                 if (s->recovery.recovery_pic_id < s->poc)
1461*437bfbebSnyanmisaka                     memset(&s->recovery, 0, sizeof(RecoveryPoint));
1462*437bfbebSnyanmisaka             }
1463*437bfbebSnyanmisaka         }
1464*437bfbebSnyanmisaka 
1465*437bfbebSnyanmisaka         if (s->max_ra == INT_MAX) {
1466*437bfbebSnyanmisaka             if (s->nal_unit_type == NAL_CRA_NUT || IS_BLA(s) ||
1467*437bfbebSnyanmisaka                 (s->recovery.valid_flag && s->recovery.first_frm_valid &&
1468*437bfbebSnyanmisaka                  s->recovery.first_frm_id == s->poc)) {
1469*437bfbebSnyanmisaka                 s->max_ra = s->poc;
1470*437bfbebSnyanmisaka             } else {
1471*437bfbebSnyanmisaka                 if (IS_IDR(s))
1472*437bfbebSnyanmisaka                     s->max_ra = INT_MIN;
1473*437bfbebSnyanmisaka             }
1474*437bfbebSnyanmisaka         }
1475*437bfbebSnyanmisaka 
1476*437bfbebSnyanmisaka         if ((s->nal_unit_type == NAL_RASL_R || s->nal_unit_type == NAL_RASL_N) &&
1477*437bfbebSnyanmisaka             s->poc <= s->max_ra) {
1478*437bfbebSnyanmisaka             s->is_decoded = 0;
1479*437bfbebSnyanmisaka             break;
1480*437bfbebSnyanmisaka         } else if (!s->h265dctx->cfg->base.disable_error &&
1481*437bfbebSnyanmisaka                    (s->poc < s->max_ra) && !IS_IRAP(s)) { //when seek to I slice skip the stream small then I slic poc
1482*437bfbebSnyanmisaka             s->is_decoded = 0;
1483*437bfbebSnyanmisaka             break;
1484*437bfbebSnyanmisaka         } else {
1485*437bfbebSnyanmisaka             if (s->nal_unit_type == NAL_RASL_R && s->poc > s->max_ra)
1486*437bfbebSnyanmisaka                 s->max_ra = INT_MIN;
1487*437bfbebSnyanmisaka         }
1488*437bfbebSnyanmisaka 
1489*437bfbebSnyanmisaka         if (s->sh.first_slice_in_pic_flag) {
1490*437bfbebSnyanmisaka             ret = hevc_frame_start(s);
1491*437bfbebSnyanmisaka             if (ret < 0) {
1492*437bfbebSnyanmisaka                 mpp_err("hevc_frame_start = %d", ret);
1493*437bfbebSnyanmisaka                 return ret;
1494*437bfbebSnyanmisaka             }
1495*437bfbebSnyanmisaka         } else if (!s->ref) {
1496*437bfbebSnyanmisaka             mpp_err("First slice in a frame missing.\n");
1497*437bfbebSnyanmisaka             goto fail;
1498*437bfbebSnyanmisaka         }
1499*437bfbebSnyanmisaka 
1500*437bfbebSnyanmisaka         if (s->nal_unit_type != s->first_nal_type) {
1501*437bfbebSnyanmisaka             mpp_err("Non-matching NAL types of the VCL NALUs: %d %d\n",
1502*437bfbebSnyanmisaka                     s->first_nal_type, s->nal_unit_type);
1503*437bfbebSnyanmisaka             goto fail;
1504*437bfbebSnyanmisaka         }
1505*437bfbebSnyanmisaka 
1506*437bfbebSnyanmisaka         if (!s->sh.dependent_slice_segment_flag &&
1507*437bfbebSnyanmisaka             s->sh.slice_type != I_SLICE) {
1508*437bfbebSnyanmisaka             // ret = mpp_hevc_slice_rpl(s);
1509*437bfbebSnyanmisaka             if (ret < 0) {
1510*437bfbebSnyanmisaka                 mpp_err("Error constructing the reference lists for the current slice.\n");
1511*437bfbebSnyanmisaka                 goto fail;
1512*437bfbebSnyanmisaka             }
1513*437bfbebSnyanmisaka             //    rk_get_ref_info(s);
1514*437bfbebSnyanmisaka         }
1515*437bfbebSnyanmisaka 
1516*437bfbebSnyanmisaka 
1517*437bfbebSnyanmisaka         s->is_decoded = 1;
1518*437bfbebSnyanmisaka 
1519*437bfbebSnyanmisaka         break;
1520*437bfbebSnyanmisaka     case NAL_EOS_NUT:
1521*437bfbebSnyanmisaka     case NAL_EOB_NUT:
1522*437bfbebSnyanmisaka         s->seq_decode = (s->seq_decode + 1) & 0xff;
1523*437bfbebSnyanmisaka         s->max_ra     = INT_MAX;
1524*437bfbebSnyanmisaka         break;
1525*437bfbebSnyanmisaka     case NAL_AUD:
1526*437bfbebSnyanmisaka     case NAL_FD_NUT:
1527*437bfbebSnyanmisaka     case NAL_UNSPEC62:
1528*437bfbebSnyanmisaka         break;
1529*437bfbebSnyanmisaka     default:
1530*437bfbebSnyanmisaka         mpp_log("Skipping NAL unit %d\n", s->nal_unit_type);
1531*437bfbebSnyanmisaka     }
1532*437bfbebSnyanmisaka 
1533*437bfbebSnyanmisaka     return 0;
1534*437bfbebSnyanmisaka fail:
1535*437bfbebSnyanmisaka 
1536*437bfbebSnyanmisaka     return ret;
1537*437bfbebSnyanmisaka }
1538*437bfbebSnyanmisaka 
1539*437bfbebSnyanmisaka 
1540*437bfbebSnyanmisaka typedef union {
1541*437bfbebSnyanmisaka     RK_U32  u32;
1542*437bfbebSnyanmisaka     RK_U16  u16[2];
1543*437bfbebSnyanmisaka     RK_U8   u8 [4];
1544*437bfbebSnyanmisaka     float   f32;
1545*437bfbebSnyanmisaka } mpp_alias32;
1546*437bfbebSnyanmisaka 
1547*437bfbebSnyanmisaka #define MPP_FAST_UNALIGNED 1
1548*437bfbebSnyanmisaka 
1549*437bfbebSnyanmisaka 
1550*437bfbebSnyanmisaka #ifndef MPP_RN32A
1551*437bfbebSnyanmisaka #define MPP_RN32A(p) (((const mpp_alias32*)(p))->u32)
1552*437bfbebSnyanmisaka #endif
mpp_hevc_extract_rbsp(HEVCContext * s,const RK_U8 * src,int length,HEVCNAL * nal)1553*437bfbebSnyanmisaka RK_S32 mpp_hevc_extract_rbsp(HEVCContext *s, const RK_U8 *src, int length,
1554*437bfbebSnyanmisaka                              HEVCNAL *nal)
1555*437bfbebSnyanmisaka {
1556*437bfbebSnyanmisaka     RK_S32 i;
1557*437bfbebSnyanmisaka 
1558*437bfbebSnyanmisaka     s->skipped_bytes = 0;
1559*437bfbebSnyanmisaka 
1560*437bfbebSnyanmisaka #define STARTCODE_TEST                                              \
1561*437bfbebSnyanmisaka     if (i + 2 < length && src[i + 1] == 0 && src[i + 2] == 1) {     \
1562*437bfbebSnyanmisaka             /* startcode, so we must be past the end */             \
1563*437bfbebSnyanmisaka         length = i;                                                 \
1564*437bfbebSnyanmisaka         break;                                                      \
1565*437bfbebSnyanmisaka     }
1566*437bfbebSnyanmisaka 
1567*437bfbebSnyanmisaka #if MPP_FAST_UNALIGNED
1568*437bfbebSnyanmisaka #define FIND_FIRST_ZERO                                             \
1569*437bfbebSnyanmisaka     if (i > 0 && !src[i])                                           \
1570*437bfbebSnyanmisaka         i--;                                                        \
1571*437bfbebSnyanmisaka     while (src[i])                                                  \
1572*437bfbebSnyanmisaka         i++
1573*437bfbebSnyanmisaka 
1574*437bfbebSnyanmisaka     for (i = 0; i + 1 < length; i += 5) {
1575*437bfbebSnyanmisaka         if (!((~MPP_RN32A(src + i) &
1576*437bfbebSnyanmisaka                (MPP_RN32A(src + i) - 0x01000101U)) &
1577*437bfbebSnyanmisaka               0x80008080U))
1578*437bfbebSnyanmisaka             continue;
1579*437bfbebSnyanmisaka 
1580*437bfbebSnyanmisaka         FIND_FIRST_ZERO;
1581*437bfbebSnyanmisaka 
1582*437bfbebSnyanmisaka         STARTCODE_TEST;
1583*437bfbebSnyanmisaka         i -= 3;
1584*437bfbebSnyanmisaka     }
1585*437bfbebSnyanmisaka #else
1586*437bfbebSnyanmisaka     for (i = 0; i + 1 < length; i += 2) {
1587*437bfbebSnyanmisaka         if (src[i])
1588*437bfbebSnyanmisaka             continue;
1589*437bfbebSnyanmisaka         if (i > 0 && src[i - 1] == 0)
1590*437bfbebSnyanmisaka             i--;
1591*437bfbebSnyanmisaka         STARTCODE_TEST;
1592*437bfbebSnyanmisaka     }
1593*437bfbebSnyanmisaka #endif
1594*437bfbebSnyanmisaka 
1595*437bfbebSnyanmisaka     if (length + MPP_INPUT_BUFFER_PADDING_SIZE > nal->rbsp_buffer_size) {
1596*437bfbebSnyanmisaka         RK_S32 min_size = length + MPP_INPUT_BUFFER_PADDING_SIZE;
1597*437bfbebSnyanmisaka         mpp_free(nal->rbsp_buffer);
1598*437bfbebSnyanmisaka         nal->rbsp_buffer = NULL;
1599*437bfbebSnyanmisaka         min_size = MPP_MAX(17 * min_size / 16 + 32, min_size);
1600*437bfbebSnyanmisaka         nal->rbsp_buffer = mpp_malloc(RK_U8, min_size);
1601*437bfbebSnyanmisaka         if (nal->rbsp_buffer == NULL) {
1602*437bfbebSnyanmisaka             min_size = 0;
1603*437bfbebSnyanmisaka         }
1604*437bfbebSnyanmisaka         nal->rbsp_buffer_size = min_size;
1605*437bfbebSnyanmisaka     }
1606*437bfbebSnyanmisaka 
1607*437bfbebSnyanmisaka     memcpy(nal->rbsp_buffer, src, length);
1608*437bfbebSnyanmisaka     nal->data = nal->rbsp_buffer;
1609*437bfbebSnyanmisaka     nal->size = length;
1610*437bfbebSnyanmisaka 
1611*437bfbebSnyanmisaka     memset(nal->rbsp_buffer + length, 0, MPP_INPUT_BUFFER_PADDING_SIZE);
1612*437bfbebSnyanmisaka     return length;
1613*437bfbebSnyanmisaka }
1614*437bfbebSnyanmisaka 
split_nal_units(HEVCContext * s,RK_U8 * buf,RK_U32 length)1615*437bfbebSnyanmisaka static RK_S32 split_nal_units(HEVCContext *s, RK_U8 *buf, RK_U32 length)
1616*437bfbebSnyanmisaka {
1617*437bfbebSnyanmisaka     RK_S32 i, consumed;
1618*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1619*437bfbebSnyanmisaka     s->nb_nals = 0;
1620*437bfbebSnyanmisaka     while (length >= 4) {
1621*437bfbebSnyanmisaka         HEVCNAL *nal;
1622*437bfbebSnyanmisaka         RK_S32 extract_length = 0;
1623*437bfbebSnyanmisaka 
1624*437bfbebSnyanmisaka         if (s->is_nalff) {
1625*437bfbebSnyanmisaka             for (i = 0; i < s->nal_length_size; i++)
1626*437bfbebSnyanmisaka                 extract_length = (extract_length << 8) | buf[i];
1627*437bfbebSnyanmisaka             buf    += s->nal_length_size;
1628*437bfbebSnyanmisaka             length -= s->nal_length_size;
1629*437bfbebSnyanmisaka 
1630*437bfbebSnyanmisaka             if ((RK_U32)extract_length > length) {
1631*437bfbebSnyanmisaka                 mpp_err( "Invalid NAL unit size.\n");
1632*437bfbebSnyanmisaka                 ret =  MPP_ERR_STREAM;
1633*437bfbebSnyanmisaka                 goto fail;
1634*437bfbebSnyanmisaka             }
1635*437bfbebSnyanmisaka         } else {
1636*437bfbebSnyanmisaka             /* search start code */
1637*437bfbebSnyanmisaka             if (buf[2] == 0) {
1638*437bfbebSnyanmisaka                 length--;
1639*437bfbebSnyanmisaka                 buf++;
1640*437bfbebSnyanmisaka                 continue;
1641*437bfbebSnyanmisaka             }
1642*437bfbebSnyanmisaka             if (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
1643*437bfbebSnyanmisaka                 RK_U32 state = (RK_U32) - 1;
1644*437bfbebSnyanmisaka                 int has_nal = 0;
1645*437bfbebSnyanmisaka                 for (i = 0; i < (RK_S32)length; i++) {
1646*437bfbebSnyanmisaka                     state = (state << 8) | buf[i];
1647*437bfbebSnyanmisaka                     if (((state >> 8) & 0xFFFFFF) == START_CODE) {
1648*437bfbebSnyanmisaka                         has_nal = 1;
1649*437bfbebSnyanmisaka                         i = i - 3;
1650*437bfbebSnyanmisaka                         break;
1651*437bfbebSnyanmisaka                     }
1652*437bfbebSnyanmisaka                 }
1653*437bfbebSnyanmisaka 
1654*437bfbebSnyanmisaka                 if (has_nal) {
1655*437bfbebSnyanmisaka                     length -= i;
1656*437bfbebSnyanmisaka                     buf += i;
1657*437bfbebSnyanmisaka                     continue;
1658*437bfbebSnyanmisaka                 }
1659*437bfbebSnyanmisaka 
1660*437bfbebSnyanmisaka                 if (s->nb_nals) {
1661*437bfbebSnyanmisaka                     return MPP_OK;
1662*437bfbebSnyanmisaka                 } else {
1663*437bfbebSnyanmisaka                     mpp_err( "No start code is found.\n");
1664*437bfbebSnyanmisaka                     ret =  MPP_ERR_STREAM;
1665*437bfbebSnyanmisaka                     goto fail;
1666*437bfbebSnyanmisaka                 }
1667*437bfbebSnyanmisaka             }
1668*437bfbebSnyanmisaka 
1669*437bfbebSnyanmisaka             buf           += 3;
1670*437bfbebSnyanmisaka             length        -= 3;
1671*437bfbebSnyanmisaka         }
1672*437bfbebSnyanmisaka 
1673*437bfbebSnyanmisaka         if (!s->is_nalff)
1674*437bfbebSnyanmisaka             extract_length = length;
1675*437bfbebSnyanmisaka 
1676*437bfbebSnyanmisaka         if (!extract_length) {
1677*437bfbebSnyanmisaka             return MPP_OK;
1678*437bfbebSnyanmisaka         }
1679*437bfbebSnyanmisaka         if (s->nals_allocated < 1) {
1680*437bfbebSnyanmisaka             RK_S32 new_size = s->nals_allocated + 10;
1681*437bfbebSnyanmisaka             HEVCNAL *tmp = mpp_malloc(HEVCNAL, new_size);
1682*437bfbebSnyanmisaka             memset((void*)tmp, 0, new_size * sizeof(HEVCNAL));
1683*437bfbebSnyanmisaka             s->nals_allocated = new_size;
1684*437bfbebSnyanmisaka             s->nals = tmp;
1685*437bfbebSnyanmisaka         }
1686*437bfbebSnyanmisaka         if (s->nals_allocated < s->nb_nals + 1) {
1687*437bfbebSnyanmisaka             int new_size = s->nals_allocated + 10;
1688*437bfbebSnyanmisaka             HEVCNAL *tmp = mpp_malloc(HEVCNAL, new_size);
1689*437bfbebSnyanmisaka             memset((void*)tmp, 0, new_size * sizeof(HEVCNAL));
1690*437bfbebSnyanmisaka             if (!tmp) {
1691*437bfbebSnyanmisaka                 mpp_err("return enomm new_size %d", new_size);
1692*437bfbebSnyanmisaka                 ret = MPP_ERR_NOMEM;
1693*437bfbebSnyanmisaka                 goto fail;
1694*437bfbebSnyanmisaka             }
1695*437bfbebSnyanmisaka             memcpy((void*)tmp, (void*)s->nals, (new_size - 10)*sizeof(HEVCNAL));
1696*437bfbebSnyanmisaka             mpp_free(s->nals);
1697*437bfbebSnyanmisaka             s->nals = NULL;
1698*437bfbebSnyanmisaka             s->nals = tmp;
1699*437bfbebSnyanmisaka             memset(s->nals + s->nals_allocated, 0,
1700*437bfbebSnyanmisaka                    (new_size - s->nals_allocated) * sizeof(*tmp));
1701*437bfbebSnyanmisaka             s->nals_allocated = new_size;
1702*437bfbebSnyanmisaka         }
1703*437bfbebSnyanmisaka         nal = &s->nals[s->nb_nals];
1704*437bfbebSnyanmisaka 
1705*437bfbebSnyanmisaka         consumed = mpp_hevc_extract_rbsp(s, buf, extract_length, nal);
1706*437bfbebSnyanmisaka 
1707*437bfbebSnyanmisaka         if (consumed < 0) {
1708*437bfbebSnyanmisaka             ret = MPP_ERR_STREAM;
1709*437bfbebSnyanmisaka             goto fail;
1710*437bfbebSnyanmisaka         }
1711*437bfbebSnyanmisaka 
1712*437bfbebSnyanmisaka         s->nb_nals++;
1713*437bfbebSnyanmisaka 
1714*437bfbebSnyanmisaka         mpp_set_bitread_ctx(&s->HEVClc->gb, (RK_U8 *)nal->data, nal->size);
1715*437bfbebSnyanmisaka         mpp_set_bitread_pseudo_code_type(&s->HEVClc->gb, PSEUDO_CODE_H264_H265);
1716*437bfbebSnyanmisaka         if (hls_nal_unit(s) < 0)
1717*437bfbebSnyanmisaka             s->nb_nals--;
1718*437bfbebSnyanmisaka 
1719*437bfbebSnyanmisaka         if (s->nal_unit_type < NAL_VPS) {
1720*437bfbebSnyanmisaka 
1721*437bfbebSnyanmisaka             if (nal->size != consumed)
1722*437bfbebSnyanmisaka                 h265d_dbg(H265D_DBG_GLOBAL, "tag_stream: nal.size=%d, consumed=%d\n", nal->size, consumed);
1723*437bfbebSnyanmisaka 
1724*437bfbebSnyanmisaka         }
1725*437bfbebSnyanmisaka 
1726*437bfbebSnyanmisaka         /* if (s->nal_unit_type == NAL_EOB_NUT ||
1727*437bfbebSnyanmisaka              s->nal_unit_type == NAL_EOS_NUT)
1728*437bfbebSnyanmisaka              s->eos = 1;*/
1729*437bfbebSnyanmisaka 
1730*437bfbebSnyanmisaka         buf    += consumed;
1731*437bfbebSnyanmisaka         length -= consumed;
1732*437bfbebSnyanmisaka     }
1733*437bfbebSnyanmisaka fail:
1734*437bfbebSnyanmisaka 
1735*437bfbebSnyanmisaka     return (s->nb_nals) ? MPP_OK : ret;
1736*437bfbebSnyanmisaka }
1737*437bfbebSnyanmisaka 
mpp_hevc_fill_dynamic_meta(HEVCContext * s,const RK_U8 * data,RK_U32 size,RK_U32 hdr_fmt)1738*437bfbebSnyanmisaka void mpp_hevc_fill_dynamic_meta(HEVCContext *s, const RK_U8 *data, RK_U32 size, RK_U32 hdr_fmt)
1739*437bfbebSnyanmisaka {
1740*437bfbebSnyanmisaka     MppFrameHdrDynamicMeta *hdr_dynamic_meta = s->hdr_dynamic_meta;
1741*437bfbebSnyanmisaka 
1742*437bfbebSnyanmisaka     if (hdr_dynamic_meta && (hdr_dynamic_meta->size < size)) {
1743*437bfbebSnyanmisaka         mpp_free(hdr_dynamic_meta);
1744*437bfbebSnyanmisaka         hdr_dynamic_meta = NULL;
1745*437bfbebSnyanmisaka     }
1746*437bfbebSnyanmisaka 
1747*437bfbebSnyanmisaka     if (!hdr_dynamic_meta) {
1748*437bfbebSnyanmisaka         hdr_dynamic_meta = mpp_calloc_size(MppFrameHdrDynamicMeta,
1749*437bfbebSnyanmisaka                                            sizeof(MppFrameHdrDynamicMeta) + size);
1750*437bfbebSnyanmisaka         if (!hdr_dynamic_meta) {
1751*437bfbebSnyanmisaka             mpp_err_f("malloc hdr dynamic data failed!\n");
1752*437bfbebSnyanmisaka             return;
1753*437bfbebSnyanmisaka         }
1754*437bfbebSnyanmisaka     }
1755*437bfbebSnyanmisaka     if (size && data) {
1756*437bfbebSnyanmisaka         switch (hdr_fmt) {
1757*437bfbebSnyanmisaka         case DLBY: {
1758*437bfbebSnyanmisaka             RK_U8 start_code[4] = {0, 0, 0, 1};
1759*437bfbebSnyanmisaka 
1760*437bfbebSnyanmisaka             memcpy((RK_U8*)hdr_dynamic_meta->data, start_code, 4);
1761*437bfbebSnyanmisaka             memcpy((RK_U8*)hdr_dynamic_meta->data + 4, (RK_U8*)data, size - 4);
1762*437bfbebSnyanmisaka         } break;
1763*437bfbebSnyanmisaka         case HDRVIVID:
1764*437bfbebSnyanmisaka         case HDR10PLUS: {
1765*437bfbebSnyanmisaka             memcpy((RK_U8*)hdr_dynamic_meta->data, (RK_U8*)data, size);
1766*437bfbebSnyanmisaka         } break;
1767*437bfbebSnyanmisaka         default:
1768*437bfbebSnyanmisaka             break;
1769*437bfbebSnyanmisaka         }
1770*437bfbebSnyanmisaka         hdr_dynamic_meta->size = size;
1771*437bfbebSnyanmisaka         hdr_dynamic_meta->hdr_fmt = hdr_fmt;
1772*437bfbebSnyanmisaka     }
1773*437bfbebSnyanmisaka     s->hdr_dynamic_meta = hdr_dynamic_meta;
1774*437bfbebSnyanmisaka     s->hdr_dynamic = 1;
1775*437bfbebSnyanmisaka     s->is_hdr = 1;
1776*437bfbebSnyanmisaka }
1777*437bfbebSnyanmisaka 
check_rpus(HEVCContext * s)1778*437bfbebSnyanmisaka static RK_S32 check_rpus(HEVCContext *s)
1779*437bfbebSnyanmisaka {
1780*437bfbebSnyanmisaka     HEVCNAL *nal;
1781*437bfbebSnyanmisaka 
1782*437bfbebSnyanmisaka     if (s->nb_nals <= 1)
1783*437bfbebSnyanmisaka         return 0;
1784*437bfbebSnyanmisaka 
1785*437bfbebSnyanmisaka     nal = &s->nals[s->nb_nals - 1];
1786*437bfbebSnyanmisaka 
1787*437bfbebSnyanmisaka     if (nal->size > 2) {
1788*437bfbebSnyanmisaka         BitReadCtx_t gb;
1789*437bfbebSnyanmisaka         RK_S32 value, nal_unit_type, nuh_layer_id, temporal_id;
1790*437bfbebSnyanmisaka 
1791*437bfbebSnyanmisaka         mpp_set_bitread_ctx((&gb), (RK_U8*)nal->data, nal->size);
1792*437bfbebSnyanmisaka         mpp_set_bitread_pseudo_code_type((&gb), PSEUDO_CODE_H264_H265);
1793*437bfbebSnyanmisaka 
1794*437bfbebSnyanmisaka         READ_ONEBIT((&gb), &value); /*this bit should be zero*/
1795*437bfbebSnyanmisaka         READ_BITS((&gb), 6, &nal_unit_type);
1796*437bfbebSnyanmisaka         READ_BITS((&gb), 6, &nuh_layer_id);
1797*437bfbebSnyanmisaka         READ_BITS((&gb), 3, &temporal_id);
1798*437bfbebSnyanmisaka 
1799*437bfbebSnyanmisaka         /*
1800*437bfbebSnyanmisaka         * Check for RPU delimiter.
1801*437bfbebSnyanmisaka         *
1802*437bfbebSnyanmisaka         * Dlby Vision RPUs masquerade as unregistered NALs of type 62.
1803*437bfbebSnyanmisaka         *
1804*437bfbebSnyanmisaka         * We have to do this check here an create the rpu buffer, since RPUs are appended
1805*437bfbebSnyanmisaka         * to the end of an AU; they are the last non-EOB/EOS NAL in the AU.
1806*437bfbebSnyanmisaka         */
1807*437bfbebSnyanmisaka         if (nal_unit_type == NAL_UNSPEC62)
1808*437bfbebSnyanmisaka             mpp_hevc_fill_dynamic_meta(s, nal->data + 2, gb.bytes_left_ + 4, DLBY);
1809*437bfbebSnyanmisaka     }
1810*437bfbebSnyanmisaka     return 0;
1811*437bfbebSnyanmisaka __BITREAD_ERR:
1812*437bfbebSnyanmisaka     return  MPP_ERR_STREAM;
1813*437bfbebSnyanmisaka }
1814*437bfbebSnyanmisaka 
parser_nal_units(HEVCContext * s)1815*437bfbebSnyanmisaka static RK_S32 parser_nal_units(HEVCContext *s)
1816*437bfbebSnyanmisaka {
1817*437bfbebSnyanmisaka     /* parse the NAL units */
1818*437bfbebSnyanmisaka     RK_S32 i, ret = 0, slice_cnt = 0;
1819*437bfbebSnyanmisaka 
1820*437bfbebSnyanmisaka     check_rpus(s);
1821*437bfbebSnyanmisaka 
1822*437bfbebSnyanmisaka     for (i = 0; i < s->nb_nals; i++) {
1823*437bfbebSnyanmisaka         ret = parser_nal_unit(s, s->nals[i].data, s->nals[i].size);
1824*437bfbebSnyanmisaka         if (ret < 0) {
1825*437bfbebSnyanmisaka             mpp_err("Error parsing NAL unit #%d,error ret = %d.\n", i, ret);
1826*437bfbebSnyanmisaka             goto fail;
1827*437bfbebSnyanmisaka         }
1828*437bfbebSnyanmisaka         /* update slice data if slice_header_extension_present_flag is 1*/
1829*437bfbebSnyanmisaka         if (s->nal_unit_type < 32) {
1830*437bfbebSnyanmisaka             switch (s->nal_unit_type) {
1831*437bfbebSnyanmisaka             case NAL_TRAIL_R:
1832*437bfbebSnyanmisaka             case NAL_TRAIL_N:
1833*437bfbebSnyanmisaka             case NAL_TSA_N:
1834*437bfbebSnyanmisaka             case NAL_TSA_R:
1835*437bfbebSnyanmisaka             case NAL_STSA_N:
1836*437bfbebSnyanmisaka             case NAL_STSA_R:
1837*437bfbebSnyanmisaka             case NAL_BLA_W_LP:
1838*437bfbebSnyanmisaka             case NAL_BLA_W_RADL:
1839*437bfbebSnyanmisaka             case NAL_BLA_N_LP:
1840*437bfbebSnyanmisaka             case NAL_IDR_W_RADL:
1841*437bfbebSnyanmisaka             case NAL_IDR_N_LP:
1842*437bfbebSnyanmisaka             case NAL_CRA_NUT:
1843*437bfbebSnyanmisaka             case NAL_RADL_N:
1844*437bfbebSnyanmisaka             case NAL_RADL_R:
1845*437bfbebSnyanmisaka             case NAL_RASL_N:
1846*437bfbebSnyanmisaka             case NAL_RASL_R:
1847*437bfbebSnyanmisaka                 if (s->pps && s->pps->slice_header_extension_present_flag) {
1848*437bfbebSnyanmisaka                     h265d_dxva2_picture_context_t *temp = (h265d_dxva2_picture_context_t *)s->hal_pic_private;
1849*437bfbebSnyanmisaka                     temp->slice_cut_param[slice_cnt].start_bit = s->start_bit;
1850*437bfbebSnyanmisaka                     temp->slice_cut_param[slice_cnt].end_bit = s->end_bit;
1851*437bfbebSnyanmisaka                     temp->slice_cut_param[slice_cnt].is_enable = 1;
1852*437bfbebSnyanmisaka                     break;
1853*437bfbebSnyanmisaka                 }
1854*437bfbebSnyanmisaka             default: break;
1855*437bfbebSnyanmisaka             }
1856*437bfbebSnyanmisaka             slice_cnt++;
1857*437bfbebSnyanmisaka         }
1858*437bfbebSnyanmisaka     }
1859*437bfbebSnyanmisaka fail:
1860*437bfbebSnyanmisaka     return ret;
1861*437bfbebSnyanmisaka }
1862*437bfbebSnyanmisaka 
U16_AT(const RK_U8 * ptr)1863*437bfbebSnyanmisaka static RK_U16 U16_AT(const RK_U8 *ptr)
1864*437bfbebSnyanmisaka {
1865*437bfbebSnyanmisaka     return ptr[0] << 8 | ptr[1];
1866*437bfbebSnyanmisaka }
1867*437bfbebSnyanmisaka 
hevc_parser_extradata(HEVCContext * s)1868*437bfbebSnyanmisaka static RK_S32 hevc_parser_extradata(HEVCContext *s)
1869*437bfbebSnyanmisaka {
1870*437bfbebSnyanmisaka     H265dContext_t *h265dctx = s->h265dctx;
1871*437bfbebSnyanmisaka     RK_S32 ret = MPP_SUCCESS;
1872*437bfbebSnyanmisaka     if (h265dctx->extradata_size > 3 &&
1873*437bfbebSnyanmisaka         (h265dctx->extradata[0] || h265dctx->extradata[1] ||
1874*437bfbebSnyanmisaka          h265dctx->extradata[2] > 1)) {
1875*437bfbebSnyanmisaka         /* It seems the extradata is encoded as hvcC format.
1876*437bfbebSnyanmisaka          * Temporarily, we support configurationVersion==0 until 14496-15 3rd
1877*437bfbebSnyanmisaka          * is finalized. When finalized, configurationVersion will be 1 and we
1878*437bfbebSnyanmisaka          * can recognize hvcC by checking if h265dctx->extradata[0]==1 or not. */
1879*437bfbebSnyanmisaka         const RK_U8 *ptr = (const RK_U8 *)h265dctx->extradata;
1880*437bfbebSnyanmisaka         RK_U32 size = h265dctx->extradata_size;
1881*437bfbebSnyanmisaka         RK_U32 numofArrays = 0, numofNals = 0;
1882*437bfbebSnyanmisaka         RK_U32 j = 0, i = 0;
1883*437bfbebSnyanmisaka         if (size < 7) {
1884*437bfbebSnyanmisaka             return MPP_NOK;
1885*437bfbebSnyanmisaka         }
1886*437bfbebSnyanmisaka 
1887*437bfbebSnyanmisaka         mpp_log("extradata is encoded as hvcC format");
1888*437bfbebSnyanmisaka         s->is_nalff = 1;
1889*437bfbebSnyanmisaka         s->nal_length_size = 1 + (ptr[14 + 7] & 3);
1890*437bfbebSnyanmisaka         ptr += 22;
1891*437bfbebSnyanmisaka         size -= 22;
1892*437bfbebSnyanmisaka         numofArrays = (char)ptr[0];
1893*437bfbebSnyanmisaka         ptr += 1;
1894*437bfbebSnyanmisaka         size -= 1;
1895*437bfbebSnyanmisaka         for (i = 0; i < numofArrays; i++) {
1896*437bfbebSnyanmisaka             ptr += 1;
1897*437bfbebSnyanmisaka             size -= 1;
1898*437bfbebSnyanmisaka             // Num of nals
1899*437bfbebSnyanmisaka             numofNals = U16_AT(ptr);
1900*437bfbebSnyanmisaka             ptr += 2;
1901*437bfbebSnyanmisaka             size -= 2;
1902*437bfbebSnyanmisaka 
1903*437bfbebSnyanmisaka             for (j = 0; j < numofNals; j++) {
1904*437bfbebSnyanmisaka                 RK_U32 length = 0;
1905*437bfbebSnyanmisaka                 if (size < 2) {
1906*437bfbebSnyanmisaka                     return MPP_NOK;
1907*437bfbebSnyanmisaka                 }
1908*437bfbebSnyanmisaka 
1909*437bfbebSnyanmisaka                 length = U16_AT(ptr);
1910*437bfbebSnyanmisaka 
1911*437bfbebSnyanmisaka                 ptr += 2;
1912*437bfbebSnyanmisaka                 size -= 2;
1913*437bfbebSnyanmisaka                 if (size < length) {
1914*437bfbebSnyanmisaka                     return MPP_NOK;
1915*437bfbebSnyanmisaka                 }
1916*437bfbebSnyanmisaka                 parser_nal_unit(s, ptr, length);
1917*437bfbebSnyanmisaka                 ptr += length;
1918*437bfbebSnyanmisaka                 size -= length;
1919*437bfbebSnyanmisaka             }
1920*437bfbebSnyanmisaka         }
1921*437bfbebSnyanmisaka     } else {
1922*437bfbebSnyanmisaka         s->is_nalff = 0;
1923*437bfbebSnyanmisaka         ret = split_nal_units(s, h265dctx->extradata, h265dctx->extradata_size);
1924*437bfbebSnyanmisaka         if (ret < 0)
1925*437bfbebSnyanmisaka             return ret;
1926*437bfbebSnyanmisaka         ret = parser_nal_units(s);
1927*437bfbebSnyanmisaka         if (ret < 0)
1928*437bfbebSnyanmisaka             return ret;
1929*437bfbebSnyanmisaka     }
1930*437bfbebSnyanmisaka     return ret;
1931*437bfbebSnyanmisaka }
1932*437bfbebSnyanmisaka 
h265d_prepare(void * ctx,MppPacket pkt,HalDecTask * task)1933*437bfbebSnyanmisaka MPP_RET h265d_prepare(void *ctx, MppPacket pkt, HalDecTask *task)
1934*437bfbebSnyanmisaka {
1935*437bfbebSnyanmisaka 
1936*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1937*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
1938*437bfbebSnyanmisaka     HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
1939*437bfbebSnyanmisaka     SplitContext_t *sc = (SplitContext_t*)h265dctx->split_cxt;
1940*437bfbebSnyanmisaka     RK_S64 pts = -1, dts = -1;
1941*437bfbebSnyanmisaka     RK_U8 *buf = NULL;
1942*437bfbebSnyanmisaka     void *pos = NULL;
1943*437bfbebSnyanmisaka     RK_S32 length = 0;
1944*437bfbebSnyanmisaka 
1945*437bfbebSnyanmisaka     task->valid = 0;
1946*437bfbebSnyanmisaka     s->eos = mpp_packet_get_eos(pkt);
1947*437bfbebSnyanmisaka 
1948*437bfbebSnyanmisaka     if (sc != NULL) {
1949*437bfbebSnyanmisaka         sc->eos = s->eos;
1950*437bfbebSnyanmisaka     } else if (h265dctx->cfg->base.split_parse) {
1951*437bfbebSnyanmisaka         h265d_split_init((void**)&sc);
1952*437bfbebSnyanmisaka         if (sc == NULL) {
1953*437bfbebSnyanmisaka             mpp_err("split contxt malloc fail");
1954*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
1955*437bfbebSnyanmisaka         }
1956*437bfbebSnyanmisaka         h265dctx->split_cxt = sc;
1957*437bfbebSnyanmisaka     }
1958*437bfbebSnyanmisaka 
1959*437bfbebSnyanmisaka     buf = (RK_U8 *)mpp_packet_get_pos(pkt);
1960*437bfbebSnyanmisaka     pts = mpp_packet_get_pts(pkt);
1961*437bfbebSnyanmisaka     dts = mpp_packet_get_dts(pkt);
1962*437bfbebSnyanmisaka     h265d_dbg(H265D_DBG_TIME, "prepare get pts %lld", pts);
1963*437bfbebSnyanmisaka     length = (RK_S32)mpp_packet_get_length(pkt);
1964*437bfbebSnyanmisaka 
1965*437bfbebSnyanmisaka     if (mpp_packet_get_flag(pkt) & MPP_PACKET_FLAG_EXTRA_DATA) {
1966*437bfbebSnyanmisaka 
1967*437bfbebSnyanmisaka         h265dctx->extradata_size = length;
1968*437bfbebSnyanmisaka         h265dctx->extradata = buf;
1969*437bfbebSnyanmisaka         s->extra_has_frame = 0;
1970*437bfbebSnyanmisaka         s->task = NULL;
1971*437bfbebSnyanmisaka         hevc_parser_extradata(s);
1972*437bfbebSnyanmisaka         if (!s->extra_has_frame) {
1973*437bfbebSnyanmisaka             pos = buf + length;
1974*437bfbebSnyanmisaka             mpp_packet_set_pos(pkt, pos);
1975*437bfbebSnyanmisaka             return MPP_OK;
1976*437bfbebSnyanmisaka         }
1977*437bfbebSnyanmisaka     }
1978*437bfbebSnyanmisaka 
1979*437bfbebSnyanmisaka     if (h265dctx->cfg->base.split_parse && !s->is_nalff) {
1980*437bfbebSnyanmisaka         RK_S32 consume = 0;
1981*437bfbebSnyanmisaka         RK_U8 *split_out_buf = NULL;
1982*437bfbebSnyanmisaka         RK_S32 split_size = 0;
1983*437bfbebSnyanmisaka 
1984*437bfbebSnyanmisaka         consume = h265d_split_frame(h265dctx->split_cxt, (const RK_U8**)&split_out_buf, &split_size,
1985*437bfbebSnyanmisaka                                     (const RK_U8*)buf, length, pts, dts);
1986*437bfbebSnyanmisaka         pos = buf + consume;
1987*437bfbebSnyanmisaka         mpp_packet_set_pos(pkt, pos);
1988*437bfbebSnyanmisaka         if (split_size) {
1989*437bfbebSnyanmisaka             buf = split_out_buf;
1990*437bfbebSnyanmisaka             length = split_size;
1991*437bfbebSnyanmisaka             s->checksum_buf = buf;  //check with openhevc
1992*437bfbebSnyanmisaka             s->checksum_buf_size = split_size;
1993*437bfbebSnyanmisaka             h265d_dbg(H265D_DBG_TIME, "split frame get pts %lld", sc->pts);
1994*437bfbebSnyanmisaka             s->pts = sc->pts;
1995*437bfbebSnyanmisaka             s->dts = sc->dts;
1996*437bfbebSnyanmisaka             s->eos = (s->eos && (mpp_packet_get_length(pkt) < 4)) ? 1 : 0;
1997*437bfbebSnyanmisaka         } else {
1998*437bfbebSnyanmisaka             return MPP_FAIL_SPLIT_FRAME;
1999*437bfbebSnyanmisaka         }
2000*437bfbebSnyanmisaka     } else {
2001*437bfbebSnyanmisaka         pos = buf + length;
2002*437bfbebSnyanmisaka         s->pts = pts;
2003*437bfbebSnyanmisaka         s->dts = dts;
2004*437bfbebSnyanmisaka         mpp_packet_set_pos(pkt, pos);
2005*437bfbebSnyanmisaka         if (s->eos && !length) {
2006*437bfbebSnyanmisaka             task->valid = 0;
2007*437bfbebSnyanmisaka             task->flags.eos = 1;
2008*437bfbebSnyanmisaka             h265d_flush(ctx);
2009*437bfbebSnyanmisaka             return ret;
2010*437bfbebSnyanmisaka         }
2011*437bfbebSnyanmisaka     }
2012*437bfbebSnyanmisaka #ifdef dump
2013*437bfbebSnyanmisaka     if (s->nb_frame < 10 && fp != NULL) {
2014*437bfbebSnyanmisaka         fwrite(buf, 1, length, fp);
2015*437bfbebSnyanmisaka     }
2016*437bfbebSnyanmisaka #endif
2017*437bfbebSnyanmisaka     ret = (MPP_RET)split_nal_units(s, buf, length);
2018*437bfbebSnyanmisaka 
2019*437bfbebSnyanmisaka     if (MPP_OK == ret) {
2020*437bfbebSnyanmisaka         if (MPP_OK == h265d_syntax_fill_slice(s->h265dctx, task->input)) {
2021*437bfbebSnyanmisaka             task->valid = 1;
2022*437bfbebSnyanmisaka             task->input_packet = s->input_packet;
2023*437bfbebSnyanmisaka         }
2024*437bfbebSnyanmisaka     }
2025*437bfbebSnyanmisaka     return ret;
2026*437bfbebSnyanmisaka 
2027*437bfbebSnyanmisaka }
2028*437bfbebSnyanmisaka 
h265d_get_stream(void * ctx,RK_U8 ** buf,RK_S32 * size)2029*437bfbebSnyanmisaka MPP_RET h265d_get_stream(void *ctx, RK_U8 **buf, RK_S32 *size)
2030*437bfbebSnyanmisaka {
2031*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2032*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
2033*437bfbebSnyanmisaka     HEVCContext *s = h265dctx->priv_data;
2034*437bfbebSnyanmisaka     *buf = s->checksum_buf;
2035*437bfbebSnyanmisaka     *size = s->checksum_buf_size;
2036*437bfbebSnyanmisaka     return ret;
2037*437bfbebSnyanmisaka }
2038*437bfbebSnyanmisaka 
h265d_set_compare_info(void * ctx,void * info)2039*437bfbebSnyanmisaka MPP_RET h265d_set_compare_info(void *ctx, void *info)
2040*437bfbebSnyanmisaka {
2041*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
2042*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
2043*437bfbebSnyanmisaka     h265dctx->compare_info = info;
2044*437bfbebSnyanmisaka     return ret;
2045*437bfbebSnyanmisaka }
2046*437bfbebSnyanmisaka 
2047*437bfbebSnyanmisaka 
h265d_parse(void * ctx,HalDecTask * task)2048*437bfbebSnyanmisaka MPP_RET h265d_parse(void *ctx, HalDecTask *task)
2049*437bfbebSnyanmisaka {
2050*437bfbebSnyanmisaka     MPP_RET ret;
2051*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
2052*437bfbebSnyanmisaka     HEVCContext *s = h265dctx->priv_data;
2053*437bfbebSnyanmisaka 
2054*437bfbebSnyanmisaka     task->valid = 0;
2055*437bfbebSnyanmisaka     s->got_frame = 0;
2056*437bfbebSnyanmisaka     s->task = task;
2057*437bfbebSnyanmisaka     s->ref = NULL;
2058*437bfbebSnyanmisaka     ret    = parser_nal_units(s);
2059*437bfbebSnyanmisaka     if (ret < 0) {
2060*437bfbebSnyanmisaka         if (ret ==  MPP_ERR_STREAM) {
2061*437bfbebSnyanmisaka             mpp_log("current stream is no right skip it %p\n", s->ref);
2062*437bfbebSnyanmisaka             ret = 0;
2063*437bfbebSnyanmisaka         }
2064*437bfbebSnyanmisaka         // return ret;
2065*437bfbebSnyanmisaka         task->flags.parse_err = 1;
2066*437bfbebSnyanmisaka     }
2067*437bfbebSnyanmisaka     h265d_dbg(H265D_DBG_GLOBAL, "decode poc = %d", s->poc);
2068*437bfbebSnyanmisaka     if (s->ref) {
2069*437bfbebSnyanmisaka         if (!task->flags.parse_err)
2070*437bfbebSnyanmisaka             h265d_parser2_syntax(h265dctx);
2071*437bfbebSnyanmisaka 
2072*437bfbebSnyanmisaka         s->task->syntax.data = s->hal_pic_private;
2073*437bfbebSnyanmisaka         s->task->syntax.number = 1;
2074*437bfbebSnyanmisaka         s->task->valid = 1;
2075*437bfbebSnyanmisaka         s->ps_need_upate = 0;
2076*437bfbebSnyanmisaka         s->rps_need_upate = 0;
2077*437bfbebSnyanmisaka     }
2078*437bfbebSnyanmisaka     if (s->eos) {
2079*437bfbebSnyanmisaka         h265d_flush(ctx);
2080*437bfbebSnyanmisaka         s->task->flags.eos = 1;
2081*437bfbebSnyanmisaka     }
2082*437bfbebSnyanmisaka     s->nb_frame++;
2083*437bfbebSnyanmisaka     if (s->is_decoded) {
2084*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_GLOBAL, "Decoded frame with POC %d.\n", s->poc);
2085*437bfbebSnyanmisaka         s->is_decoded = 0;
2086*437bfbebSnyanmisaka     }
2087*437bfbebSnyanmisaka     mpp_hevc_output_frame(ctx, 0);
2088*437bfbebSnyanmisaka     return MPP_OK;
2089*437bfbebSnyanmisaka }
2090*437bfbebSnyanmisaka 
h265d_deinit(void * ctx)2091*437bfbebSnyanmisaka MPP_RET h265d_deinit(void *ctx)
2092*437bfbebSnyanmisaka {
2093*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
2094*437bfbebSnyanmisaka     HEVCContext       *s = h265dctx->priv_data;
2095*437bfbebSnyanmisaka     SplitContext_t *sc = h265dctx->split_cxt;
2096*437bfbebSnyanmisaka     RK_U8 *buf = NULL;
2097*437bfbebSnyanmisaka     int i;
2098*437bfbebSnyanmisaka 
2099*437bfbebSnyanmisaka     for (i = 0; i < MAX_DPB_SIZE; i++) {
2100*437bfbebSnyanmisaka         mpp_hevc_unref_frame(s, &s->DPB[i], ~0);
2101*437bfbebSnyanmisaka         mpp_frame_deinit(&s->DPB[i].frame);
2102*437bfbebSnyanmisaka     }
2103*437bfbebSnyanmisaka 
2104*437bfbebSnyanmisaka     for (i = 0; i < MAX_VPS_COUNT; i++) {
2105*437bfbebSnyanmisaka         if (s->vps_list[i])
2106*437bfbebSnyanmisaka             mpp_mem_pool_put_f(s->vps_pool, s->vps_list[i]);
2107*437bfbebSnyanmisaka     }
2108*437bfbebSnyanmisaka     for (i = 0; i < MAX_SPS_COUNT; i++) {
2109*437bfbebSnyanmisaka         if (s->sps_list[i])
2110*437bfbebSnyanmisaka             mpp_mem_pool_put_f(s->sps_pool, s->sps_list[i]);
2111*437bfbebSnyanmisaka     }
2112*437bfbebSnyanmisaka     for (i = 0; i < MAX_PPS_COUNT; i++)
2113*437bfbebSnyanmisaka         mpp_hevc_pps_free(s->pps_list[i]);
2114*437bfbebSnyanmisaka 
2115*437bfbebSnyanmisaka     mpp_free(s->HEVClc);
2116*437bfbebSnyanmisaka 
2117*437bfbebSnyanmisaka     s->HEVClc = NULL;
2118*437bfbebSnyanmisaka 
2119*437bfbebSnyanmisaka     for (i = 0; i < s->nals_allocated; i++)
2120*437bfbebSnyanmisaka         mpp_free(s->nals[i].rbsp_buffer);
2121*437bfbebSnyanmisaka 
2122*437bfbebSnyanmisaka     if (s->nals) {
2123*437bfbebSnyanmisaka         mpp_free(s->nals);
2124*437bfbebSnyanmisaka     }
2125*437bfbebSnyanmisaka 
2126*437bfbebSnyanmisaka     MPP_FREE(s->pre_pps_data);
2127*437bfbebSnyanmisaka 
2128*437bfbebSnyanmisaka     s->nals_allocated = 0;
2129*437bfbebSnyanmisaka 
2130*437bfbebSnyanmisaka     if (s->hal_pic_private) {
2131*437bfbebSnyanmisaka         h265d_dxva2_picture_context_t *ctx_pic = (h265d_dxva2_picture_context_t *)s->hal_pic_private;
2132*437bfbebSnyanmisaka         MPP_FREE(ctx_pic->slice_short);
2133*437bfbebSnyanmisaka         MPP_FREE(ctx_pic->slice_cut_param);
2134*437bfbebSnyanmisaka         mpp_free(s->hal_pic_private);
2135*437bfbebSnyanmisaka     }
2136*437bfbebSnyanmisaka     if (s->input_packet) {
2137*437bfbebSnyanmisaka         buf = mpp_packet_get_data(s->input_packet);
2138*437bfbebSnyanmisaka         mpp_free(buf);
2139*437bfbebSnyanmisaka         mpp_packet_deinit(&s->input_packet);
2140*437bfbebSnyanmisaka     }
2141*437bfbebSnyanmisaka 
2142*437bfbebSnyanmisaka     if (s->vps_pool)
2143*437bfbebSnyanmisaka         mpp_mem_pool_deinit_f(s->vps_pool);
2144*437bfbebSnyanmisaka     if (s->sps_pool)
2145*437bfbebSnyanmisaka         mpp_mem_pool_deinit_f(s->sps_pool);
2146*437bfbebSnyanmisaka 
2147*437bfbebSnyanmisaka     MPP_FREE((s->hdr_dynamic_meta));
2148*437bfbebSnyanmisaka 
2149*437bfbebSnyanmisaka     if (s) {
2150*437bfbebSnyanmisaka         mpp_free(s);
2151*437bfbebSnyanmisaka     }
2152*437bfbebSnyanmisaka 
2153*437bfbebSnyanmisaka     if (sc) {
2154*437bfbebSnyanmisaka         h265d_split_deinit(sc);
2155*437bfbebSnyanmisaka     }
2156*437bfbebSnyanmisaka     return 0;
2157*437bfbebSnyanmisaka }
2158*437bfbebSnyanmisaka 
hevc_init_context(H265dContext_t * h265dctx)2159*437bfbebSnyanmisaka static RK_S32 hevc_init_context(H265dContext_t *h265dctx)
2160*437bfbebSnyanmisaka {
2161*437bfbebSnyanmisaka     HEVCContext *s = h265dctx->priv_data;
2162*437bfbebSnyanmisaka     RK_U32 i;
2163*437bfbebSnyanmisaka 
2164*437bfbebSnyanmisaka     s->h265dctx = h265dctx;
2165*437bfbebSnyanmisaka 
2166*437bfbebSnyanmisaka     s->HEVClc = (HEVCLocalContext*)mpp_calloc(HEVCLocalContext, 1);
2167*437bfbebSnyanmisaka     if (!s->HEVClc)
2168*437bfbebSnyanmisaka         goto fail;
2169*437bfbebSnyanmisaka 
2170*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(s->DPB); i++) {
2171*437bfbebSnyanmisaka         s->DPB[i].slot_index = 0xff;
2172*437bfbebSnyanmisaka         s->DPB[i].poc = INT_MAX;
2173*437bfbebSnyanmisaka         s->DPB[i].error_flag = 0;
2174*437bfbebSnyanmisaka         mpp_frame_init(&s->DPB[i].frame);
2175*437bfbebSnyanmisaka         if (!s->DPB[i].frame)
2176*437bfbebSnyanmisaka             goto fail;
2177*437bfbebSnyanmisaka     }
2178*437bfbebSnyanmisaka 
2179*437bfbebSnyanmisaka     s->max_ra = INT_MAX;
2180*437bfbebSnyanmisaka 
2181*437bfbebSnyanmisaka 
2182*437bfbebSnyanmisaka     s->temporal_layer_id   = 8;
2183*437bfbebSnyanmisaka     s->context_initialized = 1;
2184*437bfbebSnyanmisaka 
2185*437bfbebSnyanmisaka     return 0;
2186*437bfbebSnyanmisaka 
2187*437bfbebSnyanmisaka fail:
2188*437bfbebSnyanmisaka     h265d_deinit(h265dctx);
2189*437bfbebSnyanmisaka     return MPP_ERR_NOMEM;
2190*437bfbebSnyanmisaka }
2191*437bfbebSnyanmisaka 
2192*437bfbebSnyanmisaka 
h265d_init(void * ctx,ParserCfg * parser_cfg)2193*437bfbebSnyanmisaka MPP_RET h265d_init(void *ctx, ParserCfg *parser_cfg)
2194*437bfbebSnyanmisaka {
2195*437bfbebSnyanmisaka 
2196*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
2197*437bfbebSnyanmisaka     HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
2198*437bfbebSnyanmisaka     SplitContext_t *sc = (SplitContext_t*)h265dctx->split_cxt;
2199*437bfbebSnyanmisaka     RK_S32 ret;
2200*437bfbebSnyanmisaka     RK_U8 *buf = NULL;
2201*437bfbebSnyanmisaka     RK_S32 size = SZ_512K;
2202*437bfbebSnyanmisaka     if (s == NULL) {
2203*437bfbebSnyanmisaka         s = (HEVCContext*)mpp_calloc(HEVCContext, 1);
2204*437bfbebSnyanmisaka         if (s == NULL) {
2205*437bfbebSnyanmisaka             mpp_err("hevc contxt malloc fail");
2206*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
2207*437bfbebSnyanmisaka         }
2208*437bfbebSnyanmisaka         h265dctx->priv_data = s;
2209*437bfbebSnyanmisaka     }
2210*437bfbebSnyanmisaka 
2211*437bfbebSnyanmisaka     s->first_nal_type = NAL_INIT_VALUE;
2212*437bfbebSnyanmisaka     h265dctx->cfg = parser_cfg->cfg;
2213*437bfbebSnyanmisaka 
2214*437bfbebSnyanmisaka     if (sc == NULL && h265dctx->cfg->base.split_parse) {
2215*437bfbebSnyanmisaka         h265d_split_init((void**)&sc);
2216*437bfbebSnyanmisaka         if (sc == NULL) {
2217*437bfbebSnyanmisaka             mpp_err("split contxt malloc fail");
2218*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
2219*437bfbebSnyanmisaka         }
2220*437bfbebSnyanmisaka         h265dctx->split_cxt = sc;
2221*437bfbebSnyanmisaka     }
2222*437bfbebSnyanmisaka 
2223*437bfbebSnyanmisaka     //  mpp_env_set_u32("h265d_debug", H265D_DBG_REF);
2224*437bfbebSnyanmisaka     mpp_env_get_u32("h265d_debug", &h265d_debug, 0);
2225*437bfbebSnyanmisaka 
2226*437bfbebSnyanmisaka     ret = hevc_init_context(h265dctx);
2227*437bfbebSnyanmisaka 
2228*437bfbebSnyanmisaka     s->hal_pic_private = mpp_calloc_size(void, sizeof(h265d_dxva2_picture_context_t));
2229*437bfbebSnyanmisaka 
2230*437bfbebSnyanmisaka     if (s->hal_pic_private) {
2231*437bfbebSnyanmisaka         h265d_dxva2_picture_context_t *ctx_pic = (h265d_dxva2_picture_context_t *)s->hal_pic_private;
2232*437bfbebSnyanmisaka         ctx_pic->slice_short = (DXVA_Slice_HEVC_Short *)mpp_malloc(DXVA_Slice_HEVC_Short, MAX_SLICES);
2233*437bfbebSnyanmisaka 
2234*437bfbebSnyanmisaka         if (!ctx_pic->slice_short)
2235*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
2236*437bfbebSnyanmisaka 
2237*437bfbebSnyanmisaka         ctx_pic->slice_cut_param = (DXVA_Slice_HEVC_Cut_Param *)mpp_malloc(DXVA_Slice_HEVC_Cut_Param, MAX_SLICES);
2238*437bfbebSnyanmisaka         if (!ctx_pic->slice_cut_param)
2239*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
2240*437bfbebSnyanmisaka         ctx_pic->max_slice_num = MAX_SLICES;
2241*437bfbebSnyanmisaka     } else {
2242*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
2243*437bfbebSnyanmisaka     }
2244*437bfbebSnyanmisaka 
2245*437bfbebSnyanmisaka     if (ret < 0)
2246*437bfbebSnyanmisaka         return ret;
2247*437bfbebSnyanmisaka 
2248*437bfbebSnyanmisaka     s->picture_struct = 0;
2249*437bfbebSnyanmisaka 
2250*437bfbebSnyanmisaka     s->slots = parser_cfg->frame_slots;
2251*437bfbebSnyanmisaka 
2252*437bfbebSnyanmisaka     s->packet_slots = parser_cfg->packet_slots;
2253*437bfbebSnyanmisaka 
2254*437bfbebSnyanmisaka     if (h265dctx->extradata_size > 0 && h265dctx->extradata) {
2255*437bfbebSnyanmisaka         ret = hevc_parser_extradata(s);
2256*437bfbebSnyanmisaka         if (ret < 0) {
2257*437bfbebSnyanmisaka             h265d_deinit(h265dctx);
2258*437bfbebSnyanmisaka             return ret;
2259*437bfbebSnyanmisaka         }
2260*437bfbebSnyanmisaka     }
2261*437bfbebSnyanmisaka 
2262*437bfbebSnyanmisaka     buf = mpp_malloc(RK_U8, size);
2263*437bfbebSnyanmisaka 
2264*437bfbebSnyanmisaka     if (buf == NULL) {
2265*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
2266*437bfbebSnyanmisaka     }
2267*437bfbebSnyanmisaka 
2268*437bfbebSnyanmisaka     if (MPP_OK != mpp_packet_init(&s->input_packet, (void*)buf, size)) {
2269*437bfbebSnyanmisaka         return MPP_ERR_NOMEM;
2270*437bfbebSnyanmisaka     }
2271*437bfbebSnyanmisaka     mpp_buf_slot_setup(s->slots, 25);
2272*437bfbebSnyanmisaka 
2273*437bfbebSnyanmisaka     s->h265dctx->hw_info = parser_cfg->hw_info;
2274*437bfbebSnyanmisaka 
2275*437bfbebSnyanmisaka     s->pre_pps_id = -1;
2276*437bfbebSnyanmisaka 
2277*437bfbebSnyanmisaka     s->vps_pool = mpp_mem_pool_init_f("h264d_vps", sizeof(HEVCVPS));
2278*437bfbebSnyanmisaka     s->sps_pool = mpp_mem_pool_init_f("h265d_sps", sizeof(HEVCSPS));
2279*437bfbebSnyanmisaka 
2280*437bfbebSnyanmisaka     mpp_slots_set_prop(s->slots, SLOTS_WIDTH_ALIGN, rkv_ctu_64_align);
2281*437bfbebSnyanmisaka 
2282*437bfbebSnyanmisaka #ifdef dump
2283*437bfbebSnyanmisaka     fp = fopen("/data/dump1.bin", "wb+");
2284*437bfbebSnyanmisaka #endif
2285*437bfbebSnyanmisaka     return 0;
2286*437bfbebSnyanmisaka }
2287*437bfbebSnyanmisaka 
h265d_flush(void * ctx)2288*437bfbebSnyanmisaka MPP_RET h265d_flush(void *ctx)
2289*437bfbebSnyanmisaka {
2290*437bfbebSnyanmisaka     RK_S32 ret = 0;
2291*437bfbebSnyanmisaka     do {
2292*437bfbebSnyanmisaka         ret = mpp_hevc_output_frame(ctx, 1);
2293*437bfbebSnyanmisaka     } while (ret);
2294*437bfbebSnyanmisaka     return MPP_OK;
2295*437bfbebSnyanmisaka }
2296*437bfbebSnyanmisaka 
h265d_reset(void * ctx)2297*437bfbebSnyanmisaka MPP_RET h265d_reset(void *ctx)
2298*437bfbebSnyanmisaka {
2299*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
2300*437bfbebSnyanmisaka     HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
2301*437bfbebSnyanmisaka     RK_S32 ret = 0;
2302*437bfbebSnyanmisaka     do {
2303*437bfbebSnyanmisaka         ret = mpp_hevc_output_frame(ctx, 1);
2304*437bfbebSnyanmisaka     } while (ret);
2305*437bfbebSnyanmisaka     mpp_hevc_flush_dpb(s);
2306*437bfbebSnyanmisaka     h265d_split_reset(h265dctx->split_cxt);
2307*437bfbebSnyanmisaka     s->max_ra = INT_MAX;
2308*437bfbebSnyanmisaka     s->eos = 0;
2309*437bfbebSnyanmisaka     s->first_i_fast_play = 0;
2310*437bfbebSnyanmisaka     return MPP_OK;
2311*437bfbebSnyanmisaka }
2312*437bfbebSnyanmisaka 
h265d_control(void * ctx,MpiCmd cmd,void * param)2313*437bfbebSnyanmisaka MPP_RET h265d_control(void *ctx, MpiCmd cmd, void *param)
2314*437bfbebSnyanmisaka {
2315*437bfbebSnyanmisaka     (void) ctx;
2316*437bfbebSnyanmisaka     (void) cmd;
2317*437bfbebSnyanmisaka     (void) param;
2318*437bfbebSnyanmisaka     return MPP_OK;
2319*437bfbebSnyanmisaka }
2320*437bfbebSnyanmisaka 
h265d_callback(void * ctx,void * err_info)2321*437bfbebSnyanmisaka MPP_RET h265d_callback(void *ctx, void *err_info)
2322*437bfbebSnyanmisaka {
2323*437bfbebSnyanmisaka     H265dContext_t *h265dctx = (H265dContext_t *)ctx;
2324*437bfbebSnyanmisaka     HalDecTask *task_dec = (HalDecTask *)err_info;
2325*437bfbebSnyanmisaka     HEVCContext *s = (HEVCContext *)h265dctx->priv_data;
2326*437bfbebSnyanmisaka 
2327*437bfbebSnyanmisaka     if (!h265dctx->cfg->base.disable_error) {
2328*437bfbebSnyanmisaka         MppFrame frame = NULL;
2329*437bfbebSnyanmisaka         RK_U32 i = 0;
2330*437bfbebSnyanmisaka 
2331*437bfbebSnyanmisaka         if (s->first_nal_type >= 16 && s->first_nal_type <= 23) {
2332*437bfbebSnyanmisaka             mpp_log("IS_IRAP frame found error");
2333*437bfbebSnyanmisaka             s->max_ra = INT_MAX;
2334*437bfbebSnyanmisaka         }
2335*437bfbebSnyanmisaka         // s->miss_ref_flag = 1;
2336*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(s->slots, task_dec->output, SLOT_FRAME_PTR, &frame);
2337*437bfbebSnyanmisaka         mpp_frame_set_errinfo(frame, MPP_FRAME_ERR_UNKNOW);
2338*437bfbebSnyanmisaka         h265d_dbg(H265D_DBG_REF, "set decoded frame error, poc %d, slot %d\n",
2339*437bfbebSnyanmisaka                   mpp_frame_get_poc(frame), task_dec->output);
2340*437bfbebSnyanmisaka 
2341*437bfbebSnyanmisaka         for (i = 0; i < MPP_ARRAY_ELEMS(s->DPB); i++) {
2342*437bfbebSnyanmisaka             if (s->DPB[i].slot_index == task_dec->output) {
2343*437bfbebSnyanmisaka                 s->DPB[i].error_flag = 1;
2344*437bfbebSnyanmisaka                 h265d_dbg(H265D_DBG_REF, "Mark dpb[%d] poc %d, slot_idx %d, err %d, frame: err %d, dis %d\n",
2345*437bfbebSnyanmisaka                           i, mpp_frame_get_poc(s->DPB[i].frame), s->DPB[i].slot_index, s->DPB[i].error_flag,
2346*437bfbebSnyanmisaka                           mpp_frame_get_errinfo(s->DPB[i].frame), mpp_frame_get_discard(s->DPB[i].frame));
2347*437bfbebSnyanmisaka             }
2348*437bfbebSnyanmisaka         }
2349*437bfbebSnyanmisaka     }
2350*437bfbebSnyanmisaka 
2351*437bfbebSnyanmisaka     if (!task_dec->flags.parse_err) {
2352*437bfbebSnyanmisaka         s->ps_need_upate = 0;
2353*437bfbebSnyanmisaka         s->rps_need_upate = 0;
2354*437bfbebSnyanmisaka     }
2355*437bfbebSnyanmisaka 
2356*437bfbebSnyanmisaka     (void) err_info;
2357*437bfbebSnyanmisaka 
2358*437bfbebSnyanmisaka     return MPP_OK;
2359*437bfbebSnyanmisaka }
2360*437bfbebSnyanmisaka 
2361*437bfbebSnyanmisaka const ParserApi api_h265d_parser = {
2362*437bfbebSnyanmisaka     .name = "h265d_parse",
2363*437bfbebSnyanmisaka     .coding = MPP_VIDEO_CodingHEVC,
2364*437bfbebSnyanmisaka     .ctx_size = sizeof(H265dContext_t),
2365*437bfbebSnyanmisaka     .flag = 0,
2366*437bfbebSnyanmisaka     .init = h265d_init,
2367*437bfbebSnyanmisaka     .deinit = h265d_deinit,
2368*437bfbebSnyanmisaka     .prepare = h265d_prepare,
2369*437bfbebSnyanmisaka     .parse = h265d_parse,
2370*437bfbebSnyanmisaka     .reset = h265d_reset,
2371*437bfbebSnyanmisaka     .flush = h265d_flush,
2372*437bfbebSnyanmisaka     .control = h265d_control,
2373*437bfbebSnyanmisaka     .callback = h265d_callback,
2374*437bfbebSnyanmisaka };
2375*437bfbebSnyanmisaka 
2376