xref: /rockchip-linux_mpp/mpp/codec/dec/m2v/m2vd_parser.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "m2vd_parser"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka #include <math.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "mpp_env.h"
23*437bfbebSnyanmisaka #include "mpp_debug.h"
24*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "m2vd_parser.h"
27*437bfbebSnyanmisaka #include "m2vd_codec.h"
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka #define VPU_BITSTREAM_START_CODE    (0x42564b52)  /* RKVB, rockchip video bitstream */
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka /* ignore unofficial frame poriod */
32*437bfbebSnyanmisaka #define MIN_FRAME_PERIOD_27M        449000  /* more than 60 fps a little*/
33*437bfbebSnyanmisaka #define MAX_FRAME_PERIOD_27M        1130000  /* less than 23.976 fps a little */
34*437bfbebSnyanmisaka #define MAX_FRAME_PERIOD_DIFF       13500   /* 500us */
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka RK_U32 m2vd_debug = 0x0;
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka static RK_U8 scanOrder[2][64] = {
39*437bfbebSnyanmisaka     {   /* zig-zag */
40*437bfbebSnyanmisaka         0, 1, 8, 16, 9, 2, 3, 10,
41*437bfbebSnyanmisaka         17, 24, 32, 25, 18, 11, 4, 5,
42*437bfbebSnyanmisaka         12, 19, 26, 33, 40, 48, 41, 34,
43*437bfbebSnyanmisaka         27, 20, 13, 6, 7, 14, 21, 28,
44*437bfbebSnyanmisaka         35, 42, 49, 56, 57, 50, 43, 36,
45*437bfbebSnyanmisaka         29, 22, 15, 23, 30, 37, 44, 51,
46*437bfbebSnyanmisaka         58, 59, 52, 45, 38, 31, 39, 46,
47*437bfbebSnyanmisaka         53, 60, 61, 54, 47, 55, 62, 63
48*437bfbebSnyanmisaka     },
49*437bfbebSnyanmisaka 
50*437bfbebSnyanmisaka     {   /* Alternate */
51*437bfbebSnyanmisaka         0, 8, 16, 24, 1, 9, 2, 10,
52*437bfbebSnyanmisaka         17, 25, 32, 40, 48, 56, 57, 49,
53*437bfbebSnyanmisaka         41, 33, 26, 18, 3, 11, 4, 12,
54*437bfbebSnyanmisaka         19, 27, 34, 42, 50, 58, 35, 43,
55*437bfbebSnyanmisaka         51, 59, 20, 28, 5, 13, 6, 14,
56*437bfbebSnyanmisaka         21, 29, 36, 44, 52, 60, 37, 45,
57*437bfbebSnyanmisaka         53, 61, 22, 30, 7, 15, 23, 31,
58*437bfbebSnyanmisaka         38, 46, 54, 62, 39, 47, 55, 63
59*437bfbebSnyanmisaka     }
60*437bfbebSnyanmisaka };
61*437bfbebSnyanmisaka 
62*437bfbebSnyanmisaka static RK_U8 intraDefaultQMatrix[64] = {
63*437bfbebSnyanmisaka     8, 16, 19, 22, 26, 27, 29, 34,
64*437bfbebSnyanmisaka     16, 16, 22, 24, 27, 29, 34, 37,
65*437bfbebSnyanmisaka     19, 22, 26, 27, 29, 34, 34, 38,
66*437bfbebSnyanmisaka     22, 22, 26, 27, 29, 34, 37, 40,
67*437bfbebSnyanmisaka     22, 26, 27, 29, 32, 35, 40, 48,
68*437bfbebSnyanmisaka     26, 27, 29, 32, 35, 40, 48, 58,
69*437bfbebSnyanmisaka     26, 27, 29, 34, 38, 46, 56, 69,
70*437bfbebSnyanmisaka     27, 29, 35, 38, 46, 56, 69, 83
71*437bfbebSnyanmisaka };
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka static int frame_period_Table_27M[16] = {
74*437bfbebSnyanmisaka     1,
75*437bfbebSnyanmisaka     1126125, /* 23.976 fps */
76*437bfbebSnyanmisaka     1125000, /* 24 fps */
77*437bfbebSnyanmisaka     1080000, /* 25 fps */
78*437bfbebSnyanmisaka     900900,  /* 29.97 fps */
79*437bfbebSnyanmisaka     900000,  /* 30 fps */
80*437bfbebSnyanmisaka     540000,  /* 50 fps */
81*437bfbebSnyanmisaka     450450,  /* 59.94 fps */
82*437bfbebSnyanmisaka     450000,  /* 60 fps */
83*437bfbebSnyanmisaka     1800000,  /* unofficial: xing 15 fps */
84*437bfbebSnyanmisaka     /* unofficial: libmpeg3 "Unofficial economy rates" 5/10/12/15 fps */
85*437bfbebSnyanmisaka     5400000,
86*437bfbebSnyanmisaka     2700000,
87*437bfbebSnyanmisaka     2250000,
88*437bfbebSnyanmisaka     1800000,
89*437bfbebSnyanmisaka     1,
90*437bfbebSnyanmisaka     1
91*437bfbebSnyanmisaka };
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka static const MppFrameRational mpeg2_aspect[16] = {
94*437bfbebSnyanmisaka     {0, 1},
95*437bfbebSnyanmisaka     {1, 1},
96*437bfbebSnyanmisaka     {4, 3},
97*437bfbebSnyanmisaka     {16, 9},
98*437bfbebSnyanmisaka     {221, 100},
99*437bfbebSnyanmisaka     {0, 1},
100*437bfbebSnyanmisaka     {0, 1},
101*437bfbebSnyanmisaka     {0, 1},
102*437bfbebSnyanmisaka     {0, 1},
103*437bfbebSnyanmisaka     {0, 1},
104*437bfbebSnyanmisaka     {0, 1},
105*437bfbebSnyanmisaka     {0, 1},
106*437bfbebSnyanmisaka     {0, 1},
107*437bfbebSnyanmisaka     {0, 1},
108*437bfbebSnyanmisaka     {0, 1},
109*437bfbebSnyanmisaka     {0, 1},
110*437bfbebSnyanmisaka };
111*437bfbebSnyanmisaka 
m2vd_get_readbits(BitReadCtx_t * bx)112*437bfbebSnyanmisaka static inline RK_S32 m2vd_get_readbits(BitReadCtx_t *bx)
113*437bfbebSnyanmisaka {
114*437bfbebSnyanmisaka     return bx->used_bits;
115*437bfbebSnyanmisaka }
116*437bfbebSnyanmisaka 
m2vd_get_leftbits(BitReadCtx_t * bx)117*437bfbebSnyanmisaka static inline RK_S32 m2vd_get_leftbits(BitReadCtx_t *bx)
118*437bfbebSnyanmisaka {
119*437bfbebSnyanmisaka     return  (bx->bytes_left_ * 8 + bx->num_remaining_bits_in_curr_byte_);
120*437bfbebSnyanmisaka }
121*437bfbebSnyanmisaka 
m2vd_read_bits(BitReadCtx_t * bx,RK_U32 bits)122*437bfbebSnyanmisaka static RK_S32 m2vd_read_bits(BitReadCtx_t *bx, RK_U32 bits)
123*437bfbebSnyanmisaka {
124*437bfbebSnyanmisaka     RK_S32 ret = 0;
125*437bfbebSnyanmisaka     if (bits < 32)
126*437bfbebSnyanmisaka         mpp_read_bits(bx, bits, &ret);
127*437bfbebSnyanmisaka     else
128*437bfbebSnyanmisaka         mpp_read_longbits(bx, bits, (RK_U32 *)&ret);
129*437bfbebSnyanmisaka     return ret;
130*437bfbebSnyanmisaka }
131*437bfbebSnyanmisaka 
m2vd_show_bits(BitReadCtx_t * bx,RK_U32 bits)132*437bfbebSnyanmisaka static RK_S32 m2vd_show_bits(BitReadCtx_t *bx, RK_U32 bits)
133*437bfbebSnyanmisaka {
134*437bfbebSnyanmisaka     RK_S32 ret = 0;
135*437bfbebSnyanmisaka     mpp_show_bits(bx, bits, &ret);
136*437bfbebSnyanmisaka     return ret;
137*437bfbebSnyanmisaka }
138*437bfbebSnyanmisaka 
m2vd_parser_init_ctx(M2VDParserContext * ctx,ParserCfg * cfg)139*437bfbebSnyanmisaka static MPP_RET m2vd_parser_init_ctx(M2VDParserContext *ctx, ParserCfg *cfg)
140*437bfbebSnyanmisaka {
141*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
142*437bfbebSnyanmisaka     RK_S32 i = 0;
143*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka     M2VD_CHK_I(ctx);
146*437bfbebSnyanmisaka     memset(ctx, 0, sizeof(*ctx));
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka     ctx->cfg = cfg->cfg;
149*437bfbebSnyanmisaka     ctx->dxva_ctx = mpp_calloc(M2VDDxvaParam, 1);
150*437bfbebSnyanmisaka     ctx->bitread_ctx = mpp_calloc(BitReadCtx_t, 1);
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     ctx->packet_slots = cfg->packet_slots;
153*437bfbebSnyanmisaka     ctx->frame_slots = cfg->frame_slots;
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka     mpp_buf_slot_setup(ctx->frame_slots, 16);
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka     ctx->initFlag = 0;
158*437bfbebSnyanmisaka     ctx->info_changed = 0;
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka     /* copy from mpeg2decoder::mpeg2decoder */
161*437bfbebSnyanmisaka     memset(&ctx->Framehead, 0, 3 * sizeof(M2VDFrameHead));
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka     ctx->frame_ref0 = &ctx->Framehead[0];
164*437bfbebSnyanmisaka     ctx->frame_ref1 = &ctx->Framehead[1];
165*437bfbebSnyanmisaka     ctx->frame_cur = &ctx->Framehead[2];
166*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
167*437bfbebSnyanmisaka         mpp_frame_init(&ctx->Framehead[i].f);
168*437bfbebSnyanmisaka         if (!ctx->Framehead[i].f) {
169*437bfbebSnyanmisaka             mpp_err("Failed to allocate frame buffer %d\n", i);
170*437bfbebSnyanmisaka             return MPP_ERR_NOMEM;
171*437bfbebSnyanmisaka         }
172*437bfbebSnyanmisaka         ctx->Framehead[i].picCodingType = 0xffffffff;
173*437bfbebSnyanmisaka         ctx->Framehead[i].slot_index = -1;
174*437bfbebSnyanmisaka     }
175*437bfbebSnyanmisaka #if M2VD_SKIP_ERROR_FRAME_EN
176*437bfbebSnyanmisaka     ctx->mHwDecStatus = MPP_OK;
177*437bfbebSnyanmisaka #endif
178*437bfbebSnyanmisaka     ctx->resetFlag = 0;
179*437bfbebSnyanmisaka     ctx->flush_dpb_eos = 0;
180*437bfbebSnyanmisaka     ctx->pic_head.pre_temporal_reference = 0;
181*437bfbebSnyanmisaka     ctx->pic_head.pre_picture_coding_type = 0;
182*437bfbebSnyanmisaka     ctx->pic_head.picture_coding_type = 0;
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka     /* copy form mpeg2decoder::decoder_init */
185*437bfbebSnyanmisaka     //----------------------------------------------------
186*437bfbebSnyanmisaka     ctx->bitstream_sw_buf = mpp_calloc(RK_U8, M2VD_BUF_SIZE_BITMEM);
187*437bfbebSnyanmisaka     mpp_packet_init(&ctx->input_packet, ctx->bitstream_sw_buf, M2VD_BUF_SIZE_BITMEM);
188*437bfbebSnyanmisaka 
189*437bfbebSnyanmisaka     ctx->qp_tab_sw_buf = mpp_calloc(RK_U8, M2VD_BUF_SIZE_QPTAB);
190*437bfbebSnyanmisaka     ctx->seq_head.pIntra_table = ctx->qp_tab_sw_buf;
191*437bfbebSnyanmisaka     ctx->seq_head.pInter_table = ctx->seq_head.pIntra_table + 64;
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka     ctx->MPEG2_Flag = 0;
194*437bfbebSnyanmisaka     ctx->seq_ext_head.progressive_sequence = 1;
195*437bfbebSnyanmisaka     ctx->pic_code_ext_head.progressive_frame = 1;
196*437bfbebSnyanmisaka     ctx->pic_code_ext_head.picture_structure = M2VD_PIC_STRUCT_FRAME;
197*437bfbebSnyanmisaka     ctx->pic_head.pre_picture_coding_type = M2VD_CODING_TYPE_D;
198*437bfbebSnyanmisaka     ctx->top_first_cnt = 0;
199*437bfbebSnyanmisaka     ctx->bottom_first_cnt = 0;
200*437bfbebSnyanmisaka     ctx->pic_code_ext_head.frame_pred_frame_dct = 1;
201*437bfbebSnyanmisaka     ctx->seq_ext_head.chroma_format = 1;
202*437bfbebSnyanmisaka     ctx->seq_disp_ext_head.matrix_coefficients = 5;
203*437bfbebSnyanmisaka     ctx->pre_pts_27M = 0;
204*437bfbebSnyanmisaka     ctx->maxFrame_inGOP = 0;
205*437bfbebSnyanmisaka     ctx->preframe_period = 0;
206*437bfbebSnyanmisaka     ctx->mHeaderDecFlag = 0;
207*437bfbebSnyanmisaka     ctx->mExtraHeaderDecFlag = 0;
208*437bfbebSnyanmisaka     ctx->max_stream_size = M2VD_BUF_SIZE_BITMEM;
209*437bfbebSnyanmisaka     ctx->ref_frame_cnt = 0;
210*437bfbebSnyanmisaka     ctx->left_length = 0;
211*437bfbebSnyanmisaka     ctx->vop_header_found = 0;
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka     if (M2VD_DBG_DUMP_REG & m2vd_debug) {
214*437bfbebSnyanmisaka         RK_S32 k = 0;
215*437bfbebSnyanmisaka         for (k = 0; k < M2VD_DBG_FILE_NUM; k++)
216*437bfbebSnyanmisaka             ctx->fp_dbg_file[k] = NULL;
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka         ctx->fp_dbg_file[0] = fopen("/sdcard/m2vd_dbg_stream.txt", "wb");
219*437bfbebSnyanmisaka         if (!ctx->fp_dbg_file[0])
220*437bfbebSnyanmisaka             mpp_log("open file failed: %s", "/sdcard/m2vd_dbg_stream.txt");
221*437bfbebSnyanmisaka 
222*437bfbebSnyanmisaka         ctx->fp_dbg_yuv = fopen("/sdcard/m2vd_dbg_yuv_out.txt", "wb");
223*437bfbebSnyanmisaka         if (!ctx->fp_dbg_yuv)
224*437bfbebSnyanmisaka             mpp_log("open file failed: %s", "/sdcard/m2vd_dbg_yuv_out.txt");
225*437bfbebSnyanmisaka     } else {
226*437bfbebSnyanmisaka         RK_S32 k = 0;
227*437bfbebSnyanmisaka         for (k = 0; k < M2VD_DBG_FILE_NUM; k++)
228*437bfbebSnyanmisaka             ctx->fp_dbg_file[k] = NULL;
229*437bfbebSnyanmisaka     }
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka 
232*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
233*437bfbebSnyanmisaka __FAILED:
234*437bfbebSnyanmisaka 
235*437bfbebSnyanmisaka     return ret;
236*437bfbebSnyanmisaka }
237*437bfbebSnyanmisaka 
m2vd_parser_init(void * ctx,ParserCfg * parser_cfg)238*437bfbebSnyanmisaka MPP_RET m2vd_parser_init(void *ctx, ParserCfg *parser_cfg)
239*437bfbebSnyanmisaka {
240*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
241*437bfbebSnyanmisaka     M2VDContext *c = (M2VDContext *)ctx;
242*437bfbebSnyanmisaka     M2VDParserContext *p = (M2VDParserContext *)c->parse_ctx;
243*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
244*437bfbebSnyanmisaka     if (p == NULL) {
245*437bfbebSnyanmisaka         M2VD_CHK_M(p = (M2VDParserContext*)mpp_calloc(M2VDParserContext, 1));
246*437bfbebSnyanmisaka         c->parse_ctx = p;
247*437bfbebSnyanmisaka     }
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka     M2VD_CHK_F(m2vd_parser_init_ctx(p, parser_cfg));
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka     mpp_env_get_u32("m2vd_debug", &m2vd_debug, 0);
252*437bfbebSnyanmisaka 
253*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
254*437bfbebSnyanmisaka __FAILED:
255*437bfbebSnyanmisaka     return ret;
256*437bfbebSnyanmisaka }
257*437bfbebSnyanmisaka 
m2vd_parser_deinit(void * ctx)258*437bfbebSnyanmisaka MPP_RET m2vd_parser_deinit(void *ctx)
259*437bfbebSnyanmisaka {
260*437bfbebSnyanmisaka     RK_U32 k = 0;
261*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
262*437bfbebSnyanmisaka     M2VDContext *c = (M2VDContext *)ctx;
263*437bfbebSnyanmisaka     M2VDParserContext *p = (M2VDParserContext *)c->parse_ctx;
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
266*437bfbebSnyanmisaka 
267*437bfbebSnyanmisaka     for (k = 0; k < M2VD_DBG_FILE_NUM; k++) {
268*437bfbebSnyanmisaka         M2VD_FCLOSE(p->fp_dbg_file[k]);
269*437bfbebSnyanmisaka     }
270*437bfbebSnyanmisaka     M2VD_FCLOSE(p->fp_dbg_yuv);
271*437bfbebSnyanmisaka 
272*437bfbebSnyanmisaka     if (p->bitstream_sw_buf) {
273*437bfbebSnyanmisaka         mpp_free(p->bitstream_sw_buf);
274*437bfbebSnyanmisaka         p->bitstream_sw_buf = NULL;
275*437bfbebSnyanmisaka     }
276*437bfbebSnyanmisaka     if (p->qp_tab_sw_buf) {
277*437bfbebSnyanmisaka         mpp_free(p->qp_tab_sw_buf);
278*437bfbebSnyanmisaka         p->qp_tab_sw_buf = NULL;
279*437bfbebSnyanmisaka     }
280*437bfbebSnyanmisaka 
281*437bfbebSnyanmisaka     if (p->input_packet) {
282*437bfbebSnyanmisaka         mpp_packet_deinit(&p->input_packet);
283*437bfbebSnyanmisaka     }
284*437bfbebSnyanmisaka 
285*437bfbebSnyanmisaka     if (p->dxva_ctx) {
286*437bfbebSnyanmisaka         mpp_free(p->dxva_ctx);
287*437bfbebSnyanmisaka         p->dxva_ctx = NULL;
288*437bfbebSnyanmisaka     }
289*437bfbebSnyanmisaka     if (p->bitread_ctx) {
290*437bfbebSnyanmisaka         mpp_free(p->bitread_ctx);
291*437bfbebSnyanmisaka         p->bitread_ctx = NULL;
292*437bfbebSnyanmisaka     }
293*437bfbebSnyanmisaka 
294*437bfbebSnyanmisaka     for (k = 0; k < 3; k++) {
295*437bfbebSnyanmisaka         mpp_frame_deinit(&p->Framehead[k].f);
296*437bfbebSnyanmisaka     }
297*437bfbebSnyanmisaka 
298*437bfbebSnyanmisaka     if (p) {
299*437bfbebSnyanmisaka         mpp_free(p);
300*437bfbebSnyanmisaka     }
301*437bfbebSnyanmisaka 
302*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
303*437bfbebSnyanmisaka     return ret;
304*437bfbebSnyanmisaka }
305*437bfbebSnyanmisaka 
306*437bfbebSnyanmisaka /*!
307*437bfbebSnyanmisaka ***********************************************************************
308*437bfbebSnyanmisaka * \brief
309*437bfbebSnyanmisaka *   reset
310*437bfbebSnyanmisaka ***********************************************************************
311*437bfbebSnyanmisaka */
m2vd_parser_reset(void * ctx)312*437bfbebSnyanmisaka MPP_RET m2vd_parser_reset(void *ctx)
313*437bfbebSnyanmisaka {
314*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
315*437bfbebSnyanmisaka     M2VDContext *c = (M2VDContext *)ctx;
316*437bfbebSnyanmisaka     M2VDParserContext *p = (M2VDParserContext *)c->parse_ctx;
317*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
318*437bfbebSnyanmisaka     if (p->frame_cur->slot_index >= 0)
319*437bfbebSnyanmisaka         mpp_buf_slot_clr_flag(p->frame_slots, p->frame_cur->slot_index,
320*437bfbebSnyanmisaka                               SLOT_CODEC_USE);
321*437bfbebSnyanmisaka 
322*437bfbebSnyanmisaka     if (p->frame_ref0->slot_index >= 0) {
323*437bfbebSnyanmisaka         if (p->frame_ref0->flags) {
324*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(p->frame_slots, p->frame_ref0->slot_index,
325*437bfbebSnyanmisaka                                   SLOT_QUEUE_USE);
326*437bfbebSnyanmisaka             mpp_buf_slot_enqueue(p->frame_slots, p->frame_ref0->slot_index,
327*437bfbebSnyanmisaka                                  QUEUE_DISPLAY);
328*437bfbebSnyanmisaka             p->frame_ref0->flags = 0;
329*437bfbebSnyanmisaka         }
330*437bfbebSnyanmisaka         mpp_buf_slot_clr_flag(p->frame_slots, p->frame_ref0->slot_index,
331*437bfbebSnyanmisaka                               SLOT_CODEC_USE);
332*437bfbebSnyanmisaka     }
333*437bfbebSnyanmisaka 
334*437bfbebSnyanmisaka     if (p->frame_ref1->slot_index >= 0)
335*437bfbebSnyanmisaka         mpp_buf_slot_clr_flag(p->frame_slots, p->frame_ref1->slot_index,
336*437bfbebSnyanmisaka                               SLOT_CODEC_USE);
337*437bfbebSnyanmisaka 
338*437bfbebSnyanmisaka     if (p->input_packet) {
339*437bfbebSnyanmisaka         mpp_packet_clr_eos(p->input_packet);
340*437bfbebSnyanmisaka     }
341*437bfbebSnyanmisaka 
342*437bfbebSnyanmisaka     p->frame_cur->slot_index = -1;
343*437bfbebSnyanmisaka     p->frame_ref0->slot_index = -1;
344*437bfbebSnyanmisaka     p->frame_ref1->slot_index = -1;
345*437bfbebSnyanmisaka     p->ref_frame_cnt = 0;
346*437bfbebSnyanmisaka     p->resetFlag = 1;
347*437bfbebSnyanmisaka     p->eos = 0;
348*437bfbebSnyanmisaka     p->left_length = 0;
349*437bfbebSnyanmisaka     p->vop_header_found = 0;
350*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
351*437bfbebSnyanmisaka     return ret;
352*437bfbebSnyanmisaka }
353*437bfbebSnyanmisaka 
354*437bfbebSnyanmisaka /*!
355*437bfbebSnyanmisaka ***********************************************************************
356*437bfbebSnyanmisaka * \brief
357*437bfbebSnyanmisaka *   flush
358*437bfbebSnyanmisaka ***********************************************************************
359*437bfbebSnyanmisaka */
m2vd_parser_flush(void * ctx)360*437bfbebSnyanmisaka MPP_RET m2vd_parser_flush(void *ctx)
361*437bfbebSnyanmisaka {
362*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
363*437bfbebSnyanmisaka     M2VDContext *c = (M2VDContext *)ctx;
364*437bfbebSnyanmisaka     M2VDParserContext *p = (M2VDParserContext *)c->parse_ctx;
365*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
366*437bfbebSnyanmisaka 
367*437bfbebSnyanmisaka     if ((p->frame_ref0->slot_index >= 0) && p->frame_ref0->flags) {
368*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p->frame_slots, p->frame_ref0->slot_index,
369*437bfbebSnyanmisaka                               SLOT_QUEUE_USE);
370*437bfbebSnyanmisaka         mpp_buf_slot_enqueue(p->frame_slots, p->frame_ref0->slot_index,
371*437bfbebSnyanmisaka                              QUEUE_DISPLAY);
372*437bfbebSnyanmisaka         p->frame_ref0->flags = 0;
373*437bfbebSnyanmisaka     }
374*437bfbebSnyanmisaka 
375*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
376*437bfbebSnyanmisaka     return ret;
377*437bfbebSnyanmisaka }
378*437bfbebSnyanmisaka 
379*437bfbebSnyanmisaka /*!
380*437bfbebSnyanmisaka ***********************************************************************
381*437bfbebSnyanmisaka * \brief
382*437bfbebSnyanmisaka *   control/perform
383*437bfbebSnyanmisaka ***********************************************************************
384*437bfbebSnyanmisaka */
m2vd_parser_control(void * ctx,MpiCmd cmd_type,void * param)385*437bfbebSnyanmisaka MPP_RET m2vd_parser_control(void *ctx, MpiCmd cmd_type, void *param)
386*437bfbebSnyanmisaka {
387*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
388*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
389*437bfbebSnyanmisaka     (void)ctx;
390*437bfbebSnyanmisaka     (void)cmd_type;
391*437bfbebSnyanmisaka     (void)param;
392*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
393*437bfbebSnyanmisaka     return ret;
394*437bfbebSnyanmisaka }
395*437bfbebSnyanmisaka 
396*437bfbebSnyanmisaka /*!
397*437bfbebSnyanmisaka ***********************************************************************
398*437bfbebSnyanmisaka * \brief
399*437bfbebSnyanmisaka *   prepare
400*437bfbebSnyanmisaka ***********************************************************************
401*437bfbebSnyanmisaka */
mpp_m2vd_parser_split(M2VDParserContext * ctx,MppPacket dst,MppPacket src)402*437bfbebSnyanmisaka MPP_RET mpp_m2vd_parser_split(M2VDParserContext *ctx, MppPacket dst, MppPacket src)
403*437bfbebSnyanmisaka {
404*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
405*437bfbebSnyanmisaka     M2VDParserContext *p = ctx;
406*437bfbebSnyanmisaka     RK_U8 *src_buf = (RK_U8 *)mpp_packet_get_pos(src);
407*437bfbebSnyanmisaka     RK_U32 src_len = (RK_U32)mpp_packet_get_length(src);
408*437bfbebSnyanmisaka     RK_U32 src_eos = mpp_packet_get_eos(src);
409*437bfbebSnyanmisaka     RK_U8 *dst_buf = (RK_U8 *)mpp_packet_get_data(dst);
410*437bfbebSnyanmisaka     RK_U32 dst_len = (RK_U32)mpp_packet_get_length(dst);
411*437bfbebSnyanmisaka     RK_U32 src_pos = 0;
412*437bfbebSnyanmisaka 
413*437bfbebSnyanmisaka     if (!p->vop_header_found) {
414*437bfbebSnyanmisaka         if ((dst_len < sizeof(p->state)) &&
415*437bfbebSnyanmisaka             ((p->state & 0x00FFFFFF) == 0x000001)) {
416*437bfbebSnyanmisaka             dst_buf[0] = 0;
417*437bfbebSnyanmisaka             dst_buf[1] = 0;
418*437bfbebSnyanmisaka             dst_buf[2] = 1;
419*437bfbebSnyanmisaka             dst_len = 3;
420*437bfbebSnyanmisaka         }
421*437bfbebSnyanmisaka 
422*437bfbebSnyanmisaka         while (src_pos < src_len) {
423*437bfbebSnyanmisaka             p->state = (p->state << 8) | src_buf[src_pos];
424*437bfbebSnyanmisaka             dst_buf[dst_len++] = src_buf[src_pos++];
425*437bfbebSnyanmisaka 
426*437bfbebSnyanmisaka             /*
427*437bfbebSnyanmisaka              * 0x1b3 : sequence header
428*437bfbebSnyanmisaka              * 0x100 : frame header
429*437bfbebSnyanmisaka              * we see all 0x1b3 and 0x100 as boundary
430*437bfbebSnyanmisaka              */
431*437bfbebSnyanmisaka             if (p->state == SEQUENCE_HEADER_CODE || p->state == PICTURE_START_CODE) {
432*437bfbebSnyanmisaka                 p->pts = mpp_packet_get_pts(src);
433*437bfbebSnyanmisaka                 p->dts = mpp_packet_get_dts(src);
434*437bfbebSnyanmisaka                 p->vop_header_found = 1;
435*437bfbebSnyanmisaka                 break;
436*437bfbebSnyanmisaka             }
437*437bfbebSnyanmisaka         }
438*437bfbebSnyanmisaka     }
439*437bfbebSnyanmisaka 
440*437bfbebSnyanmisaka     if (p->vop_header_found) {
441*437bfbebSnyanmisaka         while (src_pos < src_len) {
442*437bfbebSnyanmisaka             p->state = (p->state << 8) | src_buf[src_pos];
443*437bfbebSnyanmisaka             dst_buf[dst_len++] = src_buf[src_pos++];
444*437bfbebSnyanmisaka 
445*437bfbebSnyanmisaka             if (((p->state & 0x00FFFFFF) == 0x000001) && (src_pos < src_len) &&
446*437bfbebSnyanmisaka                 (src_buf[src_pos] == (SEQUENCE_HEADER_CODE & 0xFF) ||
447*437bfbebSnyanmisaka                  src_buf[src_pos] == (PICTURE_START_CODE & 0xFF))) {
448*437bfbebSnyanmisaka                 dst_len -= 3;
449*437bfbebSnyanmisaka                 p->vop_header_found = 0;
450*437bfbebSnyanmisaka                 ret = MPP_OK;
451*437bfbebSnyanmisaka                 break;
452*437bfbebSnyanmisaka             }
453*437bfbebSnyanmisaka         }
454*437bfbebSnyanmisaka     }
455*437bfbebSnyanmisaka 
456*437bfbebSnyanmisaka     if (src_eos && src_pos >= src_len) {
457*437bfbebSnyanmisaka         mpp_packet_set_eos(dst);
458*437bfbebSnyanmisaka         ret = MPP_OK;
459*437bfbebSnyanmisaka     }
460*437bfbebSnyanmisaka 
461*437bfbebSnyanmisaka     mpp_packet_set_length(dst, dst_len);
462*437bfbebSnyanmisaka     mpp_packet_set_pos(src, src_buf + src_pos);
463*437bfbebSnyanmisaka 
464*437bfbebSnyanmisaka     return ret;
465*437bfbebSnyanmisaka }
466*437bfbebSnyanmisaka 
m2vd_parser_prepare(void * ctx,MppPacket pkt,HalDecTask * task)467*437bfbebSnyanmisaka MPP_RET m2vd_parser_prepare(void *ctx, MppPacket pkt, HalDecTask *task)
468*437bfbebSnyanmisaka {
469*437bfbebSnyanmisaka     M2VDContext *c = (M2VDContext *)ctx;
470*437bfbebSnyanmisaka     M2VDParserContext *p = (M2VDParserContext *)c->parse_ctx;
471*437bfbebSnyanmisaka     RK_U8 *pos = NULL;
472*437bfbebSnyanmisaka     size_t length = 0;
473*437bfbebSnyanmisaka     RK_U32 eos = 0;
474*437bfbebSnyanmisaka 
475*437bfbebSnyanmisaka     if (ctx == NULL || pkt == NULL || task == NULL) {
476*437bfbebSnyanmisaka         mpp_err_f("found NULL input ctx %p pkt %p task %p\n", ctx, pkt, task);
477*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
478*437bfbebSnyanmisaka     }
479*437bfbebSnyanmisaka 
480*437bfbebSnyanmisaka     pos = mpp_packet_get_pos(pkt);
481*437bfbebSnyanmisaka     length = mpp_packet_get_length(pkt);
482*437bfbebSnyanmisaka     eos = mpp_packet_get_eos(pkt);
483*437bfbebSnyanmisaka 
484*437bfbebSnyanmisaka     if (eos && !length && !p->left_length) {
485*437bfbebSnyanmisaka         task->valid = 0;
486*437bfbebSnyanmisaka         task->flags.eos = 1;
487*437bfbebSnyanmisaka         m2vd_parser_flush(ctx);
488*437bfbebSnyanmisaka         return MPP_OK;
489*437bfbebSnyanmisaka     }
490*437bfbebSnyanmisaka 
491*437bfbebSnyanmisaka     if (p->bitstream_sw_buf == NULL) {
492*437bfbebSnyanmisaka         mpp_err("failed to malloc task buffer for hardware with size %d\n", length);
493*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
494*437bfbebSnyanmisaka     }
495*437bfbebSnyanmisaka 
496*437bfbebSnyanmisaka     mpp_packet_set_length(p->input_packet, p->left_length);
497*437bfbebSnyanmisaka 
498*437bfbebSnyanmisaka     size_t total_length = MPP_ALIGN(p->left_length + length, 16) + 64;
499*437bfbebSnyanmisaka 
500*437bfbebSnyanmisaka     if (total_length > p->max_stream_size) {
501*437bfbebSnyanmisaka         RK_U8 *dst = NULL;
502*437bfbebSnyanmisaka 
503*437bfbebSnyanmisaka         do {
504*437bfbebSnyanmisaka             p->max_stream_size <<= 1;
505*437bfbebSnyanmisaka         } while (total_length > p->max_stream_size);
506*437bfbebSnyanmisaka 
507*437bfbebSnyanmisaka         dst = mpp_malloc_size(RK_U8, p->max_stream_size);
508*437bfbebSnyanmisaka         mpp_assert(dst);
509*437bfbebSnyanmisaka 
510*437bfbebSnyanmisaka         if (p->left_length > 0) {
511*437bfbebSnyanmisaka             memcpy(dst, p->bitstream_sw_buf, p->left_length);
512*437bfbebSnyanmisaka         }
513*437bfbebSnyanmisaka         mpp_free(p->bitstream_sw_buf);
514*437bfbebSnyanmisaka         p->bitstream_sw_buf = dst;
515*437bfbebSnyanmisaka 
516*437bfbebSnyanmisaka         mpp_packet_set_data(p->input_packet, p->bitstream_sw_buf);
517*437bfbebSnyanmisaka         mpp_packet_set_size(p->input_packet, p->max_stream_size);
518*437bfbebSnyanmisaka     }
519*437bfbebSnyanmisaka 
520*437bfbebSnyanmisaka     if (!p->cfg->base.split_parse) {
521*437bfbebSnyanmisaka         RK_U32 *val = (RK_U32 *)mpp_packet_get_pos(pkt);
522*437bfbebSnyanmisaka         /* if input data is rk format styl skip those 32 byte */
523*437bfbebSnyanmisaka         RK_S32 offset = (VPU_BITSTREAM_START_CODE == val[0]) ? 32 : 0;
524*437bfbebSnyanmisaka         memcpy(p->bitstream_sw_buf, pos + offset, length - offset);
525*437bfbebSnyanmisaka 
526*437bfbebSnyanmisaka         mpp_packet_set_length(p->input_packet, length - offset);
527*437bfbebSnyanmisaka         mpp_packet_set_data(p->input_packet, p->bitstream_sw_buf);
528*437bfbebSnyanmisaka         mpp_packet_set_size(p->input_packet, p->max_stream_size);
529*437bfbebSnyanmisaka 
530*437bfbebSnyanmisaka         if (mpp_packet_get_eos(pkt))
531*437bfbebSnyanmisaka             mpp_packet_set_eos(p->input_packet);
532*437bfbebSnyanmisaka 
533*437bfbebSnyanmisaka         p->pts = mpp_packet_get_pts(pkt);
534*437bfbebSnyanmisaka         p->dts = mpp_packet_get_dts(pkt);
535*437bfbebSnyanmisaka         task->valid = 1;
536*437bfbebSnyanmisaka         mpp_packet_set_length(pkt, 0);
537*437bfbebSnyanmisaka     } else {
538*437bfbebSnyanmisaka         if (MPP_OK == mpp_m2vd_parser_split(p, p->input_packet, pkt)) {
539*437bfbebSnyanmisaka             p->left_length = 0;
540*437bfbebSnyanmisaka             task->valid = 1;
541*437bfbebSnyanmisaka         } else {
542*437bfbebSnyanmisaka             task->valid = 0;
543*437bfbebSnyanmisaka             p->left_length = mpp_packet_get_length(p->input_packet);
544*437bfbebSnyanmisaka         }
545*437bfbebSnyanmisaka     }
546*437bfbebSnyanmisaka 
547*437bfbebSnyanmisaka     if (mpp_packet_get_flag(pkt) & MPP_PACKET_FLAG_EXTRA_DATA) {
548*437bfbebSnyanmisaka         mpp_packet_set_extra_data(p->input_packet);
549*437bfbebSnyanmisaka     }
550*437bfbebSnyanmisaka 
551*437bfbebSnyanmisaka     p->eos = mpp_packet_get_eos(p->input_packet);
552*437bfbebSnyanmisaka     mpp_packet_set_pts(p->input_packet, p->pts);
553*437bfbebSnyanmisaka     mpp_packet_set_dts(p->input_packet, p->dts);
554*437bfbebSnyanmisaka     task->input_packet = p->input_packet;
555*437bfbebSnyanmisaka     task->flags.eos = p->eos;
556*437bfbebSnyanmisaka 
557*437bfbebSnyanmisaka     return MPP_OK;
558*437bfbebSnyanmisaka }
559*437bfbebSnyanmisaka 
560*437bfbebSnyanmisaka /*!
561*437bfbebSnyanmisaka ***********************************************************************
562*437bfbebSnyanmisaka * \brief
563*437bfbebSnyanmisaka *   parser
564*437bfbebSnyanmisaka ***********************************************************************
565*437bfbebSnyanmisaka */
566*437bfbebSnyanmisaka 
m2vd_search_header(BitReadCtx_t * bx)567*437bfbebSnyanmisaka static RK_U32 m2vd_search_header(BitReadCtx_t *bx)
568*437bfbebSnyanmisaka {
569*437bfbebSnyanmisaka     mpp_align_get_bits(bx);
570*437bfbebSnyanmisaka     while (m2vd_show_bits(bx, 24) != 0x01) {
571*437bfbebSnyanmisaka         mpp_skip_bits(bx, 8);
572*437bfbebSnyanmisaka         if (m2vd_get_leftbits(bx) < 32) {
573*437bfbebSnyanmisaka             if (M2VD_DBG_SEC_HEADER & m2vd_debug) {
574*437bfbebSnyanmisaka                 mpp_log("[m2v]: seach_header: str.leftbit()[%d] < 32", m2vd_get_leftbits(bx));
575*437bfbebSnyanmisaka             }
576*437bfbebSnyanmisaka             return NO_MORE_STREAM;
577*437bfbebSnyanmisaka         }
578*437bfbebSnyanmisaka     }
579*437bfbebSnyanmisaka     return m2vd_show_bits(bx, 32);
580*437bfbebSnyanmisaka }
581*437bfbebSnyanmisaka 
m2vd_decode_seq_ext_header(M2VDParserContext * ctx)582*437bfbebSnyanmisaka static int m2vd_decode_seq_ext_header(M2VDParserContext *ctx)
583*437bfbebSnyanmisaka {
584*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
585*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
586*437bfbebSnyanmisaka     ctx->MPEG2_Flag = 1;
587*437bfbebSnyanmisaka     ctx->seq_ext_head.profile_and_level_indication = m2vd_read_bits(bx, 8);
588*437bfbebSnyanmisaka     ctx->seq_ext_head.progressive_sequence         = m2vd_read_bits(bx, 1);
589*437bfbebSnyanmisaka     ctx->seq_ext_head.chroma_format                = m2vd_read_bits(bx, 2);
590*437bfbebSnyanmisaka     if (ctx->seq_ext_head.chroma_format != 1)
591*437bfbebSnyanmisaka         return M2VD_DEC_UNSURPORT;
592*437bfbebSnyanmisaka     ctx->seq_ext_head.horizontal_size_extension    = m2vd_read_bits(bx, 2);
593*437bfbebSnyanmisaka     ctx->seq_ext_head.vertical_size_extension      = m2vd_read_bits(bx, 2);
594*437bfbebSnyanmisaka     ctx->seq_ext_head.bit_rate_extension           = m2vd_read_bits(bx, 12);
595*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
596*437bfbebSnyanmisaka     ctx->seq_ext_head.vbv_buffer_size_extension    = m2vd_read_bits(bx, 8);
597*437bfbebSnyanmisaka     ctx->seq_ext_head.low_delay                    = m2vd_read_bits(bx, 1);
598*437bfbebSnyanmisaka     ctx->seq_ext_head.frame_rate_extension_n       = m2vd_read_bits(bx, 2);
599*437bfbebSnyanmisaka     ctx->seq_ext_head.frame_rate_extension_d       = m2vd_read_bits(bx, 5);
600*437bfbebSnyanmisaka 
601*437bfbebSnyanmisaka     ctx->seq_head.bit_rate_value |= (ctx->seq_ext_head.bit_rate_extension << 18);
602*437bfbebSnyanmisaka     ctx->seq_head.vbv_buffer_size += (ctx->seq_ext_head.vbv_buffer_size_extension << 10);
603*437bfbebSnyanmisaka 
604*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
605*437bfbebSnyanmisaka     return  M2VD_DEC_OK;
606*437bfbebSnyanmisaka }
607*437bfbebSnyanmisaka 
m2vd_decode_seqdisp_ext_header(M2VDParserContext * ctx)608*437bfbebSnyanmisaka static int m2vd_decode_seqdisp_ext_header(M2VDParserContext *ctx)
609*437bfbebSnyanmisaka {
610*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
611*437bfbebSnyanmisaka     ctx->seq_disp_ext_head.video_format      = m2vd_read_bits(bx, 3);
612*437bfbebSnyanmisaka     ctx->seq_disp_ext_head.color_description = m2vd_read_bits(bx, 1);
613*437bfbebSnyanmisaka 
614*437bfbebSnyanmisaka     if (ctx->seq_disp_ext_head.color_description) {
615*437bfbebSnyanmisaka         ctx->seq_disp_ext_head.color_primaries          = m2vd_read_bits(bx, 8);
616*437bfbebSnyanmisaka         ctx->seq_disp_ext_head.transfer_characteristics = m2vd_read_bits(bx, 8);
617*437bfbebSnyanmisaka         ctx->seq_disp_ext_head.matrix_coefficients      = m2vd_read_bits(bx, 8);
618*437bfbebSnyanmisaka     }
619*437bfbebSnyanmisaka 
620*437bfbebSnyanmisaka     m2vd_read_bits(bx, 14);
621*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
622*437bfbebSnyanmisaka     m2vd_read_bits(bx, 14);
623*437bfbebSnyanmisaka     return  M2VD_DEC_OK;
624*437bfbebSnyanmisaka }
625*437bfbebSnyanmisaka 
m2vd_decode_matrix_ext_header(M2VDParserContext * ctx)626*437bfbebSnyanmisaka static int m2vd_decode_matrix_ext_header(M2VDParserContext *ctx)
627*437bfbebSnyanmisaka {
628*437bfbebSnyanmisaka     RK_U32  load_intra_quantizer_matrix;
629*437bfbebSnyanmisaka     RK_U32  load_non_intra_quantizer_matrix;
630*437bfbebSnyanmisaka     RK_U32  load_chroma_intra_quantizer_matrix;
631*437bfbebSnyanmisaka     RK_U32  load_chroma_non_intra_quantizer_matrix;
632*437bfbebSnyanmisaka     RK_U32  i;
633*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
634*437bfbebSnyanmisaka 
635*437bfbebSnyanmisaka     load_intra_quantizer_matrix = m2vd_read_bits(bx, 1);
636*437bfbebSnyanmisaka     if (load_intra_quantizer_matrix) {
637*437bfbebSnyanmisaka         for (i = 0; i < 64; i++)
638*437bfbebSnyanmisaka             ctx->seq_head.pIntra_table[scanOrder[0][i]] = (unsigned char)m2vd_read_bits(bx, 8);
639*437bfbebSnyanmisaka 
640*437bfbebSnyanmisaka     }
641*437bfbebSnyanmisaka     load_non_intra_quantizer_matrix = m2vd_read_bits(bx, 1);
642*437bfbebSnyanmisaka     if (load_non_intra_quantizer_matrix) {
643*437bfbebSnyanmisaka         for (i = 0; i < 64; i++)
644*437bfbebSnyanmisaka             ctx->seq_head.pInter_table[scanOrder[0][i]] = (unsigned char)m2vd_read_bits(bx, 8);
645*437bfbebSnyanmisaka     }
646*437bfbebSnyanmisaka     load_chroma_intra_quantizer_matrix = m2vd_read_bits(bx, 1);
647*437bfbebSnyanmisaka     if (load_chroma_intra_quantizer_matrix) {
648*437bfbebSnyanmisaka         return M2VD_DEC_UNSURPORT;
649*437bfbebSnyanmisaka     }
650*437bfbebSnyanmisaka     load_chroma_non_intra_quantizer_matrix = m2vd_read_bits(bx, 1);
651*437bfbebSnyanmisaka     if (load_chroma_non_intra_quantizer_matrix) {
652*437bfbebSnyanmisaka         return M2VD_DEC_UNSURPORT;
653*437bfbebSnyanmisaka     }
654*437bfbebSnyanmisaka     return  M2VD_DEC_OK;
655*437bfbebSnyanmisaka }
656*437bfbebSnyanmisaka 
m2vd_decode_scalable_ext_header(M2VDParserContext * ctx)657*437bfbebSnyanmisaka static int m2vd_decode_scalable_ext_header(M2VDParserContext *ctx)
658*437bfbebSnyanmisaka {
659*437bfbebSnyanmisaka     /* ISO/IEC 13818-2 section 6.2.2.5: sequence_scalable_extension() header */
660*437bfbebSnyanmisaka     int layer_id;
661*437bfbebSnyanmisaka     int lower_layer_prediction_horizontal_size;
662*437bfbebSnyanmisaka     int lower_layer_prediction_vertical_size;
663*437bfbebSnyanmisaka     int horizontal_subsampling_factor_m;
664*437bfbebSnyanmisaka     int horizontal_subsampling_factor_n;
665*437bfbebSnyanmisaka     int vertical_subsampling_factor_m;
666*437bfbebSnyanmisaka     int vertical_subsampling_factor_n;
667*437bfbebSnyanmisaka     int scalable_mode;
668*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
669*437bfbebSnyanmisaka 
670*437bfbebSnyanmisaka     /* scalable_mode */
671*437bfbebSnyanmisaka #define SC_NONE 0
672*437bfbebSnyanmisaka #define SC_DP   1
673*437bfbebSnyanmisaka #define SC_SPAT 2
674*437bfbebSnyanmisaka #define SC_SNR  3
675*437bfbebSnyanmisaka #define SC_TEMP 4
676*437bfbebSnyanmisaka 
677*437bfbebSnyanmisaka     scalable_mode = m2vd_read_bits(bx, 2) + 1; /* add 1 to make SC_DP != SC_NONE */
678*437bfbebSnyanmisaka 
679*437bfbebSnyanmisaka     layer_id = m2vd_read_bits(bx, 4);
680*437bfbebSnyanmisaka 
681*437bfbebSnyanmisaka     if (scalable_mode == SC_SPAT) {
682*437bfbebSnyanmisaka         lower_layer_prediction_horizontal_size = m2vd_read_bits(bx, 14);
683*437bfbebSnyanmisaka         mpp_skip_bits(bx, 1);
684*437bfbebSnyanmisaka         lower_layer_prediction_vertical_size   = m2vd_read_bits(bx, 14);
685*437bfbebSnyanmisaka         horizontal_subsampling_factor_m        = m2vd_read_bits(bx, 5);
686*437bfbebSnyanmisaka         horizontal_subsampling_factor_n        = m2vd_read_bits(bx, 5);
687*437bfbebSnyanmisaka         vertical_subsampling_factor_m          = m2vd_read_bits(bx, 5);
688*437bfbebSnyanmisaka         vertical_subsampling_factor_n          = m2vd_read_bits(bx, 5);
689*437bfbebSnyanmisaka     }
690*437bfbebSnyanmisaka 
691*437bfbebSnyanmisaka     (void)layer_id;
692*437bfbebSnyanmisaka     (void)lower_layer_prediction_horizontal_size;
693*437bfbebSnyanmisaka     (void)lower_layer_prediction_vertical_size;
694*437bfbebSnyanmisaka     (void)horizontal_subsampling_factor_m;
695*437bfbebSnyanmisaka     (void)horizontal_subsampling_factor_n;
696*437bfbebSnyanmisaka     (void)vertical_subsampling_factor_m;
697*437bfbebSnyanmisaka     (void)vertical_subsampling_factor_n;
698*437bfbebSnyanmisaka 
699*437bfbebSnyanmisaka 
700*437bfbebSnyanmisaka     if (scalable_mode == SC_TEMP)
701*437bfbebSnyanmisaka         return M2VD_DEC_UNSURPORT;
702*437bfbebSnyanmisaka     else
703*437bfbebSnyanmisaka         return  M2VD_DEC_OK;
704*437bfbebSnyanmisaka }
705*437bfbebSnyanmisaka 
m2vd_decode_picdisp_ext_header(M2VDParserContext * ctx)706*437bfbebSnyanmisaka static int m2vd_decode_picdisp_ext_header(M2VDParserContext *ctx)
707*437bfbebSnyanmisaka {
708*437bfbebSnyanmisaka     int i;
709*437bfbebSnyanmisaka     int number_of_frame_center_offsets;
710*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
711*437bfbebSnyanmisaka     /* based on ISO/IEC 13818-2 section 6.3.12
712*437bfbebSnyanmisaka     (November 1994) Picture display extensions */
713*437bfbebSnyanmisaka 
714*437bfbebSnyanmisaka     /* derive number_of_frame_center_offsets */
715*437bfbebSnyanmisaka     if (ctx->seq_ext_head.progressive_sequence) {
716*437bfbebSnyanmisaka         if (ctx->pic_code_ext_head.repeat_first_field) {
717*437bfbebSnyanmisaka             if (ctx->pic_code_ext_head.top_field_first)
718*437bfbebSnyanmisaka                 number_of_frame_center_offsets = 3;
719*437bfbebSnyanmisaka             else
720*437bfbebSnyanmisaka                 number_of_frame_center_offsets = 2;
721*437bfbebSnyanmisaka         } else {
722*437bfbebSnyanmisaka             number_of_frame_center_offsets = 1;
723*437bfbebSnyanmisaka         }
724*437bfbebSnyanmisaka     } else {
725*437bfbebSnyanmisaka         if (ctx->pic_code_ext_head.picture_structure != M2VD_PIC_STRUCT_FRAME) {
726*437bfbebSnyanmisaka             number_of_frame_center_offsets = 1;
727*437bfbebSnyanmisaka         } else {
728*437bfbebSnyanmisaka             if (ctx->pic_code_ext_head.repeat_first_field)
729*437bfbebSnyanmisaka                 number_of_frame_center_offsets = 3;
730*437bfbebSnyanmisaka             else
731*437bfbebSnyanmisaka                 number_of_frame_center_offsets = 2;
732*437bfbebSnyanmisaka         }
733*437bfbebSnyanmisaka     }
734*437bfbebSnyanmisaka 
735*437bfbebSnyanmisaka     /* now parse */
736*437bfbebSnyanmisaka     for (i = 0; i < number_of_frame_center_offsets; i++) {
737*437bfbebSnyanmisaka         ctx->pic_disp_ext_head.frame_center_horizontal_offset[i] = m2vd_read_bits(bx, 16);
738*437bfbebSnyanmisaka         mpp_skip_bits(bx, 1);
739*437bfbebSnyanmisaka 
740*437bfbebSnyanmisaka         ctx->pic_disp_ext_head.frame_center_vertical_offset[i]   = m2vd_read_bits(bx, 16);
741*437bfbebSnyanmisaka         mpp_skip_bits(bx, 1);
742*437bfbebSnyanmisaka     }
743*437bfbebSnyanmisaka     return  M2VD_DEC_OK;
744*437bfbebSnyanmisaka }
745*437bfbebSnyanmisaka 
m2vd_decode_spatial_ext_header(M2VDParserContext * ctx)746*437bfbebSnyanmisaka static int m2vd_decode_spatial_ext_header(M2VDParserContext *ctx)
747*437bfbebSnyanmisaka {
748*437bfbebSnyanmisaka     /* ISO/IEC 13818-2 section 6.2.3.5: picture_spatial_scalable_extension() header */
749*437bfbebSnyanmisaka     int lower_layer_temporal_reference;
750*437bfbebSnyanmisaka     int lower_layer_horizontal_offset;
751*437bfbebSnyanmisaka     int lower_layer_vertical_offset;
752*437bfbebSnyanmisaka     int spatial_temporal_weight_code_table_index;
753*437bfbebSnyanmisaka     int lower_layer_progressive_frame;
754*437bfbebSnyanmisaka     int lower_layer_deinterlaced_field_select;
755*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
756*437bfbebSnyanmisaka 
757*437bfbebSnyanmisaka     lower_layer_temporal_reference = m2vd_read_bits(bx, 10);
758*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
759*437bfbebSnyanmisaka     lower_layer_horizontal_offset = m2vd_read_bits(bx, 15);
760*437bfbebSnyanmisaka     if (lower_layer_horizontal_offset >= 16384)
761*437bfbebSnyanmisaka         lower_layer_horizontal_offset -= 32768;
762*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
763*437bfbebSnyanmisaka     lower_layer_vertical_offset = m2vd_read_bits(bx, 15);
764*437bfbebSnyanmisaka     if (lower_layer_vertical_offset >= 16384)
765*437bfbebSnyanmisaka         lower_layer_vertical_offset -= 32768;
766*437bfbebSnyanmisaka     spatial_temporal_weight_code_table_index = m2vd_read_bits(bx, 2);
767*437bfbebSnyanmisaka     lower_layer_progressive_frame = m2vd_read_bits(bx, 1);
768*437bfbebSnyanmisaka     lower_layer_deinterlaced_field_select = m2vd_read_bits(bx, 1);
769*437bfbebSnyanmisaka 
770*437bfbebSnyanmisaka     (void)lower_layer_temporal_reference;
771*437bfbebSnyanmisaka     (void)lower_layer_vertical_offset;
772*437bfbebSnyanmisaka     (void)spatial_temporal_weight_code_table_index;
773*437bfbebSnyanmisaka     (void)lower_layer_progressive_frame;
774*437bfbebSnyanmisaka     (void)lower_layer_deinterlaced_field_select;
775*437bfbebSnyanmisaka 
776*437bfbebSnyanmisaka     return  M2VD_DEC_OK;
777*437bfbebSnyanmisaka }
778*437bfbebSnyanmisaka 
m2vd_decode_pic_ext_header(M2VDParserContext * ctx)779*437bfbebSnyanmisaka static int m2vd_decode_pic_ext_header(M2VDParserContext *ctx)
780*437bfbebSnyanmisaka {
781*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
782*437bfbebSnyanmisaka     ctx->pic_code_ext_head.f_code[0][0] = m2vd_read_bits(bx, 4);
783*437bfbebSnyanmisaka     ctx->pic_code_ext_head.f_code[0][1] = m2vd_read_bits(bx, 4);
784*437bfbebSnyanmisaka     ctx->pic_code_ext_head.f_code[1][0] = m2vd_read_bits(bx, 4);
785*437bfbebSnyanmisaka     ctx->pic_code_ext_head.f_code[1][1] = m2vd_read_bits(bx, 4);
786*437bfbebSnyanmisaka     if (ctx->MPEG2_Flag) {
787*437bfbebSnyanmisaka         ctx->pic_head.full_pel_forward_vector = ctx->pic_code_ext_head.f_code[0][0];
788*437bfbebSnyanmisaka         ctx->pic_head.forward_f_code = ctx->pic_code_ext_head.f_code[0][1];
789*437bfbebSnyanmisaka         ctx->pic_head.full_pel_backward_vector = ctx->pic_code_ext_head.f_code[1][0];
790*437bfbebSnyanmisaka         ctx->pic_head.backward_f_code = ctx->pic_code_ext_head.f_code[1][1];
791*437bfbebSnyanmisaka     }
792*437bfbebSnyanmisaka 
793*437bfbebSnyanmisaka     ctx->pic_code_ext_head.intra_dc_precision         = m2vd_read_bits(bx, 2);
794*437bfbebSnyanmisaka     ctx->pic_code_ext_head.picture_structure          = m2vd_read_bits(bx, 2);
795*437bfbebSnyanmisaka     if (ctx->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_FRAME)
796*437bfbebSnyanmisaka         ctx->pic_code_ext_head.top_field_first            = m2vd_read_bits(bx, 1);
797*437bfbebSnyanmisaka     else {
798*437bfbebSnyanmisaka         m2vd_read_bits(bx, 1);
799*437bfbebSnyanmisaka         if ((ctx->pic_head.pre_picture_coding_type != ctx->pic_head.picture_coding_type) &&
800*437bfbebSnyanmisaka             (ctx->pic_head.pre_picture_coding_type != M2VD_CODING_TYPE_I)) {
801*437bfbebSnyanmisaka             if (ctx->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_TOP_FIELD)
802*437bfbebSnyanmisaka                 ctx->top_first_cnt++;
803*437bfbebSnyanmisaka             else
804*437bfbebSnyanmisaka                 ctx->bottom_first_cnt++;
805*437bfbebSnyanmisaka         }
806*437bfbebSnyanmisaka         if (ctx->top_first_cnt >= ctx->bottom_first_cnt)
807*437bfbebSnyanmisaka             ctx->pic_code_ext_head.top_field_first = 1;
808*437bfbebSnyanmisaka         else
809*437bfbebSnyanmisaka             ctx->pic_code_ext_head.top_field_first = 0;
810*437bfbebSnyanmisaka     }
811*437bfbebSnyanmisaka     ctx->pic_code_ext_head.frame_pred_frame_dct       = m2vd_read_bits(bx, 1);
812*437bfbebSnyanmisaka     ctx->pic_code_ext_head.concealment_motion_vectors = m2vd_read_bits(bx, 1);
813*437bfbebSnyanmisaka     ctx->pic_code_ext_head.q_scale_type           = m2vd_read_bits(bx, 1);
814*437bfbebSnyanmisaka     ctx->pic_code_ext_head.intra_vlc_format           = m2vd_read_bits(bx, 1);
815*437bfbebSnyanmisaka     ctx->pic_code_ext_head.alternate_scan         = m2vd_read_bits(bx, 1);
816*437bfbebSnyanmisaka     ctx->pic_code_ext_head.repeat_first_field         = m2vd_read_bits(bx, 1);
817*437bfbebSnyanmisaka     ctx->pic_code_ext_head.chroma_420_type            = m2vd_read_bits(bx, 1);
818*437bfbebSnyanmisaka     ctx->pic_code_ext_head.progressive_frame          = m2vd_read_bits(bx, 1);
819*437bfbebSnyanmisaka     ctx->pic_code_ext_head.composite_display_flag     = m2vd_read_bits(bx, 1);
820*437bfbebSnyanmisaka     if (ctx->pic_code_ext_head.composite_display_flag) {
821*437bfbebSnyanmisaka         ctx->pic_code_ext_head.v_axis            = m2vd_read_bits(bx, 1);
822*437bfbebSnyanmisaka         ctx->pic_code_ext_head.field_sequence    = m2vd_read_bits(bx, 3);
823*437bfbebSnyanmisaka         ctx->pic_code_ext_head.sub_carrier       = m2vd_read_bits(bx, 1);
824*437bfbebSnyanmisaka         ctx->pic_code_ext_head.burst_amplitude   = m2vd_read_bits(bx, 7);
825*437bfbebSnyanmisaka         ctx->pic_code_ext_head.sub_carrier_phase = m2vd_read_bits(bx, 8);
826*437bfbebSnyanmisaka     }
827*437bfbebSnyanmisaka     return  M2VD_DEC_OK;
828*437bfbebSnyanmisaka }
829*437bfbebSnyanmisaka 
m2vd_decode_temp_ext_header(void)830*437bfbebSnyanmisaka static inline int m2vd_decode_temp_ext_header(void)
831*437bfbebSnyanmisaka {
832*437bfbebSnyanmisaka     return  M2VD_DEC_UNSURPORT;
833*437bfbebSnyanmisaka }
834*437bfbebSnyanmisaka 
m2vd_decode_copyright_ext_header(M2VDParserContext * ctx)835*437bfbebSnyanmisaka static int m2vd_decode_copyright_ext_header(M2VDParserContext *ctx)
836*437bfbebSnyanmisaka {
837*437bfbebSnyanmisaka     int copyright_flag;
838*437bfbebSnyanmisaka     int copyright_identifier;
839*437bfbebSnyanmisaka     int original_or_copy;
840*437bfbebSnyanmisaka     int copyright_number_1;
841*437bfbebSnyanmisaka     int copyright_number_2;
842*437bfbebSnyanmisaka     int copyright_number_3;
843*437bfbebSnyanmisaka     int reserved_data;
844*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
845*437bfbebSnyanmisaka 
846*437bfbebSnyanmisaka     copyright_flag =       m2vd_read_bits(bx, 1);
847*437bfbebSnyanmisaka     copyright_identifier = m2vd_read_bits(bx, 8);
848*437bfbebSnyanmisaka     original_or_copy =     m2vd_read_bits(bx, 1);
849*437bfbebSnyanmisaka 
850*437bfbebSnyanmisaka     /* reserved */
851*437bfbebSnyanmisaka     reserved_data = m2vd_read_bits(bx, 7);
852*437bfbebSnyanmisaka 
853*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
854*437bfbebSnyanmisaka     copyright_number_1 =   m2vd_read_bits(bx, 20);
855*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
856*437bfbebSnyanmisaka     copyright_number_2 =   m2vd_read_bits(bx, 22);
857*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
858*437bfbebSnyanmisaka     copyright_number_3 =   m2vd_read_bits(bx, 22);
859*437bfbebSnyanmisaka 
860*437bfbebSnyanmisaka     (void)copyright_flag;
861*437bfbebSnyanmisaka     (void)copyright_identifier;
862*437bfbebSnyanmisaka     (void)original_or_copy;
863*437bfbebSnyanmisaka     (void)copyright_number_1;
864*437bfbebSnyanmisaka     (void)copyright_number_2;
865*437bfbebSnyanmisaka     (void)copyright_number_3;
866*437bfbebSnyanmisaka     (void)reserved_data;
867*437bfbebSnyanmisaka 
868*437bfbebSnyanmisaka     return  M2VD_DEC_OK;
869*437bfbebSnyanmisaka }
870*437bfbebSnyanmisaka 
m2vd_decode_ext_header(M2VDParserContext * ctx)871*437bfbebSnyanmisaka static int m2vd_decode_ext_header(M2VDParserContext *ctx)
872*437bfbebSnyanmisaka {
873*437bfbebSnyanmisaka     RK_U32      code;
874*437bfbebSnyanmisaka     RK_U32      ext_ID;
875*437bfbebSnyanmisaka     int         result;
876*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
877*437bfbebSnyanmisaka 
878*437bfbebSnyanmisaka     code = m2vd_search_header(bx);
879*437bfbebSnyanmisaka 
880*437bfbebSnyanmisaka     if (M2VD_DBG_SEC_HEADER & m2vd_debug) {
881*437bfbebSnyanmisaka         mpp_log("[m2v]: decoder_ext_header : seach_header return code: %#03x", code);
882*437bfbebSnyanmisaka     }
883*437bfbebSnyanmisaka     while (code == EXTENSION_START_CODE || code == USER_DATA_START_CODE) {
884*437bfbebSnyanmisaka         if (code == EXTENSION_START_CODE) {
885*437bfbebSnyanmisaka             mpp_skip_bits(bx, 32);
886*437bfbebSnyanmisaka             ext_ID = m2vd_read_bits(bx, 4);
887*437bfbebSnyanmisaka             if (M2VD_DBG_SEC_HEADER & m2vd_debug) {
888*437bfbebSnyanmisaka                 mpp_log("[m2v]: decoder_ext_header : ext_ID: %d", ext_ID);
889*437bfbebSnyanmisaka             }
890*437bfbebSnyanmisaka             switch (ext_ID) {
891*437bfbebSnyanmisaka             case SEQUENCE_EXTENSION_ID:
892*437bfbebSnyanmisaka                 result = m2vd_decode_seq_ext_header(ctx);
893*437bfbebSnyanmisaka                 break;
894*437bfbebSnyanmisaka             case SEQUENCE_DISPLAY_EXTENSION_ID:
895*437bfbebSnyanmisaka                 result = m2vd_decode_seqdisp_ext_header(ctx);
896*437bfbebSnyanmisaka                 break;
897*437bfbebSnyanmisaka             case QUANT_MATRIX_EXTENSION_ID:
898*437bfbebSnyanmisaka                 result = m2vd_decode_matrix_ext_header(ctx);
899*437bfbebSnyanmisaka                 break;
900*437bfbebSnyanmisaka             case SEQUENCE_SCALABLE_EXTENSION_ID:
901*437bfbebSnyanmisaka                 result = m2vd_decode_scalable_ext_header(ctx);
902*437bfbebSnyanmisaka                 break;
903*437bfbebSnyanmisaka             case PICTURE_DISPLAY_EXTENSION_ID:
904*437bfbebSnyanmisaka                 result = m2vd_decode_picdisp_ext_header(ctx);
905*437bfbebSnyanmisaka                 break;
906*437bfbebSnyanmisaka             case PICTURE_CODING_EXTENSION_ID:
907*437bfbebSnyanmisaka                 result = m2vd_decode_pic_ext_header(ctx);
908*437bfbebSnyanmisaka                 break;
909*437bfbebSnyanmisaka             case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
910*437bfbebSnyanmisaka                 result = m2vd_decode_spatial_ext_header(ctx);
911*437bfbebSnyanmisaka                 break;
912*437bfbebSnyanmisaka             case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
913*437bfbebSnyanmisaka                 result = m2vd_decode_temp_ext_header();
914*437bfbebSnyanmisaka                 break;
915*437bfbebSnyanmisaka             case COPYRIGHT_EXTENSION_ID:
916*437bfbebSnyanmisaka                 result = m2vd_decode_copyright_ext_header(ctx);
917*437bfbebSnyanmisaka                 break;
918*437bfbebSnyanmisaka             case NO_MORE_STREAM:
919*437bfbebSnyanmisaka                 break;
920*437bfbebSnyanmisaka             default:
921*437bfbebSnyanmisaka                 break;
922*437bfbebSnyanmisaka             }
923*437bfbebSnyanmisaka 
924*437bfbebSnyanmisaka             if (M2VD_DBG_SEC_HEADER & m2vd_debug) {
925*437bfbebSnyanmisaka                 mpp_log("[m2v]: decoder_ext_header result: %d", result);
926*437bfbebSnyanmisaka             }
927*437bfbebSnyanmisaka             if (result)
928*437bfbebSnyanmisaka                 return result;
929*437bfbebSnyanmisaka         } else {
930*437bfbebSnyanmisaka             mpp_skip_bits(bx, 32);
931*437bfbebSnyanmisaka         }
932*437bfbebSnyanmisaka         code = m2vd_search_header(bx);
933*437bfbebSnyanmisaka     }
934*437bfbebSnyanmisaka 
935*437bfbebSnyanmisaka     return MPP_OK;
936*437bfbebSnyanmisaka }
937*437bfbebSnyanmisaka 
m2vd_decode_gop_header(M2VDParserContext * ctx)938*437bfbebSnyanmisaka static int m2vd_decode_gop_header(M2VDParserContext *ctx)
939*437bfbebSnyanmisaka {
940*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
941*437bfbebSnyanmisaka 
942*437bfbebSnyanmisaka     ctx->gop_head.drop_flag   = m2vd_read_bits(bx, 1);
943*437bfbebSnyanmisaka     ctx->gop_head.hour        = m2vd_read_bits(bx, 5);
944*437bfbebSnyanmisaka     ctx->gop_head.minute      = m2vd_read_bits(bx, 6);
945*437bfbebSnyanmisaka 
946*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
947*437bfbebSnyanmisaka 
948*437bfbebSnyanmisaka     ctx->gop_head.sec         = m2vd_read_bits(bx, 6);
949*437bfbebSnyanmisaka     ctx->gop_head.frame       = m2vd_read_bits(bx, 6);
950*437bfbebSnyanmisaka     ctx->gop_head.closed_gop  = m2vd_read_bits(bx, 1);
951*437bfbebSnyanmisaka     ctx->gop_head.broken_link = m2vd_read_bits(bx, 1);
952*437bfbebSnyanmisaka 
953*437bfbebSnyanmisaka     return m2vd_decode_ext_header(ctx);
954*437bfbebSnyanmisaka }
955*437bfbebSnyanmisaka 
m2vd_decode_seq_header(M2VDParserContext * ctx)956*437bfbebSnyanmisaka static int m2vd_decode_seq_header(M2VDParserContext *ctx)
957*437bfbebSnyanmisaka {
958*437bfbebSnyanmisaka     RK_U32 i;
959*437bfbebSnyanmisaka     RK_S32 pre_frame_rate_code = ctx->seq_head.frame_rate_code;
960*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
961*437bfbebSnyanmisaka     RK_U32 width = m2vd_read_bits(bx, 12);
962*437bfbebSnyanmisaka     RK_U32 height = m2vd_read_bits(bx, 12);
963*437bfbebSnyanmisaka 
964*437bfbebSnyanmisaka     ctx->display_width = width;
965*437bfbebSnyanmisaka     ctx->display_height = height;
966*437bfbebSnyanmisaka 
967*437bfbebSnyanmisaka     height = MPP_ALIGN(height, 16);
968*437bfbebSnyanmisaka     width = MPP_ALIGN(width, 16);
969*437bfbebSnyanmisaka 
970*437bfbebSnyanmisaka     if (ctx->seq_head.decode_width && ctx->seq_head.decode_height) {
971*437bfbebSnyanmisaka         if (width != ctx->seq_head.decode_width ||
972*437bfbebSnyanmisaka             height != ctx->seq_head.decode_height)
973*437bfbebSnyanmisaka             ctx->info_changed = 1;
974*437bfbebSnyanmisaka     }
975*437bfbebSnyanmisaka 
976*437bfbebSnyanmisaka     ctx->seq_head.decode_width = width;
977*437bfbebSnyanmisaka     ctx->seq_head.decode_height = height;
978*437bfbebSnyanmisaka     ctx->seq_head.aspect_ratio_information = m2vd_read_bits(bx, 4);
979*437bfbebSnyanmisaka     ctx->seq_head.frame_rate_code = m2vd_read_bits(bx, 4);
980*437bfbebSnyanmisaka     if (!ctx->frame_period || pre_frame_rate_code != ctx->seq_head.frame_rate_code)
981*437bfbebSnyanmisaka         ctx->frame_period = frame_period_Table_27M[ctx->seq_head.frame_rate_code];
982*437bfbebSnyanmisaka     ctx->seq_head.bit_rate_value = m2vd_read_bits(bx, 18);
983*437bfbebSnyanmisaka     mpp_skip_bits(bx, 1);
984*437bfbebSnyanmisaka     ctx->seq_head.vbv_buffer_size = m2vd_read_bits(bx, 10);
985*437bfbebSnyanmisaka     ctx->seq_head.constrained_parameters_flag = m2vd_read_bits(bx, 1);
986*437bfbebSnyanmisaka     ctx->seq_head.load_intra_quantizer_matrix = m2vd_read_bits(bx, 1);
987*437bfbebSnyanmisaka     if (ctx->seq_head.load_intra_quantizer_matrix) {
988*437bfbebSnyanmisaka         for (i = 0; i < 64; i++)
989*437bfbebSnyanmisaka             ctx->seq_head.pIntra_table[scanOrder[0][i]] = (unsigned char)m2vd_read_bits(bx, 8);
990*437bfbebSnyanmisaka     } else {
991*437bfbebSnyanmisaka         for (i = 0; i < 64; i++)
992*437bfbebSnyanmisaka             ctx->seq_head.pIntra_table[i] = intraDefaultQMatrix[i];
993*437bfbebSnyanmisaka     }
994*437bfbebSnyanmisaka 
995*437bfbebSnyanmisaka     ctx->seq_head.load_non_intra_quantizer_matrix = m2vd_read_bits(bx, 1);
996*437bfbebSnyanmisaka     if (ctx->seq_head.load_non_intra_quantizer_matrix) {
997*437bfbebSnyanmisaka         for (i = 0; i < 64; i++)
998*437bfbebSnyanmisaka             ctx->seq_head.pInter_table[scanOrder[0][i]] = (unsigned char)m2vd_read_bits(bx, 8);
999*437bfbebSnyanmisaka     } else {
1000*437bfbebSnyanmisaka         for (i = 0; i < 64; i++)
1001*437bfbebSnyanmisaka             ctx->seq_head.pInter_table[i] = 16;
1002*437bfbebSnyanmisaka     }
1003*437bfbebSnyanmisaka 
1004*437bfbebSnyanmisaka     return m2vd_decode_ext_header(ctx);
1005*437bfbebSnyanmisaka }
1006*437bfbebSnyanmisaka 
m2vd_extra_bit_information(M2VDParserContext * ctx)1007*437bfbebSnyanmisaka static int m2vd_extra_bit_information(M2VDParserContext *ctx)
1008*437bfbebSnyanmisaka {
1009*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
1010*437bfbebSnyanmisaka     while (m2vd_read_bits(bx, 1)) {
1011*437bfbebSnyanmisaka         mpp_skip_bits(bx, 8);
1012*437bfbebSnyanmisaka     }
1013*437bfbebSnyanmisaka     return M2VD_DEC_OK;
1014*437bfbebSnyanmisaka }
1015*437bfbebSnyanmisaka 
m2vd_decode_pic_header(M2VDParserContext * ctx)1016*437bfbebSnyanmisaka static int m2vd_decode_pic_header(M2VDParserContext *ctx)
1017*437bfbebSnyanmisaka {
1018*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
1019*437bfbebSnyanmisaka     ctx->pic_head.temporal_reference  = m2vd_read_bits(bx, 10);
1020*437bfbebSnyanmisaka     ctx->pic_head.picture_coding_type = m2vd_read_bits(bx, 3);
1021*437bfbebSnyanmisaka     ctx->pic_head.vbv_delay           = m2vd_read_bits(bx, 16);
1022*437bfbebSnyanmisaka     if (ctx->pic_head.temporal_reference > 50) {
1023*437bfbebSnyanmisaka         ctx->pic_head.temporal_reference = ctx->pretemporal_reference;
1024*437bfbebSnyanmisaka     }
1025*437bfbebSnyanmisaka     //if ((maxFrame_inGOP < temporal_reference)&&(temporal_reference<60))
1026*437bfbebSnyanmisaka     //  maxFrame_inGOP = temporal_reference;
1027*437bfbebSnyanmisaka     if (((RK_S32)ctx->maxFrame_inGOP < ctx->pic_head.temporal_reference) && (ctx->pic_head.temporal_reference < 60))
1028*437bfbebSnyanmisaka         ctx->maxFrame_inGOP = ctx->pic_head.temporal_reference;
1029*437bfbebSnyanmisaka 
1030*437bfbebSnyanmisaka 
1031*437bfbebSnyanmisaka     if (ctx->pic_head.picture_coding_type == M2VD_CODING_TYPE_P ||
1032*437bfbebSnyanmisaka         ctx->pic_head.picture_coding_type == M2VD_CODING_TYPE_B) {
1033*437bfbebSnyanmisaka         ctx->pic_head.full_pel_forward_vector = m2vd_read_bits(bx, 1);
1034*437bfbebSnyanmisaka         ctx->pic_head.forward_f_code = m2vd_read_bits(bx, 3);
1035*437bfbebSnyanmisaka     }
1036*437bfbebSnyanmisaka     if (ctx->pic_head.picture_coding_type == M2VD_CODING_TYPE_B) {
1037*437bfbebSnyanmisaka         ctx->pic_head.full_pel_backward_vector = m2vd_read_bits(bx, 1);
1038*437bfbebSnyanmisaka         ctx->pic_head.backward_f_code = m2vd_read_bits(bx, 3);
1039*437bfbebSnyanmisaka     }
1040*437bfbebSnyanmisaka 
1041*437bfbebSnyanmisaka     m2vd_extra_bit_information(ctx);
1042*437bfbebSnyanmisaka 
1043*437bfbebSnyanmisaka     return m2vd_decode_ext_header(ctx);
1044*437bfbebSnyanmisaka }
1045*437bfbebSnyanmisaka 
m2vd_decode_head(M2VDParserContext * ctx)1046*437bfbebSnyanmisaka static MPP_RET m2vd_decode_head(M2VDParserContext *ctx)
1047*437bfbebSnyanmisaka {
1048*437bfbebSnyanmisaka     RK_U32      code;
1049*437bfbebSnyanmisaka     int         ret = 0;
1050*437bfbebSnyanmisaka     BitReadCtx_t *bx = ctx->bitread_ctx;
1051*437bfbebSnyanmisaka 
1052*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
1053*437bfbebSnyanmisaka     while (1) {
1054*437bfbebSnyanmisaka         code = m2vd_search_header(bx);
1055*437bfbebSnyanmisaka         if (M2VD_DBG_SEC_HEADER & m2vd_debug) {
1056*437bfbebSnyanmisaka             mpp_log("[m2v]: decoder_header : seach_header return code: 0x%3x", code);
1057*437bfbebSnyanmisaka         }
1058*437bfbebSnyanmisaka         if (code == NO_MORE_STREAM)
1059*437bfbebSnyanmisaka             return M2VD_DEC_FILE_END;
1060*437bfbebSnyanmisaka         code = m2vd_read_bits(bx, 32);
1061*437bfbebSnyanmisaka 
1062*437bfbebSnyanmisaka         switch (code) {
1063*437bfbebSnyanmisaka         case SEQUENCE_HEADER_CODE:
1064*437bfbebSnyanmisaka             ret = m2vd_decode_seq_header(ctx);
1065*437bfbebSnyanmisaka             if (!ret) {
1066*437bfbebSnyanmisaka                 MppPacket pkt = ctx->input_packet;
1067*437bfbebSnyanmisaka                 if (mpp_packet_get_flag(pkt) & MPP_PACKET_FLAG_EXTRA_DATA) {
1068*437bfbebSnyanmisaka                     ctx->mExtraHeaderDecFlag = 1;
1069*437bfbebSnyanmisaka                 } else {
1070*437bfbebSnyanmisaka                     ctx->mHeaderDecFlag = 1;
1071*437bfbebSnyanmisaka                 }
1072*437bfbebSnyanmisaka             }
1073*437bfbebSnyanmisaka             break;
1074*437bfbebSnyanmisaka         case GROUP_START_CODE:
1075*437bfbebSnyanmisaka             ret = m2vd_decode_gop_header(ctx);
1076*437bfbebSnyanmisaka             break;
1077*437bfbebSnyanmisaka         case PICTURE_START_CODE:
1078*437bfbebSnyanmisaka             ret = m2vd_decode_pic_header(ctx);
1079*437bfbebSnyanmisaka             ret = M2VD_DEC_PICHEAD_OK;
1080*437bfbebSnyanmisaka             break;
1081*437bfbebSnyanmisaka         case SEQUENCE_END_CODE:
1082*437bfbebSnyanmisaka             ret = M2VD_DEC_STREAM_END;
1083*437bfbebSnyanmisaka             break;
1084*437bfbebSnyanmisaka         default:
1085*437bfbebSnyanmisaka             if (M2VD_DBG_SEC_HEADER & m2vd_debug) {
1086*437bfbebSnyanmisaka                 mpp_log("code=%x,leftbit=%d", code, m2vd_get_leftbits(bx));
1087*437bfbebSnyanmisaka             }
1088*437bfbebSnyanmisaka             break;
1089*437bfbebSnyanmisaka         }
1090*437bfbebSnyanmisaka         if (ret)
1091*437bfbebSnyanmisaka             break;
1092*437bfbebSnyanmisaka     }
1093*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
1094*437bfbebSnyanmisaka 
1095*437bfbebSnyanmisaka     return ret;
1096*437bfbebSnyanmisaka }
1097*437bfbebSnyanmisaka 
m2v_update_ref_frame(M2VDParserContext * p,RK_S32 force)1098*437bfbebSnyanmisaka static MPP_RET m2v_update_ref_frame(M2VDParserContext *p, RK_S32 force)
1099*437bfbebSnyanmisaka {
1100*437bfbebSnyanmisaka     //push frame
1101*437bfbebSnyanmisaka     if (force || (p->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_FRAME) ||
1102*437bfbebSnyanmisaka         ((p->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_BOTTOM_FIELD) && p->pic_code_ext_head.top_field_first ) ||
1103*437bfbebSnyanmisaka         ((p->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_TOP_FIELD) && (!p->pic_code_ext_head.top_field_first))) {
1104*437bfbebSnyanmisaka         if (p->frame_cur->picCodingType == M2VD_CODING_TYPE_B) {
1105*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(p->frame_slots, p->frame_cur->slot_index, SLOT_QUEUE_USE);
1106*437bfbebSnyanmisaka             mpp_buf_slot_enqueue(p->frame_slots, p->frame_cur->slot_index, QUEUE_DISPLAY);
1107*437bfbebSnyanmisaka             mpp_buf_slot_clr_flag(p->frame_slots, p->frame_cur->slot_index, SLOT_CODEC_USE);
1108*437bfbebSnyanmisaka             p->frame_cur->slot_index = -1;
1109*437bfbebSnyanmisaka         } else if (p->frame_cur->picCodingType != 0xffffffff) {
1110*437bfbebSnyanmisaka             M2VDFrameHead *tmpHD = NULL;
1111*437bfbebSnyanmisaka             p->ref_frame_cnt++;
1112*437bfbebSnyanmisaka             if (p->frame_ref0->slot_index >= 0) {
1113*437bfbebSnyanmisaka                 if (p->frame_ref0->flags) {
1114*437bfbebSnyanmisaka                     mpp_buf_slot_set_flag(p->frame_slots, p->frame_ref0->slot_index, SLOT_QUEUE_USE);
1115*437bfbebSnyanmisaka                     mpp_buf_slot_enqueue(p->frame_slots, p->frame_ref0->slot_index, QUEUE_DISPLAY);
1116*437bfbebSnyanmisaka                     p->frame_ref0->flags = 0;
1117*437bfbebSnyanmisaka                 }
1118*437bfbebSnyanmisaka 
1119*437bfbebSnyanmisaka                 if (p->info_changed) {
1120*437bfbebSnyanmisaka                     mpp_buf_slot_clr_flag(p->frame_slots, p->frame_ref0->slot_index, SLOT_CODEC_USE);
1121*437bfbebSnyanmisaka                     p->frame_ref0->slot_index = -1;
1122*437bfbebSnyanmisaka                     p->info_changed = 0;
1123*437bfbebSnyanmisaka                 }
1124*437bfbebSnyanmisaka             }
1125*437bfbebSnyanmisaka 
1126*437bfbebSnyanmisaka             if (p->frame_ref1->slot_index >= 0) {
1127*437bfbebSnyanmisaka                 mpp_buf_slot_clr_flag(p->frame_slots, p->frame_ref1->slot_index, SLOT_CODEC_USE);
1128*437bfbebSnyanmisaka                 p->frame_ref1->slot_index = -1;
1129*437bfbebSnyanmisaka             }
1130*437bfbebSnyanmisaka             tmpHD = p->frame_ref1;
1131*437bfbebSnyanmisaka             p->frame_ref1 = p->frame_ref0;
1132*437bfbebSnyanmisaka             p->frame_ref0 = p->frame_cur;
1133*437bfbebSnyanmisaka             p->frame_cur = tmpHD;
1134*437bfbebSnyanmisaka         }
1135*437bfbebSnyanmisaka     }
1136*437bfbebSnyanmisaka 
1137*437bfbebSnyanmisaka     return MPP_OK;
1138*437bfbebSnyanmisaka }
1139*437bfbebSnyanmisaka 
m2vd_alloc_frame(M2VDParserContext * ctx)1140*437bfbebSnyanmisaka static MPP_RET m2vd_alloc_frame(M2VDParserContext *ctx)
1141*437bfbebSnyanmisaka {
1142*437bfbebSnyanmisaka     M2VDHeadPic *pic_head = &ctx->pic_head;
1143*437bfbebSnyanmisaka     M2VDHeadPicCodeExt *pic_code_ext_head = &ctx->pic_code_ext_head;
1144*437bfbebSnyanmisaka     RK_U64 pts_27M = ctx->pts;
1145*437bfbebSnyanmisaka 
1146*437bfbebSnyanmisaka     if (ctx->resetFlag && pic_head->picture_coding_type != M2VD_CODING_TYPE_I) {
1147*437bfbebSnyanmisaka         mpp_log("[m2v]: resetFlag[%d] && picture_coding_type[%d] != I_TYPE", ctx->resetFlag, pic_head->picture_coding_type);
1148*437bfbebSnyanmisaka         return MPP_NOK;
1149*437bfbebSnyanmisaka     }
1150*437bfbebSnyanmisaka 
1151*437bfbebSnyanmisaka     ctx->resetFlag = 0;
1152*437bfbebSnyanmisaka 
1153*437bfbebSnyanmisaka     if ((ctx->ref_frame_cnt < 2) && (pic_head->picture_coding_type == M2VD_CODING_TYPE_B)) {
1154*437bfbebSnyanmisaka         mpp_log("[m2v]: (ref_frame_cnt[%d] < 2) && (frame_cur->picCodingType[%d] == B_TYPE)",
1155*437bfbebSnyanmisaka                 ctx->ref_frame_cnt, pic_head->picture_coding_type);
1156*437bfbebSnyanmisaka         return MPP_NOK;
1157*437bfbebSnyanmisaka     }
1158*437bfbebSnyanmisaka 
1159*437bfbebSnyanmisaka     if ((pic_code_ext_head->picture_structure == M2VD_PIC_STRUCT_FRAME ) ||
1160*437bfbebSnyanmisaka         ((pic_code_ext_head->picture_structure == M2VD_PIC_STRUCT_TOP_FIELD) && pic_code_ext_head->top_field_first) ||
1161*437bfbebSnyanmisaka         ((pic_code_ext_head->picture_structure == M2VD_PIC_STRUCT_BOTTOM_FIELD) && (!pic_code_ext_head->top_field_first))) {
1162*437bfbebSnyanmisaka         RK_S64 frm_pts = 0;
1163*437bfbebSnyanmisaka         RK_U32 frametype = 0;
1164*437bfbebSnyanmisaka 
1165*437bfbebSnyanmisaka         if (ctx->pts_is_90K) {
1166*437bfbebSnyanmisaka             pts_27M = ctx->pts * 300;
1167*437bfbebSnyanmisaka         } else {
1168*437bfbebSnyanmisaka             pts_27M = ctx->pts * 27;
1169*437bfbebSnyanmisaka         }
1170*437bfbebSnyanmisaka 
1171*437bfbebSnyanmisaka         if (ctx->frame_cur->slot_index >= 0) {
1172*437bfbebSnyanmisaka             MppFrame frame = NULL;
1173*437bfbebSnyanmisaka 
1174*437bfbebSnyanmisaka             mpp_buf_slot_get_prop(ctx->frame_slots, ctx->frame_cur->slot_index, SLOT_FRAME_PTR, &frame);
1175*437bfbebSnyanmisaka             if (ctx->cfg->base.disable_error)
1176*437bfbebSnyanmisaka                 mpp_frame_set_discard(frame, 1);
1177*437bfbebSnyanmisaka             else
1178*437bfbebSnyanmisaka                 mpp_frame_set_errinfo(frame, 1);
1179*437bfbebSnyanmisaka 
1180*437bfbebSnyanmisaka             mpp_log("[m2v]: miss match field order at ref_frame_cnt[%d] picture_structure %d top_field_first %d\n",
1181*437bfbebSnyanmisaka                     ctx->ref_frame_cnt, pic_head->picture_coding_type, pic_code_ext_head->top_field_first);
1182*437bfbebSnyanmisaka 
1183*437bfbebSnyanmisaka             m2v_update_ref_frame(ctx, 1);
1184*437bfbebSnyanmisaka         }
1185*437bfbebSnyanmisaka 
1186*437bfbebSnyanmisaka         if (ctx->pre_pts_27M != pts_27M) {
1187*437bfbebSnyanmisaka             RK_S64 tmp_frame_period;
1188*437bfbebSnyanmisaka 
1189*437bfbebSnyanmisaka             if (ctx->group_frm_cnt) {
1190*437bfbebSnyanmisaka                 ctx->group_frm_cnt = ctx->group_frm_cnt + pic_head->temporal_reference;
1191*437bfbebSnyanmisaka             } else if (pic_head->temporal_reference == (RK_S32)ctx->prechange_temporal_ref)
1192*437bfbebSnyanmisaka                 ctx->group_frm_cnt = ctx->max_temporal_reference + 1;
1193*437bfbebSnyanmisaka             else if (pic_head->temporal_reference)
1194*437bfbebSnyanmisaka                 ctx->group_frm_cnt = pic_head->temporal_reference - ctx->prechange_temporal_ref;
1195*437bfbebSnyanmisaka             else
1196*437bfbebSnyanmisaka                 ctx->group_frm_cnt = ctx->max_temporal_reference - ctx->prechange_temporal_ref + 1;
1197*437bfbebSnyanmisaka 
1198*437bfbebSnyanmisaka             tmp_frame_period = pts_27M - ctx->pre_pts_27M;
1199*437bfbebSnyanmisaka 
1200*437bfbebSnyanmisaka             if ((pts_27M > ctx->pre_pts_27M)
1201*437bfbebSnyanmisaka                 && (pic_head->temporal_reference > (RK_S32)ctx->prechange_temporal_ref)) {
1202*437bfbebSnyanmisaka                 RK_S32 theshold_frame_period = tmp_frame_period * 2;
1203*437bfbebSnyanmisaka                 RK_S32 last_frame_period = ctx->preframe_period ? ctx->preframe_period : ctx->frame_period;
1204*437bfbebSnyanmisaka                 RK_S32 predict_frame_period =
1205*437bfbebSnyanmisaka                     (pic_head->temporal_reference - ctx->prechange_temporal_ref) * last_frame_period;
1206*437bfbebSnyanmisaka                 if (theshold_frame_period < predict_frame_period) {
1207*437bfbebSnyanmisaka                     // check pts is 90KHZ raw pts
1208*437bfbebSnyanmisaka                     RK_S64 diff_90K_frame_period = tmp_frame_period * 1000 / 90 - predict_frame_period;
1209*437bfbebSnyanmisaka 
1210*437bfbebSnyanmisaka                     if (!ctx->pts_is_90K && llabs(diff_90K_frame_period) <= 300) {
1211*437bfbebSnyanmisaka                         mpp_log("judge result pts is base in 90KHZ.\n");
1212*437bfbebSnyanmisaka                         ctx->pts_is_90K = 1;
1213*437bfbebSnyanmisaka                         // pre pts is 1MHZ, so need convert to 90KHZ
1214*437bfbebSnyanmisaka                         pts_27M = ctx->pre_pts_27M * 1000 / 90 + predict_frame_period;
1215*437bfbebSnyanmisaka                     } else {
1216*437bfbebSnyanmisaka                         pts_27M = ctx->pre_pts_27M + predict_frame_period;
1217*437bfbebSnyanmisaka                     }
1218*437bfbebSnyanmisaka                     tmp_frame_period = predict_frame_period;
1219*437bfbebSnyanmisaka                 }
1220*437bfbebSnyanmisaka             }
1221*437bfbebSnyanmisaka 
1222*437bfbebSnyanmisaka             if ((pts_27M > ctx->pre_pts_27M) && (ctx->group_frm_cnt > 0)) {
1223*437bfbebSnyanmisaka                 tmp_frame_period = tmp_frame_period / ctx->group_frm_cnt;
1224*437bfbebSnyanmisaka                 // judge frame rate changed
1225*437bfbebSnyanmisaka                 if ((tmp_frame_period > MIN_FRAME_PERIOD_27M)
1226*437bfbebSnyanmisaka                     && (tmp_frame_period < MAX_FRAME_PERIOD_27M) &&
1227*437bfbebSnyanmisaka                     (llabs(ctx->frame_period - tmp_frame_period) > MAX_FRAME_PERIOD_DIFF)) {
1228*437bfbebSnyanmisaka                     if (llabs(ctx->preframe_period - tmp_frame_period) > MAX_FRAME_PERIOD_DIFF) {
1229*437bfbebSnyanmisaka                         ctx->preframe_period = tmp_frame_period;
1230*437bfbebSnyanmisaka                     } else {
1231*437bfbebSnyanmisaka                         ctx->frame_period = tmp_frame_period;
1232*437bfbebSnyanmisaka                         ctx->preframe_period = 0;
1233*437bfbebSnyanmisaka                     }
1234*437bfbebSnyanmisaka                 } else {
1235*437bfbebSnyanmisaka                     ctx->preframe_period = 0;
1236*437bfbebSnyanmisaka                 }
1237*437bfbebSnyanmisaka             }
1238*437bfbebSnyanmisaka 
1239*437bfbebSnyanmisaka             ctx->group_start_time_27M = pts_27M - pic_head->temporal_reference * ctx->frame_period;
1240*437bfbebSnyanmisaka             if (ctx->group_start_time_27M <= -ctx->frame_period)
1241*437bfbebSnyanmisaka                 ctx->group_start_time_27M = 0;
1242*437bfbebSnyanmisaka             ctx->pre_pts_27M = pts_27M;
1243*437bfbebSnyanmisaka             ctx->prechange_temporal_ref = pic_head->temporal_reference;
1244*437bfbebSnyanmisaka             ctx->group_frm_cnt = 0;
1245*437bfbebSnyanmisaka         } else if ((RK_S32)ctx->pretemporal_reference > pic_head->temporal_reference + 5) {
1246*437bfbebSnyanmisaka             ctx->group_start_time_27M += (ctx->max_temporal_reference + 1) * ctx->frame_period;
1247*437bfbebSnyanmisaka             ctx->group_frm_cnt = ctx->max_temporal_reference - ctx->prechange_temporal_ref + 1;
1248*437bfbebSnyanmisaka             ctx->max_temporal_reference = 0;
1249*437bfbebSnyanmisaka         }
1250*437bfbebSnyanmisaka         if ((RK_S32)ctx->pretemporal_reference > pic_head->temporal_reference + 5)
1251*437bfbebSnyanmisaka             ctx->max_temporal_reference = 0;
1252*437bfbebSnyanmisaka         if (pic_head->temporal_reference > (RK_S32)ctx->max_temporal_reference)
1253*437bfbebSnyanmisaka             ctx->max_temporal_reference = pic_head->temporal_reference;
1254*437bfbebSnyanmisaka         ctx->pretemporal_reference = pic_head->temporal_reference;
1255*437bfbebSnyanmisaka         frm_pts = ctx->group_start_time_27M;
1256*437bfbebSnyanmisaka         frm_pts += pic_head->temporal_reference * ctx->frame_period;
1257*437bfbebSnyanmisaka         if (frm_pts < 0) {
1258*437bfbebSnyanmisaka             frm_pts = 0;
1259*437bfbebSnyanmisaka         }
1260*437bfbebSnyanmisaka         if (ctx->pts_is_90K) {
1261*437bfbebSnyanmisaka             frm_pts = frm_pts / 300;
1262*437bfbebSnyanmisaka         } else {
1263*437bfbebSnyanmisaka             frm_pts = frm_pts / 27;
1264*437bfbebSnyanmisaka         }
1265*437bfbebSnyanmisaka 
1266*437bfbebSnyanmisaka         /*
1267*437bfbebSnyanmisaka         mpp_log("picture_coding_type %d picture_structure %d top_field_first %d frame slot %d ref_frame_cnt %d pts %lld\n",
1268*437bfbebSnyanmisaka                 pic_head->picture_coding_type, pic_code_ext_head->picture_structure,
1269*437bfbebSnyanmisaka                 pic_code_ext_head->top_field_first, ctx->frame_cur->slot_index, ctx->ref_frame_cnt, frm_pts);
1270*437bfbebSnyanmisaka         */
1271*437bfbebSnyanmisaka 
1272*437bfbebSnyanmisaka         //base.Current_frame->ShowTime = Time;//Video_Bitsream.Slice_Time.low_part;
1273*437bfbebSnyanmisaka         //!< mark current slot error
1274*437bfbebSnyanmisaka         if (pic_head->picture_coding_type != M2VD_CODING_TYPE_I
1275*437bfbebSnyanmisaka             && pic_head->pre_picture_coding_type == pic_head->picture_coding_type) {
1276*437bfbebSnyanmisaka             if ((pic_head->temporal_reference - pic_head->pre_temporal_reference > 3)
1277*437bfbebSnyanmisaka                 || (pic_head->temporal_reference - pic_head->pre_temporal_reference < -3)) {
1278*437bfbebSnyanmisaka                 mpp_frame_set_errinfo(ctx->frame_cur->f, 1);
1279*437bfbebSnyanmisaka             } else {
1280*437bfbebSnyanmisaka                 mpp_frame_set_errinfo(ctx->frame_cur->f, 0);
1281*437bfbebSnyanmisaka             }
1282*437bfbebSnyanmisaka         }
1283*437bfbebSnyanmisaka         pic_head->pre_temporal_reference = pic_head->temporal_reference;
1284*437bfbebSnyanmisaka         pic_head->pre_picture_coding_type = pic_head->picture_coding_type;
1285*437bfbebSnyanmisaka         ctx->frame_cur->picCodingType = pic_head->picture_coding_type;
1286*437bfbebSnyanmisaka 
1287*437bfbebSnyanmisaka         mpp_frame_set_width(ctx->frame_cur->f, ctx->display_width);
1288*437bfbebSnyanmisaka         mpp_frame_set_height(ctx->frame_cur->f, ctx->display_height);
1289*437bfbebSnyanmisaka         mpp_frame_set_hor_stride(ctx->frame_cur->f, 0);
1290*437bfbebSnyanmisaka         mpp_frame_set_ver_stride(ctx->frame_cur->f, 0);
1291*437bfbebSnyanmisaka         mpp_frame_set_errinfo(ctx->frame_cur->f, 0);
1292*437bfbebSnyanmisaka         mpp_frame_set_pts(ctx->frame_cur->f, frm_pts);
1293*437bfbebSnyanmisaka         mpp_frame_set_dts(ctx->frame_cur->f, ctx->dts);
1294*437bfbebSnyanmisaka         ctx->frame_cur->flags = M2V_OUT_FLAG;
1295*437bfbebSnyanmisaka 
1296*437bfbebSnyanmisaka         if (ctx->seq_ext_head.progressive_sequence) {
1297*437bfbebSnyanmisaka             frametype = MPP_FRAME_FLAG_FRAME;
1298*437bfbebSnyanmisaka         } else {
1299*437bfbebSnyanmisaka             frametype = MPP_FRAME_FLAG_PAIRED_FIELD;
1300*437bfbebSnyanmisaka             if (pic_code_ext_head->top_field_first)
1301*437bfbebSnyanmisaka                 frametype |= MPP_FRAME_FLAG_TOP_FIRST;
1302*437bfbebSnyanmisaka             else
1303*437bfbebSnyanmisaka                 frametype |= MPP_FRAME_FLAG_BOT_FIRST;
1304*437bfbebSnyanmisaka         }
1305*437bfbebSnyanmisaka         if ((ctx->cfg->base.enable_vproc & MPP_VPROC_MODE_DETECTION) &&
1306*437bfbebSnyanmisaka             frametype == MPP_FRAME_FLAG_FRAME)
1307*437bfbebSnyanmisaka             frametype = MPP_FRAME_FLAG_DEINTERLACED;
1308*437bfbebSnyanmisaka 
1309*437bfbebSnyanmisaka         mpp_frame_set_mode(ctx->frame_cur->f, frametype);
1310*437bfbebSnyanmisaka 
1311*437bfbebSnyanmisaka         if (ctx->seq_head.aspect_ratio_information >= 0 && ctx->seq_head.aspect_ratio_information < 16)
1312*437bfbebSnyanmisaka             mpp_frame_set_sar(ctx->frame_cur->f, mpeg2_aspect[ctx->seq_head.aspect_ratio_information]);
1313*437bfbebSnyanmisaka 
1314*437bfbebSnyanmisaka         //alloc frame space
1315*437bfbebSnyanmisaka         mpp_buf_slot_get_unused(ctx->frame_slots, &ctx->frame_cur->slot_index);
1316*437bfbebSnyanmisaka         mpp_buf_slot_set_prop(ctx->frame_slots, ctx->frame_cur->slot_index, SLOT_FRAME, ctx->frame_cur->f);
1317*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(ctx->frame_slots, ctx->frame_cur->slot_index, SLOT_CODEC_USE);
1318*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(ctx->frame_slots, ctx->frame_cur->slot_index, SLOT_HAL_OUTPUT);
1319*437bfbebSnyanmisaka     } else {
1320*437bfbebSnyanmisaka         if (ctx->frame_cur->slot_index >= 0)
1321*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(ctx->frame_slots, ctx->frame_cur->slot_index, SLOT_HAL_OUTPUT);
1322*437bfbebSnyanmisaka         else {
1323*437bfbebSnyanmisaka             /*
1324*437bfbebSnyanmisaka              * frame alloc failed cause by stream error, such as:
1325*437bfbebSnyanmisaka              * receive top field while top_field_first = 0,
1326*437bfbebSnyanmisaka              * or bottom filed while top_field_first = 1;
1327*437bfbebSnyanmisaka              * mark resetFlag to wait for another I frame
1328*437bfbebSnyanmisaka              */
1329*437bfbebSnyanmisaka             mpp_log("frame alloc failed, need reset\n");
1330*437bfbebSnyanmisaka             ctx->resetFlag = 1;
1331*437bfbebSnyanmisaka             return MPP_NOK;
1332*437bfbebSnyanmisaka         }
1333*437bfbebSnyanmisaka     }
1334*437bfbebSnyanmisaka 
1335*437bfbebSnyanmisaka     return MPP_OK;
1336*437bfbebSnyanmisaka }
1337*437bfbebSnyanmisaka 
m2vd_convert_to_dxva(M2VDParserContext * p)1338*437bfbebSnyanmisaka static MPP_RET m2vd_convert_to_dxva(M2VDParserContext *p)
1339*437bfbebSnyanmisaka {
1340*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1341*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
1342*437bfbebSnyanmisaka     M2VDDxvaParam *dst = p->dxva_ctx;
1343*437bfbebSnyanmisaka     M2VDFrameHead *pfw = p->frame_ref1;
1344*437bfbebSnyanmisaka     M2VDFrameHead *pbw = p->frame_ref0;
1345*437bfbebSnyanmisaka     BitReadCtx_t *bx = p->bitread_ctx;
1346*437bfbebSnyanmisaka     RK_U32 i = 0;
1347*437bfbebSnyanmisaka     RK_U32 error_info = 0;
1348*437bfbebSnyanmisaka 
1349*437bfbebSnyanmisaka     RK_S32 readbits = m2vd_get_readbits(bx);
1350*437bfbebSnyanmisaka 
1351*437bfbebSnyanmisaka     dst->seq.decode_width                       = p->seq_head.decode_width;
1352*437bfbebSnyanmisaka     dst->seq.decode_height                      = p->seq_head.decode_height;
1353*437bfbebSnyanmisaka     dst->seq.aspect_ratio_information           = p->seq_head.aspect_ratio_information;
1354*437bfbebSnyanmisaka     dst->seq.frame_rate_code                    = p->seq_head.frame_rate_code;
1355*437bfbebSnyanmisaka     dst->seq.bit_rate_value                     = p->seq_head.bit_rate_value;
1356*437bfbebSnyanmisaka     dst->seq.vbv_buffer_size                    = p->seq_head.vbv_buffer_size;
1357*437bfbebSnyanmisaka     dst->seq.constrained_parameters_flag        = p->seq_head.constrained_parameters_flag;
1358*437bfbebSnyanmisaka     dst->seq.load_intra_quantizer_matrix        = p->seq_head.load_intra_quantizer_matrix;
1359*437bfbebSnyanmisaka     dst->seq.load_non_intra_quantizer_matrix    = p->seq_head.load_non_intra_quantizer_matrix;
1360*437bfbebSnyanmisaka 
1361*437bfbebSnyanmisaka     dst->seq_ext.profile_and_level_indication   = p->seq_ext_head.profile_and_level_indication;
1362*437bfbebSnyanmisaka     dst->seq_ext.progressive_sequence           = p->seq_ext_head.progressive_sequence;
1363*437bfbebSnyanmisaka     dst->seq_ext.chroma_format                  = p->seq_ext_head.chroma_format;
1364*437bfbebSnyanmisaka     dst->seq_ext.low_delay                      = p->seq_ext_head.low_delay;
1365*437bfbebSnyanmisaka     dst->seq_ext.frame_rate_extension_n         = p->seq_ext_head.frame_rate_extension_n;
1366*437bfbebSnyanmisaka     dst->seq_ext.frame_rate_extension_d         = p->seq_ext_head.frame_rate_extension_d;
1367*437bfbebSnyanmisaka 
1368*437bfbebSnyanmisaka 
1369*437bfbebSnyanmisaka     dst->gop.drop_flag           = p->gop_head.drop_flag;
1370*437bfbebSnyanmisaka     dst->gop.hour                = p->gop_head.hour;
1371*437bfbebSnyanmisaka     dst->gop.minute              = p->gop_head.minute;
1372*437bfbebSnyanmisaka     dst->gop.sec                 = p->gop_head.sec;
1373*437bfbebSnyanmisaka     dst->gop.frame               = p->gop_head.frame;
1374*437bfbebSnyanmisaka     dst->gop.closed_gop          = p->gop_head.closed_gop;
1375*437bfbebSnyanmisaka     dst->gop.broken_link         = p->gop_head.broken_link;
1376*437bfbebSnyanmisaka 
1377*437bfbebSnyanmisaka 
1378*437bfbebSnyanmisaka     dst->pic.temporal_reference             = p->pic_head.temporal_reference;
1379*437bfbebSnyanmisaka     dst->pic.picture_coding_type            = p->pic_head.picture_coding_type;
1380*437bfbebSnyanmisaka     dst->pic.pre_picture_coding_type        = p->pic_head.pre_picture_coding_type;
1381*437bfbebSnyanmisaka     dst->pic.vbv_delay                      = p->pic_head.vbv_delay;
1382*437bfbebSnyanmisaka     dst->pic.full_pel_forward_vector        = p->pic_head.full_pel_forward_vector;
1383*437bfbebSnyanmisaka     dst->pic.forward_f_code                 = p->pic_head.forward_f_code;
1384*437bfbebSnyanmisaka     dst->pic.full_pel_backward_vector       = p->pic_head.full_pel_backward_vector;
1385*437bfbebSnyanmisaka     dst->pic.backward_f_code                = p->pic_head.backward_f_code;
1386*437bfbebSnyanmisaka     dst->pic.pre_temporal_reference         = p->pic_head.pre_temporal_reference;
1387*437bfbebSnyanmisaka 
1388*437bfbebSnyanmisaka     dst->seq_disp_ext.video_format              = p->seq_disp_ext_head.video_format;
1389*437bfbebSnyanmisaka     dst->seq_disp_ext.color_description         = p->seq_disp_ext_head.color_description;
1390*437bfbebSnyanmisaka     dst->seq_disp_ext.color_primaries           = p->seq_disp_ext_head.color_primaries;
1391*437bfbebSnyanmisaka     dst->seq_disp_ext.transfer_characteristics  = p->seq_disp_ext_head.transfer_characteristics;
1392*437bfbebSnyanmisaka     dst->seq_disp_ext.matrix_coefficients       = p->seq_disp_ext_head.matrix_coefficients;
1393*437bfbebSnyanmisaka 
1394*437bfbebSnyanmisaka     memcpy(dst->pic_code_ext.f_code, p->pic_code_ext_head.f_code, 2 * 2 * sizeof(RK_S32));
1395*437bfbebSnyanmisaka     dst->pic_code_ext.intra_dc_precision            = p->pic_code_ext_head.intra_dc_precision;
1396*437bfbebSnyanmisaka     dst->pic_code_ext.picture_structure             = p->pic_code_ext_head.picture_structure;
1397*437bfbebSnyanmisaka     dst->pic_code_ext.top_field_first               = p->pic_code_ext_head.top_field_first;
1398*437bfbebSnyanmisaka     dst->pic_code_ext.frame_pred_frame_dct          = p->pic_code_ext_head.frame_pred_frame_dct;
1399*437bfbebSnyanmisaka     dst->pic_code_ext.concealment_motion_vectors    = p->pic_code_ext_head.concealment_motion_vectors;
1400*437bfbebSnyanmisaka     dst->pic_code_ext.q_scale_type                  = p->pic_code_ext_head.q_scale_type;
1401*437bfbebSnyanmisaka     dst->pic_code_ext.intra_vlc_format              = p->pic_code_ext_head.intra_vlc_format;
1402*437bfbebSnyanmisaka     dst->pic_code_ext.alternate_scan                = p->pic_code_ext_head.alternate_scan;
1403*437bfbebSnyanmisaka     dst->pic_code_ext.repeat_first_field            = p->pic_code_ext_head.repeat_first_field;
1404*437bfbebSnyanmisaka     dst->pic_code_ext.chroma_420_type               = p->pic_code_ext_head.chroma_420_type;
1405*437bfbebSnyanmisaka     dst->pic_code_ext.progressive_frame             = p->pic_code_ext_head.progressive_frame;
1406*437bfbebSnyanmisaka     dst->pic_code_ext.composite_display_flag        = p->pic_code_ext_head.composite_display_flag;
1407*437bfbebSnyanmisaka     dst->pic_code_ext.v_axis                        = p->pic_code_ext_head.v_axis;
1408*437bfbebSnyanmisaka     dst->pic_code_ext.field_sequence                = p->pic_code_ext_head.field_sequence;
1409*437bfbebSnyanmisaka     dst->pic_code_ext.sub_carrier                   = p->pic_code_ext_head.sub_carrier;
1410*437bfbebSnyanmisaka     dst->pic_code_ext.burst_amplitude               = p->pic_code_ext_head.burst_amplitude;
1411*437bfbebSnyanmisaka     dst->pic_code_ext.sub_carrier_phase             = p->pic_code_ext_head.sub_carrier_phase;
1412*437bfbebSnyanmisaka 
1413*437bfbebSnyanmisaka     memcpy(dst->pic_disp_ext.frame_center_horizontal_offset, p->pic_disp_ext_head.frame_center_horizontal_offset, 3 * sizeof(RK_S32));
1414*437bfbebSnyanmisaka     memcpy(dst->pic_disp_ext.frame_center_vertical_offset, p->pic_disp_ext_head.frame_center_vertical_offset, 3 * sizeof(RK_S32));
1415*437bfbebSnyanmisaka 
1416*437bfbebSnyanmisaka     dst->bitstream_length = p->frame_size - ((readbits >> 3) & (~7));
1417*437bfbebSnyanmisaka     dst->bitstream_offset = ((readbits >> 3) & (~7));
1418*437bfbebSnyanmisaka     dst->bitstream_start_bit = readbits & 0x3f;
1419*437bfbebSnyanmisaka     dst->qp_tab = p->qp_tab_sw_buf;
1420*437bfbebSnyanmisaka     dst->CurrPic.Index7Bits = p->frame_cur->slot_index;
1421*437bfbebSnyanmisaka     p->cur_slot_index = p->frame_cur->slot_index;
1422*437bfbebSnyanmisaka 
1423*437bfbebSnyanmisaka     if (p->frame_ref0->slot_index < 0)
1424*437bfbebSnyanmisaka         pbw = p->frame_cur;
1425*437bfbebSnyanmisaka 
1426*437bfbebSnyanmisaka     if (p->frame_ref1->slot_index < 0)
1427*437bfbebSnyanmisaka         pfw = pbw;
1428*437bfbebSnyanmisaka 
1429*437bfbebSnyanmisaka     for (i = 0; i < 4; i++) {
1430*437bfbebSnyanmisaka         dst->frame_refs[i].bPicEntry = 0xff;
1431*437bfbebSnyanmisaka     }
1432*437bfbebSnyanmisaka     if (p->pic_head.picture_coding_type == M2VD_CODING_TYPE_B) {
1433*437bfbebSnyanmisaka         MppFrame frame0 = NULL;
1434*437bfbebSnyanmisaka         MppFrame frame1 = NULL;
1435*437bfbebSnyanmisaka         dst->frame_refs[0].Index7Bits = pfw->slot_index;
1436*437bfbebSnyanmisaka         dst->frame_refs[1].Index7Bits = pfw->slot_index;
1437*437bfbebSnyanmisaka         dst->frame_refs[2].Index7Bits = pbw->slot_index;
1438*437bfbebSnyanmisaka         dst->frame_refs[3].Index7Bits = pbw->slot_index;
1439*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p->frame_slots, pfw->slot_index, SLOT_FRAME_PTR, &frame0);
1440*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p->frame_slots, pbw->slot_index, SLOT_FRAME_PTR, &frame1);
1441*437bfbebSnyanmisaka         error_info = mpp_frame_get_errinfo(frame0) | mpp_frame_get_errinfo(frame1);
1442*437bfbebSnyanmisaka     } else {
1443*437bfbebSnyanmisaka         MppFrame frame = NULL;
1444*437bfbebSnyanmisaka         if ((p->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_FRAME) ||
1445*437bfbebSnyanmisaka             ((p->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_TOP_FIELD) && p->pic_code_ext_head.top_field_first) ||
1446*437bfbebSnyanmisaka             ((p->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_BOTTOM_FIELD) && (!p->pic_code_ext_head.top_field_first))) {
1447*437bfbebSnyanmisaka             dst->frame_refs[0].Index7Bits = pbw->slot_index;
1448*437bfbebSnyanmisaka             dst->frame_refs[1].Index7Bits = pbw->slot_index;
1449*437bfbebSnyanmisaka         } else if (p->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_TOP_FIELD) {
1450*437bfbebSnyanmisaka             dst->frame_refs[0].Index7Bits = pbw->slot_index;
1451*437bfbebSnyanmisaka             dst->frame_refs[1].Index7Bits = p->frame_cur->slot_index;
1452*437bfbebSnyanmisaka         } else if (p->pic_code_ext_head.picture_structure == M2VD_PIC_STRUCT_BOTTOM_FIELD) {
1453*437bfbebSnyanmisaka             dst->frame_refs[0].Index7Bits = p->frame_cur->slot_index;
1454*437bfbebSnyanmisaka             dst->frame_refs[1].Index7Bits = pbw->slot_index;
1455*437bfbebSnyanmisaka         }
1456*437bfbebSnyanmisaka         dst->frame_refs[2].Index7Bits = p->frame_cur->slot_index;
1457*437bfbebSnyanmisaka         dst->frame_refs[3].Index7Bits = p->frame_cur->slot_index;
1458*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p->frame_slots, pbw->slot_index, SLOT_FRAME_PTR, &frame);
1459*437bfbebSnyanmisaka         error_info = mpp_frame_get_errinfo(frame);
1460*437bfbebSnyanmisaka     }
1461*437bfbebSnyanmisaka     if (p->frame_cur->picCodingType == M2VD_CODING_TYPE_I) {
1462*437bfbebSnyanmisaka         error_info = 0;
1463*437bfbebSnyanmisaka     }
1464*437bfbebSnyanmisaka     dst->seq_ext_head_dec_flag = p->MPEG2_Flag;
1465*437bfbebSnyanmisaka     {
1466*437bfbebSnyanmisaka         MppFrame frame = NULL;
1467*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p->frame_slots, p->cur_slot_index, SLOT_FRAME_PTR, &frame);
1468*437bfbebSnyanmisaka         mpp_frame_set_errinfo(frame, error_info);
1469*437bfbebSnyanmisaka     }
1470*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
1471*437bfbebSnyanmisaka     return ret;
1472*437bfbebSnyanmisaka }
1473*437bfbebSnyanmisaka 
m2vd_parser_parse(void * ctx,HalDecTask * in_task)1474*437bfbebSnyanmisaka MPP_RET m2vd_parser_parse(void *ctx, HalDecTask *in_task)
1475*437bfbebSnyanmisaka {
1476*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1477*437bfbebSnyanmisaka     int rev = 0;
1478*437bfbebSnyanmisaka     M2VDContext *c = (M2VDContext *)ctx;
1479*437bfbebSnyanmisaka     M2VDParserContext *p = (M2VDParserContext *)c->parse_ctx;
1480*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
1481*437bfbebSnyanmisaka 
1482*437bfbebSnyanmisaka     M2VD_CHK_I(in_task->valid);
1483*437bfbebSnyanmisaka 
1484*437bfbebSnyanmisaka     in_task->valid = 0;
1485*437bfbebSnyanmisaka 
1486*437bfbebSnyanmisaka     p->flush_dpb_eos = 0;
1487*437bfbebSnyanmisaka 
1488*437bfbebSnyanmisaka     p->frame_size = (RK_U32)mpp_packet_get_length(in_task->input_packet);
1489*437bfbebSnyanmisaka 
1490*437bfbebSnyanmisaka     mpp_set_bitread_ctx(p->bitread_ctx, p->bitstream_sw_buf, p->frame_size);
1491*437bfbebSnyanmisaka 
1492*437bfbebSnyanmisaka     rev = m2vd_decode_head(p);
1493*437bfbebSnyanmisaka 
1494*437bfbebSnyanmisaka     if (!p->mHeaderDecFlag) {
1495*437bfbebSnyanmisaka         if (p->mExtraHeaderDecFlag &&
1496*437bfbebSnyanmisaka             p->pic_head.picture_coding_type == M2VD_CODING_TYPE_I) {
1497*437bfbebSnyanmisaka             p->mHeaderDecFlag = 1;
1498*437bfbebSnyanmisaka             if (M2VD_DBG_SEC_HEADER & m2vd_debug)
1499*437bfbebSnyanmisaka                 mpp_log("[m2v]: use extra data sequence header");
1500*437bfbebSnyanmisaka         } else {
1501*437bfbebSnyanmisaka             if (M2VD_DBG_SEC_HEADER & m2vd_debug)
1502*437bfbebSnyanmisaka                 mpp_log("[m2v]: !mHeaderDecFlag");
1503*437bfbebSnyanmisaka             goto __FAILED;
1504*437bfbebSnyanmisaka         }
1505*437bfbebSnyanmisaka     }
1506*437bfbebSnyanmisaka 
1507*437bfbebSnyanmisaka     if (p->seq_head.decode_width > 1920 || p->seq_head.decode_height > 1088) {
1508*437bfbebSnyanmisaka         mpp_err("Warning: unsupport larger than 1920x1088\n");
1509*437bfbebSnyanmisaka         goto __FAILED;
1510*437bfbebSnyanmisaka     }
1511*437bfbebSnyanmisaka 
1512*437bfbebSnyanmisaka     p->mb_width = (p->seq_head.decode_width + 15) >> 4;
1513*437bfbebSnyanmisaka     p->mb_height = (p->seq_head.decode_height + 15) >> 4;
1514*437bfbebSnyanmisaka 
1515*437bfbebSnyanmisaka     if (rev < M2VD_DEC_OK) {
1516*437bfbebSnyanmisaka         if (M2VD_DBG_SEC_HEADER & m2vd_debug) {
1517*437bfbebSnyanmisaka             mpp_log("decoder_header error rev %d", rev);
1518*437bfbebSnyanmisaka         }
1519*437bfbebSnyanmisaka         goto __FAILED;
1520*437bfbebSnyanmisaka     }
1521*437bfbebSnyanmisaka 
1522*437bfbebSnyanmisaka     if (rev == M2VD_DEC_PICHEAD_OK) {
1523*437bfbebSnyanmisaka         if (m2vd_alloc_frame(p)) {
1524*437bfbebSnyanmisaka             goto __FAILED;
1525*437bfbebSnyanmisaka         }
1526*437bfbebSnyanmisaka         m2vd_convert_to_dxva(p);
1527*437bfbebSnyanmisaka         in_task->syntax.data = (void *)p->dxva_ctx;
1528*437bfbebSnyanmisaka         in_task->syntax.number = sizeof(M2VDDxvaParam);
1529*437bfbebSnyanmisaka         in_task->output = p->frame_cur->slot_index;
1530*437bfbebSnyanmisaka         p->pic_head.pre_picture_coding_type = p->pic_head.picture_coding_type;
1531*437bfbebSnyanmisaka 
1532*437bfbebSnyanmisaka         if (p->frame_ref0->slot_index >= 0 &&
1533*437bfbebSnyanmisaka             (p->frame_ref0->slot_index != p->frame_cur->slot_index)) {
1534*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(p->frame_slots, p->frame_ref0->slot_index, SLOT_HAL_INPUT);
1535*437bfbebSnyanmisaka             in_task->refer[0] = p->frame_ref0->slot_index;
1536*437bfbebSnyanmisaka         }
1537*437bfbebSnyanmisaka 
1538*437bfbebSnyanmisaka         if (p->frame_ref1->slot_index >= 0 && (p->frame_ref1->slot_index != p->frame_cur->slot_index)) {
1539*437bfbebSnyanmisaka             mpp_buf_slot_set_flag(p->frame_slots, p->frame_ref1->slot_index, SLOT_HAL_INPUT);
1540*437bfbebSnyanmisaka             in_task->refer[1] = p->frame_ref1->slot_index;
1541*437bfbebSnyanmisaka         }
1542*437bfbebSnyanmisaka 
1543*437bfbebSnyanmisaka         MppFrame frame = NULL;
1544*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p->frame_slots, p->cur_slot_index, SLOT_FRAME_PTR, &frame);
1545*437bfbebSnyanmisaka         mpp_frame_set_poc(frame, p->pic_head.temporal_reference);
1546*437bfbebSnyanmisaka 
1547*437bfbebSnyanmisaka         if (p->dxva_ctx->seq_disp_ext.color_description) {
1548*437bfbebSnyanmisaka             mpp_frame_set_color_primaries(frame, p->dxva_ctx->seq_disp_ext.color_primaries);
1549*437bfbebSnyanmisaka             mpp_frame_set_color_trc(frame, p->dxva_ctx->seq_disp_ext.transfer_characteristics);
1550*437bfbebSnyanmisaka             mpp_frame_set_colorspace(frame, p->dxva_ctx->seq_disp_ext.matrix_coefficients);
1551*437bfbebSnyanmisaka         } else {
1552*437bfbebSnyanmisaka             mpp_frame_set_color_primaries(frame, MPP_FRAME_PRI_UNSPECIFIED);
1553*437bfbebSnyanmisaka             mpp_frame_set_color_trc(frame, MPP_FRAME_TRC_UNSPECIFIED);
1554*437bfbebSnyanmisaka             mpp_frame_set_colorspace(frame, MPP_FRAME_SPC_UNSPECIFIED);
1555*437bfbebSnyanmisaka         }
1556*437bfbebSnyanmisaka 
1557*437bfbebSnyanmisaka         in_task->valid = 1;
1558*437bfbebSnyanmisaka         m2v_update_ref_frame(p, 0);
1559*437bfbebSnyanmisaka     }
1560*437bfbebSnyanmisaka 
1561*437bfbebSnyanmisaka __FAILED:
1562*437bfbebSnyanmisaka     if (p->eos)
1563*437bfbebSnyanmisaka         m2vd_parser_flush(ctx);
1564*437bfbebSnyanmisaka 
1565*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
1566*437bfbebSnyanmisaka 
1567*437bfbebSnyanmisaka     return ret;
1568*437bfbebSnyanmisaka }
1569*437bfbebSnyanmisaka 
m2vd_parser_callback(void * ctx,void * errinfo)1570*437bfbebSnyanmisaka MPP_RET m2vd_parser_callback(void *ctx, void *errinfo)
1571*437bfbebSnyanmisaka {
1572*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
1573*437bfbebSnyanmisaka     M2VDContext *c = (M2VDContext *)ctx;
1574*437bfbebSnyanmisaka     M2VDParserContext *p = (M2VDParserContext *)c->parse_ctx;
1575*437bfbebSnyanmisaka     MppFrame frame = NULL;
1576*437bfbebSnyanmisaka     (void)errinfo;
1577*437bfbebSnyanmisaka 
1578*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_I");
1579*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(p->frame_slots, p->cur_slot_index, SLOT_FRAME_PTR, &frame);
1580*437bfbebSnyanmisaka     mpp_frame_set_errinfo(frame, 1);
1581*437bfbebSnyanmisaka     m2vd_dbg_func("FUN_O");
1582*437bfbebSnyanmisaka 
1583*437bfbebSnyanmisaka     return ret;
1584*437bfbebSnyanmisaka }
1585