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 #define MODULE_TAG "h264d_sei"
19*437bfbebSnyanmisaka
20*437bfbebSnyanmisaka #include <limits.h>
21*437bfbebSnyanmisaka #include <stdio.h>
22*437bfbebSnyanmisaka #include <string.h>
23*437bfbebSnyanmisaka
24*437bfbebSnyanmisaka #include "h264d_global.h"
25*437bfbebSnyanmisaka #include "h264d_sps.h"
26*437bfbebSnyanmisaka #include "h264d_sei.h"
27*437bfbebSnyanmisaka #include "h2645d_sei.h"
28*437bfbebSnyanmisaka
interpret_picture_timing_info(BitReadCtx_t * p_bitctx,H264_SEI_t * sei_msg,H264dVideoCtx_t * p_videoctx)29*437bfbebSnyanmisaka static MPP_RET interpret_picture_timing_info(
30*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx,
31*437bfbebSnyanmisaka H264_SEI_t *sei_msg,
32*437bfbebSnyanmisaka H264dVideoCtx_t *p_videoctx)
33*437bfbebSnyanmisaka {
34*437bfbebSnyanmisaka RK_S32 cpb_removal_delay_length = 0;
35*437bfbebSnyanmisaka RK_S32 dpb_output_delay_length = 0;
36*437bfbebSnyanmisaka RK_S32 time_offset_length = 0;
37*437bfbebSnyanmisaka RK_S32 cpb_dpb_delays_present_flag = 0;
38*437bfbebSnyanmisaka RK_U32 i = 0;
39*437bfbebSnyanmisaka H264_SEI_PIC_TIMING_t *pic_timing = NULL;
40*437bfbebSnyanmisaka RK_U32 num_clock_ts[9] = {1, 1, 1, 2, 2, 3, 3, 2, 3};
41*437bfbebSnyanmisaka struct h264_vui_t *vui_seq_parameters = NULL;
42*437bfbebSnyanmisaka RK_U32 seq_parameter_set_id = sei_msg->seq_parameter_set_id;
43*437bfbebSnyanmisaka
44*437bfbebSnyanmisaka if (seq_parameter_set_id >= MAXSPS || !p_videoctx->spsSet[seq_parameter_set_id]) {
45*437bfbebSnyanmisaka H264D_ERR("seq_parameter_set_id %d may be invalid\n", seq_parameter_set_id);
46*437bfbebSnyanmisaka goto __BITREAD_ERR;
47*437bfbebSnyanmisaka }
48*437bfbebSnyanmisaka vui_seq_parameters = &(p_videoctx->spsSet[sei_msg->seq_parameter_set_id]->vui_seq_parameters);
49*437bfbebSnyanmisaka pic_timing = &(sei_msg->pic_timing);
50*437bfbebSnyanmisaka
51*437bfbebSnyanmisaka if (vui_seq_parameters->nal_hrd_parameters_present_flag) {
52*437bfbebSnyanmisaka cpb_removal_delay_length =
53*437bfbebSnyanmisaka vui_seq_parameters->nal_hrd_parameters.cpb_removal_delay_length_minus1;
54*437bfbebSnyanmisaka dpb_output_delay_length =
55*437bfbebSnyanmisaka vui_seq_parameters->nal_hrd_parameters.dpb_output_delay_length_minus1;
56*437bfbebSnyanmisaka time_offset_length =
57*437bfbebSnyanmisaka vui_seq_parameters->nal_hrd_parameters.time_offset_length;
58*437bfbebSnyanmisaka cpb_dpb_delays_present_flag = 1;
59*437bfbebSnyanmisaka } else if (vui_seq_parameters->vcl_hrd_parameters_present_flag) {
60*437bfbebSnyanmisaka cpb_removal_delay_length =
61*437bfbebSnyanmisaka vui_seq_parameters->vcl_hrd_parameters.cpb_removal_delay_length_minus1;
62*437bfbebSnyanmisaka dpb_output_delay_length =
63*437bfbebSnyanmisaka vui_seq_parameters->vcl_hrd_parameters.dpb_output_delay_length_minus1;
64*437bfbebSnyanmisaka time_offset_length =
65*437bfbebSnyanmisaka vui_seq_parameters->vcl_hrd_parameters.time_offset_length;
66*437bfbebSnyanmisaka cpb_dpb_delays_present_flag = 1;
67*437bfbebSnyanmisaka }
68*437bfbebSnyanmisaka
69*437bfbebSnyanmisaka if (cpb_dpb_delays_present_flag) {
70*437bfbebSnyanmisaka READ_BITS(p_bitctx, cpb_removal_delay_length, &pic_timing->cpb_removal_delay);
71*437bfbebSnyanmisaka READ_BITS(p_bitctx, dpb_output_delay_length, &pic_timing->dpb_output_delay);
72*437bfbebSnyanmisaka }
73*437bfbebSnyanmisaka
74*437bfbebSnyanmisaka if (vui_seq_parameters->pic_struct_present_flag) {
75*437bfbebSnyanmisaka READ_BITS(p_bitctx, 4, &pic_timing->pic_struct);
76*437bfbebSnyanmisaka if (pic_timing->pic_struct > 8 || pic_timing->pic_struct < 0) {
77*437bfbebSnyanmisaka goto __BITREAD_ERR;
78*437bfbebSnyanmisaka }
79*437bfbebSnyanmisaka
80*437bfbebSnyanmisaka for (i = 0; i < num_clock_ts[pic_timing->pic_struct]; i++) {
81*437bfbebSnyanmisaka READ_BITS(p_bitctx, 1, &pic_timing->clock_timestamp_flag[i]);
82*437bfbebSnyanmisaka
83*437bfbebSnyanmisaka if (pic_timing->clock_timestamp_flag[i]) {
84*437bfbebSnyanmisaka READ_BITS(p_bitctx, 2, &pic_timing->ct_type[i]);
85*437bfbebSnyanmisaka READ_BITS(p_bitctx, 1, &pic_timing->nuit_field_based_flag[i]);
86*437bfbebSnyanmisaka
87*437bfbebSnyanmisaka READ_BITS(p_bitctx, 5, &pic_timing->counting_type[i]);
88*437bfbebSnyanmisaka if (pic_timing->counting_type[i] > 6
89*437bfbebSnyanmisaka || pic_timing->counting_type[i] < 0) {
90*437bfbebSnyanmisaka goto __BITREAD_ERR;
91*437bfbebSnyanmisaka }
92*437bfbebSnyanmisaka
93*437bfbebSnyanmisaka READ_BITS(p_bitctx, 1, &pic_timing->full_timestamp_flag[i]);
94*437bfbebSnyanmisaka READ_BITS(p_bitctx, 1, &pic_timing->discontinuity_flag[i]);
95*437bfbebSnyanmisaka READ_BITS(p_bitctx, 1, &pic_timing->cnt_dropped_flag[i]);
96*437bfbebSnyanmisaka
97*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &pic_timing->n_frames[i]);
98*437bfbebSnyanmisaka
99*437bfbebSnyanmisaka if (pic_timing->full_timestamp_flag[i]) {
100*437bfbebSnyanmisaka READ_BITS(p_bitctx, 6, &pic_timing->seconds_value[i]);
101*437bfbebSnyanmisaka if (pic_timing->seconds_value[i] > 59) {
102*437bfbebSnyanmisaka goto __BITREAD_ERR;
103*437bfbebSnyanmisaka }
104*437bfbebSnyanmisaka
105*437bfbebSnyanmisaka READ_BITS(p_bitctx, 6, &pic_timing->minutes_value[i]);
106*437bfbebSnyanmisaka if (pic_timing->minutes_value[i] > 59) {
107*437bfbebSnyanmisaka goto __BITREAD_ERR;
108*437bfbebSnyanmisaka }
109*437bfbebSnyanmisaka
110*437bfbebSnyanmisaka READ_BITS(p_bitctx, 5, &pic_timing->hours_value[i]);
111*437bfbebSnyanmisaka if (pic_timing->hours_value[i] > 23) {
112*437bfbebSnyanmisaka goto __BITREAD_ERR;
113*437bfbebSnyanmisaka }
114*437bfbebSnyanmisaka } else {
115*437bfbebSnyanmisaka READ_BITS(p_bitctx, 1, &pic_timing->seconds_flag[i]);
116*437bfbebSnyanmisaka if (pic_timing->seconds_flag[i]) {
117*437bfbebSnyanmisaka READ_BITS(p_bitctx, 6, &pic_timing->seconds_value[i]);
118*437bfbebSnyanmisaka if (pic_timing->seconds_value[i] > 59) {
119*437bfbebSnyanmisaka goto __BITREAD_ERR;
120*437bfbebSnyanmisaka }
121*437bfbebSnyanmisaka
122*437bfbebSnyanmisaka READ_BITS(p_bitctx, 1, &pic_timing->minutes_flag[i]);
123*437bfbebSnyanmisaka if (pic_timing->minutes_flag[i]) {
124*437bfbebSnyanmisaka READ_BITS(p_bitctx, 6, &pic_timing->minutes_value[i]);
125*437bfbebSnyanmisaka if (pic_timing->minutes_value[i] > 59) {
126*437bfbebSnyanmisaka goto __BITREAD_ERR;
127*437bfbebSnyanmisaka }
128*437bfbebSnyanmisaka
129*437bfbebSnyanmisaka READ_BITS(p_bitctx, 1, &pic_timing->hours_flag[i]);
130*437bfbebSnyanmisaka if (pic_timing->hours_flag[i]) {
131*437bfbebSnyanmisaka READ_BITS(p_bitctx, 5, &pic_timing->hours_value[i]);
132*437bfbebSnyanmisaka if (pic_timing->hours_value[i] > 23) {
133*437bfbebSnyanmisaka goto __BITREAD_ERR;
134*437bfbebSnyanmisaka }
135*437bfbebSnyanmisaka }
136*437bfbebSnyanmisaka }
137*437bfbebSnyanmisaka }
138*437bfbebSnyanmisaka }
139*437bfbebSnyanmisaka if (time_offset_length) {
140*437bfbebSnyanmisaka RK_S32 tmp;
141*437bfbebSnyanmisaka READ_BITS(p_bitctx, time_offset_length, &tmp);
142*437bfbebSnyanmisaka /* following "converts" timeOffsetLength-bit signed
143*437bfbebSnyanmisaka * integer into i32 */
144*437bfbebSnyanmisaka /*lint -save -e701 -e702 */
145*437bfbebSnyanmisaka tmp <<= (32 - time_offset_length);
146*437bfbebSnyanmisaka tmp >>= (32 - time_offset_length);
147*437bfbebSnyanmisaka /*lint -restore */
148*437bfbebSnyanmisaka pic_timing->time_offset[i] = tmp;
149*437bfbebSnyanmisaka } else
150*437bfbebSnyanmisaka pic_timing->time_offset[i] = 0;
151*437bfbebSnyanmisaka }
152*437bfbebSnyanmisaka }
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka
155*437bfbebSnyanmisaka return MPP_OK;
156*437bfbebSnyanmisaka __BITREAD_ERR:
157*437bfbebSnyanmisaka return MPP_ERR_STREAM;
158*437bfbebSnyanmisaka }
159*437bfbebSnyanmisaka
interpret_buffering_period_info(BitReadCtx_t * p_bitctx,H264_SEI_t * sei_msg,H264dVideoCtx_t * p_videoctx)160*437bfbebSnyanmisaka static MPP_RET interpret_buffering_period_info(
161*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx,
162*437bfbebSnyanmisaka H264_SEI_t *sei_msg,
163*437bfbebSnyanmisaka H264dVideoCtx_t *p_videoctx)
164*437bfbebSnyanmisaka {
165*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
166*437bfbebSnyanmisaka RK_U32 i = 0;
167*437bfbebSnyanmisaka RK_U32 seq_parameter_set_id = sei_msg->seq_parameter_set_id;
168*437bfbebSnyanmisaka struct h264_vui_t *vui_seq_parameters = NULL;
169*437bfbebSnyanmisaka
170*437bfbebSnyanmisaka READ_UE(p_bitctx, &seq_parameter_set_id);
171*437bfbebSnyanmisaka
172*437bfbebSnyanmisaka if (seq_parameter_set_id >= MAXSPS || !p_videoctx->spsSet[seq_parameter_set_id]) {
173*437bfbebSnyanmisaka H264D_ERR("seq_parameter_set_id %d may be invalid\n", seq_parameter_set_id);
174*437bfbebSnyanmisaka goto __BITREAD_ERR;
175*437bfbebSnyanmisaka }
176*437bfbebSnyanmisaka
177*437bfbebSnyanmisaka sei_msg->seq_parameter_set_id = seq_parameter_set_id;
178*437bfbebSnyanmisaka vui_seq_parameters = &(p_videoctx->spsSet[sei_msg->seq_parameter_set_id]->vui_seq_parameters);
179*437bfbebSnyanmisaka
180*437bfbebSnyanmisaka if (vui_seq_parameters->nal_hrd_parameters_present_flag) {
181*437bfbebSnyanmisaka for (i = 0; i < vui_seq_parameters->nal_hrd_parameters.cpb_cnt_minus1; i++) {
182*437bfbebSnyanmisaka SKIP_BITS(p_bitctx,
183*437bfbebSnyanmisaka vui_seq_parameters->nal_hrd_parameters.initial_cpb_removal_delay_length_minus1); //initial_cpb_removal_delay
184*437bfbebSnyanmisaka SKIP_BITS(p_bitctx,
185*437bfbebSnyanmisaka vui_seq_parameters->nal_hrd_parameters.initial_cpb_removal_delay_length_minus1); //initial_cpb_removal_delay_offset
186*437bfbebSnyanmisaka }
187*437bfbebSnyanmisaka }
188*437bfbebSnyanmisaka
189*437bfbebSnyanmisaka if (vui_seq_parameters->vcl_hrd_parameters_present_flag) {
190*437bfbebSnyanmisaka for (i = 0; i < vui_seq_parameters->vcl_hrd_parameters.cpb_cnt_minus1; i++) {
191*437bfbebSnyanmisaka SKIP_BITS(p_bitctx,
192*437bfbebSnyanmisaka vui_seq_parameters->vcl_hrd_parameters.initial_cpb_removal_delay_length_minus1); //initial_cpb_removal_delay
193*437bfbebSnyanmisaka SKIP_BITS(p_bitctx,
194*437bfbebSnyanmisaka vui_seq_parameters->vcl_hrd_parameters.initial_cpb_removal_delay_length_minus1); //initial_cpb_removal_delay_offset
195*437bfbebSnyanmisaka }
196*437bfbebSnyanmisaka }
197*437bfbebSnyanmisaka
198*437bfbebSnyanmisaka return ret = MPP_OK;
199*437bfbebSnyanmisaka __BITREAD_ERR:
200*437bfbebSnyanmisaka ret = p_bitctx->ret;
201*437bfbebSnyanmisaka return ret;
202*437bfbebSnyanmisaka
203*437bfbebSnyanmisaka }
204*437bfbebSnyanmisaka
interpret_recovery_point(BitReadCtx_t * p_bitctx,H264dVideoCtx_t * p_videoctx)205*437bfbebSnyanmisaka static MPP_RET interpret_recovery_point(BitReadCtx_t *p_bitctx, H264dVideoCtx_t *p_videoctx)
206*437bfbebSnyanmisaka {
207*437bfbebSnyanmisaka RK_S32 recovery_frame_cnt = 0;
208*437bfbebSnyanmisaka
209*437bfbebSnyanmisaka READ_UE(p_bitctx, &recovery_frame_cnt);
210*437bfbebSnyanmisaka
211*437bfbebSnyanmisaka if (recovery_frame_cnt >= (1 << 16) || recovery_frame_cnt < 0) {
212*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_SEI, "recovery_frame_cnt %d, is out of range %d",
213*437bfbebSnyanmisaka recovery_frame_cnt, p_videoctx->max_frame_num);
214*437bfbebSnyanmisaka return MPP_ERR_STREAM;
215*437bfbebSnyanmisaka }
216*437bfbebSnyanmisaka
217*437bfbebSnyanmisaka memset(&p_videoctx->recovery, 0, sizeof(RecoveryPoint));
218*437bfbebSnyanmisaka
219*437bfbebSnyanmisaka p_videoctx->recovery.valid_flag = 1;
220*437bfbebSnyanmisaka p_videoctx->recovery.recovery_frame_cnt = recovery_frame_cnt;
221*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_SEI, "Recovery point: frame_cnt %d", p_videoctx->recovery.recovery_frame_cnt);
222*437bfbebSnyanmisaka return MPP_OK;
223*437bfbebSnyanmisaka __BITREAD_ERR:
224*437bfbebSnyanmisaka return p_bitctx->ret;
225*437bfbebSnyanmisaka }
226*437bfbebSnyanmisaka
227*437bfbebSnyanmisaka /*!
228*437bfbebSnyanmisaka ***********************************************************************
229*437bfbebSnyanmisaka * \brief
230*437bfbebSnyanmisaka * parse SEI information
231*437bfbebSnyanmisaka ***********************************************************************
232*437bfbebSnyanmisaka */
233*437bfbebSnyanmisaka //extern "C"
process_sei(H264_SLICE_t * currSlice)234*437bfbebSnyanmisaka MPP_RET process_sei(H264_SLICE_t *currSlice)
235*437bfbebSnyanmisaka {
236*437bfbebSnyanmisaka RK_S32 tmp_byte = 0;
237*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
238*437bfbebSnyanmisaka H264_SEI_t *sei_msg = NULL;
239*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx = &currSlice->p_Cur->bitctx;
240*437bfbebSnyanmisaka BitReadCtx_t payload_bitctx;
241*437bfbebSnyanmisaka RK_S32 i = 0;
242*437bfbebSnyanmisaka
243*437bfbebSnyanmisaka if (!currSlice->p_Cur->sei)
244*437bfbebSnyanmisaka currSlice->p_Cur->sei = mpp_calloc(H264_SEI_t, 1);
245*437bfbebSnyanmisaka
246*437bfbebSnyanmisaka sei_msg = currSlice->p_Cur->sei;
247*437bfbebSnyanmisaka sei_msg->mvc_scalable_nesting_flag = 0; //init to false
248*437bfbebSnyanmisaka sei_msg->p_Dec = currSlice->p_Dec;
249*437bfbebSnyanmisaka do {
250*437bfbebSnyanmisaka tmp_byte = 0xFF;
251*437bfbebSnyanmisaka sei_msg->type = 0;
252*437bfbebSnyanmisaka while (tmp_byte == 0xFF) {
253*437bfbebSnyanmisaka if (p_bitctx->bytes_left_ < 2 || sei_msg->type > INT_MAX - 255) {
254*437bfbebSnyanmisaka mpp_err("parse payload_type error: byte_left %d payload_type %d\n",
255*437bfbebSnyanmisaka p_bitctx->bytes_left_, sei_msg->type);
256*437bfbebSnyanmisaka return MPP_ERR_STREAM;
257*437bfbebSnyanmisaka }
258*437bfbebSnyanmisaka
259*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &tmp_byte);
260*437bfbebSnyanmisaka sei_msg->type += tmp_byte;
261*437bfbebSnyanmisaka }
262*437bfbebSnyanmisaka
263*437bfbebSnyanmisaka tmp_byte = 0xFF;
264*437bfbebSnyanmisaka sei_msg->payload_size = 0;
265*437bfbebSnyanmisaka while (tmp_byte == 0xFF) {
266*437bfbebSnyanmisaka if ((RK_S32)p_bitctx->bytes_left_ < sei_msg->payload_size + 1) {
267*437bfbebSnyanmisaka mpp_err("parse payload_size error: byte_left %d payload_size %d\n",
268*437bfbebSnyanmisaka p_bitctx->bytes_left_, sei_msg->payload_size + 1);
269*437bfbebSnyanmisaka return MPP_ERR_STREAM;
270*437bfbebSnyanmisaka }
271*437bfbebSnyanmisaka
272*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &tmp_byte);
273*437bfbebSnyanmisaka sei_msg->payload_size += tmp_byte;
274*437bfbebSnyanmisaka }
275*437bfbebSnyanmisaka
276*437bfbebSnyanmisaka if ((RK_S32)p_bitctx->bytes_left_ < sei_msg->payload_size) {
277*437bfbebSnyanmisaka mpp_err("parse payload_size error: byte_left %d payload_size %d\n",
278*437bfbebSnyanmisaka p_bitctx->bytes_left_, sei_msg->payload_size);
279*437bfbebSnyanmisaka return MPP_ERR_STREAM;
280*437bfbebSnyanmisaka }
281*437bfbebSnyanmisaka
282*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_SEI, "SEI type %d, payload size: %d\n", sei_msg->type, sei_msg->payload_size);
283*437bfbebSnyanmisaka
284*437bfbebSnyanmisaka memset(&payload_bitctx, 0, sizeof(payload_bitctx));
285*437bfbebSnyanmisaka mpp_set_bitread_ctx(&payload_bitctx, p_bitctx->data_, sei_msg->payload_size);
286*437bfbebSnyanmisaka mpp_set_bitread_pseudo_code_type(&payload_bitctx, PSEUDO_CODE_H264_H265_SEI);
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka switch (sei_msg->type) {
289*437bfbebSnyanmisaka case H264_SEI_BUFFERING_PERIOD:
290*437bfbebSnyanmisaka FUN_CHECK(ret = interpret_buffering_period_info(&payload_bitctx, sei_msg, currSlice->p_Vid));
291*437bfbebSnyanmisaka break;
292*437bfbebSnyanmisaka case H264_SEI_PIC_TIMING:
293*437bfbebSnyanmisaka FUN_CHECK(interpret_picture_timing_info(&payload_bitctx, sei_msg, currSlice->p_Vid));
294*437bfbebSnyanmisaka break;
295*437bfbebSnyanmisaka case H264_SEI_USER_DATA_UNREGISTERED:
296*437bfbebSnyanmisaka FUN_CHECK(check_encoder_sei_info(&payload_bitctx, sei_msg->payload_size, &currSlice->p_Vid->deny_flag));
297*437bfbebSnyanmisaka
298*437bfbebSnyanmisaka if (currSlice->p_Vid->deny_flag)
299*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_SEI, "Bitstream is encoded by special encoder.");
300*437bfbebSnyanmisaka break;
301*437bfbebSnyanmisaka case H264_SEI_RECOVERY_POINT:
302*437bfbebSnyanmisaka FUN_CHECK(interpret_recovery_point(&payload_bitctx, currSlice->p_Vid));
303*437bfbebSnyanmisaka break;
304*437bfbebSnyanmisaka default:
305*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_SEI, "Skip parsing SEI type %d\n", sei_msg->type);
306*437bfbebSnyanmisaka break;
307*437bfbebSnyanmisaka }
308*437bfbebSnyanmisaka
309*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_SEI, "After parsing SEI %d, bits left int cur byte %d, bits_used %d, bytes left %d",
310*437bfbebSnyanmisaka sei_msg->type, payload_bitctx.num_remaining_bits_in_curr_byte_, payload_bitctx.used_bits,
311*437bfbebSnyanmisaka payload_bitctx.bytes_left_);
312*437bfbebSnyanmisaka
313*437bfbebSnyanmisaka for (i = 0; i < sei_msg->payload_size; i++)
314*437bfbebSnyanmisaka SKIP_BITS(p_bitctx, 8);
315*437bfbebSnyanmisaka } while (mpp_has_more_rbsp_data(p_bitctx)); // more_rbsp_data() msg[offset] != 0x80
316*437bfbebSnyanmisaka
317*437bfbebSnyanmisaka return ret = MPP_OK;
318*437bfbebSnyanmisaka __BITREAD_ERR:
319*437bfbebSnyanmisaka __FAILED:
320*437bfbebSnyanmisaka return ret;
321*437bfbebSnyanmisaka }
322