1*a97c2a1fSXin Li /******************************************************************************
2*a97c2a1fSXin Li *
3*a97c2a1fSXin Li * Copyright (C) 2015 The Android Open Source Project
4*a97c2a1fSXin Li *
5*a97c2a1fSXin Li * Licensed under the Apache License, Version 2.0 (the "License");
6*a97c2a1fSXin Li * you may not use this file except in compliance with the License.
7*a97c2a1fSXin Li * You may obtain a copy of the License at:
8*a97c2a1fSXin Li *
9*a97c2a1fSXin Li * http://www.apache.org/licenses/LICENSE-2.0
10*a97c2a1fSXin Li *
11*a97c2a1fSXin Li * Unless required by applicable law or agreed to in writing, software
12*a97c2a1fSXin Li * distributed under the License is distributed on an "AS IS" BASIS,
13*a97c2a1fSXin Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*a97c2a1fSXin Li * See the License for the specific language governing permissions and
15*a97c2a1fSXin Li * limitations under the License.
16*a97c2a1fSXin Li *
17*a97c2a1fSXin Li *****************************************************************************
18*a97c2a1fSXin Li * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*a97c2a1fSXin Li */
20*a97c2a1fSXin Li #include <string.h>
21*a97c2a1fSXin Li #ifdef __ANDROID__
22*a97c2a1fSXin Li #include <log/log.h>
23*a97c2a1fSXin Li #endif
24*a97c2a1fSXin Li #include "iv_datatypedef.h"
25*a97c2a1fSXin Li #include "iv.h"
26*a97c2a1fSXin Li #include "ivd.h"
27*a97c2a1fSXin Li #include "impeg2_macros.h"
28*a97c2a1fSXin Li #include "impeg2_buf_mgr.h"
29*a97c2a1fSXin Li #include "impeg2_disp_mgr.h"
30*a97c2a1fSXin Li #include "impeg2_defs.h"
31*a97c2a1fSXin Li #include "impeg2_inter_pred.h"
32*a97c2a1fSXin Li #include "impeg2_idct.h"
33*a97c2a1fSXin Li #include "impeg2_format_conv.h"
34*a97c2a1fSXin Li #include "impeg2_mem_func.h"
35*a97c2a1fSXin Li #include "impeg2_platform_macros.h"
36*a97c2a1fSXin Li #include "ithread.h"
37*a97c2a1fSXin Li #include "impeg2_job_queue.h"
38*a97c2a1fSXin Li
39*a97c2a1fSXin Li #include "impeg2d.h"
40*a97c2a1fSXin Li #include "impeg2d_bitstream.h"
41*a97c2a1fSXin Li #include "impeg2d_api.h"
42*a97c2a1fSXin Li #include "impeg2d_structs.h"
43*a97c2a1fSXin Li #include "impeg2_globals.h"
44*a97c2a1fSXin Li #include "impeg2d_pic_proc.h"
45*a97c2a1fSXin Li #include "impeg2d_deinterlace.h"
46*a97c2a1fSXin Li
47*a97c2a1fSXin Li
48*a97c2a1fSXin Li /*****************************************************************************
49*a97c2a1fSXin Li * MPEG2 Constants for Parse Check
50*a97c2a1fSXin Li ******************************************************************************/
51*a97c2a1fSXin Li #define MPEG2_MAX_FRAME_RATE_CODE 8
52*a97c2a1fSXin Li
53*a97c2a1fSXin Li /******************************************************************************
54*a97c2a1fSXin Li * Function Name : impeg2d_next_start_code
55*a97c2a1fSXin Li *
56*a97c2a1fSXin Li * Description : Peek for next_start_code from the stream_t.
57*a97c2a1fSXin Li *
58*a97c2a1fSXin Li * Arguments :
59*a97c2a1fSXin Li * dec : Decoder Context
60*a97c2a1fSXin Li *
61*a97c2a1fSXin Li * Values Returned : None
62*a97c2a1fSXin Li ******************************************************************************/
impeg2d_next_start_code(dec_state_t * ps_dec)63*a97c2a1fSXin Li void impeg2d_next_start_code(dec_state_t *ps_dec)
64*a97c2a1fSXin Li {
65*a97c2a1fSXin Li stream_t *ps_stream;
66*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
67*a97c2a1fSXin Li impeg2d_bit_stream_flush_to_byte_boundary(ps_stream);
68*a97c2a1fSXin Li
69*a97c2a1fSXin Li while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX)
70*a97c2a1fSXin Li && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
71*a97c2a1fSXin Li {
72*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream,8);
73*a97c2a1fSXin Li }
74*a97c2a1fSXin Li return;
75*a97c2a1fSXin Li }
76*a97c2a1fSXin Li /******************************************************************************
77*a97c2a1fSXin Li * Function Name : impeg2d_next_code
78*a97c2a1fSXin Li *
79*a97c2a1fSXin Li * Description : Peek for next_start_code from the stream_t.
80*a97c2a1fSXin Li *
81*a97c2a1fSXin Li * Arguments :
82*a97c2a1fSXin Li * dec : Decoder Context
83*a97c2a1fSXin Li *
84*a97c2a1fSXin Li * Values Returned : None
85*a97c2a1fSXin Li ******************************************************************************/
impeg2d_next_code(dec_state_t * ps_dec,UWORD32 u4_start_code_val)86*a97c2a1fSXin Li void impeg2d_next_code(dec_state_t *ps_dec, UWORD32 u4_start_code_val)
87*a97c2a1fSXin Li {
88*a97c2a1fSXin Li stream_t *ps_stream;
89*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
90*a97c2a1fSXin Li impeg2d_bit_stream_flush_to_byte_boundary(ps_stream);
91*a97c2a1fSXin Li
92*a97c2a1fSXin Li while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) != u4_start_code_val) &&
93*a97c2a1fSXin Li (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
94*a97c2a1fSXin Li {
95*a97c2a1fSXin Li
96*a97c2a1fSXin Li if (impeg2d_bit_stream_get(ps_stream,8) != 0)
97*a97c2a1fSXin Li {
98*a97c2a1fSXin Li /* Ignore stuffing bit errors. */
99*a97c2a1fSXin Li }
100*a97c2a1fSXin Li
101*a97c2a1fSXin Li }
102*a97c2a1fSXin Li return;
103*a97c2a1fSXin Li }
104*a97c2a1fSXin Li /******************************************************************************
105*a97c2a1fSXin Li * Function Name : impeg2d_peek_next_start_code
106*a97c2a1fSXin Li *
107*a97c2a1fSXin Li * Description : Peek for next_start_code from the stream_t.
108*a97c2a1fSXin Li *
109*a97c2a1fSXin Li * Arguments :
110*a97c2a1fSXin Li * dec : Decoder Context
111*a97c2a1fSXin Li *
112*a97c2a1fSXin Li * Values Returned : None
113*a97c2a1fSXin Li ******************************************************************************/
impeg2d_peek_next_start_code(dec_state_t * ps_dec)114*a97c2a1fSXin Li void impeg2d_peek_next_start_code(dec_state_t *ps_dec)
115*a97c2a1fSXin Li {
116*a97c2a1fSXin Li stream_t *ps_stream;
117*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
118*a97c2a1fSXin Li impeg2d_bit_stream_flush_to_byte_boundary(ps_stream);
119*a97c2a1fSXin Li
120*a97c2a1fSXin Li while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX)
121*a97c2a1fSXin Li && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
122*a97c2a1fSXin Li {
123*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream,8);
124*a97c2a1fSXin Li }
125*a97c2a1fSXin Li return;
126*a97c2a1fSXin Li }
127*a97c2a1fSXin Li /******************************************************************************
128*a97c2a1fSXin Li *
129*a97c2a1fSXin Li * Function Name : impeg2d_dec_seq_hdr
130*a97c2a1fSXin Li *
131*a97c2a1fSXin Li * Description : Decodes Sequence header information
132*a97c2a1fSXin Li *
133*a97c2a1fSXin Li * Arguments :
134*a97c2a1fSXin Li * dec : Decoder Context
135*a97c2a1fSXin Li *
136*a97c2a1fSXin Li * Values Returned : None
137*a97c2a1fSXin Li ******************************************************************************/
impeg2d_dec_seq_hdr(dec_state_t * ps_dec)138*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_seq_hdr(dec_state_t *ps_dec)
139*a97c2a1fSXin Li {
140*a97c2a1fSXin Li stream_t *ps_stream;
141*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
142*a97c2a1fSXin Li UWORD16 u2_height;
143*a97c2a1fSXin Li UWORD16 u2_width;
144*a97c2a1fSXin Li
145*a97c2a1fSXin Li if (impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) != SEQUENCE_HEADER_CODE)
146*a97c2a1fSXin Li {
147*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
148*a97c2a1fSXin Li return IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND;
149*a97c2a1fSXin Li
150*a97c2a1fSXin Li }
151*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
152*a97c2a1fSXin Li
153*a97c2a1fSXin Li u2_width = impeg2d_bit_stream_get(ps_stream,12);
154*a97c2a1fSXin Li u2_height = impeg2d_bit_stream_get(ps_stream,12);
155*a97c2a1fSXin Li
156*a97c2a1fSXin Li if (0 == u2_width || 0 == u2_height)
157*a97c2a1fSXin Li {
158*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error = IMPEG2D_FRM_HDR_DECODE_ERR;
159*a97c2a1fSXin Li return e_error;
160*a97c2a1fSXin Li }
161*a97c2a1fSXin Li
162*a97c2a1fSXin Li if ((u2_width != ps_dec->u2_horizontal_size)
163*a97c2a1fSXin Li || (u2_height != ps_dec->u2_vertical_size))
164*a97c2a1fSXin Li {
165*a97c2a1fSXin Li if (0 == ps_dec->u2_header_done)
166*a97c2a1fSXin Li {
167*a97c2a1fSXin Li /* This is the first time we are reading the resolution */
168*a97c2a1fSXin Li ps_dec->u2_horizontal_size = u2_width;
169*a97c2a1fSXin Li ps_dec->u2_vertical_size = u2_height;
170*a97c2a1fSXin Li }
171*a97c2a1fSXin Li else
172*a97c2a1fSXin Li {
173*a97c2a1fSXin Li if (0 == ps_dec->i4_pic_count)
174*a97c2a1fSXin Li {
175*a97c2a1fSXin Li /* Decoder has not decoded a single frame since the last
176*a97c2a1fSXin Li * reset/init. This implies that we have two headers in the
177*a97c2a1fSXin Li * input stream. So, do not indicate a resolution change, since
178*a97c2a1fSXin Li * this can take the decoder into an infinite loop.
179*a97c2a1fSXin Li */
180*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T) IMPEG2D_FRM_HDR_DECODE_ERR;
181*a97c2a1fSXin Li }
182*a97c2a1fSXin Li else if((u2_width > ps_dec->u2_create_max_width)
183*a97c2a1fSXin Li || (u2_height > ps_dec->u2_create_max_height))
184*a97c2a1fSXin Li {
185*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error = IMPEG2D_UNSUPPORTED_DIMENSIONS;
186*a97c2a1fSXin Li
187*a97c2a1fSXin Li ps_dec->u2_reinit_max_height = u2_height;
188*a97c2a1fSXin Li ps_dec->u2_reinit_max_width = u2_width;
189*a97c2a1fSXin Li
190*a97c2a1fSXin Li return e_error;
191*a97c2a1fSXin Li }
192*a97c2a1fSXin Li else if((ps_dec->u2_horizontal_size < MIN_WIDTH)
193*a97c2a1fSXin Li || (ps_dec->u2_vertical_size < MIN_HEIGHT))
194*a97c2a1fSXin Li {
195*a97c2a1fSXin Li return IMPEG2D_UNSUPPORTED_DIMENSIONS;
196*a97c2a1fSXin Li }
197*a97c2a1fSXin Li else
198*a97c2a1fSXin Li {
199*a97c2a1fSXin Li /* The resolution has changed */
200*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T)IVD_RES_CHANGED;
201*a97c2a1fSXin Li }
202*a97c2a1fSXin Li }
203*a97c2a1fSXin Li }
204*a97c2a1fSXin Li
205*a97c2a1fSXin Li if((ps_dec->u2_horizontal_size > ps_dec->u2_create_max_width)
206*a97c2a1fSXin Li || (ps_dec->u2_vertical_size > ps_dec->u2_create_max_height))
207*a97c2a1fSXin Li {
208*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error = IMPEG2D_UNSUPPORTED_DIMENSIONS;
209*a97c2a1fSXin Li ps_dec->u2_reinit_max_height = ps_dec->u2_vertical_size;
210*a97c2a1fSXin Li ps_dec->u2_reinit_max_width = ps_dec->u2_horizontal_size;
211*a97c2a1fSXin Li return e_error;
212*a97c2a1fSXin Li }
213*a97c2a1fSXin Li
214*a97c2a1fSXin Li if((ps_dec->u2_horizontal_size < MIN_WIDTH)
215*a97c2a1fSXin Li || (ps_dec->u2_vertical_size < MIN_HEIGHT))
216*a97c2a1fSXin Li {
217*a97c2a1fSXin Li return IMPEG2D_UNSUPPORTED_DIMENSIONS;
218*a97c2a1fSXin Li }
219*a97c2a1fSXin Li
220*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
221*a97c2a1fSXin Li /* Flush the following as they are not being used */
222*a97c2a1fSXin Li /* aspect_ratio_info (4 bits) */
223*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
224*a97c2a1fSXin Li ps_dec->u2_aspect_ratio_info = impeg2d_bit_stream_get(ps_stream,4);
225*a97c2a1fSXin Li
226*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
227*a97c2a1fSXin Li /* Frame rate code(4 bits) */
228*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
229*a97c2a1fSXin Li ps_dec->u2_frame_rate_code = impeg2d_bit_stream_get(ps_stream,4);
230*a97c2a1fSXin Li if (ps_dec->u2_frame_rate_code > MPEG2_MAX_FRAME_RATE_CODE)
231*a97c2a1fSXin Li {
232*a97c2a1fSXin Li return IMPEG2D_FRM_HDR_DECODE_ERR;
233*a97c2a1fSXin Li }
234*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
235*a97c2a1fSXin Li /* Flush the following as they are not being used */
236*a97c2a1fSXin Li /* bit_rate_value (18 bits) */
237*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
238*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,18);
239*a97c2a1fSXin Li GET_MARKER_BIT(ps_dec,ps_stream);
240*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
241*a97c2a1fSXin Li /* Flush the following as they are not being used */
242*a97c2a1fSXin Li /* vbv_buffer_size_value(10 bits), constrained_parameter_flag (1 bit) */
243*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
244*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,11);
245*a97c2a1fSXin Li
246*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
247*a97c2a1fSXin Li /* Quantization matrix for the intra blocks */
248*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
249*a97c2a1fSXin Li if(impeg2d_bit_stream_get_bit(ps_stream) == 1)
250*a97c2a1fSXin Li {
251*a97c2a1fSXin Li UWORD16 i;
252*a97c2a1fSXin Li for(i = 0; i < NUM_PELS_IN_BLOCK; i++)
253*a97c2a1fSXin Li {
254*a97c2a1fSXin Li ps_dec->au1_intra_quant_matrix[gau1_impeg2_inv_scan_zig_zag[i]] = (UWORD8)impeg2d_bit_stream_get(ps_stream,8);
255*a97c2a1fSXin Li }
256*a97c2a1fSXin Li
257*a97c2a1fSXin Li }
258*a97c2a1fSXin Li else
259*a97c2a1fSXin Li {
260*a97c2a1fSXin Li memcpy(ps_dec->au1_intra_quant_matrix,gau1_impeg2_intra_quant_matrix_default,
261*a97c2a1fSXin Li NUM_PELS_IN_BLOCK);
262*a97c2a1fSXin Li }
263*a97c2a1fSXin Li
264*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
265*a97c2a1fSXin Li /* Quantization matrix for the inter blocks */
266*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
267*a97c2a1fSXin Li if(impeg2d_bit_stream_get_bit(ps_stream) == 1)
268*a97c2a1fSXin Li {
269*a97c2a1fSXin Li UWORD16 i;
270*a97c2a1fSXin Li for(i = 0; i < NUM_PELS_IN_BLOCK; i++)
271*a97c2a1fSXin Li {
272*a97c2a1fSXin Li ps_dec->au1_inter_quant_matrix[gau1_impeg2_inv_scan_zig_zag[i]] = (UWORD8)impeg2d_bit_stream_get(ps_stream,8);
273*a97c2a1fSXin Li }
274*a97c2a1fSXin Li }
275*a97c2a1fSXin Li else
276*a97c2a1fSXin Li {
277*a97c2a1fSXin Li memcpy(ps_dec->au1_inter_quant_matrix,gau1_impeg2_inter_quant_matrix_default,
278*a97c2a1fSXin Li NUM_PELS_IN_BLOCK);
279*a97c2a1fSXin Li }
280*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
281*a97c2a1fSXin Li
282*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
283*a97c2a1fSXin Li }
284*a97c2a1fSXin Li
285*a97c2a1fSXin Li /******************************************************************************
286*a97c2a1fSXin Li *
287*a97c2a1fSXin Li * Function Name : impeg2d_dec_seq_ext
288*a97c2a1fSXin Li *
289*a97c2a1fSXin Li * Description : Gets additional sequence data.
290*a97c2a1fSXin Li *
291*a97c2a1fSXin Li * Arguments :
292*a97c2a1fSXin Li * dec : Decoder Context
293*a97c2a1fSXin Li *
294*a97c2a1fSXin Li * Values Returned : None
295*a97c2a1fSXin Li ******************************************************************************/
impeg2d_dec_seq_ext(dec_state_t * ps_dec)296*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_seq_ext(dec_state_t *ps_dec)
297*a97c2a1fSXin Li {
298*a97c2a1fSXin Li stream_t *ps_stream;
299*a97c2a1fSXin Li UWORD16 horizontal_value;
300*a97c2a1fSXin Li UWORD16 vertical_value;
301*a97c2a1fSXin Li
302*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
303*a97c2a1fSXin Li
304*a97c2a1fSXin Li if (impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) != EXTENSION_START_CODE)
305*a97c2a1fSXin Li {
306*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
307*a97c2a1fSXin Li return IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND;
308*a97c2a1fSXin Li
309*a97c2a1fSXin Li }
310*a97c2a1fSXin Li /* Flush the extension start code */
311*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
312*a97c2a1fSXin Li
313*a97c2a1fSXin Li /* Flush extension start code identifier */
314*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,4);
315*a97c2a1fSXin Li
316*a97c2a1fSXin Li /*----------------------------------------------------------------------*/
317*a97c2a1fSXin Li /* Profile and Level information */
318*a97c2a1fSXin Li /*----------------------------------------------------------------------*/
319*a97c2a1fSXin Li {
320*a97c2a1fSXin Li UWORD32 u4_esc_bit, u4_profile, u4_level;
321*a97c2a1fSXin Li
322*a97c2a1fSXin Li /* Read the profile and level information */
323*a97c2a1fSXin Li /* check_profile_and_level: Table 8-1 */
324*a97c2a1fSXin Li /* [7:7] 1 Escape bit */
325*a97c2a1fSXin Li /* [6:4] 3 Profile identification */
326*a97c2a1fSXin Li /* [3:0] 4 Level identification */
327*a97c2a1fSXin Li
328*a97c2a1fSXin Li u4_esc_bit = impeg2d_bit_stream_get_bit(ps_stream);
329*a97c2a1fSXin Li u4_profile = impeg2d_bit_stream_get(ps_stream,3);
330*a97c2a1fSXin Li u4_level = impeg2d_bit_stream_get(ps_stream,4);
331*a97c2a1fSXin Li UNUSED(u4_profile);
332*a97c2a1fSXin Li UNUSED(u4_level);
333*a97c2a1fSXin Li /*
334*a97c2a1fSXin Li if( escBit == 1 ||
335*a97c2a1fSXin Li profile < MPEG2_MAIN_PROFILE ||
336*a97c2a1fSXin Li level < MPEG2_MAIN_LEVEL)
337*a97c2a1fSXin Li */
338*a97c2a1fSXin Li if (1 == u4_esc_bit)
339*a97c2a1fSXin Li {
340*a97c2a1fSXin Li return IMPEG2D_PROF_LEVEL_NOT_SUPPORTED;
341*a97c2a1fSXin Li }
342*a97c2a1fSXin Li }
343*a97c2a1fSXin Li
344*a97c2a1fSXin Li ps_dec->u2_progressive_sequence = impeg2d_bit_stream_get_bit(ps_stream);
345*a97c2a1fSXin Li
346*a97c2a1fSXin Li /* Read the chrominance format */
347*a97c2a1fSXin Li if(impeg2d_bit_stream_get(ps_stream,2) != 0x1)
348*a97c2a1fSXin Li return IMPEG2D_CHROMA_FMT_NOT_SUP;
349*a97c2a1fSXin Li
350*a97c2a1fSXin Li /* Error resilience: store the 2 most significant bit in horizontal and vertical */
351*a97c2a1fSXin Li /* variables.Use it only if adding them to the vertical and horizontal sizes */
352*a97c2a1fSXin Li /* respectively, doesn't exceed the MAX_WD and MAX_HT supported by the application.*/
353*a97c2a1fSXin Li
354*a97c2a1fSXin Li
355*a97c2a1fSXin Li /* Read the 2 most significant bits from horizontal_size */
356*a97c2a1fSXin Li horizontal_value = (impeg2d_bit_stream_get(ps_stream,2) << 12);
357*a97c2a1fSXin Li
358*a97c2a1fSXin Li /* Read the 2 most significant bits from vertical_size */
359*a97c2a1fSXin Li vertical_value = (impeg2d_bit_stream_get(ps_stream,2) << 12);
360*a97c2a1fSXin Li
361*a97c2a1fSXin Li /* Error resilience: The height and width should not be more than the*/
362*a97c2a1fSXin Li /*max height and width the application can support*/
363*a97c2a1fSXin Li if(ps_dec->u2_create_max_height < (ps_dec->u2_vertical_size + vertical_value))
364*a97c2a1fSXin Li {
365*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T) IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
366*a97c2a1fSXin Li }
367*a97c2a1fSXin Li
368*a97c2a1fSXin Li if(ps_dec->u2_create_max_width < (ps_dec->u2_horizontal_size + horizontal_value))
369*a97c2a1fSXin Li {
370*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T) IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
371*a97c2a1fSXin Li }
372*a97c2a1fSXin Li ps_dec->u2_vertical_size += vertical_value;
373*a97c2a1fSXin Li ps_dec->u2_horizontal_size += horizontal_value;
374*a97c2a1fSXin Li
375*a97c2a1fSXin Li /*-----------------------------------------------------------------------*/
376*a97c2a1fSXin Li /* Flush the following as they are not used now */
377*a97c2a1fSXin Li /* bit_rate_extension 12 */
378*a97c2a1fSXin Li /* marker_bit 1 */
379*a97c2a1fSXin Li /* vbv_buffer_size_extension 8 */
380*a97c2a1fSXin Li /* low_delay 1 */
381*a97c2a1fSXin Li /*-----------------------------------------------------------------------*/
382*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,12);
383*a97c2a1fSXin Li GET_MARKER_BIT(ps_dec,ps_stream);
384*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,9);
385*a97c2a1fSXin Li /*-----------------------------------------------------------------------*/
386*a97c2a1fSXin Li /* frame_rate_extension_n 2 */
387*a97c2a1fSXin Li /* frame_rate_extension_d 5 */
388*a97c2a1fSXin Li /*-----------------------------------------------------------------------*/
389*a97c2a1fSXin Li ps_dec->u2_frame_rate_extension_n = impeg2d_bit_stream_get(ps_stream,2);
390*a97c2a1fSXin Li ps_dec->u2_frame_rate_extension_d = impeg2d_bit_stream_get(ps_stream,5);
391*a97c2a1fSXin Li
392*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
393*a97c2a1fSXin Li }
394*a97c2a1fSXin Li
395*a97c2a1fSXin Li /*******************************************************************************
396*a97c2a1fSXin Li *
397*a97c2a1fSXin Li * Function Name : impeg2d_dec_seq_disp_ext
398*a97c2a1fSXin Li *
399*a97c2a1fSXin Li * Description : This function is eqvt to sequence_display_extension() of
400*a97c2a1fSXin Li * standard. It flushes data present as it is not being used
401*a97c2a1fSXin Li *
402*a97c2a1fSXin Li * Arguments :
403*a97c2a1fSXin Li * dec : Decoder Context
404*a97c2a1fSXin Li *
405*a97c2a1fSXin Li * Values Returned : None
406*a97c2a1fSXin Li ******************************************************************************/
impeg2d_dec_seq_disp_ext(dec_state_t * ps_dec)407*a97c2a1fSXin Li void impeg2d_dec_seq_disp_ext(dec_state_t *ps_dec)
408*a97c2a1fSXin Li {
409*a97c2a1fSXin Li stream_t *ps_stream;
410*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
411*a97c2a1fSXin Li
412*a97c2a1fSXin Li /*
413*a97c2a1fSXin Li sequence_display_extension()
414*a97c2a1fSXin Li {
415*a97c2a1fSXin Li extension_start_code_identifier 4
416*a97c2a1fSXin Li video_format 3
417*a97c2a1fSXin Li colour_description 1
418*a97c2a1fSXin Li if (colour_description)
419*a97c2a1fSXin Li {
420*a97c2a1fSXin Li colour_primaries 8
421*a97c2a1fSXin Li transfer_characteristics 8
422*a97c2a1fSXin Li matrix_coefficients 8
423*a97c2a1fSXin Li }
424*a97c2a1fSXin Li display_horizontal_size 14
425*a97c2a1fSXin Li marker_bit 1
426*a97c2a1fSXin Li display_vertical_size 14
427*a97c2a1fSXin Li next_start_code()
428*a97c2a1fSXin Li }
429*a97c2a1fSXin Li */
430*a97c2a1fSXin Li
431*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream, 4);
432*a97c2a1fSXin Li ps_dec->u1_video_format = impeg2d_bit_stream_get(ps_stream, 3);
433*a97c2a1fSXin Li ps_dec->u1_colour_description = impeg2d_bit_stream_get(ps_stream, 1);
434*a97c2a1fSXin Li ps_dec->u1_colour_primaries = 2;
435*a97c2a1fSXin Li ps_dec->u1_transfer_characteristics = 2;
436*a97c2a1fSXin Li ps_dec->u1_matrix_coefficients = 2;
437*a97c2a1fSXin Li if(ps_dec->u1_colour_description)
438*a97c2a1fSXin Li {
439*a97c2a1fSXin Li ps_dec->u1_colour_primaries = impeg2d_bit_stream_get(ps_stream, 8);
440*a97c2a1fSXin Li ps_dec->u1_transfer_characteristics = impeg2d_bit_stream_get(ps_stream, 8);
441*a97c2a1fSXin Li ps_dec->u1_matrix_coefficients = impeg2d_bit_stream_get(ps_stream, 8);
442*a97c2a1fSXin Li }
443*a97c2a1fSXin Li
444*a97c2a1fSXin Li /* display_horizontal_size and display_vertical_size */
445*a97c2a1fSXin Li ps_dec->u2_display_horizontal_size = impeg2d_bit_stream_get(ps_stream,14);;
446*a97c2a1fSXin Li GET_MARKER_BIT(ps_dec,ps_stream);
447*a97c2a1fSXin Li ps_dec->u2_display_vertical_size = impeg2d_bit_stream_get(ps_stream,14);
448*a97c2a1fSXin Li
449*a97c2a1fSXin Li ps_dec->u1_seq_disp_extn_present = 1;
450*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
451*a97c2a1fSXin Li }
452*a97c2a1fSXin Li
453*a97c2a1fSXin Li
454*a97c2a1fSXin Li /*******************************************************************************
455*a97c2a1fSXin Li *
456*a97c2a1fSXin Li * Function Name : impeg2d_dec_seq_scale_ext
457*a97c2a1fSXin Li *
458*a97c2a1fSXin Li * Description : This function is eqvt to sequence_scalable_extension() of
459*a97c2a1fSXin Li * standard.
460*a97c2a1fSXin Li *
461*a97c2a1fSXin Li * Arguments : Decoder context
462*a97c2a1fSXin Li *
463*a97c2a1fSXin Li * Values Returned : None
464*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_seq_scale_ext(dec_state_t * ps_dec)465*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_seq_scale_ext(dec_state_t *ps_dec)
466*a97c2a1fSXin Li {
467*a97c2a1fSXin Li UNUSED(ps_dec);
468*a97c2a1fSXin Li return IMPEG2D_SCALABILITIY_NOT_SUPPORTED;
469*a97c2a1fSXin Li }
470*a97c2a1fSXin Li
471*a97c2a1fSXin Li /*******************************************************************************
472*a97c2a1fSXin Li *
473*a97c2a1fSXin Li * Function Name : impeg2d_dec_quant_matrix_ext
474*a97c2a1fSXin Li *
475*a97c2a1fSXin Li * Description : Gets Intra and NonIntra quantizer matrix from the stream.
476*a97c2a1fSXin Li *
477*a97c2a1fSXin Li * Arguments : Decoder context
478*a97c2a1fSXin Li *
479*a97c2a1fSXin Li * Values Returned : None
480*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_quant_matrix_ext(dec_state_t * ps_dec)481*a97c2a1fSXin Li void impeg2d_dec_quant_matrix_ext(dec_state_t *ps_dec)
482*a97c2a1fSXin Li {
483*a97c2a1fSXin Li stream_t *ps_stream;
484*a97c2a1fSXin Li
485*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
486*a97c2a1fSXin Li /* Flush extension_start_code_identifier */
487*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,4);
488*a97c2a1fSXin Li
489*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
490*a97c2a1fSXin Li /* Quantization matrix for the intra blocks */
491*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
492*a97c2a1fSXin Li if(impeg2d_bit_stream_get(ps_stream,1) == 1)
493*a97c2a1fSXin Li {
494*a97c2a1fSXin Li UWORD16 i;
495*a97c2a1fSXin Li for(i = 0; i < NUM_PELS_IN_BLOCK; i++)
496*a97c2a1fSXin Li {
497*a97c2a1fSXin Li ps_dec->au1_intra_quant_matrix[gau1_impeg2_inv_scan_zig_zag[i]] = (UWORD8)impeg2d_bit_stream_get(ps_stream,8);
498*a97c2a1fSXin Li }
499*a97c2a1fSXin Li
500*a97c2a1fSXin Li }
501*a97c2a1fSXin Li
502*a97c2a1fSXin Li
503*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
504*a97c2a1fSXin Li /* Quantization matrix for the inter blocks */
505*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
506*a97c2a1fSXin Li if(impeg2d_bit_stream_get(ps_stream,1) == 1)
507*a97c2a1fSXin Li {
508*a97c2a1fSXin Li UWORD16 i;
509*a97c2a1fSXin Li for(i = 0; i < NUM_PELS_IN_BLOCK; i++)
510*a97c2a1fSXin Li {
511*a97c2a1fSXin Li ps_dec->au1_inter_quant_matrix[gau1_impeg2_inv_scan_zig_zag[i]] = (UWORD8)impeg2d_bit_stream_get(ps_stream,8);
512*a97c2a1fSXin Li }
513*a97c2a1fSXin Li }
514*a97c2a1fSXin Li
515*a97c2a1fSXin Li /* Note : chroma intra quantizer matrix and chroma non
516*a97c2a1fSXin Li intra quantizer matrix are not needed for 4:2:0 format */
517*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
518*a97c2a1fSXin Li }
519*a97c2a1fSXin Li /*******************************************************************************
520*a97c2a1fSXin Li *
521*a97c2a1fSXin Li * Function Name : impeg2d_dec_pic_disp_ext
522*a97c2a1fSXin Li *
523*a97c2a1fSXin Li * Description : This function is eqvt to picture_display_extension() of
524*a97c2a1fSXin Li * standard.The parameters are not used by decoder
525*a97c2a1fSXin Li *
526*a97c2a1fSXin Li * Arguments : Pointer to dec_state_t
527*a97c2a1fSXin Li *
528*a97c2a1fSXin Li * Values Returned : Decoder context
529*a97c2a1fSXin Li *
530*a97c2a1fSXin Li * Values Returned : None
531*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_pic_disp_ext(dec_state_t * ps_dec)532*a97c2a1fSXin Li void impeg2d_dec_pic_disp_ext(dec_state_t *ps_dec)
533*a97c2a1fSXin Li {
534*a97c2a1fSXin Li WORD16 i2_number_of_frame_centre_offsets ;
535*a97c2a1fSXin Li stream_t *ps_stream;
536*a97c2a1fSXin Li
537*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
538*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,4);
539*a97c2a1fSXin Li
540*a97c2a1fSXin Li if (ps_dec->u2_progressive_sequence)
541*a97c2a1fSXin Li {
542*a97c2a1fSXin Li i2_number_of_frame_centre_offsets = (ps_dec->u2_repeat_first_field) ?
543*a97c2a1fSXin Li 2 + ps_dec->u2_top_field_first : 1;
544*a97c2a1fSXin Li }
545*a97c2a1fSXin Li else
546*a97c2a1fSXin Li {
547*a97c2a1fSXin Li i2_number_of_frame_centre_offsets =
548*a97c2a1fSXin Li (ps_dec->u2_picture_structure != FRAME_PICTURE) ?
549*a97c2a1fSXin Li 1 : 2 + ps_dec->u2_repeat_first_field;
550*a97c2a1fSXin Li }
551*a97c2a1fSXin Li while(i2_number_of_frame_centre_offsets--)
552*a97c2a1fSXin Li {
553*a97c2a1fSXin Li /* frame_centre_horizontal_offset */
554*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream,16);
555*a97c2a1fSXin Li GET_MARKER_BIT(ps_dec,ps_stream);
556*a97c2a1fSXin Li /* frame_centre_vertical_offset */
557*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream,16);
558*a97c2a1fSXin Li GET_MARKER_BIT(ps_dec,ps_stream);
559*a97c2a1fSXin Li }
560*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
561*a97c2a1fSXin Li }
562*a97c2a1fSXin Li
563*a97c2a1fSXin Li /*******************************************************************************
564*a97c2a1fSXin Li *
565*a97c2a1fSXin Li * Function Name : impeg2d_dec_itu_t_ext
566*a97c2a1fSXin Li *
567*a97c2a1fSXin Li * Description : This function is eqvt to ITU-T_extension() of
568*a97c2a1fSXin Li * standard.The parameters are not used by decoder
569*a97c2a1fSXin Li *
570*a97c2a1fSXin Li * Arguments : Decoder context
571*a97c2a1fSXin Li *
572*a97c2a1fSXin Li * Values Returned : None
573*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_itu_t_ext(dec_state_t * ps_dec)574*a97c2a1fSXin Li void impeg2d_dec_itu_t_ext(dec_state_t *ps_dec)
575*a97c2a1fSXin Li {
576*a97c2a1fSXin Li impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,EXT_ID_LEN);
577*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
578*a97c2a1fSXin Li }
579*a97c2a1fSXin Li
580*a97c2a1fSXin Li /*******************************************************************************
581*a97c2a1fSXin Li * Function Name : impeg2d_dec_copyright_ext
582*a97c2a1fSXin Li *
583*a97c2a1fSXin Li * Description : This function is eqvt to copyright_extension() of
584*a97c2a1fSXin Li * standard. The parameters are not used by decoder
585*a97c2a1fSXin Li *
586*a97c2a1fSXin Li * Arguments : Decoder context
587*a97c2a1fSXin Li *
588*a97c2a1fSXin Li * Values Returned : None
589*a97c2a1fSXin Li *******************************************************************************/
590*a97c2a1fSXin Li
591*a97c2a1fSXin Li
impeg2d_dec_copyright_ext(dec_state_t * ps_dec)592*a97c2a1fSXin Li void impeg2d_dec_copyright_ext(dec_state_t *ps_dec)
593*a97c2a1fSXin Li {
594*a97c2a1fSXin Li UWORD32 u4_bits_to_flush;
595*a97c2a1fSXin Li
596*a97c2a1fSXin Li u4_bits_to_flush = COPYRIGHT_EXTENSION_LEN;
597*a97c2a1fSXin Li
598*a97c2a1fSXin Li while(u4_bits_to_flush >= 32 )
599*a97c2a1fSXin Li {
600*a97c2a1fSXin Li impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,32);
601*a97c2a1fSXin Li u4_bits_to_flush = u4_bits_to_flush - 32;
602*a97c2a1fSXin Li }
603*a97c2a1fSXin Li
604*a97c2a1fSXin Li if(u4_bits_to_flush > 0)
605*a97c2a1fSXin Li {
606*a97c2a1fSXin Li impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,u4_bits_to_flush);
607*a97c2a1fSXin Li }
608*a97c2a1fSXin Li
609*a97c2a1fSXin Li
610*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
611*a97c2a1fSXin Li }
612*a97c2a1fSXin Li /*******************************************************************************
613*a97c2a1fSXin Li * Function Name : impeg2d_dec_cam_param_ext
614*a97c2a1fSXin Li *
615*a97c2a1fSXin Li * Description : This function is eqvt to camera_parameters_extension() of
616*a97c2a1fSXin Li * standard. The parameters are not used by decoder
617*a97c2a1fSXin Li *
618*a97c2a1fSXin Li * Arguments : Decoder context
619*a97c2a1fSXin Li *
620*a97c2a1fSXin Li * Values Returned : None
621*a97c2a1fSXin Li *******************************************************************************/
622*a97c2a1fSXin Li
623*a97c2a1fSXin Li
impeg2d_dec_cam_param_ext(dec_state_t * ps_dec)624*a97c2a1fSXin Li void impeg2d_dec_cam_param_ext(dec_state_t *ps_dec)
625*a97c2a1fSXin Li {
626*a97c2a1fSXin Li
627*a97c2a1fSXin Li UWORD32 u4_bits_to_flush;
628*a97c2a1fSXin Li
629*a97c2a1fSXin Li u4_bits_to_flush = CAMERA_PARAMETER_EXTENSION_LEN;
630*a97c2a1fSXin Li
631*a97c2a1fSXin Li while(u4_bits_to_flush >= 32 )
632*a97c2a1fSXin Li {
633*a97c2a1fSXin Li impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,32);
634*a97c2a1fSXin Li u4_bits_to_flush = u4_bits_to_flush - 32;
635*a97c2a1fSXin Li }
636*a97c2a1fSXin Li
637*a97c2a1fSXin Li if(u4_bits_to_flush > 0)
638*a97c2a1fSXin Li {
639*a97c2a1fSXin Li impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,u4_bits_to_flush);
640*a97c2a1fSXin Li }
641*a97c2a1fSXin Li
642*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
643*a97c2a1fSXin Li }
644*a97c2a1fSXin Li
645*a97c2a1fSXin Li /*******************************************************************************
646*a97c2a1fSXin Li *
647*a97c2a1fSXin Li * Function Name : impeg2d_dec_grp_of_pic_hdr
648*a97c2a1fSXin Li *
649*a97c2a1fSXin Li * Description : Gets information at the GOP level.
650*a97c2a1fSXin Li *
651*a97c2a1fSXin Li * Arguments : Decoder context
652*a97c2a1fSXin Li *
653*a97c2a1fSXin Li * Values Returned : None
654*a97c2a1fSXin Li *******************************************************************************/
655*a97c2a1fSXin Li
656*a97c2a1fSXin Li
impeg2d_dec_grp_of_pic_hdr(dec_state_t * ps_dec)657*a97c2a1fSXin Li void impeg2d_dec_grp_of_pic_hdr(dec_state_t *ps_dec)
658*a97c2a1fSXin Li {
659*a97c2a1fSXin Li
660*a97c2a1fSXin Li UWORD32 u4_bits_to_flush;
661*a97c2a1fSXin Li
662*a97c2a1fSXin Li u4_bits_to_flush = GROUP_OF_PICTURE_LEN;
663*a97c2a1fSXin Li
664*a97c2a1fSXin Li while(u4_bits_to_flush >= 32 )
665*a97c2a1fSXin Li {
666*a97c2a1fSXin Li impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,32);
667*a97c2a1fSXin Li u4_bits_to_flush = u4_bits_to_flush - 32;
668*a97c2a1fSXin Li }
669*a97c2a1fSXin Li
670*a97c2a1fSXin Li if(u4_bits_to_flush > 0)
671*a97c2a1fSXin Li {
672*a97c2a1fSXin Li impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,u4_bits_to_flush);
673*a97c2a1fSXin Li }
674*a97c2a1fSXin Li
675*a97c2a1fSXin Li }
676*a97c2a1fSXin Li
677*a97c2a1fSXin Li
678*a97c2a1fSXin Li /*******************************************************************************
679*a97c2a1fSXin Li *
680*a97c2a1fSXin Li * Function Name : impeg2d_dec_pic_hdr
681*a97c2a1fSXin Li *
682*a97c2a1fSXin Li * Description : Gets the picture header information.
683*a97c2a1fSXin Li *
684*a97c2a1fSXin Li * Arguments : Decoder context
685*a97c2a1fSXin Li *
686*a97c2a1fSXin Li * Values Returned : None
687*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_pic_hdr(dec_state_t * ps_dec)688*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_pic_hdr(dec_state_t *ps_dec)
689*a97c2a1fSXin Li {
690*a97c2a1fSXin Li stream_t *ps_stream;
691*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
692*a97c2a1fSXin Li
693*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
694*a97c2a1fSXin Li /* Flush temporal reference */
695*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream,10);
696*a97c2a1fSXin Li
697*a97c2a1fSXin Li /* Picture type */
698*a97c2a1fSXin Li ps_dec->e_pic_type = (e_pic_type_t)impeg2d_bit_stream_get(ps_stream,3);
699*a97c2a1fSXin Li if((ps_dec->e_pic_type < I_PIC) || (ps_dec->e_pic_type > D_PIC))
700*a97c2a1fSXin Li {
701*a97c2a1fSXin Li impeg2d_next_code(ps_dec, PICTURE_START_CODE);
702*a97c2a1fSXin Li return IMPEG2D_INVALID_PIC_TYPE;
703*a97c2a1fSXin Li }
704*a97c2a1fSXin Li
705*a97c2a1fSXin Li /* Flush vbv_delay */
706*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream,16);
707*a97c2a1fSXin Li
708*a97c2a1fSXin Li if(ps_dec->e_pic_type == P_PIC || ps_dec->e_pic_type == B_PIC)
709*a97c2a1fSXin Li {
710*a97c2a1fSXin Li ps_dec->u2_full_pel_forw_vector = impeg2d_bit_stream_get_bit(ps_stream);
711*a97c2a1fSXin Li ps_dec->u2_forw_f_code = impeg2d_bit_stream_get(ps_stream,3);
712*a97c2a1fSXin Li }
713*a97c2a1fSXin Li if(ps_dec->e_pic_type == B_PIC)
714*a97c2a1fSXin Li {
715*a97c2a1fSXin Li ps_dec->u2_full_pel_back_vector = impeg2d_bit_stream_get_bit(ps_stream);
716*a97c2a1fSXin Li ps_dec->u2_back_f_code = impeg2d_bit_stream_get(ps_stream,3);
717*a97c2a1fSXin Li }
718*a97c2a1fSXin Li
719*a97c2a1fSXin Li if(ps_dec->u2_is_mpeg2 == 0)
720*a97c2a1fSXin Li {
721*a97c2a1fSXin Li if (ps_dec->u2_forw_f_code < 1 || ps_dec->u2_forw_f_code > 7 ||
722*a97c2a1fSXin Li ps_dec->u2_back_f_code < 1 || ps_dec->u2_back_f_code > 7)
723*a97c2a1fSXin Li {
724*a97c2a1fSXin Li return IMPEG2D_UNKNOWN_ERROR;
725*a97c2a1fSXin Li }
726*a97c2a1fSXin Li ps_dec->au2_f_code[0][0] = ps_dec->au2_f_code[0][1] = ps_dec->u2_forw_f_code;
727*a97c2a1fSXin Li ps_dec->au2_f_code[1][0] = ps_dec->au2_f_code[1][1] = ps_dec->u2_back_f_code;
728*a97c2a1fSXin Li }
729*a97c2a1fSXin Li
730*a97c2a1fSXin Li /*-----------------------------------------------------------------------*/
731*a97c2a1fSXin Li /* Flush the extra bit value */
732*a97c2a1fSXin Li /* */
733*a97c2a1fSXin Li /* while(impeg2d_bit_stream_nxt() == '1') */
734*a97c2a1fSXin Li /* { */
735*a97c2a1fSXin Li /* extra_bit_picture 1 */
736*a97c2a1fSXin Li /* extra_information_picture 8 */
737*a97c2a1fSXin Li /* } */
738*a97c2a1fSXin Li /* extra_bit_picture 1 */
739*a97c2a1fSXin Li /*-----------------------------------------------------------------------*/
740*a97c2a1fSXin Li while (impeg2d_bit_stream_nxt(ps_stream,1) == 1 &&
741*a97c2a1fSXin Li ps_stream->u4_offset < ps_stream->u4_max_offset)
742*a97c2a1fSXin Li {
743*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream,9);
744*a97c2a1fSXin Li }
745*a97c2a1fSXin Li impeg2d_bit_stream_get_bit(ps_stream);
746*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
747*a97c2a1fSXin Li
748*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
749*a97c2a1fSXin Li }
750*a97c2a1fSXin Li
751*a97c2a1fSXin Li
752*a97c2a1fSXin Li /*******************************************************************************
753*a97c2a1fSXin Li *
754*a97c2a1fSXin Li * Function Name : impeg2d_dec_pic_coding_ext
755*a97c2a1fSXin Li *
756*a97c2a1fSXin Li * Description : Reads more picture level parameters
757*a97c2a1fSXin Li *
758*a97c2a1fSXin Li * Arguments :
759*a97c2a1fSXin Li * dec : Decoder context
760*a97c2a1fSXin Li *
761*a97c2a1fSXin Li * Values Returned : Error
762*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_pic_coding_ext(dec_state_t * ps_dec)763*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_pic_coding_ext(dec_state_t *ps_dec)
764*a97c2a1fSXin Li {
765*a97c2a1fSXin Li
766*a97c2a1fSXin Li UWORD32 u4_val;
767*a97c2a1fSXin Li stream_t *ps_stream;
768*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T) IV_SUCCESS;
769*a97c2a1fSXin Li
770*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
771*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
772*a97c2a1fSXin Li /* extension code identifier */
773*a97c2a1fSXin Li impeg2d_bit_stream_get(ps_stream,4);
774*a97c2a1fSXin Li
775*a97c2a1fSXin Li u4_val = impeg2d_bit_stream_get(ps_stream,4);
776*a97c2a1fSXin Li if(u4_val == 0)
777*a97c2a1fSXin Li return IMPEG2D_UNKNOWN_ERROR;
778*a97c2a1fSXin Li ps_dec->au2_f_code[0][0] = u4_val;
779*a97c2a1fSXin Li
780*a97c2a1fSXin Li u4_val = impeg2d_bit_stream_get(ps_stream,4);
781*a97c2a1fSXin Li if(u4_val == 0)
782*a97c2a1fSXin Li return IMPEG2D_UNKNOWN_ERROR;
783*a97c2a1fSXin Li ps_dec->au2_f_code[0][1] = u4_val;
784*a97c2a1fSXin Li
785*a97c2a1fSXin Li u4_val = impeg2d_bit_stream_get(ps_stream,4);
786*a97c2a1fSXin Li if(u4_val == 0)
787*a97c2a1fSXin Li return IMPEG2D_UNKNOWN_ERROR;
788*a97c2a1fSXin Li ps_dec->au2_f_code[1][0] = u4_val;
789*a97c2a1fSXin Li
790*a97c2a1fSXin Li u4_val = impeg2d_bit_stream_get(ps_stream,4);
791*a97c2a1fSXin Li if(u4_val == 0)
792*a97c2a1fSXin Li return IMPEG2D_UNKNOWN_ERROR;
793*a97c2a1fSXin Li ps_dec->au2_f_code[1][1] = u4_val;
794*a97c2a1fSXin Li
795*a97c2a1fSXin Li ps_dec->u2_intra_dc_precision = impeg2d_bit_stream_get(ps_stream,2);
796*a97c2a1fSXin Li ps_dec->u2_picture_structure = impeg2d_bit_stream_get(ps_stream,2);
797*a97c2a1fSXin Li if (ps_dec->u2_picture_structure < TOP_FIELD ||
798*a97c2a1fSXin Li ps_dec->u2_picture_structure > FRAME_PICTURE)
799*a97c2a1fSXin Li {
800*a97c2a1fSXin Li return IMPEG2D_FRM_HDR_DECODE_ERR;
801*a97c2a1fSXin Li }
802*a97c2a1fSXin Li ps_dec->u2_top_field_first = impeg2d_bit_stream_get_bit(ps_stream);
803*a97c2a1fSXin Li ps_dec->u2_frame_pred_frame_dct = impeg2d_bit_stream_get_bit(ps_stream);
804*a97c2a1fSXin Li ps_dec->u2_concealment_motion_vectors = impeg2d_bit_stream_get_bit(ps_stream);
805*a97c2a1fSXin Li ps_dec->u2_q_scale_type = impeg2d_bit_stream_get_bit(ps_stream);
806*a97c2a1fSXin Li ps_dec->u2_intra_vlc_format = impeg2d_bit_stream_get_bit(ps_stream);
807*a97c2a1fSXin Li ps_dec->u2_alternate_scan = impeg2d_bit_stream_get_bit(ps_stream);
808*a97c2a1fSXin Li ps_dec->u2_repeat_first_field = impeg2d_bit_stream_get_bit(ps_stream);
809*a97c2a1fSXin Li /* Flush chroma_420_type */
810*a97c2a1fSXin Li impeg2d_bit_stream_get_bit(ps_stream);
811*a97c2a1fSXin Li
812*a97c2a1fSXin Li ps_dec->u2_progressive_frame = impeg2d_bit_stream_get_bit(ps_stream);
813*a97c2a1fSXin Li if (impeg2d_bit_stream_get_bit(ps_stream))
814*a97c2a1fSXin Li {
815*a97c2a1fSXin Li /* Flush v_axis, field_sequence, burst_amplitude, sub_carrier_phase */
816*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,20);
817*a97c2a1fSXin Li }
818*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
819*a97c2a1fSXin Li
820*a97c2a1fSXin Li
821*a97c2a1fSXin Li if(VERTICAL_SCAN == ps_dec->u2_alternate_scan)
822*a97c2a1fSXin Li {
823*a97c2a1fSXin Li ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_vertical;
824*a97c2a1fSXin Li }
825*a97c2a1fSXin Li else
826*a97c2a1fSXin Li {
827*a97c2a1fSXin Li ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_zig_zag;
828*a97c2a1fSXin Li }
829*a97c2a1fSXin Li return e_error;
830*a97c2a1fSXin Li }
831*a97c2a1fSXin Li
832*a97c2a1fSXin Li /*******************************************************************************
833*a97c2a1fSXin Li *
834*a97c2a1fSXin Li * Function Name : impeg2d_dec_slice
835*a97c2a1fSXin Li *
836*a97c2a1fSXin Li * Description : Reads Slice level parameters and calls functions that
837*a97c2a1fSXin Li * decode individual MBs of slice
838*a97c2a1fSXin Li *
839*a97c2a1fSXin Li * Arguments :
840*a97c2a1fSXin Li * dec : Decoder context
841*a97c2a1fSXin Li *
842*a97c2a1fSXin Li * Values Returned : None
843*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_slice(dec_state_t * ps_dec)844*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_slice(dec_state_t *ps_dec)
845*a97c2a1fSXin Li {
846*a97c2a1fSXin Li stream_t *ps_stream;
847*a97c2a1fSXin Li UWORD32 u4_slice_vertical_position;
848*a97c2a1fSXin Li UWORD32 u4_slice_vertical_position_extension;
849*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error;
850*a97c2a1fSXin Li
851*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
852*a97c2a1fSXin Li
853*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
854*a97c2a1fSXin Li /* All the profiles supported require restricted slice structure. Hence */
855*a97c2a1fSXin Li /* there is no need to store slice_vertical_position. Note that max */
856*a97c2a1fSXin Li /* height supported does not exceed 2800 and scalablity is not supported */
857*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
858*a97c2a1fSXin Li
859*a97c2a1fSXin Li /* Remove the slice start code */
860*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_PREFIX_LEN);
861*a97c2a1fSXin Li u4_slice_vertical_position = impeg2d_bit_stream_get(ps_stream, 8);
862*a97c2a1fSXin Li if(u4_slice_vertical_position > 2800)
863*a97c2a1fSXin Li {
864*a97c2a1fSXin Li u4_slice_vertical_position_extension = impeg2d_bit_stream_get(ps_stream, 3);
865*a97c2a1fSXin Li u4_slice_vertical_position += (u4_slice_vertical_position_extension << 7);
866*a97c2a1fSXin Li }
867*a97c2a1fSXin Li
868*a97c2a1fSXin Li if((u4_slice_vertical_position > ps_dec->u2_num_vert_mb) ||
869*a97c2a1fSXin Li (u4_slice_vertical_position == 0))
870*a97c2a1fSXin Li {
871*a97c2a1fSXin Li return IMPEG2D_INVALID_VERT_SIZE;
872*a97c2a1fSXin Li }
873*a97c2a1fSXin Li
874*a97c2a1fSXin Li // change the mb_y to point to slice_vertical_position
875*a97c2a1fSXin Li u4_slice_vertical_position--;
876*a97c2a1fSXin Li if (ps_dec->u2_mb_y != u4_slice_vertical_position)
877*a97c2a1fSXin Li {
878*a97c2a1fSXin Li ps_dec->u2_mb_y = u4_slice_vertical_position;
879*a97c2a1fSXin Li ps_dec->u2_mb_x = 0;
880*a97c2a1fSXin Li
881*a97c2a1fSXin Li /* Update the number of MBs left, since we have probably missed a slice
882*a97c2a1fSXin Li * (that's why we see a mismatch between u2_mb_y and current position).
883*a97c2a1fSXin Li */
884*a97c2a1fSXin Li ps_dec->u2_num_mbs_left = (ps_dec->u2_num_vert_mb - ps_dec->u2_mb_y)
885*a97c2a1fSXin Li * ps_dec->u2_num_horiz_mb;
886*a97c2a1fSXin Li }
887*a97c2a1fSXin Li ps_dec->u2_first_mb = 1;
888*a97c2a1fSXin Li
889*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
890*a97c2a1fSXin Li /* Quant scale code decoding */
891*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
892*a97c2a1fSXin Li {
893*a97c2a1fSXin Li UWORD16 u2_quant_scale_code;
894*a97c2a1fSXin Li u2_quant_scale_code = impeg2d_bit_stream_get(ps_stream,5);
895*a97c2a1fSXin Li ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ?
896*a97c2a1fSXin Li gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1);
897*a97c2a1fSXin Li }
898*a97c2a1fSXin Li
899*a97c2a1fSXin Li if (impeg2d_bit_stream_nxt(ps_stream,1) == 1)
900*a97c2a1fSXin Li {
901*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,9);
902*a97c2a1fSXin Li /* Flush extra bit information */
903*a97c2a1fSXin Li while (impeg2d_bit_stream_nxt(ps_stream,1) == 1 &&
904*a97c2a1fSXin Li ps_stream->u4_offset < ps_stream->u4_max_offset)
905*a97c2a1fSXin Li {
906*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,9);
907*a97c2a1fSXin Li }
908*a97c2a1fSXin Li }
909*a97c2a1fSXin Li impeg2d_bit_stream_get_bit(ps_stream);
910*a97c2a1fSXin Li
911*a97c2a1fSXin Li /* Reset the DC predictors to reset values given in Table 7.2 at the start*/
912*a97c2a1fSXin Li /* of slice data */
913*a97c2a1fSXin Li ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision;
914*a97c2a1fSXin Li ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
915*a97c2a1fSXin Li ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
916*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
917*a97c2a1fSXin Li /* dec->DecMBsinSlice() implements the following psuedo code from standard*/
918*a97c2a1fSXin Li /* do */
919*a97c2a1fSXin Li /* { */
920*a97c2a1fSXin Li /* macroblock() */
921*a97c2a1fSXin Li /* } while (impeg2d_bit_stream_nxt() != '000 0000 0000 0000 0000 0000') */
922*a97c2a1fSXin Li /*------------------------------------------------------------------------*/
923*a97c2a1fSXin Li
924*a97c2a1fSXin Li e_error = ps_dec->pf_decode_slice(ps_dec);
925*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
926*a97c2a1fSXin Li {
927*a97c2a1fSXin Li return e_error;
928*a97c2a1fSXin Li }
929*a97c2a1fSXin Li
930*a97c2a1fSXin Li /* Check for the MBy index instead of number of MBs left, because the
931*a97c2a1fSXin Li * number of MBs left in case of multi-thread decode is the number of MBs
932*a97c2a1fSXin Li * in that row only
933*a97c2a1fSXin Li */
934*a97c2a1fSXin Li if(ps_dec->u2_mb_y < ps_dec->u2_num_vert_mb)
935*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
936*a97c2a1fSXin Li
937*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
938*a97c2a1fSXin Li }
939*a97c2a1fSXin Li
impeg2d_dec_pic_data_thread(dec_state_t * ps_dec)940*a97c2a1fSXin Li void impeg2d_dec_pic_data_thread(dec_state_t *ps_dec)
941*a97c2a1fSXin Li {
942*a97c2a1fSXin Li WORD32 i4_continue_decode;
943*a97c2a1fSXin Li
944*a97c2a1fSXin Li WORD32 i4_cur_row, temp;
945*a97c2a1fSXin Li UWORD32 u4_bits_read;
946*a97c2a1fSXin Li WORD32 i4_dequeue_job;
947*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error;
948*a97c2a1fSXin Li
949*a97c2a1fSXin Li UWORD32 id = ps_dec->currThreadId;
950*a97c2a1fSXin Li dec_state_multi_core_t *ps_dec_state_multi_core = ps_dec->ps_dec_state_multi_core;
951*a97c2a1fSXin Li
952*a97c2a1fSXin Li while (1)
953*a97c2a1fSXin Li {
954*a97c2a1fSXin Li if(ps_dec->i4_threads_active)
955*a97c2a1fSXin Li {
956*a97c2a1fSXin Li if(id != 0)
957*a97c2a1fSXin Li {
958*a97c2a1fSXin Li e_error = ithread_mutex_lock(ps_dec->pv_proc_start_mutex);
959*a97c2a1fSXin Li if((IMPEG2D_ERROR_CODES_T)IV_SUCCESS != e_error)
960*a97c2a1fSXin Li break;
961*a97c2a1fSXin Li
962*a97c2a1fSXin Li while(!ps_dec->ai4_process_start)
963*a97c2a1fSXin Li {
964*a97c2a1fSXin Li ithread_cond_wait(ps_dec->pv_proc_start_condition,
965*a97c2a1fSXin Li ps_dec->pv_proc_start_mutex);
966*a97c2a1fSXin Li }
967*a97c2a1fSXin Li ps_dec->ai4_process_start = 0;
968*a97c2a1fSXin Li e_error = ithread_mutex_unlock(ps_dec->pv_proc_start_mutex);
969*a97c2a1fSXin Li if((IMPEG2D_ERROR_CODES_T)IV_SUCCESS != e_error)
970*a97c2a1fSXin Li break;
971*a97c2a1fSXin Li // break off at the end of decoding all the frames
972*a97c2a1fSXin Li if(ps_dec_state_multi_core->i4_break_threads)
973*a97c2a1fSXin Li break;
974*a97c2a1fSXin Li }
975*a97c2a1fSXin Li }
976*a97c2a1fSXin Li i4_cur_row = ps_dec->u2_mb_y + 1;
977*a97c2a1fSXin Li
978*a97c2a1fSXin Li i4_continue_decode = 1;
979*a97c2a1fSXin Li
980*a97c2a1fSXin Li i4_dequeue_job = 1;
981*a97c2a1fSXin Li do
982*a97c2a1fSXin Li {
983*a97c2a1fSXin Li if(i4_cur_row > ps_dec->u2_num_vert_mb)
984*a97c2a1fSXin Li {
985*a97c2a1fSXin Li i4_continue_decode = 0;
986*a97c2a1fSXin Li break;
987*a97c2a1fSXin Li }
988*a97c2a1fSXin Li
989*a97c2a1fSXin Li if((ps_dec->i4_num_cores> 1) && (i4_dequeue_job))
990*a97c2a1fSXin Li {
991*a97c2a1fSXin Li job_t s_job;
992*a97c2a1fSXin Li IV_API_CALL_STATUS_T e_ret;
993*a97c2a1fSXin Li UWORD8 *pu1_buf;
994*a97c2a1fSXin Li
995*a97c2a1fSXin Li e_ret = impeg2_jobq_dequeue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 1);
996*a97c2a1fSXin Li if(e_ret != IV_SUCCESS)
997*a97c2a1fSXin Li break;
998*a97c2a1fSXin Li
999*a97c2a1fSXin Li if(CMD_PROCESS == s_job.i4_cmd)
1000*a97c2a1fSXin Li {
1001*a97c2a1fSXin Li pu1_buf = ps_dec->pu1_inp_bits_buf + s_job.i4_bistream_ofst;
1002*a97c2a1fSXin Li impeg2d_bit_stream_init(&(ps_dec->s_bit_stream), pu1_buf,
1003*a97c2a1fSXin Li (ps_dec->u4_num_inp_bytes - s_job.i4_bistream_ofst));
1004*a97c2a1fSXin Li i4_cur_row = s_job.i2_start_mb_y;
1005*a97c2a1fSXin Li ps_dec->i4_start_mb_y = s_job.i2_start_mb_y;
1006*a97c2a1fSXin Li ps_dec->i4_end_mb_y = s_job.i2_end_mb_y;
1007*a97c2a1fSXin Li ps_dec->u2_mb_x = 0;
1008*a97c2a1fSXin Li ps_dec->u2_mb_y = ps_dec->i4_start_mb_y;
1009*a97c2a1fSXin Li ps_dec->u2_num_mbs_left = (ps_dec->i4_end_mb_y - ps_dec->i4_start_mb_y) * ps_dec->u2_num_horiz_mb;
1010*a97c2a1fSXin Li
1011*a97c2a1fSXin Li }
1012*a97c2a1fSXin Li else
1013*a97c2a1fSXin Li {
1014*a97c2a1fSXin Li WORD32 start_row;
1015*a97c2a1fSXin Li WORD32 num_rows;
1016*a97c2a1fSXin Li start_row = s_job.i2_start_mb_y << 4;
1017*a97c2a1fSXin Li num_rows = MIN((s_job.i2_end_mb_y << 4), ps_dec->u2_vertical_size);
1018*a97c2a1fSXin Li num_rows -= start_row;
1019*a97c2a1fSXin Li
1020*a97c2a1fSXin Li if(ps_dec->u4_deinterlace && (0 == ps_dec->u2_progressive_frame))
1021*a97c2a1fSXin Li {
1022*a97c2a1fSXin Li impeg2d_deinterlace(ps_dec,
1023*a97c2a1fSXin Li ps_dec->ps_disp_pic,
1024*a97c2a1fSXin Li ps_dec->ps_disp_frm_buf,
1025*a97c2a1fSXin Li start_row,
1026*a97c2a1fSXin Li num_rows);
1027*a97c2a1fSXin Li
1028*a97c2a1fSXin Li }
1029*a97c2a1fSXin Li else
1030*a97c2a1fSXin Li {
1031*a97c2a1fSXin Li impeg2d_format_convert(ps_dec, ps_dec->ps_disp_pic,
1032*a97c2a1fSXin Li ps_dec->ps_disp_frm_buf,
1033*a97c2a1fSXin Li start_row, num_rows);
1034*a97c2a1fSXin Li }
1035*a97c2a1fSXin Li break;
1036*a97c2a1fSXin Li
1037*a97c2a1fSXin Li }
1038*a97c2a1fSXin Li
1039*a97c2a1fSXin Li }
1040*a97c2a1fSXin Li e_error = impeg2d_dec_slice(ps_dec);
1041*a97c2a1fSXin Li
1042*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1043*a97c2a1fSXin Li {
1044*a97c2a1fSXin Li ps_dec->u2_num_mbs_left = 0;
1045*a97c2a1fSXin Li break;
1046*a97c2a1fSXin Li }
1047*a97c2a1fSXin Li
1048*a97c2a1fSXin Li /* Detecting next slice start code */
1049*a97c2a1fSXin Li while(1)
1050*a97c2a1fSXin Li {
1051*a97c2a1fSXin Li // skip (dec->u4_num_cores-1) rows
1052*a97c2a1fSXin Li u4_bits_read = impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,START_CODE_LEN);
1053*a97c2a1fSXin Li temp = u4_bits_read & 0xFF;
1054*a97c2a1fSXin Li i4_continue_decode = (((u4_bits_read >> 8) == 0x01) && (temp) && (temp <= 0xAF));
1055*a97c2a1fSXin Li
1056*a97c2a1fSXin Li if (1 == ps_dec->i4_num_cores && 0 == ps_dec->u2_num_mbs_left)
1057*a97c2a1fSXin Li {
1058*a97c2a1fSXin Li i4_continue_decode = 0;
1059*a97c2a1fSXin Li #ifdef __ANDROID__
1060*a97c2a1fSXin Li android_errorWriteLog(0x534e4554, "26070014");
1061*a97c2a1fSXin Li #endif
1062*a97c2a1fSXin Li }
1063*a97c2a1fSXin Li
1064*a97c2a1fSXin Li if(i4_continue_decode)
1065*a97c2a1fSXin Li {
1066*a97c2a1fSXin Li if (0 != ps_dec->u2_num_mbs_left)
1067*a97c2a1fSXin Li {
1068*a97c2a1fSXin Li /* If the slice is from the same row, then continue decoding without dequeue */
1069*a97c2a1fSXin Li if((temp - 1) == i4_cur_row)
1070*a97c2a1fSXin Li {
1071*a97c2a1fSXin Li i4_dequeue_job = 0;
1072*a97c2a1fSXin Li }
1073*a97c2a1fSXin Li else
1074*a97c2a1fSXin Li {
1075*a97c2a1fSXin Li if(temp < ps_dec->i4_end_mb_y)
1076*a97c2a1fSXin Li {
1077*a97c2a1fSXin Li i4_cur_row = ps_dec->u2_mb_y;
1078*a97c2a1fSXin Li }
1079*a97c2a1fSXin Li else
1080*a97c2a1fSXin Li {
1081*a97c2a1fSXin Li i4_dequeue_job = 1;
1082*a97c2a1fSXin Li }
1083*a97c2a1fSXin Li }
1084*a97c2a1fSXin Li }
1085*a97c2a1fSXin Li else
1086*a97c2a1fSXin Li {
1087*a97c2a1fSXin Li i4_dequeue_job = 1;
1088*a97c2a1fSXin Li }
1089*a97c2a1fSXin Li break;
1090*a97c2a1fSXin Li }
1091*a97c2a1fSXin Li else
1092*a97c2a1fSXin Li break;
1093*a97c2a1fSXin Li }
1094*a97c2a1fSXin Li
1095*a97c2a1fSXin Li }while(i4_continue_decode);
1096*a97c2a1fSXin Li if(ps_dec->i4_num_cores > 1)
1097*a97c2a1fSXin Li {
1098*a97c2a1fSXin Li while(1)
1099*a97c2a1fSXin Li {
1100*a97c2a1fSXin Li job_t s_job;
1101*a97c2a1fSXin Li IV_API_CALL_STATUS_T e_ret;
1102*a97c2a1fSXin Li
1103*a97c2a1fSXin Li e_ret = impeg2_jobq_dequeue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 1);
1104*a97c2a1fSXin Li if(e_ret != IV_SUCCESS)
1105*a97c2a1fSXin Li break;
1106*a97c2a1fSXin Li if(CMD_FMTCONV == s_job.i4_cmd)
1107*a97c2a1fSXin Li {
1108*a97c2a1fSXin Li WORD32 start_row;
1109*a97c2a1fSXin Li WORD32 num_rows;
1110*a97c2a1fSXin Li start_row = s_job.i2_start_mb_y << 4;
1111*a97c2a1fSXin Li num_rows = MIN((s_job.i2_end_mb_y << 4), ps_dec->u2_vertical_size);
1112*a97c2a1fSXin Li num_rows -= start_row;
1113*a97c2a1fSXin Li if(ps_dec->u4_deinterlace && (0 == ps_dec->u2_progressive_frame))
1114*a97c2a1fSXin Li {
1115*a97c2a1fSXin Li impeg2d_deinterlace(ps_dec,
1116*a97c2a1fSXin Li ps_dec->ps_disp_pic,
1117*a97c2a1fSXin Li ps_dec->ps_disp_frm_buf,
1118*a97c2a1fSXin Li start_row,
1119*a97c2a1fSXin Li num_rows);
1120*a97c2a1fSXin Li
1121*a97c2a1fSXin Li }
1122*a97c2a1fSXin Li else
1123*a97c2a1fSXin Li {
1124*a97c2a1fSXin Li impeg2d_format_convert(ps_dec,
1125*a97c2a1fSXin Li ps_dec->ps_disp_pic,
1126*a97c2a1fSXin Li ps_dec->ps_disp_frm_buf,
1127*a97c2a1fSXin Li start_row,
1128*a97c2a1fSXin Li num_rows);
1129*a97c2a1fSXin Li }
1130*a97c2a1fSXin Li }
1131*a97c2a1fSXin Li }
1132*a97c2a1fSXin Li }
1133*a97c2a1fSXin Li else
1134*a97c2a1fSXin Li {
1135*a97c2a1fSXin Li if((NULL != ps_dec->ps_disp_pic) && ((0 == ps_dec->u4_share_disp_buf) || (IV_YUV_420P != ps_dec->i4_chromaFormat)))
1136*a97c2a1fSXin Li {
1137*a97c2a1fSXin Li if(ps_dec->u4_deinterlace && (0 == ps_dec->u2_progressive_frame))
1138*a97c2a1fSXin Li {
1139*a97c2a1fSXin Li impeg2d_deinterlace(ps_dec,
1140*a97c2a1fSXin Li ps_dec->ps_disp_pic,
1141*a97c2a1fSXin Li ps_dec->ps_disp_frm_buf,
1142*a97c2a1fSXin Li 0,
1143*a97c2a1fSXin Li ps_dec->u2_vertical_size);
1144*a97c2a1fSXin Li
1145*a97c2a1fSXin Li }
1146*a97c2a1fSXin Li else
1147*a97c2a1fSXin Li {
1148*a97c2a1fSXin Li impeg2d_format_convert(ps_dec, ps_dec->ps_disp_pic,
1149*a97c2a1fSXin Li ps_dec->ps_disp_frm_buf,
1150*a97c2a1fSXin Li 0, ps_dec->u2_vertical_size);
1151*a97c2a1fSXin Li }
1152*a97c2a1fSXin Li }
1153*a97c2a1fSXin Li }
1154*a97c2a1fSXin Li if(ps_dec->i4_threads_active)
1155*a97c2a1fSXin Li {
1156*a97c2a1fSXin Li if(id != 0)
1157*a97c2a1fSXin Li {
1158*a97c2a1fSXin Li e_error = ithread_mutex_lock(ps_dec->pv_proc_done_mutex);
1159*a97c2a1fSXin Li if((IMPEG2D_ERROR_CODES_T)IV_SUCCESS != e_error)
1160*a97c2a1fSXin Li break;
1161*a97c2a1fSXin Li
1162*a97c2a1fSXin Li ps_dec->ai4_process_done = 1;
1163*a97c2a1fSXin Li ithread_cond_signal(ps_dec->pv_proc_done_condition);
1164*a97c2a1fSXin Li
1165*a97c2a1fSXin Li e_error = ithread_mutex_unlock(ps_dec->pv_proc_done_mutex);
1166*a97c2a1fSXin Li if((IMPEG2D_ERROR_CODES_T)IV_SUCCESS != e_error)
1167*a97c2a1fSXin Li break;
1168*a97c2a1fSXin Li }
1169*a97c2a1fSXin Li else
1170*a97c2a1fSXin Li {
1171*a97c2a1fSXin Li break;
1172*a97c2a1fSXin Li }
1173*a97c2a1fSXin Li }
1174*a97c2a1fSXin Li else
1175*a97c2a1fSXin Li {
1176*a97c2a1fSXin Li break;
1177*a97c2a1fSXin Li }
1178*a97c2a1fSXin Li }
1179*a97c2a1fSXin Li }
1180*a97c2a1fSXin Li
impeg2d_init_thread_dec_ctxt(dec_state_t * ps_dec,dec_state_t * ps_dec_thd,WORD32 i4_min_mb_y)1181*a97c2a1fSXin Li static WORD32 impeg2d_init_thread_dec_ctxt(dec_state_t *ps_dec,
1182*a97c2a1fSXin Li dec_state_t *ps_dec_thd,
1183*a97c2a1fSXin Li WORD32 i4_min_mb_y)
1184*a97c2a1fSXin Li {
1185*a97c2a1fSXin Li UNUSED(i4_min_mb_y);
1186*a97c2a1fSXin Li ps_dec_thd->i4_start_mb_y = 0;
1187*a97c2a1fSXin Li ps_dec_thd->i4_end_mb_y = ps_dec->u2_num_vert_mb;
1188*a97c2a1fSXin Li ps_dec_thd->u2_mb_x = 0;
1189*a97c2a1fSXin Li ps_dec_thd->u2_mb_y = 0;
1190*a97c2a1fSXin Li ps_dec_thd->u2_is_mpeg2 = ps_dec->u2_is_mpeg2;
1191*a97c2a1fSXin Li ps_dec_thd->i4_pic_count = ps_dec->i4_pic_count;
1192*a97c2a1fSXin Li ps_dec_thd->u2_frame_width = ps_dec->u2_frame_width;
1193*a97c2a1fSXin Li ps_dec_thd->u2_frame_height = ps_dec->u2_frame_height;
1194*a97c2a1fSXin Li ps_dec_thd->u2_picture_width = ps_dec->u2_picture_width;
1195*a97c2a1fSXin Li ps_dec_thd->u2_horizontal_size = ps_dec->u2_horizontal_size;
1196*a97c2a1fSXin Li ps_dec_thd->u2_vertical_size = ps_dec->u2_vertical_size;
1197*a97c2a1fSXin Li ps_dec_thd->u2_create_max_width = ps_dec->u2_create_max_width;
1198*a97c2a1fSXin Li ps_dec_thd->u2_create_max_height = ps_dec->u2_create_max_height;
1199*a97c2a1fSXin Li ps_dec_thd->u2_header_done = ps_dec->u2_header_done;
1200*a97c2a1fSXin Li ps_dec_thd->u2_decode_header = ps_dec->u2_decode_header;
1201*a97c2a1fSXin Li
1202*a97c2a1fSXin Li ps_dec_thd->u2_num_horiz_mb = ps_dec->u2_num_horiz_mb;
1203*a97c2a1fSXin Li ps_dec_thd->u2_num_vert_mb = ps_dec->u2_num_vert_mb;
1204*a97c2a1fSXin Li ps_dec_thd->u2_num_flds_decoded = ps_dec->u2_num_flds_decoded;
1205*a97c2a1fSXin Li
1206*a97c2a1fSXin Li ps_dec_thd->u4_frm_buf_stride = ps_dec->u4_frm_buf_stride;
1207*a97c2a1fSXin Li
1208*a97c2a1fSXin Li ps_dec_thd->u2_field_dct = ps_dec->u2_field_dct;
1209*a97c2a1fSXin Li ps_dec_thd->u2_read_dct_type = ps_dec->u2_read_dct_type;
1210*a97c2a1fSXin Li
1211*a97c2a1fSXin Li ps_dec_thd->u2_read_motion_type = ps_dec->u2_read_motion_type;
1212*a97c2a1fSXin Li ps_dec_thd->u2_motion_type = ps_dec->u2_motion_type;
1213*a97c2a1fSXin Li
1214*a97c2a1fSXin Li ps_dec_thd->pu2_mb_type = ps_dec->pu2_mb_type;
1215*a97c2a1fSXin Li ps_dec_thd->u2_fld_pic = ps_dec->u2_fld_pic;
1216*a97c2a1fSXin Li ps_dec_thd->u2_frm_pic = ps_dec->u2_frm_pic;
1217*a97c2a1fSXin Li
1218*a97c2a1fSXin Li ps_dec_thd->u2_fld_parity = ps_dec->u2_fld_parity;
1219*a97c2a1fSXin Li
1220*a97c2a1fSXin Li ps_dec_thd->au2_fcode_data[0] = ps_dec->au2_fcode_data[0];
1221*a97c2a1fSXin Li ps_dec_thd->au2_fcode_data[1] = ps_dec->au2_fcode_data[1];
1222*a97c2a1fSXin Li
1223*a97c2a1fSXin Li ps_dec_thd->u1_quant_scale = ps_dec->u1_quant_scale;
1224*a97c2a1fSXin Li
1225*a97c2a1fSXin Li ps_dec_thd->u2_num_mbs_left = ps_dec->u2_num_mbs_left;
1226*a97c2a1fSXin Li ps_dec_thd->u2_first_mb = ps_dec->u2_first_mb;
1227*a97c2a1fSXin Li ps_dec_thd->u2_num_skipped_mbs = ps_dec->u2_num_skipped_mbs;
1228*a97c2a1fSXin Li
1229*a97c2a1fSXin Li memcpy(&ps_dec_thd->s_cur_frm_buf, &ps_dec->s_cur_frm_buf, sizeof(yuv_buf_t));
1230*a97c2a1fSXin Li memcpy(&ps_dec_thd->as_recent_fld[0][0], &ps_dec->as_recent_fld[0][0], sizeof(yuv_buf_t));
1231*a97c2a1fSXin Li memcpy(&ps_dec_thd->as_recent_fld[0][1], &ps_dec->as_recent_fld[0][1], sizeof(yuv_buf_t));
1232*a97c2a1fSXin Li memcpy(&ps_dec_thd->as_recent_fld[1][0], &ps_dec->as_recent_fld[1][0], sizeof(yuv_buf_t));
1233*a97c2a1fSXin Li memcpy(&ps_dec_thd->as_recent_fld[1][1], &ps_dec->as_recent_fld[1][1], sizeof(yuv_buf_t));
1234*a97c2a1fSXin Li memcpy(&ps_dec_thd->as_ref_buf, &ps_dec->as_ref_buf, sizeof(yuv_buf_t) * 2 * 2);
1235*a97c2a1fSXin Li
1236*a97c2a1fSXin Li
1237*a97c2a1fSXin Li ps_dec_thd->pf_decode_slice = ps_dec->pf_decode_slice;
1238*a97c2a1fSXin Li
1239*a97c2a1fSXin Li ps_dec_thd->pf_vld_inv_quant = ps_dec->pf_vld_inv_quant;
1240*a97c2a1fSXin Li
1241*a97c2a1fSXin Li memcpy(ps_dec_thd->pf_idct_recon, ps_dec->pf_idct_recon, sizeof(ps_dec->pf_idct_recon));
1242*a97c2a1fSXin Li
1243*a97c2a1fSXin Li memcpy(ps_dec_thd->pf_mc, ps_dec->pf_mc, sizeof(ps_dec->pf_mc));
1244*a97c2a1fSXin Li ps_dec_thd->pf_interpolate = ps_dec->pf_interpolate;
1245*a97c2a1fSXin Li ps_dec_thd->pf_copy_mb = ps_dec->pf_copy_mb;
1246*a97c2a1fSXin Li ps_dec_thd->pf_fullx_halfy_8x8 = ps_dec->pf_fullx_halfy_8x8;
1247*a97c2a1fSXin Li ps_dec_thd->pf_halfx_fully_8x8 = ps_dec->pf_halfx_fully_8x8;
1248*a97c2a1fSXin Li ps_dec_thd->pf_halfx_halfy_8x8 = ps_dec->pf_halfx_halfy_8x8;
1249*a97c2a1fSXin Li ps_dec_thd->pf_fullx_fully_8x8 = ps_dec->pf_fullx_fully_8x8;
1250*a97c2a1fSXin Li
1251*a97c2a1fSXin Li ps_dec_thd->pf_memset_8bit_8x8_block = ps_dec->pf_memset_8bit_8x8_block;
1252*a97c2a1fSXin Li ps_dec_thd->pf_memset_16bit_8x8_linear_block = ps_dec->pf_memset_16bit_8x8_linear_block;
1253*a97c2a1fSXin Li ps_dec_thd->pf_copy_yuv420p_buf = ps_dec->pf_copy_yuv420p_buf;
1254*a97c2a1fSXin Li ps_dec_thd->pf_fmt_conv_yuv420p_to_yuv422ile = ps_dec->pf_fmt_conv_yuv420p_to_yuv422ile;
1255*a97c2a1fSXin Li ps_dec_thd->pf_fmt_conv_yuv420p_to_yuv420sp_uv = ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_uv;
1256*a97c2a1fSXin Li ps_dec_thd->pf_fmt_conv_yuv420p_to_yuv420sp_vu = ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_vu;
1257*a97c2a1fSXin Li
1258*a97c2a1fSXin Li
1259*a97c2a1fSXin Li memcpy(ps_dec_thd->au1_intra_quant_matrix, ps_dec->au1_intra_quant_matrix, NUM_PELS_IN_BLOCK * sizeof(UWORD8));
1260*a97c2a1fSXin Li memcpy(ps_dec_thd->au1_inter_quant_matrix, ps_dec->au1_inter_quant_matrix, NUM_PELS_IN_BLOCK * sizeof(UWORD8));
1261*a97c2a1fSXin Li ps_dec_thd->pu1_inv_scan_matrix = ps_dec->pu1_inv_scan_matrix;
1262*a97c2a1fSXin Li
1263*a97c2a1fSXin Li
1264*a97c2a1fSXin Li ps_dec_thd->u2_progressive_sequence = ps_dec->u2_progressive_sequence;
1265*a97c2a1fSXin Li ps_dec_thd->e_pic_type = ps_dec->e_pic_type;
1266*a97c2a1fSXin Li ps_dec_thd->u2_full_pel_forw_vector = ps_dec->u2_full_pel_forw_vector;
1267*a97c2a1fSXin Li ps_dec_thd->u2_forw_f_code = ps_dec->u2_forw_f_code;
1268*a97c2a1fSXin Li ps_dec_thd->u2_full_pel_back_vector = ps_dec->u2_full_pel_back_vector;
1269*a97c2a1fSXin Li ps_dec_thd->u2_back_f_code = ps_dec->u2_back_f_code;
1270*a97c2a1fSXin Li
1271*a97c2a1fSXin Li memcpy(ps_dec_thd->ai2_mv, ps_dec->ai2_mv, (2*2*2)*sizeof(WORD16));
1272*a97c2a1fSXin Li memcpy(ps_dec_thd->au2_f_code, ps_dec->au2_f_code, (2*2)*sizeof(UWORD16));
1273*a97c2a1fSXin Li ps_dec_thd->u2_intra_dc_precision = ps_dec->u2_intra_dc_precision;
1274*a97c2a1fSXin Li ps_dec_thd->u2_picture_structure = ps_dec->u2_picture_structure;
1275*a97c2a1fSXin Li ps_dec_thd->u2_top_field_first = ps_dec->u2_top_field_first;
1276*a97c2a1fSXin Li ps_dec_thd->u2_frame_pred_frame_dct = ps_dec->u2_frame_pred_frame_dct;
1277*a97c2a1fSXin Li ps_dec_thd->u2_concealment_motion_vectors = ps_dec->u2_concealment_motion_vectors;
1278*a97c2a1fSXin Li ps_dec_thd->u2_q_scale_type = ps_dec->u2_q_scale_type;
1279*a97c2a1fSXin Li ps_dec_thd->u2_intra_vlc_format = ps_dec->u2_intra_vlc_format;
1280*a97c2a1fSXin Li ps_dec_thd->u2_alternate_scan = ps_dec->u2_alternate_scan;
1281*a97c2a1fSXin Li ps_dec_thd->u2_repeat_first_field = ps_dec->u2_repeat_first_field;
1282*a97c2a1fSXin Li ps_dec_thd->u2_progressive_frame = ps_dec->u2_progressive_frame;
1283*a97c2a1fSXin Li ps_dec_thd->pu1_inp_bits_buf = ps_dec->pu1_inp_bits_buf;
1284*a97c2a1fSXin Li ps_dec_thd->u4_num_inp_bytes = ps_dec->u4_num_inp_bytes;
1285*a97c2a1fSXin Li ps_dec_thd->pv_jobq = ps_dec->pv_jobq;
1286*a97c2a1fSXin Li ps_dec_thd->pv_jobq_buf = ps_dec->pv_jobq_buf;
1287*a97c2a1fSXin Li ps_dec_thd->i4_jobq_buf_size = ps_dec->i4_jobq_buf_size;
1288*a97c2a1fSXin Li
1289*a97c2a1fSXin Li
1290*a97c2a1fSXin Li ps_dec_thd->u2_frame_rate_code = ps_dec->u2_frame_rate_code;
1291*a97c2a1fSXin Li ps_dec_thd->u2_frame_rate_extension_n = ps_dec->u2_frame_rate_extension_n;
1292*a97c2a1fSXin Li ps_dec_thd->u2_frame_rate_extension_d = ps_dec->u2_frame_rate_extension_d;
1293*a97c2a1fSXin Li ps_dec_thd->u2_framePeriod = ps_dec->u2_framePeriod;
1294*a97c2a1fSXin Li ps_dec_thd->u2_display_horizontal_size = ps_dec->u2_display_horizontal_size;
1295*a97c2a1fSXin Li ps_dec_thd->u2_display_vertical_size = ps_dec->u2_display_vertical_size;
1296*a97c2a1fSXin Li ps_dec_thd->u2_aspect_ratio_info = ps_dec->u2_aspect_ratio_info;
1297*a97c2a1fSXin Li
1298*a97c2a1fSXin Li ps_dec_thd->ps_func_bi_direct = ps_dec->ps_func_bi_direct;
1299*a97c2a1fSXin Li ps_dec_thd->ps_func_forw_or_back = ps_dec->ps_func_forw_or_back;
1300*a97c2a1fSXin Li ps_dec_thd->pv_deinterlacer_ctxt = ps_dec->pv_deinterlacer_ctxt;
1301*a97c2a1fSXin Li ps_dec_thd->ps_deint_pic = ps_dec->ps_deint_pic;
1302*a97c2a1fSXin Li ps_dec_thd->pu1_deint_fmt_buf = ps_dec->pu1_deint_fmt_buf;
1303*a97c2a1fSXin Li
1304*a97c2a1fSXin Li return 0;
1305*a97c2a1fSXin Li }
1306*a97c2a1fSXin Li
1307*a97c2a1fSXin Li
impeg2d_get_slice_pos(dec_state_multi_core_t * ps_dec_state_multi_core)1308*a97c2a1fSXin Li WORD32 impeg2d_get_slice_pos(dec_state_multi_core_t *ps_dec_state_multi_core)
1309*a97c2a1fSXin Li {
1310*a97c2a1fSXin Li WORD32 u4_bits;
1311*a97c2a1fSXin Li WORD32 i4_row;
1312*a97c2a1fSXin Li
1313*a97c2a1fSXin Li
1314*a97c2a1fSXin Li dec_state_t *ps_dec = ps_dec_state_multi_core->ps_dec_state[0];
1315*a97c2a1fSXin Li WORD32 i4_prev_row;
1316*a97c2a1fSXin Li stream_t s_bitstrm;
1317*a97c2a1fSXin Li WORD32 i4_start_row;
1318*a97c2a1fSXin Li WORD32 i4_slice_bistream_ofst;
1319*a97c2a1fSXin Li WORD32 i;
1320*a97c2a1fSXin Li s_bitstrm = ps_dec->s_bit_stream;
1321*a97c2a1fSXin Li i4_prev_row = -1;
1322*a97c2a1fSXin Li
1323*a97c2a1fSXin Li ps_dec_state_multi_core->ps_dec_state[0]->i4_start_mb_y = 0;
1324*a97c2a1fSXin Li ps_dec_state_multi_core->ps_dec_state[1]->i4_start_mb_y = -1;
1325*a97c2a1fSXin Li ps_dec_state_multi_core->ps_dec_state[2]->i4_start_mb_y = -1;
1326*a97c2a1fSXin Li ps_dec_state_multi_core->ps_dec_state[3]->i4_start_mb_y = -1;
1327*a97c2a1fSXin Li
1328*a97c2a1fSXin Li ps_dec_state_multi_core->ps_dec_state[0]->i4_end_mb_y = ps_dec->u2_num_vert_mb;
1329*a97c2a1fSXin Li ps_dec_state_multi_core->ps_dec_state[1]->i4_end_mb_y = -1;
1330*a97c2a1fSXin Li ps_dec_state_multi_core->ps_dec_state[2]->i4_end_mb_y = -1;
1331*a97c2a1fSXin Li ps_dec_state_multi_core->ps_dec_state[3]->i4_end_mb_y = -1;
1332*a97c2a1fSXin Li
1333*a97c2a1fSXin Li if(ps_dec->i4_num_cores == 1)
1334*a97c2a1fSXin Li return 0;
1335*a97c2a1fSXin Li /* Reset the jobq to start of the jobq buffer */
1336*a97c2a1fSXin Li impeg2_jobq_reset((jobq_t *)ps_dec->pv_jobq);
1337*a97c2a1fSXin Li
1338*a97c2a1fSXin Li i4_start_row = -1;
1339*a97c2a1fSXin Li i4_slice_bistream_ofst = 0;
1340*a97c2a1fSXin Li while(1)
1341*a97c2a1fSXin Li {
1342*a97c2a1fSXin Li WORD32 i4_is_slice;
1343*a97c2a1fSXin Li
1344*a97c2a1fSXin Li if(s_bitstrm.u4_offset + START_CODE_LEN >= s_bitstrm.u4_max_offset)
1345*a97c2a1fSXin Li {
1346*a97c2a1fSXin Li break;
1347*a97c2a1fSXin Li }
1348*a97c2a1fSXin Li u4_bits = impeg2d_bit_stream_nxt(&s_bitstrm,START_CODE_LEN);
1349*a97c2a1fSXin Li
1350*a97c2a1fSXin Li i4_row = u4_bits & 0xFF;
1351*a97c2a1fSXin Li
1352*a97c2a1fSXin Li /* Detect end of frame */
1353*a97c2a1fSXin Li i4_is_slice = (((u4_bits >> 8) == 0x01) && (i4_row) && (i4_row <= ps_dec->u2_num_vert_mb));
1354*a97c2a1fSXin Li if(!i4_is_slice)
1355*a97c2a1fSXin Li break;
1356*a97c2a1fSXin Li
1357*a97c2a1fSXin Li i4_row -= 1;
1358*a97c2a1fSXin Li
1359*a97c2a1fSXin Li
1360*a97c2a1fSXin Li if(i4_prev_row < i4_row)
1361*a97c2a1fSXin Li {
1362*a97c2a1fSXin Li /* Create a job for previous slice row */
1363*a97c2a1fSXin Li if(i4_start_row != -1)
1364*a97c2a1fSXin Li {
1365*a97c2a1fSXin Li job_t s_job;
1366*a97c2a1fSXin Li IV_API_CALL_STATUS_T ret;
1367*a97c2a1fSXin Li s_job.i2_start_mb_y = i4_start_row;
1368*a97c2a1fSXin Li s_job.i2_end_mb_y = i4_row;
1369*a97c2a1fSXin Li s_job.i4_cmd = CMD_PROCESS;
1370*a97c2a1fSXin Li s_job.i4_bistream_ofst = i4_slice_bistream_ofst;
1371*a97c2a1fSXin Li ret = impeg2_jobq_queue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 0);
1372*a97c2a1fSXin Li if(ret != IV_SUCCESS)
1373*a97c2a1fSXin Li return ret;
1374*a97c2a1fSXin Li
1375*a97c2a1fSXin Li }
1376*a97c2a1fSXin Li /* Store current slice's bitstream offset */
1377*a97c2a1fSXin Li i4_slice_bistream_ofst = s_bitstrm.u4_offset >> 3;
1378*a97c2a1fSXin Li i4_slice_bistream_ofst -= (size_t)s_bitstrm.pv_bs_buf & 3;
1379*a97c2a1fSXin Li i4_prev_row = i4_row;
1380*a97c2a1fSXin Li
1381*a97c2a1fSXin Li /* Store current slice's row position */
1382*a97c2a1fSXin Li i4_start_row = i4_row;
1383*a97c2a1fSXin Li
1384*a97c2a1fSXin Li }
1385*a97c2a1fSXin Li #ifdef __ANDROID__
1386*a97c2a1fSXin Li else if (i4_prev_row > i4_row)
1387*a97c2a1fSXin Li {
1388*a97c2a1fSXin Li android_errorWriteLog(0x534e4554, "26070014");
1389*a97c2a1fSXin Li }
1390*a97c2a1fSXin Li #endif
1391*a97c2a1fSXin Li
1392*a97c2a1fSXin Li impeg2d_bit_stream_flush(&s_bitstrm, START_CODE_LEN);
1393*a97c2a1fSXin Li
1394*a97c2a1fSXin Li // flush bytes till next start code
1395*a97c2a1fSXin Li /* Flush the bytes till a start code is encountered */
1396*a97c2a1fSXin Li while(impeg2d_bit_stream_nxt(&s_bitstrm, 24) != START_CODE_PREFIX)
1397*a97c2a1fSXin Li {
1398*a97c2a1fSXin Li impeg2d_bit_stream_get(&s_bitstrm, 8);
1399*a97c2a1fSXin Li
1400*a97c2a1fSXin Li if(s_bitstrm.u4_offset >= s_bitstrm.u4_max_offset)
1401*a97c2a1fSXin Li {
1402*a97c2a1fSXin Li break;
1403*a97c2a1fSXin Li }
1404*a97c2a1fSXin Li }
1405*a97c2a1fSXin Li }
1406*a97c2a1fSXin Li
1407*a97c2a1fSXin Li /* Create job for the last slice row */
1408*a97c2a1fSXin Li {
1409*a97c2a1fSXin Li job_t s_job;
1410*a97c2a1fSXin Li IV_API_CALL_STATUS_T e_ret;
1411*a97c2a1fSXin Li s_job.i2_start_mb_y = i4_start_row;
1412*a97c2a1fSXin Li s_job.i2_end_mb_y = ps_dec->u2_num_vert_mb;
1413*a97c2a1fSXin Li s_job.i4_cmd = CMD_PROCESS;
1414*a97c2a1fSXin Li s_job.i4_bistream_ofst = i4_slice_bistream_ofst;
1415*a97c2a1fSXin Li e_ret = impeg2_jobq_queue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 0);
1416*a97c2a1fSXin Li if(e_ret != IV_SUCCESS)
1417*a97c2a1fSXin Li return e_ret;
1418*a97c2a1fSXin Li
1419*a97c2a1fSXin Li }
1420*a97c2a1fSXin Li if((NULL != ps_dec->ps_disp_pic) && ((0 == ps_dec->u4_share_disp_buf) || (IV_YUV_420P != ps_dec->i4_chromaFormat)))
1421*a97c2a1fSXin Li {
1422*a97c2a1fSXin Li for(i = 0; i < ps_dec->u2_vertical_size; i+=64)
1423*a97c2a1fSXin Li {
1424*a97c2a1fSXin Li job_t s_job;
1425*a97c2a1fSXin Li IV_API_CALL_STATUS_T ret;
1426*a97c2a1fSXin Li s_job.i2_start_mb_y = i;
1427*a97c2a1fSXin Li s_job.i2_start_mb_y >>= 4;
1428*a97c2a1fSXin Li s_job.i2_end_mb_y = (i + 64);
1429*a97c2a1fSXin Li s_job.i2_end_mb_y >>= 4;
1430*a97c2a1fSXin Li s_job.i4_cmd = CMD_FMTCONV;
1431*a97c2a1fSXin Li s_job.i4_bistream_ofst = 0;
1432*a97c2a1fSXin Li ret = impeg2_jobq_queue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 0);
1433*a97c2a1fSXin Li if(ret != IV_SUCCESS)
1434*a97c2a1fSXin Li return ret;
1435*a97c2a1fSXin Li
1436*a97c2a1fSXin Li }
1437*a97c2a1fSXin Li }
1438*a97c2a1fSXin Li
1439*a97c2a1fSXin Li impeg2_jobq_terminate(ps_dec->pv_jobq);
1440*a97c2a1fSXin Li ps_dec->i4_bytes_consumed = s_bitstrm.u4_offset >> 3;
1441*a97c2a1fSXin Li ps_dec->i4_bytes_consumed -= ((size_t)s_bitstrm.pv_bs_buf & 3);
1442*a97c2a1fSXin Li
1443*a97c2a1fSXin Li return 0;
1444*a97c2a1fSXin Li }
1445*a97c2a1fSXin Li
1446*a97c2a1fSXin Li /*******************************************************************************
1447*a97c2a1fSXin Li *
1448*a97c2a1fSXin Li * Function Name : impeg2d_dec_pic_data
1449*a97c2a1fSXin Li *
1450*a97c2a1fSXin Li * Description : It intializes several parameters and decodes a Picture
1451*a97c2a1fSXin Li * till any slice is left.
1452*a97c2a1fSXin Li *
1453*a97c2a1fSXin Li * Arguments :
1454*a97c2a1fSXin Li * dec : Decoder context
1455*a97c2a1fSXin Li *
1456*a97c2a1fSXin Li * Values Returned : None
1457*a97c2a1fSXin Li *******************************************************************************/
1458*a97c2a1fSXin Li
impeg2d_dec_pic_data(dec_state_t * ps_dec)1459*a97c2a1fSXin Li void impeg2d_dec_pic_data(dec_state_t *ps_dec)
1460*a97c2a1fSXin Li {
1461*a97c2a1fSXin Li
1462*a97c2a1fSXin Li WORD32 i;
1463*a97c2a1fSXin Li dec_state_multi_core_t *ps_dec_state_multi_core;
1464*a97c2a1fSXin Li
1465*a97c2a1fSXin Li dec_state_t *ps_dec_thd;
1466*a97c2a1fSXin Li WORD32 i4_status;
1467*a97c2a1fSXin Li WORD32 i4_min_mb_y;
1468*a97c2a1fSXin Li
1469*a97c2a1fSXin Li
1470*a97c2a1fSXin Li /* Resetting the MB address and MB coordinates at the start of the Frame */
1471*a97c2a1fSXin Li ps_dec->u2_mb_x = ps_dec->u2_mb_y = 0;
1472*a97c2a1fSXin Li
1473*a97c2a1fSXin Li ps_dec_state_multi_core = ps_dec->ps_dec_state_multi_core;
1474*a97c2a1fSXin Li impeg2d_get_slice_pos(ps_dec_state_multi_core);
1475*a97c2a1fSXin Li
1476*a97c2a1fSXin Li if(ps_dec->i4_threads_active)
1477*a97c2a1fSXin Li {
1478*a97c2a1fSXin Li ps_dec->currThreadId = 0;
1479*a97c2a1fSXin Li }
1480*a97c2a1fSXin Li
1481*a97c2a1fSXin Li i4_min_mb_y = 1;
1482*a97c2a1fSXin Li for(i=1; i < ps_dec->i4_num_cores; i++)
1483*a97c2a1fSXin Li {
1484*a97c2a1fSXin Li // initialize decoder context for thread
1485*a97c2a1fSXin Li // launch dec->u4_num_cores-1 threads
1486*a97c2a1fSXin Li
1487*a97c2a1fSXin Li ps_dec_thd = ps_dec_state_multi_core->ps_dec_state[i];
1488*a97c2a1fSXin Li
1489*a97c2a1fSXin Li ps_dec_thd->ps_disp_pic = ps_dec->ps_disp_pic;
1490*a97c2a1fSXin Li ps_dec_thd->ps_disp_frm_buf = ps_dec->ps_disp_frm_buf;
1491*a97c2a1fSXin Li
1492*a97c2a1fSXin Li i4_status = impeg2d_init_thread_dec_ctxt(ps_dec, ps_dec_thd, i4_min_mb_y);
1493*a97c2a1fSXin Li //impeg2d_dec_pic_data_thread(ps_dec_thd);
1494*a97c2a1fSXin Li
1495*a97c2a1fSXin Li if(i4_status == 0 && !ps_dec_state_multi_core->au4_thread_launched[i])
1496*a97c2a1fSXin Li {
1497*a97c2a1fSXin Li if(ps_dec->i4_threads_active)
1498*a97c2a1fSXin Li {
1499*a97c2a1fSXin Li ps_dec_thd->currThreadId = i;
1500*a97c2a1fSXin Li }
1501*a97c2a1fSXin Li ithread_create(ps_dec_thd->pv_codec_thread_handle, NULL, (void *)impeg2d_dec_pic_data_thread, ps_dec_thd);
1502*a97c2a1fSXin Li ps_dec_state_multi_core->au4_thread_launched[i] = 1;
1503*a97c2a1fSXin Li i4_min_mb_y = ps_dec_thd->u2_mb_y + 1;
1504*a97c2a1fSXin Li }
1505*a97c2a1fSXin Li
1506*a97c2a1fSXin Li else if (!ps_dec->i4_threads_active)
1507*a97c2a1fSXin Li {
1508*a97c2a1fSXin Li ps_dec_state_multi_core->au4_thread_launched[i] = 0;
1509*a97c2a1fSXin Li break;
1510*a97c2a1fSXin Li }
1511*a97c2a1fSXin Li
1512*a97c2a1fSXin Li if(ps_dec->i4_threads_active)
1513*a97c2a1fSXin Li {
1514*a97c2a1fSXin Li i4_status = ithread_mutex_lock(ps_dec_thd->pv_proc_start_mutex);
1515*a97c2a1fSXin Li if((IMPEG2D_ERROR_CODES_T)IV_SUCCESS != i4_status) return;
1516*a97c2a1fSXin Li
1517*a97c2a1fSXin Li ps_dec_thd->ai4_process_start = 1;
1518*a97c2a1fSXin Li ithread_cond_signal(ps_dec_thd->pv_proc_start_condition);
1519*a97c2a1fSXin Li
1520*a97c2a1fSXin Li i4_status = ithread_mutex_unlock(ps_dec_thd->pv_proc_start_mutex);
1521*a97c2a1fSXin Li if((IMPEG2D_ERROR_CODES_T)IV_SUCCESS != i4_status) return;
1522*a97c2a1fSXin Li }
1523*a97c2a1fSXin Li }
1524*a97c2a1fSXin Li
1525*a97c2a1fSXin Li impeg2d_dec_pic_data_thread(ps_dec);
1526*a97c2a1fSXin Li
1527*a97c2a1fSXin Li // wait for threads to complete
1528*a97c2a1fSXin Li for(i=1; i < ps_dec->i4_num_cores; i++)
1529*a97c2a1fSXin Li {
1530*a97c2a1fSXin Li if(ps_dec_state_multi_core->au4_thread_launched[i])
1531*a97c2a1fSXin Li {
1532*a97c2a1fSXin Li ps_dec_thd = ps_dec_state_multi_core->ps_dec_state[i];
1533*a97c2a1fSXin Li if (ps_dec->i4_threads_active)
1534*a97c2a1fSXin Li {
1535*a97c2a1fSXin Li i4_status = ithread_mutex_lock(ps_dec_thd->pv_proc_done_mutex);
1536*a97c2a1fSXin Li if((IMPEG2D_ERROR_CODES_T)IV_SUCCESS != i4_status) return;
1537*a97c2a1fSXin Li
1538*a97c2a1fSXin Li while(!ps_dec_thd->ai4_process_done)
1539*a97c2a1fSXin Li {
1540*a97c2a1fSXin Li ithread_cond_wait(ps_dec_thd->pv_proc_done_condition,
1541*a97c2a1fSXin Li ps_dec_thd->pv_proc_done_mutex);
1542*a97c2a1fSXin Li }
1543*a97c2a1fSXin Li ps_dec_thd->ai4_process_done = 0;
1544*a97c2a1fSXin Li i4_status = ithread_mutex_unlock(ps_dec_thd->pv_proc_done_mutex);
1545*a97c2a1fSXin Li if((IMPEG2D_ERROR_CODES_T)IV_SUCCESS != i4_status) return;
1546*a97c2a1fSXin Li }
1547*a97c2a1fSXin Li else
1548*a97c2a1fSXin Li {
1549*a97c2a1fSXin Li ithread_join(ps_dec_thd->pv_codec_thread_handle, NULL);
1550*a97c2a1fSXin Li ps_dec_state_multi_core->au4_thread_launched[i] = 0;
1551*a97c2a1fSXin Li }
1552*a97c2a1fSXin Li }
1553*a97c2a1fSXin Li }
1554*a97c2a1fSXin Li
1555*a97c2a1fSXin Li }
1556*a97c2a1fSXin Li /*******************************************************************************
1557*a97c2a1fSXin Li *
1558*a97c2a1fSXin Li * Function Name : impeg2d_flush_ext_and_user_data
1559*a97c2a1fSXin Li *
1560*a97c2a1fSXin Li * Description : Flushes the extension and user data present in the
1561*a97c2a1fSXin Li * stream_t
1562*a97c2a1fSXin Li *
1563*a97c2a1fSXin Li * Arguments :
1564*a97c2a1fSXin Li * dec : Decoder context
1565*a97c2a1fSXin Li *
1566*a97c2a1fSXin Li * Values Returned : None
1567*a97c2a1fSXin Li *******************************************************************************/
impeg2d_flush_ext_and_user_data(dec_state_t * ps_dec)1568*a97c2a1fSXin Li void impeg2d_flush_ext_and_user_data(dec_state_t *ps_dec)
1569*a97c2a1fSXin Li {
1570*a97c2a1fSXin Li UWORD32 u4_start_code;
1571*a97c2a1fSXin Li stream_t *ps_stream;
1572*a97c2a1fSXin Li
1573*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
1574*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1575*a97c2a1fSXin Li
1576*a97c2a1fSXin Li while((u4_start_code == EXTENSION_START_CODE || u4_start_code == USER_DATA_START_CODE) &&
1577*a97c2a1fSXin Li (ps_stream->u4_offset < ps_stream->u4_max_offset))
1578*a97c2a1fSXin Li {
1579*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
1580*a97c2a1fSXin Li while(impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX &&
1581*a97c2a1fSXin Li (ps_stream->u4_offset < ps_stream->u4_max_offset))
1582*a97c2a1fSXin Li {
1583*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,8);
1584*a97c2a1fSXin Li }
1585*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1586*a97c2a1fSXin Li }
1587*a97c2a1fSXin Li }
1588*a97c2a1fSXin Li /*******************************************************************************
1589*a97c2a1fSXin Li *
1590*a97c2a1fSXin Li * Function Name : impeg2d_dec_user_data
1591*a97c2a1fSXin Li *
1592*a97c2a1fSXin Li * Description : Flushes the user data present in the stream_t
1593*a97c2a1fSXin Li *
1594*a97c2a1fSXin Li * Arguments :
1595*a97c2a1fSXin Li * dec : Decoder context
1596*a97c2a1fSXin Li *
1597*a97c2a1fSXin Li * Values Returned : None
1598*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_user_data(dec_state_t * ps_dec)1599*a97c2a1fSXin Li void impeg2d_dec_user_data(dec_state_t *ps_dec)
1600*a97c2a1fSXin Li {
1601*a97c2a1fSXin Li UWORD32 u4_start_code;
1602*a97c2a1fSXin Li stream_t *ps_stream;
1603*a97c2a1fSXin Li
1604*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
1605*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1606*a97c2a1fSXin Li
1607*a97c2a1fSXin Li while((u4_start_code == USER_DATA_START_CODE) &&
1608*a97c2a1fSXin Li (ps_stream->u4_offset <= ps_stream->u4_max_offset))
1609*a97c2a1fSXin Li {
1610*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
1611*a97c2a1fSXin Li while((impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX) &&
1612*a97c2a1fSXin Li (ps_stream->u4_offset < ps_stream->u4_max_offset))
1613*a97c2a1fSXin Li {
1614*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,8);
1615*a97c2a1fSXin Li }
1616*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1617*a97c2a1fSXin Li }
1618*a97c2a1fSXin Li }
1619*a97c2a1fSXin Li /*******************************************************************************
1620*a97c2a1fSXin Li * Function Name : impeg2d_dec_seq_ext_data
1621*a97c2a1fSXin Li *
1622*a97c2a1fSXin Li * Description : Decodes the extension data following Sequence
1623*a97c2a1fSXin Li * Extension. It flushes any user data if present
1624*a97c2a1fSXin Li *
1625*a97c2a1fSXin Li * Arguments :
1626*a97c2a1fSXin Li * dec : Decoder context
1627*a97c2a1fSXin Li *
1628*a97c2a1fSXin Li * Values Returned : None
1629*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_seq_ext_data(dec_state_t * ps_dec)1630*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_seq_ext_data(dec_state_t *ps_dec)
1631*a97c2a1fSXin Li {
1632*a97c2a1fSXin Li stream_t *ps_stream;
1633*a97c2a1fSXin Li UWORD32 u4_start_code;
1634*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error;
1635*a97c2a1fSXin Li
1636*a97c2a1fSXin Li e_error = (IMPEG2D_ERROR_CODES_T) IVD_ERROR_NONE;
1637*a97c2a1fSXin Li
1638*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
1639*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1640*a97c2a1fSXin Li while( (u4_start_code == EXTENSION_START_CODE ||
1641*a97c2a1fSXin Li u4_start_code == USER_DATA_START_CODE) &&
1642*a97c2a1fSXin Li (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE == e_error &&
1643*a97c2a1fSXin Li (ps_stream->u4_offset < ps_stream->u4_max_offset))
1644*a97c2a1fSXin Li {
1645*a97c2a1fSXin Li if(u4_start_code == USER_DATA_START_CODE)
1646*a97c2a1fSXin Li {
1647*a97c2a1fSXin Li impeg2d_dec_user_data(ps_dec);
1648*a97c2a1fSXin Li }
1649*a97c2a1fSXin Li else
1650*a97c2a1fSXin Li {
1651*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
1652*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,EXT_ID_LEN);
1653*a97c2a1fSXin Li switch(u4_start_code)
1654*a97c2a1fSXin Li {
1655*a97c2a1fSXin Li case SEQ_DISPLAY_EXT_ID:
1656*a97c2a1fSXin Li impeg2d_dec_seq_disp_ext(ps_dec);
1657*a97c2a1fSXin Li break;
1658*a97c2a1fSXin Li case SEQ_SCALABLE_EXT_ID:
1659*a97c2a1fSXin Li e_error = IMPEG2D_SCALABILITIY_NOT_SUPPORTED;
1660*a97c2a1fSXin Li break;
1661*a97c2a1fSXin Li default:
1662*a97c2a1fSXin Li /* In case its a reserved extension code */
1663*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,EXT_ID_LEN);
1664*a97c2a1fSXin Li impeg2d_peek_next_start_code(ps_dec);
1665*a97c2a1fSXin Li break;
1666*a97c2a1fSXin Li }
1667*a97c2a1fSXin Li }
1668*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1669*a97c2a1fSXin Li }
1670*a97c2a1fSXin Li return e_error;
1671*a97c2a1fSXin Li }
1672*a97c2a1fSXin Li /*******************************************************************************
1673*a97c2a1fSXin Li * Function Name : impeg2d_dec_pic_ext_data
1674*a97c2a1fSXin Li *
1675*a97c2a1fSXin Li * Description : Decodes the extension data following Picture Coding
1676*a97c2a1fSXin Li * Extension. It flushes any user data if present
1677*a97c2a1fSXin Li *
1678*a97c2a1fSXin Li * Arguments :
1679*a97c2a1fSXin Li * dec : Decoder context
1680*a97c2a1fSXin Li *
1681*a97c2a1fSXin Li * Values Returned : None
1682*a97c2a1fSXin Li *******************************************************************************/
impeg2d_dec_pic_ext_data(dec_state_t * ps_dec)1683*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_dec_pic_ext_data(dec_state_t *ps_dec)
1684*a97c2a1fSXin Li {
1685*a97c2a1fSXin Li stream_t *ps_stream;
1686*a97c2a1fSXin Li UWORD32 u4_start_code;
1687*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error;
1688*a97c2a1fSXin Li
1689*a97c2a1fSXin Li e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
1690*a97c2a1fSXin Li
1691*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
1692*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1693*a97c2a1fSXin Li while ( (u4_start_code == EXTENSION_START_CODE ||
1694*a97c2a1fSXin Li u4_start_code == USER_DATA_START_CODE) &&
1695*a97c2a1fSXin Li (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE == e_error &&
1696*a97c2a1fSXin Li (ps_stream->u4_offset < ps_stream->u4_max_offset))
1697*a97c2a1fSXin Li {
1698*a97c2a1fSXin Li if(u4_start_code == USER_DATA_START_CODE)
1699*a97c2a1fSXin Li {
1700*a97c2a1fSXin Li impeg2d_dec_user_data(ps_dec);
1701*a97c2a1fSXin Li }
1702*a97c2a1fSXin Li else
1703*a97c2a1fSXin Li {
1704*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
1705*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,EXT_ID_LEN);
1706*a97c2a1fSXin Li switch(u4_start_code)
1707*a97c2a1fSXin Li {
1708*a97c2a1fSXin Li case QUANT_MATRIX_EXT_ID:
1709*a97c2a1fSXin Li impeg2d_dec_quant_matrix_ext(ps_dec);
1710*a97c2a1fSXin Li break;
1711*a97c2a1fSXin Li case COPYRIGHT_EXT_ID:
1712*a97c2a1fSXin Li impeg2d_dec_copyright_ext(ps_dec);
1713*a97c2a1fSXin Li break;
1714*a97c2a1fSXin Li case PIC_DISPLAY_EXT_ID:
1715*a97c2a1fSXin Li impeg2d_dec_pic_disp_ext(ps_dec);
1716*a97c2a1fSXin Li break;
1717*a97c2a1fSXin Li case CAMERA_PARAM_EXT_ID:
1718*a97c2a1fSXin Li impeg2d_dec_cam_param_ext(ps_dec);
1719*a97c2a1fSXin Li break;
1720*a97c2a1fSXin Li case ITU_T_EXT_ID:
1721*a97c2a1fSXin Li impeg2d_dec_itu_t_ext(ps_dec);
1722*a97c2a1fSXin Li break;
1723*a97c2a1fSXin Li case PIC_SPATIAL_SCALABLE_EXT_ID:
1724*a97c2a1fSXin Li case PIC_TEMPORAL_SCALABLE_EXT_ID:
1725*a97c2a1fSXin Li e_error = IMPEG2D_SCALABLITY_NOT_SUP;
1726*a97c2a1fSXin Li break;
1727*a97c2a1fSXin Li default:
1728*a97c2a1fSXin Li /* In case its a reserved extension code */
1729*a97c2a1fSXin Li impeg2d_bit_stream_flush(ps_stream,EXT_ID_LEN);
1730*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
1731*a97c2a1fSXin Li break;
1732*a97c2a1fSXin Li }
1733*a97c2a1fSXin Li }
1734*a97c2a1fSXin Li u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1735*a97c2a1fSXin Li }
1736*a97c2a1fSXin Li return e_error;
1737*a97c2a1fSXin Li }
1738*a97c2a1fSXin Li
1739*a97c2a1fSXin Li /*******************************************************************************
1740*a97c2a1fSXin Li *
1741*a97c2a1fSXin Li * Function Name : impeg2d_process_video_header
1742*a97c2a1fSXin Li *
1743*a97c2a1fSXin Li * Description : Processes video sequence header information
1744*a97c2a1fSXin Li *
1745*a97c2a1fSXin Li * Arguments :
1746*a97c2a1fSXin Li * dec : Decoder context
1747*a97c2a1fSXin Li *
1748*a97c2a1fSXin Li * Values Returned : None
1749*a97c2a1fSXin Li *******************************************************************************/
impeg2d_process_video_header(dec_state_t * ps_dec)1750*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_process_video_header(dec_state_t *ps_dec)
1751*a97c2a1fSXin Li {
1752*a97c2a1fSXin Li stream_t *ps_stream;
1753*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
1754*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error;
1755*a97c2a1fSXin Li
1756*a97c2a1fSXin Li impeg2d_next_code(ps_dec, SEQUENCE_HEADER_CODE);
1757*a97c2a1fSXin Li if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1758*a97c2a1fSXin Li {
1759*a97c2a1fSXin Li e_error = impeg2d_dec_seq_hdr(ps_dec);
1760*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1761*a97c2a1fSXin Li {
1762*a97c2a1fSXin Li return e_error;
1763*a97c2a1fSXin Li }
1764*a97c2a1fSXin Li }
1765*a97c2a1fSXin Li else
1766*a97c2a1fSXin Li {
1767*a97c2a1fSXin Li return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
1768*a97c2a1fSXin Li }
1769*a97c2a1fSXin Li if (impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) == EXTENSION_START_CODE)
1770*a97c2a1fSXin Li {
1771*a97c2a1fSXin Li /* MPEG2 Decoder */
1772*a97c2a1fSXin Li if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1773*a97c2a1fSXin Li {
1774*a97c2a1fSXin Li e_error = impeg2d_dec_seq_ext(ps_dec);
1775*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1776*a97c2a1fSXin Li {
1777*a97c2a1fSXin Li return e_error;
1778*a97c2a1fSXin Li }
1779*a97c2a1fSXin Li }
1780*a97c2a1fSXin Li else
1781*a97c2a1fSXin Li {
1782*a97c2a1fSXin Li return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
1783*a97c2a1fSXin Li }
1784*a97c2a1fSXin Li if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1785*a97c2a1fSXin Li {
1786*a97c2a1fSXin Li e_error = impeg2d_dec_seq_ext_data(ps_dec);
1787*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1788*a97c2a1fSXin Li {
1789*a97c2a1fSXin Li return e_error;
1790*a97c2a1fSXin Li }
1791*a97c2a1fSXin Li }
1792*a97c2a1fSXin Li return impeg2d_init_video_state(ps_dec,MPEG_2_VIDEO);
1793*a97c2a1fSXin Li }
1794*a97c2a1fSXin Li else
1795*a97c2a1fSXin Li {
1796*a97c2a1fSXin Li /* MPEG1 Decoder */
1797*a97c2a1fSXin Li if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1798*a97c2a1fSXin Li {
1799*a97c2a1fSXin Li impeg2d_flush_ext_and_user_data(ps_dec);
1800*a97c2a1fSXin Li }
1801*a97c2a1fSXin Li return impeg2d_init_video_state(ps_dec,MPEG_1_VIDEO);
1802*a97c2a1fSXin Li }
1803*a97c2a1fSXin Li }
1804*a97c2a1fSXin Li /*******************************************************************************
1805*a97c2a1fSXin Li *
1806*a97c2a1fSXin Li * Function Name : impeg2d_process_video_bit_stream
1807*a97c2a1fSXin Li *
1808*a97c2a1fSXin Li * Description : Processes video sequence header information
1809*a97c2a1fSXin Li *
1810*a97c2a1fSXin Li * Arguments :
1811*a97c2a1fSXin Li * dec : Decoder context
1812*a97c2a1fSXin Li *
1813*a97c2a1fSXin Li * Values Returned : None
1814*a97c2a1fSXin Li *******************************************************************************/
impeg2d_process_video_bit_stream(dec_state_t * ps_dec)1815*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T impeg2d_process_video_bit_stream(dec_state_t *ps_dec)
1816*a97c2a1fSXin Li {
1817*a97c2a1fSXin Li stream_t *ps_stream;
1818*a97c2a1fSXin Li UWORD32 u4_next_bits, u4_start_code_found;
1819*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error;
1820*a97c2a1fSXin Li
1821*a97c2a1fSXin Li ps_stream = &ps_dec->s_bit_stream;
1822*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
1823*a97c2a1fSXin Li /* If the stream is MPEG-2 compliant stream */
1824*a97c2a1fSXin Li u4_start_code_found = 0;
1825*a97c2a1fSXin Li
1826*a97c2a1fSXin Li if(ps_dec->u2_is_mpeg2)
1827*a97c2a1fSXin Li {
1828*a97c2a1fSXin Li /* MPEG2 decoding starts */
1829*a97c2a1fSXin Li while((u4_start_code_found == 0) && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
1830*a97c2a1fSXin Li {
1831*a97c2a1fSXin Li u4_next_bits = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1832*a97c2a1fSXin Li
1833*a97c2a1fSXin Li if(u4_next_bits == SEQUENCE_HEADER_CODE)
1834*a97c2a1fSXin Li {
1835*a97c2a1fSXin Li if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1836*a97c2a1fSXin Li {
1837*a97c2a1fSXin Li e_error = impeg2d_dec_seq_hdr(ps_dec);
1838*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1839*a97c2a1fSXin Li {
1840*a97c2a1fSXin Li return e_error;
1841*a97c2a1fSXin Li }
1842*a97c2a1fSXin Li
1843*a97c2a1fSXin Li u4_start_code_found = 0;
1844*a97c2a1fSXin Li
1845*a97c2a1fSXin Li }
1846*a97c2a1fSXin Li else
1847*a97c2a1fSXin Li {
1848*a97c2a1fSXin Li return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
1849*a97c2a1fSXin Li }
1850*a97c2a1fSXin Li
1851*a97c2a1fSXin Li
1852*a97c2a1fSXin Li if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1853*a97c2a1fSXin Li {
1854*a97c2a1fSXin Li IMPEG2D_ERROR_CODES_T e_error;
1855*a97c2a1fSXin Li e_error = impeg2d_dec_seq_ext(ps_dec);
1856*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1857*a97c2a1fSXin Li {
1858*a97c2a1fSXin Li return e_error;
1859*a97c2a1fSXin Li }
1860*a97c2a1fSXin Li u4_start_code_found = 0;
1861*a97c2a1fSXin Li
1862*a97c2a1fSXin Li }
1863*a97c2a1fSXin Li else
1864*a97c2a1fSXin Li {
1865*a97c2a1fSXin Li return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
1866*a97c2a1fSXin Li }
1867*a97c2a1fSXin Li }
1868*a97c2a1fSXin Li else if((u4_next_bits == USER_DATA_START_CODE) || (u4_next_bits == EXTENSION_START_CODE))
1869*a97c2a1fSXin Li {
1870*a97c2a1fSXin Li if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1871*a97c2a1fSXin Li {
1872*a97c2a1fSXin Li impeg2d_dec_seq_ext_data(ps_dec);
1873*a97c2a1fSXin Li u4_start_code_found = 0;
1874*a97c2a1fSXin Li
1875*a97c2a1fSXin Li }
1876*a97c2a1fSXin Li
1877*a97c2a1fSXin Li }
1878*a97c2a1fSXin Li else if((ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1879*a97c2a1fSXin Li && (u4_next_bits == GOP_START_CODE))
1880*a97c2a1fSXin Li {
1881*a97c2a1fSXin Li impeg2d_dec_grp_of_pic_hdr(ps_dec);
1882*a97c2a1fSXin Li impeg2d_dec_user_data(ps_dec);
1883*a97c2a1fSXin Li u4_start_code_found = 0;
1884*a97c2a1fSXin Li
1885*a97c2a1fSXin Li }
1886*a97c2a1fSXin Li else if((ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1887*a97c2a1fSXin Li && (u4_next_bits == PICTURE_START_CODE))
1888*a97c2a1fSXin Li {
1889*a97c2a1fSXin Li ps_dec->i4_pic_count++;
1890*a97c2a1fSXin Li
1891*a97c2a1fSXin Li e_error = impeg2d_dec_pic_hdr(ps_dec);
1892*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1893*a97c2a1fSXin Li {
1894*a97c2a1fSXin Li return e_error;
1895*a97c2a1fSXin Li }
1896*a97c2a1fSXin Li e_error = impeg2d_dec_pic_coding_ext(ps_dec);
1897*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1898*a97c2a1fSXin Li {
1899*a97c2a1fSXin Li return e_error;
1900*a97c2a1fSXin Li }
1901*a97c2a1fSXin Li e_error = impeg2d_dec_pic_ext_data(ps_dec);
1902*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1903*a97c2a1fSXin Li {
1904*a97c2a1fSXin Li return e_error;
1905*a97c2a1fSXin Li }
1906*a97c2a1fSXin Li e_error = impeg2d_pre_pic_dec_proc(ps_dec);
1907*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T) IVD_ERROR_NONE != e_error)
1908*a97c2a1fSXin Li {
1909*a97c2a1fSXin Li return e_error;
1910*a97c2a1fSXin Li }
1911*a97c2a1fSXin Li impeg2d_dec_pic_data(ps_dec);
1912*a97c2a1fSXin Li impeg2d_post_pic_dec_proc(ps_dec);
1913*a97c2a1fSXin Li u4_start_code_found = 1;
1914*a97c2a1fSXin Li }
1915*a97c2a1fSXin Li else
1916*a97c2a1fSXin Li
1917*a97c2a1fSXin Li {
1918*a97c2a1fSXin Li FLUSH_BITS(ps_dec->s_bit_stream.u4_offset, ps_dec->s_bit_stream.u4_buf, ps_dec->s_bit_stream.u4_buf_nxt, 8, ps_dec->s_bit_stream.pu4_buf_aligned);
1919*a97c2a1fSXin Li
1920*a97c2a1fSXin Li }
1921*a97c2a1fSXin Li if(u4_start_code_found == 0)
1922*a97c2a1fSXin Li {
1923*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
1924*a97c2a1fSXin Li /* In case a dec_pic_data call has not been made, the number of
1925*a97c2a1fSXin Li * bytes consumed in the previous header decode has to be
1926*a97c2a1fSXin Li * consumed. Not consuming it will result in zero bytes consumed
1927*a97c2a1fSXin Li * loops in case there are multiple headers and the second
1928*a97c2a1fSXin Li * or a future header has a resolution change/other error where
1929*a97c2a1fSXin Li * the bytes of the last header are not consumed.
1930*a97c2a1fSXin Li */
1931*a97c2a1fSXin Li ps_dec->i4_bytes_consumed = (ps_dec->s_bit_stream.u4_offset + 7) >> 3;
1932*a97c2a1fSXin Li ps_dec->i4_bytes_consumed -= ((size_t)ps_dec->s_bit_stream.pv_bs_buf & 3);
1933*a97c2a1fSXin Li }
1934*a97c2a1fSXin Li }
1935*a97c2a1fSXin Li if((u4_start_code_found == 0) && (ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset))
1936*a97c2a1fSXin Li {
1937*a97c2a1fSXin Li return IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND;
1938*a97c2a1fSXin Li }
1939*a97c2a1fSXin Li
1940*a97c2a1fSXin Li }
1941*a97c2a1fSXin Li /* If the stream is MPEG-1 compliant stream */
1942*a97c2a1fSXin Li else
1943*a97c2a1fSXin Li {
1944*a97c2a1fSXin Li while((u4_start_code_found == 0) && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
1945*a97c2a1fSXin Li {
1946*a97c2a1fSXin Li u4_next_bits = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
1947*a97c2a1fSXin Li
1948*a97c2a1fSXin Li if(impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) == SEQUENCE_HEADER_CODE)
1949*a97c2a1fSXin Li {
1950*a97c2a1fSXin Li if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
1951*a97c2a1fSXin Li {
1952*a97c2a1fSXin Li e_error = impeg2d_dec_seq_hdr(ps_dec);
1953*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1954*a97c2a1fSXin Li {
1955*a97c2a1fSXin Li return e_error;
1956*a97c2a1fSXin Li }
1957*a97c2a1fSXin Li
1958*a97c2a1fSXin Li u4_start_code_found = 0;
1959*a97c2a1fSXin Li }
1960*a97c2a1fSXin Li else
1961*a97c2a1fSXin Li {
1962*a97c2a1fSXin Li return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
1963*a97c2a1fSXin Li }
1964*a97c2a1fSXin Li }
1965*a97c2a1fSXin Li else if((ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset) && (u4_next_bits == EXTENSION_START_CODE || u4_next_bits == USER_DATA_START_CODE))
1966*a97c2a1fSXin Li {
1967*a97c2a1fSXin Li impeg2d_flush_ext_and_user_data(ps_dec);
1968*a97c2a1fSXin Li u4_start_code_found = 0;
1969*a97c2a1fSXin Li }
1970*a97c2a1fSXin Li
1971*a97c2a1fSXin Li
1972*a97c2a1fSXin Li else if ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) == GOP_START_CODE)
1973*a97c2a1fSXin Li && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
1974*a97c2a1fSXin Li {
1975*a97c2a1fSXin Li impeg2d_dec_grp_of_pic_hdr(ps_dec);
1976*a97c2a1fSXin Li impeg2d_flush_ext_and_user_data(ps_dec);
1977*a97c2a1fSXin Li u4_start_code_found = 0;
1978*a97c2a1fSXin Li }
1979*a97c2a1fSXin Li else if ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) == PICTURE_START_CODE)
1980*a97c2a1fSXin Li && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
1981*a97c2a1fSXin Li {
1982*a97c2a1fSXin Li ps_dec->i4_pic_count++;
1983*a97c2a1fSXin Li
1984*a97c2a1fSXin Li e_error = impeg2d_dec_pic_hdr(ps_dec);
1985*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1986*a97c2a1fSXin Li {
1987*a97c2a1fSXin Li return e_error;
1988*a97c2a1fSXin Li }
1989*a97c2a1fSXin Li impeg2d_flush_ext_and_user_data(ps_dec);
1990*a97c2a1fSXin Li e_error = impeg2d_pre_pic_dec_proc(ps_dec);
1991*a97c2a1fSXin Li if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
1992*a97c2a1fSXin Li {
1993*a97c2a1fSXin Li return e_error;
1994*a97c2a1fSXin Li }
1995*a97c2a1fSXin Li impeg2d_dec_pic_data(ps_dec);
1996*a97c2a1fSXin Li impeg2d_post_pic_dec_proc(ps_dec);
1997*a97c2a1fSXin Li u4_start_code_found = 1;
1998*a97c2a1fSXin Li }
1999*a97c2a1fSXin Li else
2000*a97c2a1fSXin Li {
2001*a97c2a1fSXin Li FLUSH_BITS(ps_dec->s_bit_stream.u4_offset, ps_dec->s_bit_stream.u4_buf, ps_dec->s_bit_stream.u4_buf_nxt, 8, ps_dec->s_bit_stream.pu4_buf_aligned);
2002*a97c2a1fSXin Li }
2003*a97c2a1fSXin Li impeg2d_next_start_code(ps_dec);
2004*a97c2a1fSXin Li if (0 == u4_start_code_found)
2005*a97c2a1fSXin Li {
2006*a97c2a1fSXin Li /* In case a dec_pic_data call has not been made, the number of
2007*a97c2a1fSXin Li * bytes consumed in the previous header decode has to be
2008*a97c2a1fSXin Li * consumed. Not consuming it will result in zero bytes consumed
2009*a97c2a1fSXin Li * loops in case there are multiple headers and the second
2010*a97c2a1fSXin Li * or a future header has a resolution change/other error where
2011*a97c2a1fSXin Li * the bytes of the last header are not consumed.
2012*a97c2a1fSXin Li */
2013*a97c2a1fSXin Li ps_dec->i4_bytes_consumed = (ps_dec->s_bit_stream.u4_offset + 7) >> 3;
2014*a97c2a1fSXin Li ps_dec->i4_bytes_consumed -= ((size_t)ps_dec->s_bit_stream.pv_bs_buf & 3);
2015*a97c2a1fSXin Li }
2016*a97c2a1fSXin Li }
2017*a97c2a1fSXin Li if((u4_start_code_found == 0) && (ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset))
2018*a97c2a1fSXin Li {
2019*a97c2a1fSXin Li return IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND;
2020*a97c2a1fSXin Li }
2021*a97c2a1fSXin Li }
2022*a97c2a1fSXin Li
2023*a97c2a1fSXin Li return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
2024*a97c2a1fSXin Li }
2025