xref: /rockchip-linux_mpp/mpp/codec/dec/mpg4/mpg4d_parser.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  *
3*437bfbebSnyanmisaka  * Copyright 2010 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 "mpg4d_parser"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "mpp_env.h"
23*437bfbebSnyanmisaka #include "mpp_mem.h"
24*437bfbebSnyanmisaka #include "mpp_debug.h"
25*437bfbebSnyanmisaka #include "mpp_bitread.h"
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka #include "mpg4d_parser.h"
28*437bfbebSnyanmisaka #include "mpg4d_syntax.h"
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka RK_U32 mpg4d_debug = 0;
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka #define mpg4d_dbg(flag, fmt, ...)   _mpp_dbg(mpg4d_debug, flag, fmt, ## __VA_ARGS__)
33*437bfbebSnyanmisaka #define mpg4d_dbg_f(flag, fmt, ...) _mpp_dbg_f(mpg4d_debug, flag, fmt, ## __VA_ARGS__)
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka #define mpg4d_dbg_func(fmt, ...)    mpg4d_dbg_f(MPG4D_DBG_FUNCTION, fmt, ## __VA_ARGS__)
36*437bfbebSnyanmisaka #define mpg4d_dbg_bit(fmt, ...)     mpg4d_dbg(MPG4D_DBG_BITS, fmt, ## __VA_ARGS__)
37*437bfbebSnyanmisaka #define mpg4d_dbg_result(fmt, ...)  mpg4d_dbg(MPG4D_DBG_RESULT, fmt, ## __VA_ARGS__)
38*437bfbebSnyanmisaka 
39*437bfbebSnyanmisaka #define MPEG4_VIDOBJ_START_CODE             0x00000100  /* ..0x0000011f */
40*437bfbebSnyanmisaka #define MPEG4_VIDOBJLAY_START_CODE          0x00000120  /* ..0x0000012f */
41*437bfbebSnyanmisaka #define MPEG4_VISOBJSEQ_START_CODE          0x000001b0
42*437bfbebSnyanmisaka #define MPEG4_VISOBJSEQ_STOP_CODE           0x000001b1
43*437bfbebSnyanmisaka #define MPEG4_USERDATA_START_CODE           0x000001b2
44*437bfbebSnyanmisaka #define MPEG4_GRPOFVOP_START_CODE           0x000001b3
45*437bfbebSnyanmisaka #define MPEG4_VISOBJ_START_CODE             0x000001b5
46*437bfbebSnyanmisaka #define MPEG4_VOP_START_CODE                0x000001b6
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka #define MPG4_VOL_STARTCODE                  0x120
49*437bfbebSnyanmisaka #define MPG4_VOL_STOPCODE                   0x12F
50*437bfbebSnyanmisaka #define MPG4_VOS_STARTCODE                  0x1B0
51*437bfbebSnyanmisaka #define MPG4_VOS_STOPCODE                   0x1B1
52*437bfbebSnyanmisaka #define MPG4_USER_DATA_STARTCODE            0x1B2
53*437bfbebSnyanmisaka #define MPG4_GOP_STARTCODE                  0x1B3
54*437bfbebSnyanmisaka #define MPG4_VISUAL_OBJ_STARTCODE           0x1B5
55*437bfbebSnyanmisaka #define MPG4_VOP_STARTCODE                  0x1B6
56*437bfbebSnyanmisaka 
57*437bfbebSnyanmisaka typedef struct {
58*437bfbebSnyanmisaka     RK_S32 method;
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka     RK_S32 opaque;
61*437bfbebSnyanmisaka     RK_S32 transparent;
62*437bfbebSnyanmisaka     RK_S32 intra_cae;
63*437bfbebSnyanmisaka     RK_S32 inter_cae;
64*437bfbebSnyanmisaka     RK_S32 no_update;
65*437bfbebSnyanmisaka     RK_S32 upsampling;
66*437bfbebSnyanmisaka 
67*437bfbebSnyanmisaka     RK_S32 intra_blocks;
68*437bfbebSnyanmisaka     RK_S32 inter_blocks;
69*437bfbebSnyanmisaka     RK_S32 inter4v_blocks;
70*437bfbebSnyanmisaka     RK_S32 gmc_blocks;
71*437bfbebSnyanmisaka     RK_S32 not_coded_blocks;
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka     RK_S32 dct_coefs;
74*437bfbebSnyanmisaka     RK_S32 dct_lines;
75*437bfbebSnyanmisaka     RK_S32 vlc_symbols;
76*437bfbebSnyanmisaka     RK_S32 vlc_bits;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     RK_S32 apm;
79*437bfbebSnyanmisaka     RK_S32 npm;
80*437bfbebSnyanmisaka     RK_S32 interpolate_mc_q;
81*437bfbebSnyanmisaka     RK_S32 forw_back_mc_q;
82*437bfbebSnyanmisaka     RK_S32 halfpel2;
83*437bfbebSnyanmisaka     RK_S32 halfpel4;
84*437bfbebSnyanmisaka 
85*437bfbebSnyanmisaka     RK_S32 sadct;
86*437bfbebSnyanmisaka     RK_S32 quarterpel;
87*437bfbebSnyanmisaka } Mpeg4Estimation;
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka typedef struct Mp4HdrVol_t {
90*437bfbebSnyanmisaka     RK_S32  vo_type;
91*437bfbebSnyanmisaka     RK_U32  low_delay;
92*437bfbebSnyanmisaka     RK_U32  shape;
93*437bfbebSnyanmisaka     RK_S32  time_inc_resolution;
94*437bfbebSnyanmisaka     RK_U32  time_inc_bits;
95*437bfbebSnyanmisaka     RK_S32  width;
96*437bfbebSnyanmisaka     RK_S32  height;
97*437bfbebSnyanmisaka     RK_U32  mb_width;
98*437bfbebSnyanmisaka     RK_U32  mb_height;
99*437bfbebSnyanmisaka     RK_S32  hor_stride;
100*437bfbebSnyanmisaka     RK_S32  ver_stride;
101*437bfbebSnyanmisaka     RK_U32  totalMbInVop;
102*437bfbebSnyanmisaka     RK_U32  interlacing;
103*437bfbebSnyanmisaka     RK_S32  sprite_enable;
104*437bfbebSnyanmisaka     RK_U32  quant_bits;
105*437bfbebSnyanmisaka     RK_U32  quant_type;
106*437bfbebSnyanmisaka     RK_S32  quarter_sample;
107*437bfbebSnyanmisaka     RK_S32  complexity_estimation_disable;
108*437bfbebSnyanmisaka     RK_U32  resync_marker_disable;
109*437bfbebSnyanmisaka     RK_S32  newpred_enable;
110*437bfbebSnyanmisaka     RK_S32  reduced_resolution_enable;
111*437bfbebSnyanmisaka     RK_S32  scalability;
112*437bfbebSnyanmisaka     RK_S32  ver_id;
113*437bfbebSnyanmisaka } Mp4HdrVol;
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka typedef struct Mp4HdrUserData_t {
116*437bfbebSnyanmisaka     RK_S32  packed_mode;                /* bframes packed bits? (1 = yes) */
117*437bfbebSnyanmisaka } Mp4HdrUserData;
118*437bfbebSnyanmisaka 
119*437bfbebSnyanmisaka typedef struct Mp4HdrVop_t {
120*437bfbebSnyanmisaka     RK_S32  coding_type;
121*437bfbebSnyanmisaka     RK_U32  frameNumber;
122*437bfbebSnyanmisaka     RK_U32  rounding;
123*437bfbebSnyanmisaka     RK_U32  intra_dc_vlc_threshold;
124*437bfbebSnyanmisaka     RK_U32  top_field_first;
125*437bfbebSnyanmisaka     RK_U32  alternate_vertical_scan;
126*437bfbebSnyanmisaka     RK_U32  fcode_forward;
127*437bfbebSnyanmisaka     RK_U32  fcode_backward;
128*437bfbebSnyanmisaka     RK_U32  quant;                      // OFFSET_OF_QUANT_IN_DEC
129*437bfbebSnyanmisaka     RK_U32  hdr_bits;
130*437bfbebSnyanmisaka } Mp4HdrVop;
131*437bfbebSnyanmisaka 
132*437bfbebSnyanmisaka typedef struct Mpg4Hdr_t {
133*437bfbebSnyanmisaka     // vol parameter
134*437bfbebSnyanmisaka     Mp4HdrVol       vol;
135*437bfbebSnyanmisaka 
136*437bfbebSnyanmisaka     // user data parameter
137*437bfbebSnyanmisaka     Mp4HdrUserData  usr;
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka     // vop header parameter
140*437bfbebSnyanmisaka     Mp4HdrVop       vop;
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     // frame related parameter
143*437bfbebSnyanmisaka     RK_S64  pts;
144*437bfbebSnyanmisaka     RK_S32  slot_idx;
145*437bfbebSnyanmisaka     RK_U32  enqueued;
146*437bfbebSnyanmisaka 
147*437bfbebSnyanmisaka     RK_U32  last_time_base;
148*437bfbebSnyanmisaka     RK_U32  time_base;
149*437bfbebSnyanmisaka     RK_U32  time;
150*437bfbebSnyanmisaka     RK_U32  time_pp;
151*437bfbebSnyanmisaka     RK_U32  time_bp;
152*437bfbebSnyanmisaka     RK_U32  last_non_b_time;
153*437bfbebSnyanmisaka } Mpg4Hdr;
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka typedef struct {
157*437bfbebSnyanmisaka     // global paramter
158*437bfbebSnyanmisaka     MppBufSlots     frame_slots;
159*437bfbebSnyanmisaka     RK_U32          found_vol;
160*437bfbebSnyanmisaka     RK_U32          found_vop;
161*437bfbebSnyanmisaka     RK_U32          found_i_vop;
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka     // frame size parameter
164*437bfbebSnyanmisaka     RK_S32          width;
165*437bfbebSnyanmisaka     RK_S32          height;
166*437bfbebSnyanmisaka     RK_S32          hor_stride;
167*437bfbebSnyanmisaka     RK_S32          ver_stride;
168*437bfbebSnyanmisaka     RK_U32          info_change;
169*437bfbebSnyanmisaka     RK_U32          eos;
170*437bfbebSnyanmisaka 
171*437bfbebSnyanmisaka     // spliter parameter
172*437bfbebSnyanmisaka     RK_U32          state;
173*437bfbebSnyanmisaka     RK_U32          vop_header_found;   // flag: visual object plane header found
174*437bfbebSnyanmisaka 
175*437bfbebSnyanmisaka     // bit read context
176*437bfbebSnyanmisaka     BitReadCtx_t    *bit_ctx;
177*437bfbebSnyanmisaka     // vos infomation
178*437bfbebSnyanmisaka     RK_U32          profile;
179*437bfbebSnyanmisaka     RK_U32          level;
180*437bfbebSnyanmisaka     RK_U32          custorm_version;
181*437bfbebSnyanmisaka     // commom buffer for header information
182*437bfbebSnyanmisaka     /*
183*437bfbebSnyanmisaka      * NOTE: We assume that quant matrix only used for current frame decoding
184*437bfbebSnyanmisaka      *       So we use only one quant matrix buffer and only support
185*437bfbebSnyanmisaka      */
186*437bfbebSnyanmisaka     RK_U32          new_qm[2];              // [0] - intra [1] - inter
187*437bfbebSnyanmisaka     RK_U8           quant_matrices[128];    // 0-63: intra 64-127: inter
188*437bfbebSnyanmisaka     Mpeg4Estimation estimation;
189*437bfbebSnyanmisaka     Mpg4Hdr         hdr_curr;               /* header for current decoding frame */
190*437bfbebSnyanmisaka     Mpg4Hdr         hdr_ref0;               /* header for reference frame 0 */
191*437bfbebSnyanmisaka     Mpg4Hdr         hdr_ref1;               /* header for reference frame 1 */
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka     // dpb/output information
194*437bfbebSnyanmisaka     RK_S32          output;
195*437bfbebSnyanmisaka     RK_S64          last_pts;
196*437bfbebSnyanmisaka     RK_S64          pts_inc;
197*437bfbebSnyanmisaka     RK_S64          pts;
198*437bfbebSnyanmisaka     RK_S64          dts;
199*437bfbebSnyanmisaka     RK_U32          frame_num;
200*437bfbebSnyanmisaka     MppDecCfgSet    *dec_cfg;
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka     // syntax for hal
203*437bfbebSnyanmisaka     mpeg4d_dxva2_picture_context_t *syntax;
204*437bfbebSnyanmisaka } Mpg4dParserImpl;
205*437bfbebSnyanmisaka 
log2bin(RK_U32 value)206*437bfbebSnyanmisaka static RK_S32 log2bin(RK_U32 value)
207*437bfbebSnyanmisaka {
208*437bfbebSnyanmisaka     RK_S32 n = 0;
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka     while (value) {
211*437bfbebSnyanmisaka         value >>= 1;
212*437bfbebSnyanmisaka         n++;
213*437bfbebSnyanmisaka     }
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka     return n;
216*437bfbebSnyanmisaka }
217*437bfbebSnyanmisaka 
mpg4d_parse_matrix(BitReadCtx_t * gb,RK_U8 * matrix)218*437bfbebSnyanmisaka static MPP_RET mpg4d_parse_matrix(BitReadCtx_t *gb, RK_U8 * matrix)
219*437bfbebSnyanmisaka {
220*437bfbebSnyanmisaka     RK_S32 i = 0;
221*437bfbebSnyanmisaka     RK_S32 last, value = 0;
222*437bfbebSnyanmisaka 
223*437bfbebSnyanmisaka     do {
224*437bfbebSnyanmisaka         last = value;
225*437bfbebSnyanmisaka         READ_BITS(gb, 8, &value);
226*437bfbebSnyanmisaka         matrix[i++] = value;
227*437bfbebSnyanmisaka     } while (value != 0 && i < 64);
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka     if (value != 0)
230*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
231*437bfbebSnyanmisaka 
232*437bfbebSnyanmisaka     i--;
233*437bfbebSnyanmisaka 
234*437bfbebSnyanmisaka     while (i < 64) {
235*437bfbebSnyanmisaka         matrix[i++ ] = last;
236*437bfbebSnyanmisaka     }
237*437bfbebSnyanmisaka 
238*437bfbebSnyanmisaka     return MPP_OK;
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka __BITREAD_ERR:
241*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
242*437bfbebSnyanmisaka }
243*437bfbebSnyanmisaka 
mpg4d_set_intra_matrix(RK_U8 * quant_matrices,RK_U8 * matrix)244*437bfbebSnyanmisaka static void mpg4d_set_intra_matrix(RK_U8 * quant_matrices, RK_U8 * matrix)
245*437bfbebSnyanmisaka {
246*437bfbebSnyanmisaka     RK_S32 i;
247*437bfbebSnyanmisaka     RK_U8 *intra_matrix = quant_matrices + 0 * 64;
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka     for (i = 0; i < 64; i++) {
250*437bfbebSnyanmisaka         intra_matrix[i] = (!i) ? (RK_U8)8 : (RK_U8)matrix[i];
251*437bfbebSnyanmisaka     }
252*437bfbebSnyanmisaka }
253*437bfbebSnyanmisaka 
mpg4d_set_inter_matrix(RK_U8 * quant_matrices,RK_U8 * matrix)254*437bfbebSnyanmisaka static void mpg4d_set_inter_matrix(RK_U8 * quant_matrices, RK_U8 * matrix)
255*437bfbebSnyanmisaka {
256*437bfbebSnyanmisaka     RK_S32 i;
257*437bfbebSnyanmisaka     RK_U8 *inter_matrix = quant_matrices + 1 * 64;
258*437bfbebSnyanmisaka 
259*437bfbebSnyanmisaka     for (i = 0; i < 64; i++) {
260*437bfbebSnyanmisaka         inter_matrix[i] = (RK_U8) (matrix[i]);
261*437bfbebSnyanmisaka     }
262*437bfbebSnyanmisaka }
263*437bfbebSnyanmisaka 
read_vol_complexity_estimation_header(Mpeg4Estimation * e,BitReadCtx_t * gb)264*437bfbebSnyanmisaka static MPP_RET read_vol_complexity_estimation_header(Mpeg4Estimation *e, BitReadCtx_t *gb)
265*437bfbebSnyanmisaka {
266*437bfbebSnyanmisaka     RK_U32 val;
267*437bfbebSnyanmisaka 
268*437bfbebSnyanmisaka     READ_BITS(gb, 2, &(e->method));                     /* estimation_method */
269*437bfbebSnyanmisaka 
270*437bfbebSnyanmisaka     if (e->method == 0 || e->method == 1) {
271*437bfbebSnyanmisaka         READ_BITS(gb, 1, &val);
272*437bfbebSnyanmisaka         if (!val) {                                     /* shape_complexity_estimation_disable */
273*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->opaque));             /* opaque */
274*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->transparent));        /* transparent */
275*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->intra_cae));          /* intra_cae */
276*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->inter_cae));          /* inter_cae */
277*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->no_update));          /* no_update */
278*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->upsampling));         /* upsampling */
279*437bfbebSnyanmisaka         }
280*437bfbebSnyanmisaka 
281*437bfbebSnyanmisaka         READ_BITS(gb, 1, &val);
282*437bfbebSnyanmisaka         if (!val) {                                     /* texture_complexity_estimation_set_1_disable */
283*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->intra_blocks));       /* intra_blocks */
284*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->inter_blocks));       /* inter_blocks */
285*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->inter4v_blocks));     /* inter4v_blocks */
286*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->not_coded_blocks));   /* not_coded_blocks */
287*437bfbebSnyanmisaka         }
288*437bfbebSnyanmisaka     }
289*437bfbebSnyanmisaka 
290*437bfbebSnyanmisaka     SKIP_BITS(gb, 1);
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka     READ_BITS(gb, 1, &val);
293*437bfbebSnyanmisaka     if (!val) {                                         /* texture_complexity_estimation_set_2_disable */
294*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->dct_coefs));              /* dct_coefs */
295*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->dct_lines));              /* dct_lines */
296*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->vlc_symbols));            /* vlc_symbols */
297*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->vlc_bits));               /* vlc_bits */
298*437bfbebSnyanmisaka     }
299*437bfbebSnyanmisaka 
300*437bfbebSnyanmisaka     READ_BITS(gb, 1, &val);
301*437bfbebSnyanmisaka     if (!val) {                                         /* motion_compensation_complexity_disable */
302*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->apm));                    /* apm */
303*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->npm));                    /* npm */
304*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->interpolate_mc_q));       /* interpolate_mc_q */
305*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->forw_back_mc_q));         /* forw_back_mc_q */
306*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->halfpel2));               /* halfpel2 */
307*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(e->halfpel4));               /* halfpel4 */
308*437bfbebSnyanmisaka     }
309*437bfbebSnyanmisaka 
310*437bfbebSnyanmisaka     SKIP_BITS(gb, 1);
311*437bfbebSnyanmisaka 
312*437bfbebSnyanmisaka     if (e->method == 1) {
313*437bfbebSnyanmisaka         READ_BITS(gb, 1, &val);
314*437bfbebSnyanmisaka         if (!val) {                                     /* version2_complexity_estimation_disable */
315*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->sadct));              /* sadct */
316*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(e->quarterpel));         /* quarterpel */
317*437bfbebSnyanmisaka         }
318*437bfbebSnyanmisaka     }
319*437bfbebSnyanmisaka 
320*437bfbebSnyanmisaka     return MPP_OK;
321*437bfbebSnyanmisaka 
322*437bfbebSnyanmisaka __BITREAD_ERR:
323*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
324*437bfbebSnyanmisaka }
325*437bfbebSnyanmisaka 
326*437bfbebSnyanmisaka /* vop estimation header */
read_vop_complexity_estimation_header(Mpeg4Estimation * e,BitReadCtx_t * gb,Mpg4Hdr * mp4Hdr,int coding_type)327*437bfbebSnyanmisaka static MPP_RET read_vop_complexity_estimation_header(Mpeg4Estimation *e, BitReadCtx_t *gb, Mpg4Hdr *mp4Hdr, int coding_type)
328*437bfbebSnyanmisaka {
329*437bfbebSnyanmisaka     if (e->method == 0 || e->method == 1) {
330*437bfbebSnyanmisaka         if (coding_type == MPEG4_I_VOP) {
331*437bfbebSnyanmisaka             if (e->opaque)  SKIP_BITS(gb, 8);           /* dcecs_opaque */
332*437bfbebSnyanmisaka             if (e->transparent) SKIP_BITS(gb, 8);       /* */
333*437bfbebSnyanmisaka             if (e->intra_cae) SKIP_BITS(gb, 8);         /* */
334*437bfbebSnyanmisaka             if (e->inter_cae) SKIP_BITS(gb, 8);         /* */
335*437bfbebSnyanmisaka             if (e->no_update) SKIP_BITS(gb, 8);         /* */
336*437bfbebSnyanmisaka             if (e->upsampling) SKIP_BITS(gb, 8);        /* */
337*437bfbebSnyanmisaka             if (e->intra_blocks) SKIP_BITS(gb, 8);      /* */
338*437bfbebSnyanmisaka             if (e->not_coded_blocks) SKIP_BITS(gb, 8);  /* */
339*437bfbebSnyanmisaka             if (e->dct_coefs) SKIP_BITS(gb, 8);         /* */
340*437bfbebSnyanmisaka             if (e->dct_lines) SKIP_BITS(gb, 8);         /* */
341*437bfbebSnyanmisaka             if (e->vlc_symbols) SKIP_BITS(gb, 8);       /* */
342*437bfbebSnyanmisaka             if (e->vlc_bits) SKIP_BITS(gb, 8);          /* */
343*437bfbebSnyanmisaka             if (e->sadct)  SKIP_BITS(gb, 8);            /* */
344*437bfbebSnyanmisaka         }
345*437bfbebSnyanmisaka 
346*437bfbebSnyanmisaka         if (coding_type == MPEG4_P_VOP) {
347*437bfbebSnyanmisaka             if (e->opaque) SKIP_BITS(gb, 8);            /* */
348*437bfbebSnyanmisaka             if (e->transparent) SKIP_BITS(gb, 8);       /* */
349*437bfbebSnyanmisaka             if (e->intra_cae) SKIP_BITS(gb, 8);         /* */
350*437bfbebSnyanmisaka             if (e->inter_cae) SKIP_BITS(gb, 8);         /* */
351*437bfbebSnyanmisaka             if (e->no_update) SKIP_BITS(gb, 8);         /* */
352*437bfbebSnyanmisaka             if (e->upsampling) SKIP_BITS(gb, 8);        /* */
353*437bfbebSnyanmisaka             if (e->intra_blocks) SKIP_BITS(gb, 8);      /* */
354*437bfbebSnyanmisaka             if (e->not_coded_blocks) SKIP_BITS(gb, 8);  /* */
355*437bfbebSnyanmisaka             if (e->dct_coefs) SKIP_BITS(gb, 8);         /* */
356*437bfbebSnyanmisaka             if (e->dct_lines) SKIP_BITS(gb, 8);         /* */
357*437bfbebSnyanmisaka             if (e->vlc_symbols) SKIP_BITS(gb, 8);       /* */
358*437bfbebSnyanmisaka             if (e->vlc_bits) SKIP_BITS(gb, 8);          /* */
359*437bfbebSnyanmisaka             if (e->inter_blocks) SKIP_BITS(gb, 8);      /* */
360*437bfbebSnyanmisaka             if (e->inter4v_blocks) SKIP_BITS(gb, 8);    /* */
361*437bfbebSnyanmisaka             if (e->apm) SKIP_BITS(gb, 8);               /* */
362*437bfbebSnyanmisaka             if (e->npm) SKIP_BITS(gb, 8);               /* */
363*437bfbebSnyanmisaka             if (e->forw_back_mc_q) SKIP_BITS(gb, 8);    /* */
364*437bfbebSnyanmisaka             if (e->halfpel2) SKIP_BITS(gb, 8);          /* */
365*437bfbebSnyanmisaka             if (e->halfpel4) SKIP_BITS(gb, 8);          /* */
366*437bfbebSnyanmisaka             if (e->sadct) SKIP_BITS(gb, 8);             /* */
367*437bfbebSnyanmisaka             if (e->quarterpel) SKIP_BITS(gb, 8);        /* */
368*437bfbebSnyanmisaka         }
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka         if (coding_type == MPEG4_B_VOP) {
371*437bfbebSnyanmisaka             if (e->opaque)  SKIP_BITS(gb, 8);           /* */
372*437bfbebSnyanmisaka             if (e->transparent) SKIP_BITS(gb, 8);       /* */
373*437bfbebSnyanmisaka             if (e->intra_cae) SKIP_BITS(gb, 8);         /* */
374*437bfbebSnyanmisaka             if (e->inter_cae) SKIP_BITS(gb, 8);         /* */
375*437bfbebSnyanmisaka             if (e->no_update) SKIP_BITS(gb, 8);         /* */
376*437bfbebSnyanmisaka             if (e->upsampling) SKIP_BITS(gb, 8);        /* */
377*437bfbebSnyanmisaka             if (e->intra_blocks) SKIP_BITS(gb, 8);      /* */
378*437bfbebSnyanmisaka             if (e->not_coded_blocks) SKIP_BITS(gb, 8);  /* */
379*437bfbebSnyanmisaka             if (e->dct_coefs) SKIP_BITS(gb, 8);         /* */
380*437bfbebSnyanmisaka             if (e->dct_lines) SKIP_BITS(gb, 8);         /* */
381*437bfbebSnyanmisaka             if (e->vlc_symbols) SKIP_BITS(gb, 8);       /* */
382*437bfbebSnyanmisaka             if (e->vlc_bits) SKIP_BITS(gb, 8);          /* */
383*437bfbebSnyanmisaka             if (e->inter_blocks) SKIP_BITS(gb, 8);      /* */
384*437bfbebSnyanmisaka             if (e->inter4v_blocks) SKIP_BITS(gb, 8);    /* */
385*437bfbebSnyanmisaka             if (e->apm) SKIP_BITS(gb, 8);               /* */
386*437bfbebSnyanmisaka             if (e->npm) SKIP_BITS(gb, 8);               /* */
387*437bfbebSnyanmisaka             if (e->forw_back_mc_q) SKIP_BITS(gb, 8);    /* */
388*437bfbebSnyanmisaka             if (e->halfpel2) SKIP_BITS(gb, 8);          /* */
389*437bfbebSnyanmisaka             if (e->halfpel4) SKIP_BITS(gb, 8);          /* */
390*437bfbebSnyanmisaka             if (e->interpolate_mc_q) SKIP_BITS(gb, 8);  /* */
391*437bfbebSnyanmisaka             if (e->sadct)  SKIP_BITS(gb, 8);            /* */
392*437bfbebSnyanmisaka             if (e->quarterpel) SKIP_BITS(gb, 8);        /* */
393*437bfbebSnyanmisaka         }
394*437bfbebSnyanmisaka 
395*437bfbebSnyanmisaka #ifdef GMC_SUPPORT
396*437bfbebSnyanmisaka         if (coding_type == MPEG4_S_VOP && mp4Hdr->vol.sprite_enable == MPEG4_SPRITE_STATIC) {
397*437bfbebSnyanmisaka             if (e->intra_blocks) SKIP_BITS(gb, 8);      /* */
398*437bfbebSnyanmisaka             if (e->not_coded_blocks) SKIP_BITS(gb, 8);  /* */
399*437bfbebSnyanmisaka             if (e->dct_coefs) SKIP_BITS(gb, 8);         /* */
400*437bfbebSnyanmisaka             if (e->dct_lines) SKIP_BITS(gb, 8);         /* */
401*437bfbebSnyanmisaka             if (e->vlc_symbols) SKIP_BITS(gb, 8);       /* */
402*437bfbebSnyanmisaka             if (e->vlc_bits) SKIP_BITS(gb, 8);          /* */
403*437bfbebSnyanmisaka             if (e->inter_blocks) SKIP_BITS(gb, 8);      /* */
404*437bfbebSnyanmisaka             if (e->inter4v_blocks) SKIP_BITS(gb, 8);    /* */
405*437bfbebSnyanmisaka             if (e->apm) SKIP_BITS(gb, 8);               /* */
406*437bfbebSnyanmisaka             if (e->npm) SKIP_BITS(gb, 8);               /* */
407*437bfbebSnyanmisaka             if (e->forw_back_mc_q) SKIP_BITS(gb, 8);    /* */
408*437bfbebSnyanmisaka             if (e->halfpel2) SKIP_BITS(gb, 8);          /* */
409*437bfbebSnyanmisaka             if (e->halfpel4) SKIP_BITS(gb, 8);          /* */
410*437bfbebSnyanmisaka             if (e->interpolate_mc_q) SKIP_BITS(gb, 8);  /* */
411*437bfbebSnyanmisaka         }
412*437bfbebSnyanmisaka #else
413*437bfbebSnyanmisaka         (void)mp4Hdr;
414*437bfbebSnyanmisaka #endif
415*437bfbebSnyanmisaka     }
416*437bfbebSnyanmisaka 
417*437bfbebSnyanmisaka     return MPP_OK;
418*437bfbebSnyanmisaka 
419*437bfbebSnyanmisaka __BITREAD_ERR:
420*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
421*437bfbebSnyanmisaka }
422*437bfbebSnyanmisaka 
init_mpg4_hdr_vol(Mpg4Hdr * header)423*437bfbebSnyanmisaka static void init_mpg4_hdr_vol(Mpg4Hdr *header)
424*437bfbebSnyanmisaka {
425*437bfbebSnyanmisaka     memset(&header->vol, 0, sizeof(header->vol));
426*437bfbebSnyanmisaka     header->vol.ver_id = 1;
427*437bfbebSnyanmisaka }
428*437bfbebSnyanmisaka 
init_mpg4_hdr_vop(Mpg4Hdr * header)429*437bfbebSnyanmisaka static void init_mpg4_hdr_vop(Mpg4Hdr *header)
430*437bfbebSnyanmisaka {
431*437bfbebSnyanmisaka     memset(&header->vop, 0, sizeof(header->vop));
432*437bfbebSnyanmisaka     header->vop.coding_type = MPEG4_INVALID_VOP;
433*437bfbebSnyanmisaka }
434*437bfbebSnyanmisaka 
init_mpg4_header(Mpg4Hdr * header)435*437bfbebSnyanmisaka static void init_mpg4_header(Mpg4Hdr *header)
436*437bfbebSnyanmisaka {
437*437bfbebSnyanmisaka     init_mpg4_hdr_vol(header);
438*437bfbebSnyanmisaka     header->usr.packed_mode = 0;
439*437bfbebSnyanmisaka     init_mpg4_hdr_vop(header);
440*437bfbebSnyanmisaka     header->pts         = 0;
441*437bfbebSnyanmisaka     header->slot_idx    = -1;
442*437bfbebSnyanmisaka     header->enqueued    = 0;
443*437bfbebSnyanmisaka }
444*437bfbebSnyanmisaka 
mpg4d_parse_vol_header(Mpg4dParserImpl * p,BitReadCtx_t * cb)445*437bfbebSnyanmisaka static MPP_RET mpg4d_parse_vol_header(Mpg4dParserImpl *p, BitReadCtx_t *cb)
446*437bfbebSnyanmisaka {
447*437bfbebSnyanmisaka     RK_U32 val = 0;
448*437bfbebSnyanmisaka     Mpg4Hdr *mp4Hdr = &p->hdr_curr;
449*437bfbebSnyanmisaka     RK_S32 vol_ver_id;
450*437bfbebSnyanmisaka     RK_S32 aspect_ratio;
451*437bfbebSnyanmisaka     RK_S32 vol_control_parameters;
452*437bfbebSnyanmisaka 
453*437bfbebSnyanmisaka     SKIP_BITS(cb, 1);                                   /* random_accessible_vol */
454*437bfbebSnyanmisaka     READ_BITS(cb, 8, &(mp4Hdr->vol.vo_type));
455*437bfbebSnyanmisaka 
456*437bfbebSnyanmisaka     READ_BITS(cb, 1, &val); /* is_object_layer_identifier */
457*437bfbebSnyanmisaka     if (val) {
458*437bfbebSnyanmisaka         READ_BITS(cb, 4, &vol_ver_id);  /* video_object_layer_verid */
459*437bfbebSnyanmisaka         SKIP_BITS(cb, 3);                               /* video_object_layer_priority */
460*437bfbebSnyanmisaka     } else {
461*437bfbebSnyanmisaka         vol_ver_id = mp4Hdr->vol.ver_id;
462*437bfbebSnyanmisaka     }
463*437bfbebSnyanmisaka 
464*437bfbebSnyanmisaka     READ_BITS(cb, 4, &aspect_ratio);
465*437bfbebSnyanmisaka 
466*437bfbebSnyanmisaka     if (aspect_ratio == MPEG4_VIDOBJLAY_AR_EXTPAR) {    /* aspect_ratio_info */
467*437bfbebSnyanmisaka         RK_S32 par_width, par_height;
468*437bfbebSnyanmisaka 
469*437bfbebSnyanmisaka         READ_BITS(cb, 8, &par_width);                   /* par_width */
470*437bfbebSnyanmisaka         READ_BITS(cb, 8, &par_height);                  /* par_height */
471*437bfbebSnyanmisaka     }
472*437bfbebSnyanmisaka 
473*437bfbebSnyanmisaka     READ_BITS(cb, 1, &vol_control_parameters);
474*437bfbebSnyanmisaka 
475*437bfbebSnyanmisaka     if (vol_control_parameters) {                       /* vol_control_parameters */
476*437bfbebSnyanmisaka         SKIP_BITS(cb, 2);                               /* chroma_format */
477*437bfbebSnyanmisaka         READ_BITS(cb, 1, &(mp4Hdr->vol.low_delay));     /* low_delay flage (1 means no B_VOP) */
478*437bfbebSnyanmisaka 
479*437bfbebSnyanmisaka         READ_BITS(cb, 1, &val); /* vbv_parameters */
480*437bfbebSnyanmisaka         if (val) {
481*437bfbebSnyanmisaka             RK_U32 bitrate;
482*437bfbebSnyanmisaka             RK_U32 buffer_size;
483*437bfbebSnyanmisaka             RK_U32 occupancy;
484*437bfbebSnyanmisaka 
485*437bfbebSnyanmisaka             READ_BITS(cb, 15, &val); /* first_half_bit_rate */
486*437bfbebSnyanmisaka             bitrate = val << 15;
487*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);
488*437bfbebSnyanmisaka             READ_BITS(cb, 15, &val); /* latter_half_bit_rate */
489*437bfbebSnyanmisaka             bitrate |= val;
490*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);
491*437bfbebSnyanmisaka 
492*437bfbebSnyanmisaka             READ_BITS(cb, 15, &val); /* first_half_vbv_buffer_size */
493*437bfbebSnyanmisaka             buffer_size = val << 3;
494*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);
495*437bfbebSnyanmisaka             READ_BITS(cb, 3, &val);
496*437bfbebSnyanmisaka             buffer_size |= val;                             /* latter_half_vbv_buffer_size */
497*437bfbebSnyanmisaka 
498*437bfbebSnyanmisaka             READ_BITS(cb, 11, &val);
499*437bfbebSnyanmisaka             occupancy = val << 15;                          /* first_half_vbv_occupancy */
500*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);
501*437bfbebSnyanmisaka             READ_BITS(cb, 15, &val);
502*437bfbebSnyanmisaka             occupancy |= val;                               /* latter_half_vbv_occupancy */
503*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);
504*437bfbebSnyanmisaka             mpg4d_dbg_bit("bitrate %d, buffer_size %d, occupancy %d", bitrate, buffer_size, occupancy);
505*437bfbebSnyanmisaka         }
506*437bfbebSnyanmisaka     } else {
507*437bfbebSnyanmisaka         mp4Hdr->vol.low_delay = 0;
508*437bfbebSnyanmisaka     }
509*437bfbebSnyanmisaka 
510*437bfbebSnyanmisaka     if (mp4Hdr->vol.vo_type == 0 && vol_control_parameters == 0 && mp4Hdr->vop.frameNumber == 0) {
511*437bfbebSnyanmisaka         mpp_log("looks like this file was encoded with (divx4/(old)xvid/opendivx)\n");
512*437bfbebSnyanmisaka         return MPP_NOK;
513*437bfbebSnyanmisaka     }
514*437bfbebSnyanmisaka 
515*437bfbebSnyanmisaka     READ_BITS(cb, 2, &(mp4Hdr->vol.shape));                 /* video_object_layer_shape */
516*437bfbebSnyanmisaka 
517*437bfbebSnyanmisaka     if (mp4Hdr->vol.shape != MPEG4_VIDOBJLAY_SHAPE_RECTANGULAR) {
518*437bfbebSnyanmisaka         mpp_log("unsupported shape %d\n", mp4Hdr->vol.shape);
519*437bfbebSnyanmisaka         return MPP_NOK;
520*437bfbebSnyanmisaka     }
521*437bfbebSnyanmisaka 
522*437bfbebSnyanmisaka     if (mp4Hdr->vol.shape == MPEG4_VIDOBJLAY_SHAPE_GRAYSCALE && vol_ver_id != 1) {
523*437bfbebSnyanmisaka         SKIP_BITS(cb, 4);                                   /* video_object_layer_shape_extension */
524*437bfbebSnyanmisaka     }
525*437bfbebSnyanmisaka 
526*437bfbebSnyanmisaka     SKIP_BITS(cb, 1);
527*437bfbebSnyanmisaka 
528*437bfbebSnyanmisaka     READ_BITS(cb, 16, &(mp4Hdr->vol.time_inc_resolution));  /* vop_time_increment_resolution */
529*437bfbebSnyanmisaka 
530*437bfbebSnyanmisaka     if (mp4Hdr->vol.time_inc_resolution > 0) {
531*437bfbebSnyanmisaka         mp4Hdr->vol.time_inc_bits = MPP_MAX(log2bin(mp4Hdr->vol.time_inc_resolution - 1), 1);
532*437bfbebSnyanmisaka     } else {
533*437bfbebSnyanmisaka         /* for "old" xvid compatibility, set time_inc_bits = 1 */
534*437bfbebSnyanmisaka         mp4Hdr->vol.time_inc_bits = 1;
535*437bfbebSnyanmisaka     }
536*437bfbebSnyanmisaka 
537*437bfbebSnyanmisaka     SKIP_BITS(cb, 1);
538*437bfbebSnyanmisaka 
539*437bfbebSnyanmisaka     READ_BITS(cb, 1, &val);
540*437bfbebSnyanmisaka     if (val) {                                          /* fixed_vop_rate */
541*437bfbebSnyanmisaka         SKIP_BITS(cb, mp4Hdr->vol.time_inc_bits);       /* fixed_vop_time_increment */
542*437bfbebSnyanmisaka     }
543*437bfbebSnyanmisaka 
544*437bfbebSnyanmisaka     if (mp4Hdr->vol.shape != MPEG4_VIDOBJLAY_SHAPE_BINARY_ONLY) {
545*437bfbebSnyanmisaka         if (mp4Hdr->vol.shape == MPEG4_VIDOBJLAY_SHAPE_RECTANGULAR) {
546*437bfbebSnyanmisaka             RK_S32 width, height;
547*437bfbebSnyanmisaka 
548*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);
549*437bfbebSnyanmisaka             READ_BITS(cb, 13, &width);                  /* video_object_layer_width */
550*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);
551*437bfbebSnyanmisaka             READ_BITS(cb, 13, &height);                 /* video_object_layer_height */
552*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);
553*437bfbebSnyanmisaka 
554*437bfbebSnyanmisaka             mpg4d_dbg_bit("width %4d height %4d\n", width, height);
555*437bfbebSnyanmisaka 
556*437bfbebSnyanmisaka             if (width > 1920 || height > 1088) {
557*437bfbebSnyanmisaka                 mpp_err("Warning: unsupport larger than 1920x1088\n");
558*437bfbebSnyanmisaka                 return MPP_NOK;
559*437bfbebSnyanmisaka             }
560*437bfbebSnyanmisaka 
561*437bfbebSnyanmisaka             mp4Hdr->vol.width  = width;
562*437bfbebSnyanmisaka             mp4Hdr->vol.height = height;
563*437bfbebSnyanmisaka             mp4Hdr->vol.mb_width  = (mp4Hdr->vol.width  + 15) >> 4;
564*437bfbebSnyanmisaka             mp4Hdr->vol.mb_height = (mp4Hdr->vol.height + 15) >> 4;
565*437bfbebSnyanmisaka             mp4Hdr->vol.totalMbInVop = mp4Hdr->vol.mb_width * mp4Hdr->vol.mb_height;
566*437bfbebSnyanmisaka             mp4Hdr->vol.hor_stride = 16 * mp4Hdr->vol.mb_width;
567*437bfbebSnyanmisaka             mp4Hdr->vol.ver_stride = 16 * mp4Hdr->vol.mb_height;
568*437bfbebSnyanmisaka         }
569*437bfbebSnyanmisaka 
570*437bfbebSnyanmisaka         READ_BITS(cb, 1, &(mp4Hdr->vol.interlacing));
571*437bfbebSnyanmisaka 
572*437bfbebSnyanmisaka         READ_BITS(cb, 1, &val);
573*437bfbebSnyanmisaka         if (!val) {                                     /* obmc_disable */
574*437bfbebSnyanmisaka             /* TODO */
575*437bfbebSnyanmisaka             /* fucking divx4.02 has this enabled */
576*437bfbebSnyanmisaka         }
577*437bfbebSnyanmisaka 
578*437bfbebSnyanmisaka         /* sprite_enable */
579*437bfbebSnyanmisaka         READ_BITS(cb, (vol_ver_id == 1 ? 1 : 2), &(mp4Hdr->vol.sprite_enable));
580*437bfbebSnyanmisaka 
581*437bfbebSnyanmisaka         if (mp4Hdr->vol.sprite_enable != MPEG4_SPRITE_NONE) {
582*437bfbebSnyanmisaka             mpp_err("GMC is not supported\n");
583*437bfbebSnyanmisaka             return MPP_ERR_PROTOL;
584*437bfbebSnyanmisaka         }
585*437bfbebSnyanmisaka 
586*437bfbebSnyanmisaka         if (vol_ver_id != 1 &&
587*437bfbebSnyanmisaka             mp4Hdr->vol.shape != MPEG4_VIDOBJLAY_SHAPE_RECTANGULAR) {
588*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);                           /* sadct_disable */
589*437bfbebSnyanmisaka         }
590*437bfbebSnyanmisaka 
591*437bfbebSnyanmisaka         READ_BITS(cb, 1, &val);
592*437bfbebSnyanmisaka         if (val) {                                      /* not_8_bit */
593*437bfbebSnyanmisaka             READ_BITS(cb, 4, &(mp4Hdr->vol.quant_bits));/* quant_precision */
594*437bfbebSnyanmisaka             SKIP_BITS(cb, 4);                           /* bits_per_pixel */
595*437bfbebSnyanmisaka         } else {
596*437bfbebSnyanmisaka             mp4Hdr->vol.quant_bits = 5;
597*437bfbebSnyanmisaka         }
598*437bfbebSnyanmisaka 
599*437bfbebSnyanmisaka         if (mp4Hdr->vol.shape == MPEG4_VIDOBJLAY_SHAPE_GRAYSCALE) {
600*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);                           /* no_gray_quant_update */
601*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);                           /* composition_method */
602*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);                           /* linear_composition */
603*437bfbebSnyanmisaka         }
604*437bfbebSnyanmisaka 
605*437bfbebSnyanmisaka         READ_BITS(cb, 1, &(mp4Hdr->vol.quant_type));    /* quant_type */
606*437bfbebSnyanmisaka 
607*437bfbebSnyanmisaka         if (mp4Hdr->vol.quant_type) {
608*437bfbebSnyanmisaka             RK_U8 matrix[64];
609*437bfbebSnyanmisaka 
610*437bfbebSnyanmisaka             READ_BITS(cb, 1, &val);
611*437bfbebSnyanmisaka             p->new_qm[0] = val;
612*437bfbebSnyanmisaka             if (val) {                                  /* load_intra_quant_mat */
613*437bfbebSnyanmisaka                 mpg4d_parse_matrix(cb, matrix);
614*437bfbebSnyanmisaka                 mpg4d_set_intra_matrix(p->quant_matrices, matrix);
615*437bfbebSnyanmisaka             }
616*437bfbebSnyanmisaka 
617*437bfbebSnyanmisaka             READ_BITS(cb, 1, &val);
618*437bfbebSnyanmisaka             p->new_qm[1] = val;
619*437bfbebSnyanmisaka             if (val) {                                  /* load_inter_quant_mat */
620*437bfbebSnyanmisaka                 mpg4d_parse_matrix(cb, matrix);
621*437bfbebSnyanmisaka                 mpg4d_set_inter_matrix(p->quant_matrices, matrix);
622*437bfbebSnyanmisaka             }
623*437bfbebSnyanmisaka 
624*437bfbebSnyanmisaka             if (mp4Hdr->vol.shape == MPEG4_VIDOBJLAY_SHAPE_GRAYSCALE) {
625*437bfbebSnyanmisaka                 mpp_err("SHAPE_GRAYSCALE is not supported\n");
626*437bfbebSnyanmisaka                 return MPP_NOK;
627*437bfbebSnyanmisaka             }
628*437bfbebSnyanmisaka         } else {
629*437bfbebSnyanmisaka             p->new_qm[0] = 0;
630*437bfbebSnyanmisaka             p->new_qm[1] = 0;
631*437bfbebSnyanmisaka         }
632*437bfbebSnyanmisaka 
633*437bfbebSnyanmisaka         if (vol_ver_id != 1) {
634*437bfbebSnyanmisaka             READ_BITS(cb, 1, &(mp4Hdr->vol.quarter_sample));
635*437bfbebSnyanmisaka         } else
636*437bfbebSnyanmisaka             mp4Hdr->vol.quarter_sample = 0;
637*437bfbebSnyanmisaka 
638*437bfbebSnyanmisaka         /* complexity estimation disable */
639*437bfbebSnyanmisaka         READ_BITS(cb, 1, &(mp4Hdr->vol.complexity_estimation_disable));
640*437bfbebSnyanmisaka 
641*437bfbebSnyanmisaka         if (!mp4Hdr->vol.complexity_estimation_disable) {
642*437bfbebSnyanmisaka             mpg4d_dbg_bit("read_vol_complexity_estimation_header\n");
643*437bfbebSnyanmisaka             if (read_vol_complexity_estimation_header(&p->estimation, cb))
644*437bfbebSnyanmisaka                 return MPP_ERR_STREAM;
645*437bfbebSnyanmisaka         }
646*437bfbebSnyanmisaka 
647*437bfbebSnyanmisaka         /* resync_marker_disable */
648*437bfbebSnyanmisaka         READ_BITS(cb, 1, &(mp4Hdr->vol.resync_marker_disable));
649*437bfbebSnyanmisaka         if (!mp4Hdr->vol.resync_marker_disable) {
650*437bfbebSnyanmisaka             mpp_log("resync marker enabled\n");
651*437bfbebSnyanmisaka             // return MPEG4_RESYNC_VOP;
652*437bfbebSnyanmisaka         }
653*437bfbebSnyanmisaka 
654*437bfbebSnyanmisaka         READ_BITS(cb, 1, &val);
655*437bfbebSnyanmisaka         if (val) {                                      /* data_partitioned */
656*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);                           /* reversible_vlc */
657*437bfbebSnyanmisaka         }
658*437bfbebSnyanmisaka 
659*437bfbebSnyanmisaka         if (vol_ver_id != 1) {
660*437bfbebSnyanmisaka             READ_BITS(cb, 1, &(mp4Hdr->vol.newpred_enable));
661*437bfbebSnyanmisaka 
662*437bfbebSnyanmisaka             if (mp4Hdr->vol.newpred_enable) {               /* newpred_enable */
663*437bfbebSnyanmisaka                 SKIP_BITS(cb, 2);                       /* requested_upstream_message_type */
664*437bfbebSnyanmisaka                 SKIP_BITS(cb, 1);                       /* newpred_segment_type */
665*437bfbebSnyanmisaka             }
666*437bfbebSnyanmisaka 
667*437bfbebSnyanmisaka             /* reduced_resolution_vop_enable */
668*437bfbebSnyanmisaka             READ_BITS(cb, 1, &(mp4Hdr->vol.reduced_resolution_enable));
669*437bfbebSnyanmisaka         } else {
670*437bfbebSnyanmisaka             mp4Hdr->vol.newpred_enable = 0;
671*437bfbebSnyanmisaka             mp4Hdr->vol.reduced_resolution_enable = 0;
672*437bfbebSnyanmisaka         }
673*437bfbebSnyanmisaka 
674*437bfbebSnyanmisaka         READ_BITS(cb, 1, &mp4Hdr->vol.scalability);         /* scalability */
675*437bfbebSnyanmisaka 
676*437bfbebSnyanmisaka         if (mp4Hdr->vol.scalability) {
677*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);                           /* hierarchy_type */
678*437bfbebSnyanmisaka             SKIP_BITS(cb, 4);                           /* ref_layer_id */
679*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);                           /* ref_layer_sampling_direc */
680*437bfbebSnyanmisaka             SKIP_BITS(cb, 5);                           /* hor_sampling_factor_n */
681*437bfbebSnyanmisaka             SKIP_BITS(cb, 5);                           /* hor_sampling_factor_m */
682*437bfbebSnyanmisaka             SKIP_BITS(cb, 5);                           /* vert_sampling_factor_n */
683*437bfbebSnyanmisaka             SKIP_BITS(cb, 5);                           /* vert_sampling_factor_m */
684*437bfbebSnyanmisaka             SKIP_BITS(cb, 1);                           /* enhancement_type */
685*437bfbebSnyanmisaka 
686*437bfbebSnyanmisaka             if (mp4Hdr->vol.shape == MPEG4_VIDOBJLAY_SHAPE_BINARY /* && hierarchy_type==0 */) {
687*437bfbebSnyanmisaka                 /* use_ref_shape and so on*/
688*437bfbebSnyanmisaka                 SKIP_BITS(cb, ( 1 + 1 + 1 + 5 + 5 + 5 + 5));
689*437bfbebSnyanmisaka             }
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka             mpp_err("scalability is not supported\n");
692*437bfbebSnyanmisaka             return MPP_NOK;
693*437bfbebSnyanmisaka         }
694*437bfbebSnyanmisaka     } else { /* mp4Hdr->shape == BINARY_ONLY */
695*437bfbebSnyanmisaka         mpp_err("shape %d is not supported\n");
696*437bfbebSnyanmisaka         return MPP_NOK;
697*437bfbebSnyanmisaka     }
698*437bfbebSnyanmisaka 
699*437bfbebSnyanmisaka     return MPP_OK;
700*437bfbebSnyanmisaka 
701*437bfbebSnyanmisaka __BITREAD_ERR:
702*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
703*437bfbebSnyanmisaka }
704*437bfbebSnyanmisaka 
mpg4d_parse_user_data(Mpg4dParserImpl * p,BitReadCtx_t * gb)705*437bfbebSnyanmisaka static MPP_RET mpg4d_parse_user_data(Mpg4dParserImpl *p, BitReadCtx_t *gb)
706*437bfbebSnyanmisaka {
707*437bfbebSnyanmisaka     RK_U8 tmp[256];
708*437bfbebSnyanmisaka     Mpg4Hdr *mp4Hdr = &p->hdr_curr;
709*437bfbebSnyanmisaka     RK_U32 remain_bit = gb->bytes_left_ * 8 + gb->num_remaining_bits_in_curr_byte_;
710*437bfbebSnyanmisaka     RK_S32 i;
711*437bfbebSnyanmisaka 
712*437bfbebSnyanmisaka     memset(tmp, 0, 256);
713*437bfbebSnyanmisaka 
714*437bfbebSnyanmisaka     for (i = 0; i < 255 && gb->bytes_left_; i++) {
715*437bfbebSnyanmisaka         RK_U32 show_bit = MPP_MIN(remain_bit, 23);
716*437bfbebSnyanmisaka         RK_U32 val;
717*437bfbebSnyanmisaka 
718*437bfbebSnyanmisaka         SHOW_BITS(gb, show_bit, &val);
719*437bfbebSnyanmisaka         if (val == 0)
720*437bfbebSnyanmisaka             break;
721*437bfbebSnyanmisaka 
722*437bfbebSnyanmisaka         READ_BITS(gb, 8, &val);
723*437bfbebSnyanmisaka         tmp[i] = val;
724*437bfbebSnyanmisaka         remain_bit -= 8;
725*437bfbebSnyanmisaka     }
726*437bfbebSnyanmisaka 
727*437bfbebSnyanmisaka     /*
728*437bfbebSnyanmisaka      * The value of i in the for loop above must be less than 255 otherwise it will cause
729*437bfbebSnyanmisaka      * tmp [256] = 0 which is overflow
730*437bfbebSnyanmisaka      */
731*437bfbebSnyanmisaka     tmp[i] = 0;
732*437bfbebSnyanmisaka 
733*437bfbebSnyanmisaka     if (!mp4Hdr->usr.packed_mode) {
734*437bfbebSnyanmisaka         RK_U32 packed = 0;
735*437bfbebSnyanmisaka 
736*437bfbebSnyanmisaka         if ((tmp[0] == 'D') &&
737*437bfbebSnyanmisaka             (tmp[1] == 'i') &&
738*437bfbebSnyanmisaka             (tmp[2] == 'v') &&
739*437bfbebSnyanmisaka             (tmp[3] == 'X')) {
740*437bfbebSnyanmisaka             RK_U32 j = 4;
741*437bfbebSnyanmisaka 
742*437bfbebSnyanmisaka             if (tmp[j] <= '4') {
743*437bfbebSnyanmisaka                 p->custorm_version = 4;
744*437bfbebSnyanmisaka             } else {
745*437bfbebSnyanmisaka                 p->custorm_version = 5;
746*437bfbebSnyanmisaka             }
747*437bfbebSnyanmisaka 
748*437bfbebSnyanmisaka             while ((tmp[j] >= '0') &&
749*437bfbebSnyanmisaka                    (tmp[j] <= '9'))
750*437bfbebSnyanmisaka                 j++;
751*437bfbebSnyanmisaka 
752*437bfbebSnyanmisaka             if (tmp[j] == 'b') {
753*437bfbebSnyanmisaka                 j++;
754*437bfbebSnyanmisaka 
755*437bfbebSnyanmisaka                 while ((tmp[j] >= '0') &&
756*437bfbebSnyanmisaka                        (tmp[j] <= '9'))
757*437bfbebSnyanmisaka                     j++;
758*437bfbebSnyanmisaka 
759*437bfbebSnyanmisaka                 packed = tmp[j];
760*437bfbebSnyanmisaka             } else if ((tmp[j + 0] == 'B') &&
761*437bfbebSnyanmisaka                        (tmp[j + 1] == 'u') &&
762*437bfbebSnyanmisaka                        (tmp[j + 2] == 'i') &&
763*437bfbebSnyanmisaka                        (tmp[j + 3] == 'l') &&
764*437bfbebSnyanmisaka                        (tmp[j + 4] == 'd')) {
765*437bfbebSnyanmisaka                 j += 5;
766*437bfbebSnyanmisaka 
767*437bfbebSnyanmisaka                 while ((tmp[j] >= '0') && (tmp[j] <= '9'))
768*437bfbebSnyanmisaka                     j++;
769*437bfbebSnyanmisaka 
770*437bfbebSnyanmisaka                 packed = tmp[j];
771*437bfbebSnyanmisaka             }
772*437bfbebSnyanmisaka 
773*437bfbebSnyanmisaka             mp4Hdr->usr.packed_mode = ((packed == 'p') ? (1) : (0));
774*437bfbebSnyanmisaka         } else {
775*437bfbebSnyanmisaka             mp4Hdr->usr.packed_mode = 0;
776*437bfbebSnyanmisaka         }
777*437bfbebSnyanmisaka     }
778*437bfbebSnyanmisaka 
779*437bfbebSnyanmisaka     return MPP_OK;
780*437bfbebSnyanmisaka 
781*437bfbebSnyanmisaka __BITREAD_ERR:
782*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
783*437bfbebSnyanmisaka }
784*437bfbebSnyanmisaka 
mpeg4_parse_gop_header(Mpg4dParserImpl * p,BitReadCtx_t * gb)785*437bfbebSnyanmisaka static MPP_RET mpeg4_parse_gop_header(Mpg4dParserImpl *p, BitReadCtx_t *gb)
786*437bfbebSnyanmisaka {
787*437bfbebSnyanmisaka     (void) p;
788*437bfbebSnyanmisaka     RK_S32 hours, minutes, seconds;
789*437bfbebSnyanmisaka 
790*437bfbebSnyanmisaka     READ_BITS(gb, 5, &hours);
791*437bfbebSnyanmisaka     READ_BITS(gb, 6, &minutes);
792*437bfbebSnyanmisaka     SKIP_BITS(gb, 1);
793*437bfbebSnyanmisaka     READ_BITS(gb, 6, &seconds);
794*437bfbebSnyanmisaka 
795*437bfbebSnyanmisaka     SKIP_BITS(gb, 1); /* closed_gov */
796*437bfbebSnyanmisaka     SKIP_BITS(gb, 1); /* broken_link */
797*437bfbebSnyanmisaka 
798*437bfbebSnyanmisaka     return MPP_OK;
799*437bfbebSnyanmisaka 
800*437bfbebSnyanmisaka __BITREAD_ERR:
801*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
802*437bfbebSnyanmisaka }
803*437bfbebSnyanmisaka 
mpeg4_parse_profile_level(Mpg4dParserImpl * p,BitReadCtx_t * bc)804*437bfbebSnyanmisaka static MPP_RET mpeg4_parse_profile_level(Mpg4dParserImpl *p, BitReadCtx_t *bc)
805*437bfbebSnyanmisaka {
806*437bfbebSnyanmisaka     READ_BITS(bc, 4, &p->profile);
807*437bfbebSnyanmisaka     READ_BITS(bc, 4, &p->level);
808*437bfbebSnyanmisaka     return MPP_OK;
809*437bfbebSnyanmisaka 
810*437bfbebSnyanmisaka __BITREAD_ERR:
811*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
812*437bfbebSnyanmisaka }
813*437bfbebSnyanmisaka 
mpeg4_parse_vop_header(Mpg4dParserImpl * p,BitReadCtx_t * gb)814*437bfbebSnyanmisaka static MPP_RET mpeg4_parse_vop_header(Mpg4dParserImpl *p, BitReadCtx_t *gb)
815*437bfbebSnyanmisaka {
816*437bfbebSnyanmisaka     RK_U32 val;
817*437bfbebSnyanmisaka     RK_U32 time_incr = 0;
818*437bfbebSnyanmisaka     RK_S32 time_increment = 0;
819*437bfbebSnyanmisaka     Mpg4Hdr *mp4Hdr = &p->hdr_curr;
820*437bfbebSnyanmisaka 
821*437bfbebSnyanmisaka     READ_BITS(gb, 2, &(mp4Hdr->vop.coding_type));       /* vop_coding_type */
822*437bfbebSnyanmisaka 
823*437bfbebSnyanmisaka     READ_BITS(gb, 1, &val);
824*437bfbebSnyanmisaka     while (val != 0) {
825*437bfbebSnyanmisaka         time_incr++;                                    /* time_base */
826*437bfbebSnyanmisaka         READ_BITS(gb, 1, &val);
827*437bfbebSnyanmisaka     }
828*437bfbebSnyanmisaka 
829*437bfbebSnyanmisaka     SKIP_BITS(gb, 1);
830*437bfbebSnyanmisaka 
831*437bfbebSnyanmisaka     if (mp4Hdr->vol.time_inc_bits) {
832*437bfbebSnyanmisaka         /* vop_time_increment */
833*437bfbebSnyanmisaka         READ_BITS(gb, mp4Hdr->vol.time_inc_bits, &time_increment);
834*437bfbebSnyanmisaka     }
835*437bfbebSnyanmisaka 
836*437bfbebSnyanmisaka     if (mp4Hdr->vop.coding_type != MPEG4_B_VOP) {
837*437bfbebSnyanmisaka         mp4Hdr->last_time_base = mp4Hdr->time_base;
838*437bfbebSnyanmisaka         mp4Hdr->time_base += time_incr;
839*437bfbebSnyanmisaka         mp4Hdr->time = mp4Hdr->time_base * mp4Hdr->vol.time_inc_resolution + time_increment;
840*437bfbebSnyanmisaka         mp4Hdr->time_pp = (RK_S32)(mp4Hdr->time - mp4Hdr->last_non_b_time);
841*437bfbebSnyanmisaka         mp4Hdr->last_non_b_time = mp4Hdr->time;
842*437bfbebSnyanmisaka     } else {
843*437bfbebSnyanmisaka         mp4Hdr->time = (mp4Hdr->last_time_base + time_incr) * mp4Hdr->vol.time_inc_resolution + time_increment;
844*437bfbebSnyanmisaka         mp4Hdr->time_bp = mp4Hdr->time_pp - (RK_S32)(mp4Hdr->last_non_b_time - mp4Hdr->time);
845*437bfbebSnyanmisaka     }
846*437bfbebSnyanmisaka 
847*437bfbebSnyanmisaka     SKIP_BITS(gb, 1);
848*437bfbebSnyanmisaka 
849*437bfbebSnyanmisaka     READ_BITS(gb, 1, &val);
850*437bfbebSnyanmisaka     if (!val) {                                         /* vop_coded */
851*437bfbebSnyanmisaka         mp4Hdr->vop.coding_type = MPEG4_N_VOP;
852*437bfbebSnyanmisaka         mpg4d_dbg_result("found N frame\n");
853*437bfbebSnyanmisaka         return MPP_OK;
854*437bfbebSnyanmisaka     }
855*437bfbebSnyanmisaka     /* do coding_type detection here in order to save time_bp / time_pp */
856*437bfbebSnyanmisaka     if (mp4Hdr->vop.coding_type == MPEG4_B_VOP &&
857*437bfbebSnyanmisaka         (p->hdr_ref0.slot_idx == -1 || p->hdr_ref1.slot_idx == -1)) {
858*437bfbebSnyanmisaka         mpg4d_dbg_result("MPEG4 DIVX 5 PBBI case found!\n");
859*437bfbebSnyanmisaka         return MPP_NOK;
860*437bfbebSnyanmisaka     }
861*437bfbebSnyanmisaka     if (mp4Hdr->vop.coding_type == MPEG4_I_VOP)
862*437bfbebSnyanmisaka         p->found_i_vop = 1;
863*437bfbebSnyanmisaka 
864*437bfbebSnyanmisaka     if (mp4Hdr->vol.newpred_enable) {
865*437bfbebSnyanmisaka         RK_S32 vop_id;
866*437bfbebSnyanmisaka         RK_S32 vop_id_for_prediction;
867*437bfbebSnyanmisaka 
868*437bfbebSnyanmisaka         READ_BITS(gb, (MPP_MIN(mp4Hdr->vol.time_inc_bits + 3, 15)), &vop_id);
869*437bfbebSnyanmisaka 
870*437bfbebSnyanmisaka         READ_BITS(gb, 1, &val);
871*437bfbebSnyanmisaka         if (val) {
872*437bfbebSnyanmisaka             /* vop_id_for_prediction_indication */
873*437bfbebSnyanmisaka             READ_BITS(gb, MPP_MIN(mp4Hdr->vol.time_inc_bits + 3, 15), &vop_id_for_prediction);
874*437bfbebSnyanmisaka         }
875*437bfbebSnyanmisaka 
876*437bfbebSnyanmisaka         SKIP_BITS(gb, 1);
877*437bfbebSnyanmisaka     }
878*437bfbebSnyanmisaka 
879*437bfbebSnyanmisaka     if ((mp4Hdr->vol.shape != MPEG4_VIDOBJLAY_SHAPE_BINARY_ONLY) &&
880*437bfbebSnyanmisaka         ((mp4Hdr->vop.coding_type == MPEG4_P_VOP) ||
881*437bfbebSnyanmisaka          (mp4Hdr->vop.coding_type == MPEG4_S_VOP &&
882*437bfbebSnyanmisaka           mp4Hdr->vol.sprite_enable == MPEG4_SPRITE_GMC))) {
883*437bfbebSnyanmisaka         READ_BITS(gb, 1, &(mp4Hdr->vop.rounding));          /* rounding_type */
884*437bfbebSnyanmisaka     }
885*437bfbebSnyanmisaka 
886*437bfbebSnyanmisaka     if (mp4Hdr->vol.reduced_resolution_enable &&
887*437bfbebSnyanmisaka         mp4Hdr->vol.shape == MPEG4_VIDOBJLAY_SHAPE_RECTANGULAR &&
888*437bfbebSnyanmisaka         (mp4Hdr->vop.coding_type == MPEG4_P_VOP || mp4Hdr->vop.coding_type == MPEG4_I_VOP)) {
889*437bfbebSnyanmisaka 
890*437bfbebSnyanmisaka         READ_BITS(gb, 1, &val);
891*437bfbebSnyanmisaka     }
892*437bfbebSnyanmisaka 
893*437bfbebSnyanmisaka     mpp_assert(mp4Hdr->vol.shape == MPEG4_VIDOBJLAY_SHAPE_RECTANGULAR);
894*437bfbebSnyanmisaka 
895*437bfbebSnyanmisaka     if (mp4Hdr->vol.shape != MPEG4_VIDOBJLAY_SHAPE_BINARY_ONLY) {
896*437bfbebSnyanmisaka         if (!mp4Hdr->vol.complexity_estimation_disable) {
897*437bfbebSnyanmisaka             read_vop_complexity_estimation_header(&p->estimation, gb, mp4Hdr, mp4Hdr->vop.coding_type);
898*437bfbebSnyanmisaka         }
899*437bfbebSnyanmisaka 
900*437bfbebSnyanmisaka         READ_BITS(gb, 3, &val);
901*437bfbebSnyanmisaka         /* intra_dc_vlc_threshold */
902*437bfbebSnyanmisaka         mp4Hdr->vop.intra_dc_vlc_threshold = val;
903*437bfbebSnyanmisaka         mp4Hdr->vop.top_field_first = 0;
904*437bfbebSnyanmisaka         mp4Hdr->vop.alternate_vertical_scan = 0;
905*437bfbebSnyanmisaka 
906*437bfbebSnyanmisaka         if (mp4Hdr->vol.interlacing) {
907*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(mp4Hdr->vop.top_field_first));
908*437bfbebSnyanmisaka             READ_BITS(gb, 1, &(mp4Hdr->vop.alternate_vertical_scan));
909*437bfbebSnyanmisaka         }
910*437bfbebSnyanmisaka     }
911*437bfbebSnyanmisaka 
912*437bfbebSnyanmisaka     if ((mp4Hdr->vol.sprite_enable == MPEG4_SPRITE_STATIC ||
913*437bfbebSnyanmisaka          mp4Hdr->vol.sprite_enable == MPEG4_SPRITE_GMC) &&
914*437bfbebSnyanmisaka         mp4Hdr->vop.coding_type == MPEG4_S_VOP) {
915*437bfbebSnyanmisaka         mpp_err("unsupport split mode %d coding type %d\n",
916*437bfbebSnyanmisaka                 mp4Hdr->vol.sprite_enable, mp4Hdr->vop.coding_type);
917*437bfbebSnyanmisaka         return MPP_ERR_STREAM;
918*437bfbebSnyanmisaka     }
919*437bfbebSnyanmisaka 
920*437bfbebSnyanmisaka     READ_BITS(gb, mp4Hdr->vol.quant_bits, &(mp4Hdr->vop.quant));
921*437bfbebSnyanmisaka     if (mp4Hdr->vop.quant < 1)                              /* vop_quant */
922*437bfbebSnyanmisaka         mp4Hdr->vop.quant = 1;
923*437bfbebSnyanmisaka 
924*437bfbebSnyanmisaka     if (mp4Hdr->vop.coding_type != MPEG4_I_VOP) {
925*437bfbebSnyanmisaka         READ_BITS(gb, 3, &(mp4Hdr->vop.fcode_forward));     /* fcode_forward */
926*437bfbebSnyanmisaka     }
927*437bfbebSnyanmisaka 
928*437bfbebSnyanmisaka     if (mp4Hdr->vop.coding_type == MPEG4_B_VOP) {
929*437bfbebSnyanmisaka         READ_BITS(gb, 3, &(mp4Hdr->vop.fcode_backward));    /* fcode_backward */
930*437bfbebSnyanmisaka     }
931*437bfbebSnyanmisaka 
932*437bfbebSnyanmisaka     if (!mp4Hdr->vol.scalability) {
933*437bfbebSnyanmisaka         if ((mp4Hdr->vol.shape != MPEG4_VIDOBJLAY_SHAPE_RECTANGULAR) &&
934*437bfbebSnyanmisaka             (mp4Hdr->vop.coding_type != MPEG4_I_VOP)) {
935*437bfbebSnyanmisaka             SKIP_BITS(gb, 1);                           /* vop_shape_coding_type */
936*437bfbebSnyanmisaka         }
937*437bfbebSnyanmisaka     }
938*437bfbebSnyanmisaka 
939*437bfbebSnyanmisaka     // NOTE: record header used bits here
940*437bfbebSnyanmisaka     mp4Hdr->vop.hdr_bits = gb->used_bits;
941*437bfbebSnyanmisaka 
942*437bfbebSnyanmisaka     return MPP_OK;
943*437bfbebSnyanmisaka __BITREAD_ERR:
944*437bfbebSnyanmisaka     return MPP_ERR_STREAM;
945*437bfbebSnyanmisaka }
946*437bfbebSnyanmisaka 
mpg4d_fill_picture_parameters(const Mpg4dParserImpl * p,DXVA_PicParams_MPEG4_PART2 * pp)947*437bfbebSnyanmisaka static void mpg4d_fill_picture_parameters(const Mpg4dParserImpl *p,
948*437bfbebSnyanmisaka                                           DXVA_PicParams_MPEG4_PART2 *pp)
949*437bfbebSnyanmisaka {
950*437bfbebSnyanmisaka     const Mpg4Hdr *hdr_curr = &p->hdr_curr;
951*437bfbebSnyanmisaka     const Mpg4Hdr *hdr_ref0 = &p->hdr_ref0;
952*437bfbebSnyanmisaka     const Mpg4Hdr *hdr_ref1 = &p->hdr_ref1;
953*437bfbebSnyanmisaka 
954*437bfbebSnyanmisaka     pp->short_video_header = 0;
955*437bfbebSnyanmisaka     pp->vop_coding_type = hdr_curr->vop.coding_type;
956*437bfbebSnyanmisaka     pp->vop_quant = hdr_curr->vop.quant;
957*437bfbebSnyanmisaka     pp->wDecodedPictureIndex = hdr_curr->slot_idx;
958*437bfbebSnyanmisaka     pp->wForwardRefPictureIndex = hdr_ref0->slot_idx;
959*437bfbebSnyanmisaka     pp->wBackwardRefPictureIndex = hdr_ref1->slot_idx;
960*437bfbebSnyanmisaka     pp->vop_time_increment_resolution = hdr_curr->vol.time_inc_resolution;
961*437bfbebSnyanmisaka     pp->TRB[0] = 0; /* FIXME: */
962*437bfbebSnyanmisaka     pp->TRD[0] = 0; /* FIXME: */
963*437bfbebSnyanmisaka     pp->unPicPostProc = 0; /* FIXME: */
964*437bfbebSnyanmisaka     pp->interlaced = hdr_curr->vol.interlacing;
965*437bfbebSnyanmisaka     pp->quant_type = hdr_curr->vol.quant_type;
966*437bfbebSnyanmisaka     pp->quarter_sample = hdr_curr->vol.quarter_sample;
967*437bfbebSnyanmisaka     pp->resync_marker_disable = 0; /* FIXME: */
968*437bfbebSnyanmisaka     pp->data_partitioned = 0; /* FIXME: */
969*437bfbebSnyanmisaka     pp->reversible_vlc = 0; /* FIXME: */
970*437bfbebSnyanmisaka     pp->reduced_resolution_vop_enable = hdr_curr->vol.reduced_resolution_enable;
971*437bfbebSnyanmisaka     pp->vop_coded = (hdr_curr->vop.coding_type != MPEG4_N_VOP);
972*437bfbebSnyanmisaka     pp->vop_rounding_type = hdr_curr->vop.rounding;
973*437bfbebSnyanmisaka     pp->intra_dc_vlc_thr = hdr_curr->vop.intra_dc_vlc_threshold;
974*437bfbebSnyanmisaka     pp->top_field_first = hdr_curr->vop.top_field_first;
975*437bfbebSnyanmisaka     pp->alternate_vertical_scan_flag = hdr_curr->vop.alternate_vertical_scan;
976*437bfbebSnyanmisaka     pp->profile_and_level_indication = (p->profile << 4) | p->level;
977*437bfbebSnyanmisaka     pp->video_object_layer_verid = hdr_curr->vol.ver_id;
978*437bfbebSnyanmisaka     pp->vop_width = hdr_curr->vol.width;
979*437bfbebSnyanmisaka     pp->vop_height = hdr_curr->vol.height;
980*437bfbebSnyanmisaka     pp->sprite_enable = hdr_curr->vol.sprite_enable;
981*437bfbebSnyanmisaka     pp->no_of_sprite_warping_points = 0; /* FIXME: */
982*437bfbebSnyanmisaka     pp->sprite_warping_accuracy = 0; /* FIXME: */
983*437bfbebSnyanmisaka     memset(pp->warping_mv, 0, sizeof(pp->warping_mv));
984*437bfbebSnyanmisaka     pp->vop_fcode_forward = hdr_curr->vop.fcode_forward;
985*437bfbebSnyanmisaka     pp->vop_fcode_backward = hdr_curr->vop.fcode_backward;
986*437bfbebSnyanmisaka     pp->StatusReportFeedbackNumber = 0; /* FIXME: */
987*437bfbebSnyanmisaka     pp->Reserved16BitsA = 0; /* FIXME: */
988*437bfbebSnyanmisaka     pp->Reserved16BitsB = 0; /* FIXME: */
989*437bfbebSnyanmisaka 
990*437bfbebSnyanmisaka     // Rockchip special data
991*437bfbebSnyanmisaka     pp->custorm_version = p->custorm_version;
992*437bfbebSnyanmisaka     pp->prev_coding_type = (hdr_ref0->vop.coding_type == MPEG4_INVALID_VOP) ? (0) : (hdr_ref0->vop.coding_type);
993*437bfbebSnyanmisaka     pp->time_bp = hdr_curr->time_bp;
994*437bfbebSnyanmisaka     pp->time_pp = hdr_curr->time_pp;
995*437bfbebSnyanmisaka     pp->header_bits = hdr_curr->vop.hdr_bits;
996*437bfbebSnyanmisaka }
997*437bfbebSnyanmisaka 
mpg4d_fill_quantization_matrices(const Mpg4dParserImpl * p,DXVA_QmatrixData * qm)998*437bfbebSnyanmisaka static void mpg4d_fill_quantization_matrices(const Mpg4dParserImpl *p,
999*437bfbebSnyanmisaka                                              DXVA_QmatrixData *qm)
1000*437bfbebSnyanmisaka {
1001*437bfbebSnyanmisaka     RK_S32 i = 0;
1002*437bfbebSnyanmisaka 
1003*437bfbebSnyanmisaka     qm->bNewQmatrix[0] = p->new_qm[0];
1004*437bfbebSnyanmisaka     qm->bNewQmatrix[1] = p->new_qm[1];
1005*437bfbebSnyanmisaka     qm->bNewQmatrix[2] = 0;
1006*437bfbebSnyanmisaka     qm->bNewQmatrix[3] = 0;
1007*437bfbebSnyanmisaka 
1008*437bfbebSnyanmisaka     // intra Y
1009*437bfbebSnyanmisaka     if (p->new_qm[0]) {
1010*437bfbebSnyanmisaka         for (i = 0; i < 64; i++) {
1011*437bfbebSnyanmisaka             qm->Qmatrix[0][i] = p->quant_matrices[i];
1012*437bfbebSnyanmisaka         }
1013*437bfbebSnyanmisaka     } else {
1014*437bfbebSnyanmisaka         memset(qm->Qmatrix[0], 0, sizeof(qm->Qmatrix[0]));
1015*437bfbebSnyanmisaka     }
1016*437bfbebSnyanmisaka 
1017*437bfbebSnyanmisaka     // inter Y
1018*437bfbebSnyanmisaka     if (p->new_qm[1]) {
1019*437bfbebSnyanmisaka         for (i = 0; i < 64; i++) {
1020*437bfbebSnyanmisaka             qm->Qmatrix[1][i] = p->quant_matrices[64 + i];
1021*437bfbebSnyanmisaka         }
1022*437bfbebSnyanmisaka     } else {
1023*437bfbebSnyanmisaka         memset(qm->Qmatrix[1], 0, sizeof(qm->Qmatrix[1]));
1024*437bfbebSnyanmisaka     }
1025*437bfbebSnyanmisaka 
1026*437bfbebSnyanmisaka     memset(qm->Qmatrix[2], 0, sizeof(qm->Qmatrix[2]));
1027*437bfbebSnyanmisaka     memset(qm->Qmatrix[3], 0, sizeof(qm->Qmatrix[3]));
1028*437bfbebSnyanmisaka }
1029*437bfbebSnyanmisaka 
mpg4_syntax_init(mpeg4d_dxva2_picture_context_t * syntax)1030*437bfbebSnyanmisaka static void mpg4_syntax_init(mpeg4d_dxva2_picture_context_t *syntax)
1031*437bfbebSnyanmisaka {
1032*437bfbebSnyanmisaka     DXVA2_DecodeBufferDesc *data = &syntax->desc[0];
1033*437bfbebSnyanmisaka 
1034*437bfbebSnyanmisaka     //!< commit picture paramters
1035*437bfbebSnyanmisaka     memset(data, 0, sizeof(*data));
1036*437bfbebSnyanmisaka     data->CompressedBufferType = DXVA2_PictureParametersBufferType;
1037*437bfbebSnyanmisaka     data->pvPVPState = (void *)&syntax->pp;
1038*437bfbebSnyanmisaka     data->DataSize = sizeof(syntax->pp);
1039*437bfbebSnyanmisaka     syntax->data[0] = data;
1040*437bfbebSnyanmisaka 
1041*437bfbebSnyanmisaka     //!< commit Qmatrix
1042*437bfbebSnyanmisaka     data = &syntax->desc[1];
1043*437bfbebSnyanmisaka     memset(data, 0, sizeof(*data));
1044*437bfbebSnyanmisaka     data->CompressedBufferType = DXVA2_InverseQuantizationMatrixBufferType;
1045*437bfbebSnyanmisaka     data->pvPVPState = (void *)&syntax->qm;
1046*437bfbebSnyanmisaka     data->DataSize = sizeof(syntax->qm);
1047*437bfbebSnyanmisaka     data->NumMBsInBuffer = 0;
1048*437bfbebSnyanmisaka     syntax->data[1] = data;
1049*437bfbebSnyanmisaka 
1050*437bfbebSnyanmisaka     //!< commit bitstream
1051*437bfbebSnyanmisaka     data = &syntax->desc[2];
1052*437bfbebSnyanmisaka     memset(data, 0, sizeof(*data));
1053*437bfbebSnyanmisaka     data->CompressedBufferType = DXVA2_BitStreamDateBufferType;
1054*437bfbebSnyanmisaka     syntax->data[2] = data;
1055*437bfbebSnyanmisaka }
1056*437bfbebSnyanmisaka 
mpp_mpg4_parser_init(Mpg4dParser * ctx,ParserCfg * cfg)1057*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_init(Mpg4dParser *ctx, ParserCfg *cfg)
1058*437bfbebSnyanmisaka {
1059*437bfbebSnyanmisaka     BitReadCtx_t *bit_ctx = mpp_calloc(BitReadCtx_t, 1);
1060*437bfbebSnyanmisaka     Mpg4dParserImpl *p = mpp_calloc(Mpg4dParserImpl, 1);
1061*437bfbebSnyanmisaka     mpeg4d_dxva2_picture_context_t *syntax = mpp_calloc(mpeg4d_dxva2_picture_context_t, 1);
1062*437bfbebSnyanmisaka     MppBufSlots frame_slots = cfg->frame_slots;
1063*437bfbebSnyanmisaka 
1064*437bfbebSnyanmisaka     p->dec_cfg = cfg->cfg;
1065*437bfbebSnyanmisaka 
1066*437bfbebSnyanmisaka     if (NULL == p || NULL == bit_ctx || NULL == syntax) {
1067*437bfbebSnyanmisaka         mpp_err_f("malloc context failed\n");
1068*437bfbebSnyanmisaka         if (p)
1069*437bfbebSnyanmisaka             mpp_free(p);
1070*437bfbebSnyanmisaka         if (bit_ctx)
1071*437bfbebSnyanmisaka             mpp_free(bit_ctx);
1072*437bfbebSnyanmisaka         if (syntax)
1073*437bfbebSnyanmisaka             mpp_free(syntax);
1074*437bfbebSnyanmisaka         return MPP_NOK;
1075*437bfbebSnyanmisaka     }
1076*437bfbebSnyanmisaka 
1077*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1078*437bfbebSnyanmisaka 
1079*437bfbebSnyanmisaka     mpp_buf_slot_setup(frame_slots, 8);
1080*437bfbebSnyanmisaka     p->frame_slots      = frame_slots;
1081*437bfbebSnyanmisaka     p->state            = -1;
1082*437bfbebSnyanmisaka     p->vop_header_found = 0;
1083*437bfbebSnyanmisaka     p->bit_ctx          = bit_ctx;
1084*437bfbebSnyanmisaka     init_mpg4_header(&p->hdr_curr);
1085*437bfbebSnyanmisaka     init_mpg4_header(&p->hdr_ref0);
1086*437bfbebSnyanmisaka     init_mpg4_header(&p->hdr_ref1);
1087*437bfbebSnyanmisaka     mpg4_syntax_init(syntax);
1088*437bfbebSnyanmisaka     p->syntax = syntax;
1089*437bfbebSnyanmisaka 
1090*437bfbebSnyanmisaka     mpp_env_get_u32("mpg4d_debug", &mpg4d_debug, 0);
1091*437bfbebSnyanmisaka 
1092*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1093*437bfbebSnyanmisaka 
1094*437bfbebSnyanmisaka     *ctx = p;
1095*437bfbebSnyanmisaka     return MPP_OK;
1096*437bfbebSnyanmisaka }
1097*437bfbebSnyanmisaka 
mpp_mpg4_parser_deinit(Mpg4dParser ctx)1098*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_deinit(Mpg4dParser ctx)
1099*437bfbebSnyanmisaka {
1100*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1101*437bfbebSnyanmisaka 
1102*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1103*437bfbebSnyanmisaka 
1104*437bfbebSnyanmisaka     if (p) {
1105*437bfbebSnyanmisaka         if (p->bit_ctx) {
1106*437bfbebSnyanmisaka             mpp_free(p->bit_ctx);
1107*437bfbebSnyanmisaka             p->bit_ctx = NULL;
1108*437bfbebSnyanmisaka         }
1109*437bfbebSnyanmisaka         if (p->syntax) {
1110*437bfbebSnyanmisaka             mpp_free(p->syntax);
1111*437bfbebSnyanmisaka             p->syntax = NULL;
1112*437bfbebSnyanmisaka         }
1113*437bfbebSnyanmisaka         mpp_free(p);
1114*437bfbebSnyanmisaka     }
1115*437bfbebSnyanmisaka 
1116*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1117*437bfbebSnyanmisaka 
1118*437bfbebSnyanmisaka     return MPP_OK;
1119*437bfbebSnyanmisaka }
1120*437bfbebSnyanmisaka 
mpp_mpg4_parser_flush(Mpg4dParser ctx)1121*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_flush(Mpg4dParser ctx)
1122*437bfbebSnyanmisaka {
1123*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1124*437bfbebSnyanmisaka     MppBufSlots slots = p->frame_slots;
1125*437bfbebSnyanmisaka     Mpg4Hdr *hdr_ref0 = &p->hdr_ref0;
1126*437bfbebSnyanmisaka     RK_S32 index = hdr_ref0->slot_idx;
1127*437bfbebSnyanmisaka 
1128*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1129*437bfbebSnyanmisaka 
1130*437bfbebSnyanmisaka     if (!hdr_ref0->enqueued && index >= 0) {
1131*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(slots, index, SLOT_QUEUE_USE);
1132*437bfbebSnyanmisaka         mpp_buf_slot_enqueue(slots, index, QUEUE_DISPLAY);
1133*437bfbebSnyanmisaka         hdr_ref0->enqueued = 1;
1134*437bfbebSnyanmisaka     }
1135*437bfbebSnyanmisaka 
1136*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1137*437bfbebSnyanmisaka 
1138*437bfbebSnyanmisaka     return MPP_OK;
1139*437bfbebSnyanmisaka }
1140*437bfbebSnyanmisaka 
mpp_mpg4_parser_reset(Mpg4dParser ctx)1141*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_reset(Mpg4dParser ctx)
1142*437bfbebSnyanmisaka {
1143*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1144*437bfbebSnyanmisaka     MppBufSlots slots = p->frame_slots;
1145*437bfbebSnyanmisaka     Mpg4Hdr *hdr_ref0 = &p->hdr_ref0;
1146*437bfbebSnyanmisaka     Mpg4Hdr *hdr_ref1 = &p->hdr_ref1;
1147*437bfbebSnyanmisaka     RK_S32 index = hdr_ref0->slot_idx;
1148*437bfbebSnyanmisaka 
1149*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1150*437bfbebSnyanmisaka 
1151*437bfbebSnyanmisaka     if (index >= 0) {
1152*437bfbebSnyanmisaka         if (!hdr_ref0->enqueued) {
1153*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(slots, index, SLOT_QUEUE_USE);
1154*437bfbebSnyanmisaka             mpp_buf_slot_enqueue(slots, index, QUEUE_DISPLAY);
1155*437bfbebSnyanmisaka             hdr_ref0->enqueued = 1;
1156*437bfbebSnyanmisaka         }
1157*437bfbebSnyanmisaka         mpp_buf_slot_clr_flag(slots, index, SLOT_CODEC_USE);
1158*437bfbebSnyanmisaka         hdr_ref0->slot_idx = -1;
1159*437bfbebSnyanmisaka     }
1160*437bfbebSnyanmisaka 
1161*437bfbebSnyanmisaka     index = hdr_ref1->slot_idx;
1162*437bfbebSnyanmisaka     if (index >= 0) {
1163*437bfbebSnyanmisaka         mpp_buf_slot_clr_flag(slots, index, SLOT_CODEC_USE);
1164*437bfbebSnyanmisaka         hdr_ref1->slot_idx = -1;
1165*437bfbebSnyanmisaka     }
1166*437bfbebSnyanmisaka 
1167*437bfbebSnyanmisaka     p->found_i_vop      = 0;
1168*437bfbebSnyanmisaka     p->found_vop        = 0;
1169*437bfbebSnyanmisaka     p->state            = -1;
1170*437bfbebSnyanmisaka     p->vop_header_found = 0;
1171*437bfbebSnyanmisaka 
1172*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1173*437bfbebSnyanmisaka 
1174*437bfbebSnyanmisaka     return MPP_OK;
1175*437bfbebSnyanmisaka }
1176*437bfbebSnyanmisaka 
mpp_mpg4_parser_split(Mpg4dParser ctx,MppPacket dst,MppPacket src)1177*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_split(Mpg4dParser ctx, MppPacket dst, MppPacket src)
1178*437bfbebSnyanmisaka {
1179*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
1180*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1181*437bfbebSnyanmisaka     RK_U8 *src_buf = (RK_U8 *)mpp_packet_get_pos(src);
1182*437bfbebSnyanmisaka     RK_U32 src_len = (RK_U32)mpp_packet_get_length(src);
1183*437bfbebSnyanmisaka     RK_U32 src_eos = mpp_packet_get_eos(src);
1184*437bfbebSnyanmisaka     RK_S64 src_pts = mpp_packet_get_pts(src);
1185*437bfbebSnyanmisaka     RK_U8 *dst_buf = (RK_U8 *)mpp_packet_get_data(dst);
1186*437bfbebSnyanmisaka     RK_U32 dst_len = (RK_U32)mpp_packet_get_length(dst);
1187*437bfbebSnyanmisaka     RK_U32 src_pos = 0;
1188*437bfbebSnyanmisaka 
1189*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1190*437bfbebSnyanmisaka 
1191*437bfbebSnyanmisaka     // find the began of the vop
1192*437bfbebSnyanmisaka     if (!p->vop_header_found) {
1193*437bfbebSnyanmisaka         // add last startcode to the new frame data
1194*437bfbebSnyanmisaka         if ((dst_len < sizeof(p->state))
1195*437bfbebSnyanmisaka             && ((p->state & 0x00FFFFFF) == 0x000001)) {
1196*437bfbebSnyanmisaka             dst_buf[0] = 0;
1197*437bfbebSnyanmisaka             dst_buf[1] = 0;
1198*437bfbebSnyanmisaka             dst_buf[2] = 1;
1199*437bfbebSnyanmisaka             dst_len = 3;
1200*437bfbebSnyanmisaka         }
1201*437bfbebSnyanmisaka         while (src_pos < src_len) {
1202*437bfbebSnyanmisaka             p->state = (p->state << 8) | src_buf[src_pos];
1203*437bfbebSnyanmisaka             dst_buf[dst_len++] = src_buf[src_pos++];
1204*437bfbebSnyanmisaka             if (p->state == MPG4_VOP_STARTCODE) {
1205*437bfbebSnyanmisaka                 p->vop_header_found = 1;
1206*437bfbebSnyanmisaka                 mpp_packet_set_pts(dst, src_pts);
1207*437bfbebSnyanmisaka                 break;
1208*437bfbebSnyanmisaka             }
1209*437bfbebSnyanmisaka         }
1210*437bfbebSnyanmisaka     }
1211*437bfbebSnyanmisaka     // find the end of the vop
1212*437bfbebSnyanmisaka     if (p->vop_header_found) {
1213*437bfbebSnyanmisaka         while (src_pos < src_len) {
1214*437bfbebSnyanmisaka             p->state = (p->state << 8) | src_buf[src_pos];
1215*437bfbebSnyanmisaka             dst_buf[dst_len++] = src_buf[src_pos++];
1216*437bfbebSnyanmisaka             if ((p->state & 0x00FFFFFF) == 0x000001) {
1217*437bfbebSnyanmisaka                 dst_len -= 3;
1218*437bfbebSnyanmisaka                 p->vop_header_found = 0;
1219*437bfbebSnyanmisaka                 ret = MPP_OK; // split complete
1220*437bfbebSnyanmisaka                 break;
1221*437bfbebSnyanmisaka             }
1222*437bfbebSnyanmisaka         }
1223*437bfbebSnyanmisaka     }
1224*437bfbebSnyanmisaka     // the last packet
1225*437bfbebSnyanmisaka     if (src_eos && src_pos >= src_len) {
1226*437bfbebSnyanmisaka         mpp_packet_set_eos(dst);
1227*437bfbebSnyanmisaka         ret = MPP_OK;
1228*437bfbebSnyanmisaka     }
1229*437bfbebSnyanmisaka     // reset the src and dst
1230*437bfbebSnyanmisaka     mpp_packet_set_length(dst, dst_len);
1231*437bfbebSnyanmisaka     mpp_packet_set_pos(src, src_buf + src_pos);
1232*437bfbebSnyanmisaka 
1233*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1234*437bfbebSnyanmisaka 
1235*437bfbebSnyanmisaka     return ret;
1236*437bfbebSnyanmisaka }
1237*437bfbebSnyanmisaka 
mpp_mpg4_parser_decode(Mpg4dParser ctx,MppPacket pkt)1238*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_decode(Mpg4dParser ctx, MppPacket pkt)
1239*437bfbebSnyanmisaka {
1240*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1241*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1242*437bfbebSnyanmisaka     BitReadCtx_t *gb = p->bit_ctx;
1243*437bfbebSnyanmisaka     RK_U8 *buf = mpp_packet_get_data(pkt);
1244*437bfbebSnyanmisaka     RK_S32 len = (RK_S32)mpp_packet_get_length(pkt);
1245*437bfbebSnyanmisaka     RK_U32 startcode = 0xff;
1246*437bfbebSnyanmisaka 
1247*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1248*437bfbebSnyanmisaka 
1249*437bfbebSnyanmisaka     // setup bit read context
1250*437bfbebSnyanmisaka     mpp_set_bitread_ctx(gb, buf, len);
1251*437bfbebSnyanmisaka     p->found_vop = 0;
1252*437bfbebSnyanmisaka 
1253*437bfbebSnyanmisaka     while (gb->bytes_left_) {
1254*437bfbebSnyanmisaka         RK_U32 val = 0;
1255*437bfbebSnyanmisaka 
1256*437bfbebSnyanmisaka         READ_BITS(gb, 8, &val);
1257*437bfbebSnyanmisaka         startcode = (startcode << 8) | val;
1258*437bfbebSnyanmisaka 
1259*437bfbebSnyanmisaka         if ((startcode & 0xFFFFFF00) != 0x100)
1260*437bfbebSnyanmisaka             continue;
1261*437bfbebSnyanmisaka 
1262*437bfbebSnyanmisaka         mpg4d_dbg_bit("found startcode at byte %d\n", gb->used_bits >> 3);
1263*437bfbebSnyanmisaka 
1264*437bfbebSnyanmisaka         if (mpg4d_debug & MPG4D_DBG_STARTCODE) {
1265*437bfbebSnyanmisaka             mpp_log_f("start code %03x\n", startcode);
1266*437bfbebSnyanmisaka             if (startcode <= 0x11F)
1267*437bfbebSnyanmisaka                 mpp_log_f("Video Object Start");
1268*437bfbebSnyanmisaka             else if (startcode <= 0x12F)
1269*437bfbebSnyanmisaka                 mpp_log_f("Video Object Layer Start");
1270*437bfbebSnyanmisaka             else if (startcode <= 0x13F)
1271*437bfbebSnyanmisaka                 mpp_log_f("Reserved");
1272*437bfbebSnyanmisaka             else if (startcode <= 0x15F)
1273*437bfbebSnyanmisaka                 mpp_log_f("FGS bp start");
1274*437bfbebSnyanmisaka             else if (startcode <= 0x1AF)
1275*437bfbebSnyanmisaka                 mpp_log_f("Reserved");
1276*437bfbebSnyanmisaka             else if (startcode == 0x1B0)
1277*437bfbebSnyanmisaka                 mpp_log_f("Visual Object Seq Start");
1278*437bfbebSnyanmisaka             else if (startcode == 0x1B1)
1279*437bfbebSnyanmisaka                 mpp_log_f("Visual Object Seq End");
1280*437bfbebSnyanmisaka             else if (startcode == 0x1B2)
1281*437bfbebSnyanmisaka                 mpp_log_f("User Data");
1282*437bfbebSnyanmisaka             else if (startcode == 0x1B3)
1283*437bfbebSnyanmisaka                 mpp_log_f("Group of VOP start");
1284*437bfbebSnyanmisaka             else if (startcode == 0x1B4)
1285*437bfbebSnyanmisaka                 mpp_log_f("Video Session Error");
1286*437bfbebSnyanmisaka             else if (startcode == 0x1B5)
1287*437bfbebSnyanmisaka                 mpp_log_f("Visual Object Start");
1288*437bfbebSnyanmisaka             else if (startcode == 0x1B6)
1289*437bfbebSnyanmisaka                 mpp_log_f("Video Object Plane start");
1290*437bfbebSnyanmisaka             else if (startcode == 0x1B7)
1291*437bfbebSnyanmisaka                 mpp_log_f("slice start");
1292*437bfbebSnyanmisaka             else if (startcode == 0x1B8)
1293*437bfbebSnyanmisaka                 mpp_log_f("extension start");
1294*437bfbebSnyanmisaka             else if (startcode == 0x1B9)
1295*437bfbebSnyanmisaka                 mpp_log_f("fgs start");
1296*437bfbebSnyanmisaka             else if (startcode == 0x1BA)
1297*437bfbebSnyanmisaka                 mpp_log_f("FBA Object start");
1298*437bfbebSnyanmisaka             else if (startcode == 0x1BB)
1299*437bfbebSnyanmisaka                 mpp_log_f("FBA Object Plane start");
1300*437bfbebSnyanmisaka             else if (startcode == 0x1BC)
1301*437bfbebSnyanmisaka                 mpp_log_f("Mesh Object start");
1302*437bfbebSnyanmisaka             else if (startcode == 0x1BD)
1303*437bfbebSnyanmisaka                 mpp_log_f("Mesh Object Plane start");
1304*437bfbebSnyanmisaka             else if (startcode == 0x1BE)
1305*437bfbebSnyanmisaka                 mpp_log_f("Still Texture Object start");
1306*437bfbebSnyanmisaka             else if (startcode == 0x1BF)
1307*437bfbebSnyanmisaka                 mpp_log_f("Texture Spatial Layer start");
1308*437bfbebSnyanmisaka             else if (startcode == 0x1C0)
1309*437bfbebSnyanmisaka                 mpp_log_f("Texture SNR Layer start");
1310*437bfbebSnyanmisaka             else if (startcode == 0x1C1)
1311*437bfbebSnyanmisaka                 mpp_log_f("Texture Tile start");
1312*437bfbebSnyanmisaka             else if (startcode == 0x1C2)
1313*437bfbebSnyanmisaka                 mpp_log_f("Texture Shape Layer start");
1314*437bfbebSnyanmisaka             else if (startcode == 0x1C3)
1315*437bfbebSnyanmisaka                 mpp_log_f("stuffing start");
1316*437bfbebSnyanmisaka             else if (startcode <= 0x1C5)
1317*437bfbebSnyanmisaka                 mpp_log_f("reserved");
1318*437bfbebSnyanmisaka             else if (startcode <= 0x1FF)
1319*437bfbebSnyanmisaka                 mpp_log_f("System start");
1320*437bfbebSnyanmisaka         }
1321*437bfbebSnyanmisaka 
1322*437bfbebSnyanmisaka         if (startcode >= MPG4_VOL_STARTCODE && startcode <= MPG4_VOL_STOPCODE) {
1323*437bfbebSnyanmisaka             ret = mpg4d_parse_vol_header(p, gb);
1324*437bfbebSnyanmisaka             if (!p->found_vol)
1325*437bfbebSnyanmisaka                 p->found_vol = (ret == MPP_OK);
1326*437bfbebSnyanmisaka         } else if (startcode == MPG4_USER_DATA_STARTCODE) {
1327*437bfbebSnyanmisaka             ret = mpg4d_parse_user_data(p, gb);
1328*437bfbebSnyanmisaka         } else if (startcode == MPG4_GOP_STARTCODE) {
1329*437bfbebSnyanmisaka             ret = mpeg4_parse_gop_header(p, gb);
1330*437bfbebSnyanmisaka         } else if (startcode == MPG4_VOS_STARTCODE) {
1331*437bfbebSnyanmisaka             ret = mpeg4_parse_profile_level(p, gb);
1332*437bfbebSnyanmisaka         } else if (startcode == MPG4_VOP_STARTCODE) {
1333*437bfbebSnyanmisaka             ret = mpeg4_parse_vop_header(p, gb);
1334*437bfbebSnyanmisaka             if (MPP_OK == ret) {
1335*437bfbebSnyanmisaka                 RK_S32 coding_type = p->hdr_curr.vop.coding_type;
1336*437bfbebSnyanmisaka                 mpg4d_dbg_bit("frame %d coding_type %d\n", p->frame_num, coding_type);
1337*437bfbebSnyanmisaka                 p->frame_num++;
1338*437bfbebSnyanmisaka 
1339*437bfbebSnyanmisaka                 if (coding_type == MPEG4_N_VOP) {
1340*437bfbebSnyanmisaka                     ret = MPP_OK;
1341*437bfbebSnyanmisaka                     mpp_align_get_bits(gb);
1342*437bfbebSnyanmisaka                     continue;
1343*437bfbebSnyanmisaka                 }
1344*437bfbebSnyanmisaka 
1345*437bfbebSnyanmisaka                 p->found_vop = p->found_i_vop;
1346*437bfbebSnyanmisaka             }
1347*437bfbebSnyanmisaka         }
1348*437bfbebSnyanmisaka 
1349*437bfbebSnyanmisaka         if (ret)
1350*437bfbebSnyanmisaka             goto __BITREAD_ERR;
1351*437bfbebSnyanmisaka 
1352*437bfbebSnyanmisaka         mpp_align_get_bits(gb);
1353*437bfbebSnyanmisaka 
1354*437bfbebSnyanmisaka         if (p->found_vol && p->found_vop)
1355*437bfbebSnyanmisaka             break;
1356*437bfbebSnyanmisaka     }
1357*437bfbebSnyanmisaka 
1358*437bfbebSnyanmisaka     if (p->found_vol) {
1359*437bfbebSnyanmisaka         mpg4d_dbg_result("found vol w %d h %d\n", p->hdr_curr.vol.width, p->hdr_curr.vol.height);
1360*437bfbebSnyanmisaka         p->width    = p->hdr_curr.vol.width;
1361*437bfbebSnyanmisaka         p->height   = p->hdr_curr.vol.height;
1362*437bfbebSnyanmisaka     }
1363*437bfbebSnyanmisaka 
1364*437bfbebSnyanmisaka     p->pts  = mpp_packet_get_pts(pkt);
1365*437bfbebSnyanmisaka     p->dts  = mpp_packet_get_dts(pkt);
1366*437bfbebSnyanmisaka 
1367*437bfbebSnyanmisaka     ret = (p->found_vol && p->found_vop) ? (MPP_OK) : (MPP_NOK);
1368*437bfbebSnyanmisaka 
1369*437bfbebSnyanmisaka __BITREAD_ERR:
1370*437bfbebSnyanmisaka     mpg4d_dbg_result("found vol %d vop %d ret %d\n", p->found_vol, p->found_vop, ret);
1371*437bfbebSnyanmisaka 
1372*437bfbebSnyanmisaka     if (ret) {
1373*437bfbebSnyanmisaka         mpp_packet_set_pos(pkt, buf);
1374*437bfbebSnyanmisaka         mpp_packet_set_length(pkt, 0);
1375*437bfbebSnyanmisaka     } else {
1376*437bfbebSnyanmisaka         RK_U32 used_bytes = gb->used_bits >> 3;
1377*437bfbebSnyanmisaka         mpp_packet_set_pos(pkt, buf + used_bytes);
1378*437bfbebSnyanmisaka     }
1379*437bfbebSnyanmisaka 
1380*437bfbebSnyanmisaka     p->eos = mpp_packet_get_eos(pkt);
1381*437bfbebSnyanmisaka 
1382*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1383*437bfbebSnyanmisaka 
1384*437bfbebSnyanmisaka     return ret;
1385*437bfbebSnyanmisaka }
1386*437bfbebSnyanmisaka 
mpp_mpg4_parser_setup_syntax(Mpg4dParser ctx,MppSyntax * syntax)1387*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_setup_syntax(Mpg4dParser ctx, MppSyntax *syntax)
1388*437bfbebSnyanmisaka {
1389*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1390*437bfbebSnyanmisaka     mpeg4d_dxva2_picture_context_t *syn = p->syntax;
1391*437bfbebSnyanmisaka 
1392*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1393*437bfbebSnyanmisaka 
1394*437bfbebSnyanmisaka     mpg4d_fill_picture_parameters(p, &syn->pp);
1395*437bfbebSnyanmisaka     mpg4d_fill_quantization_matrices(p, &syn->qm);
1396*437bfbebSnyanmisaka 
1397*437bfbebSnyanmisaka     // fill bit stream parameter
1398*437bfbebSnyanmisaka     syn->data[2]->DataSize   = p->bit_ctx->buf_len;
1399*437bfbebSnyanmisaka     syn->data[2]->DataOffset = p->hdr_curr.vop.hdr_bits;
1400*437bfbebSnyanmisaka     syn->data[2]->pvPVPState = p->bit_ctx->buf;
1401*437bfbebSnyanmisaka 
1402*437bfbebSnyanmisaka     syntax->number = 3;
1403*437bfbebSnyanmisaka     syntax->data = syn->data;
1404*437bfbebSnyanmisaka 
1405*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1406*437bfbebSnyanmisaka 
1407*437bfbebSnyanmisaka     return MPP_OK;
1408*437bfbebSnyanmisaka }
1409*437bfbebSnyanmisaka 
mpp_mpg4_parser_setup_hal_output(Mpg4dParser ctx,RK_S32 * output)1410*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_setup_hal_output(Mpg4dParser ctx, RK_S32 *output)
1411*437bfbebSnyanmisaka {
1412*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1413*437bfbebSnyanmisaka     Mpg4Hdr *hdr_curr = &p->hdr_curr;
1414*437bfbebSnyanmisaka     RK_S32 index = -1;
1415*437bfbebSnyanmisaka 
1416*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1417*437bfbebSnyanmisaka 
1418*437bfbebSnyanmisaka     if (p->found_i_vop && hdr_curr->vop.coding_type != MPEG4_N_VOP) {
1419*437bfbebSnyanmisaka         MppBufSlots slots = p->frame_slots;
1420*437bfbebSnyanmisaka         RK_U32 frame_mode = MPP_FRAME_FLAG_FRAME;
1421*437bfbebSnyanmisaka         MppFrame frame = NULL;
1422*437bfbebSnyanmisaka 
1423*437bfbebSnyanmisaka         mpp_frame_init(&frame);
1424*437bfbebSnyanmisaka         mpp_frame_set_width(frame, p->width);
1425*437bfbebSnyanmisaka         mpp_frame_set_height(frame, p->height);
1426*437bfbebSnyanmisaka         mpp_frame_set_hor_stride(frame, MPP_ALIGN(p->width, 16));
1427*437bfbebSnyanmisaka         mpp_frame_set_ver_stride(frame, MPP_ALIGN(p->height, 16));
1428*437bfbebSnyanmisaka 
1429*437bfbebSnyanmisaka         /*
1430*437bfbebSnyanmisaka          * set slots information
1431*437bfbebSnyanmisaka          * 1. output index MUST be set
1432*437bfbebSnyanmisaka          * 2. get unused index for output if needed
1433*437bfbebSnyanmisaka          * 3. set output index as hal_input
1434*437bfbebSnyanmisaka          * 4. set frame information to output index
1435*437bfbebSnyanmisaka          * 5. if one frame can be display, it SHOULD be enqueued to display queue
1436*437bfbebSnyanmisaka          */
1437*437bfbebSnyanmisaka         mpp_buf_slot_get_unused(slots, &index);
1438*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(slots, index, SLOT_HAL_OUTPUT);
1439*437bfbebSnyanmisaka         mpp_frame_set_pts(frame, p->pts);
1440*437bfbebSnyanmisaka         mpp_frame_set_dts(frame, p->dts);
1441*437bfbebSnyanmisaka 
1442*437bfbebSnyanmisaka         if (hdr_curr->vol.interlacing) {
1443*437bfbebSnyanmisaka             frame_mode = MPP_FRAME_FLAG_PAIRED_FIELD;
1444*437bfbebSnyanmisaka             if (hdr_curr->vop.top_field_first)
1445*437bfbebSnyanmisaka                 frame_mode |= MPP_FRAME_FLAG_TOP_FIRST;
1446*437bfbebSnyanmisaka             else
1447*437bfbebSnyanmisaka                 frame_mode |= MPP_FRAME_FLAG_BOT_FIRST;
1448*437bfbebSnyanmisaka         }
1449*437bfbebSnyanmisaka 
1450*437bfbebSnyanmisaka         if ((p->dec_cfg->base.enable_vproc & MPP_VPROC_MODE_DETECTION) &&
1451*437bfbebSnyanmisaka             frame_mode == MPP_FRAME_FLAG_FRAME)
1452*437bfbebSnyanmisaka             frame_mode = MPP_FRAME_FLAG_DEINTERLACED;
1453*437bfbebSnyanmisaka 
1454*437bfbebSnyanmisaka         mpp_frame_set_mode(frame, frame_mode);
1455*437bfbebSnyanmisaka 
1456*437bfbebSnyanmisaka         mpp_buf_slot_set_prop(slots, index, SLOT_FRAME, frame);
1457*437bfbebSnyanmisaka         mpp_frame_deinit(&frame);
1458*437bfbebSnyanmisaka         mpp_assert(NULL == frame);
1459*437bfbebSnyanmisaka 
1460*437bfbebSnyanmisaka         hdr_curr->slot_idx = index;
1461*437bfbebSnyanmisaka     }
1462*437bfbebSnyanmisaka 
1463*437bfbebSnyanmisaka     p->output = index;
1464*437bfbebSnyanmisaka     *output = index;
1465*437bfbebSnyanmisaka 
1466*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1467*437bfbebSnyanmisaka 
1468*437bfbebSnyanmisaka     return MPP_OK;
1469*437bfbebSnyanmisaka }
1470*437bfbebSnyanmisaka 
mpp_mpg4_parser_setup_refer(Mpg4dParser ctx,RK_S32 * refer,RK_S32 max_ref)1471*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_setup_refer(Mpg4dParser ctx, RK_S32 *refer, RK_S32 max_ref)
1472*437bfbebSnyanmisaka {
1473*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1474*437bfbebSnyanmisaka     Mpg4Hdr *hdr_curr = &p->hdr_curr;
1475*437bfbebSnyanmisaka     MppBufSlots slots = p->frame_slots;
1476*437bfbebSnyanmisaka     RK_S32 index;
1477*437bfbebSnyanmisaka 
1478*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1479*437bfbebSnyanmisaka 
1480*437bfbebSnyanmisaka     memset(refer, -1, sizeof(max_ref * sizeof(*refer)));
1481*437bfbebSnyanmisaka     if (hdr_curr->vop.coding_type != MPEG4_N_VOP) {
1482*437bfbebSnyanmisaka         index = p->hdr_ref0.slot_idx;
1483*437bfbebSnyanmisaka         if (index >= 0) {
1484*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(slots, index, SLOT_HAL_INPUT);
1485*437bfbebSnyanmisaka             refer[0] = index;
1486*437bfbebSnyanmisaka         }
1487*437bfbebSnyanmisaka         index = p->hdr_ref1.slot_idx;
1488*437bfbebSnyanmisaka         if (index >= 0) {
1489*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(slots, index, SLOT_HAL_INPUT);
1490*437bfbebSnyanmisaka             refer[1] = index;
1491*437bfbebSnyanmisaka         }
1492*437bfbebSnyanmisaka     }
1493*437bfbebSnyanmisaka 
1494*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1495*437bfbebSnyanmisaka 
1496*437bfbebSnyanmisaka     return MPP_OK;
1497*437bfbebSnyanmisaka }
1498*437bfbebSnyanmisaka 
mpp_mpg4_parser_update_dpb(Mpg4dParser ctx)1499*437bfbebSnyanmisaka MPP_RET mpp_mpg4_parser_update_dpb(Mpg4dParser ctx)
1500*437bfbebSnyanmisaka {
1501*437bfbebSnyanmisaka     Mpg4dParserImpl *p = (Mpg4dParserImpl *)ctx;
1502*437bfbebSnyanmisaka     MppBufSlots slots = p->frame_slots;
1503*437bfbebSnyanmisaka     Mpg4Hdr *hdr_curr = &p->hdr_curr;
1504*437bfbebSnyanmisaka     Mpg4Hdr *hdr_ref0 = &p->hdr_ref0;
1505*437bfbebSnyanmisaka     Mpg4Hdr *hdr_ref1 = &p->hdr_ref1;
1506*437bfbebSnyanmisaka     RK_S32 coding_type = hdr_curr->vop.coding_type;
1507*437bfbebSnyanmisaka     RK_S32 index = p->output;
1508*437bfbebSnyanmisaka 
1509*437bfbebSnyanmisaka     mpg4d_dbg_func("in\n");
1510*437bfbebSnyanmisaka 
1511*437bfbebSnyanmisaka     // update pts increacement
1512*437bfbebSnyanmisaka     if (p->pts != p->last_pts)
1513*437bfbebSnyanmisaka         p->pts_inc = p->pts - p->last_pts;
1514*437bfbebSnyanmisaka 
1515*437bfbebSnyanmisaka     switch (coding_type) {
1516*437bfbebSnyanmisaka     case MPEG4_B_VOP : {
1517*437bfbebSnyanmisaka         mpp_assert((hdr_ref0->slot_idx >= 0) && (hdr_ref1->slot_idx >= 0));
1518*437bfbebSnyanmisaka         // B frame -> index current frame
1519*437bfbebSnyanmisaka         // output current frame and do not change ref0 and ref1
1520*437bfbebSnyanmisaka         index = hdr_curr->slot_idx;
1521*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(slots, index, SLOT_QUEUE_USE);
1522*437bfbebSnyanmisaka         mpp_buf_slot_enqueue(slots, index, QUEUE_DISPLAY);
1523*437bfbebSnyanmisaka     }
1524*437bfbebSnyanmisaka     /*
1525*437bfbebSnyanmisaka      * NOTE: here fallback to N vop - do nothing
1526*437bfbebSnyanmisaka      */
1527*437bfbebSnyanmisaka     case MPEG4_INVALID_VOP :
1528*437bfbebSnyanmisaka     case MPEG4_N_VOP : {
1529*437bfbebSnyanmisaka     } break;
1530*437bfbebSnyanmisaka     case MPEG4_I_VOP :
1531*437bfbebSnyanmisaka     case MPEG4_P_VOP :
1532*437bfbebSnyanmisaka     case MPEG4_S_VOP :
1533*437bfbebSnyanmisaka         // the other case -> index reference 0
1534*437bfbebSnyanmisaka         index = hdr_ref0->slot_idx;
1535*437bfbebSnyanmisaka         if (!hdr_ref0->enqueued && index >= 0) {
1536*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(slots, index, SLOT_QUEUE_USE);
1537*437bfbebSnyanmisaka             mpp_buf_slot_enqueue(slots, index, QUEUE_DISPLAY);
1538*437bfbebSnyanmisaka         }
1539*437bfbebSnyanmisaka         // non B frame send this frame to reference queue
1540*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(slots, hdr_curr->slot_idx, SLOT_CODEC_USE);
1541*437bfbebSnyanmisaka 
1542*437bfbebSnyanmisaka         // release ref1
1543*437bfbebSnyanmisaka         index = hdr_ref1->slot_idx;
1544*437bfbebSnyanmisaka         if (index >= 0)
1545*437bfbebSnyanmisaka             mpp_buf_slot_clr_flag(slots, index, SLOT_CODEC_USE);
1546*437bfbebSnyanmisaka 
1547*437bfbebSnyanmisaka         // swap ref0 to ref1, current to ref0
1548*437bfbebSnyanmisaka         *hdr_ref1 = *hdr_ref0;
1549*437bfbebSnyanmisaka         *hdr_ref0 = *hdr_curr;
1550*437bfbebSnyanmisaka         hdr_curr->pts       = 0;
1551*437bfbebSnyanmisaka     }
1552*437bfbebSnyanmisaka 
1553*437bfbebSnyanmisaka     init_mpg4_hdr_vop(hdr_curr);
1554*437bfbebSnyanmisaka     hdr_curr->slot_idx = -1;
1555*437bfbebSnyanmisaka     p->last_pts = p->pts;
1556*437bfbebSnyanmisaka 
1557*437bfbebSnyanmisaka     mpg4d_dbg_func("out\n");
1558*437bfbebSnyanmisaka 
1559*437bfbebSnyanmisaka     return MPP_OK;
1560*437bfbebSnyanmisaka }
1561*437bfbebSnyanmisaka 
1562*437bfbebSnyanmisaka 
1563*437bfbebSnyanmisaka 
1564