xref: /aosp_15_r20/external/libmpeg2/decoder/impeg2d_structs.h (revision a97c2a1f0a796dc32bed80d3353c69c5fc07c750)
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 #ifndef __IMPEG2D_STRUCTS_H__
21*a97c2a1fSXin Li #define __IMPEG2D_STRUCTS_H__
22*a97c2a1fSXin Li 
23*a97c2a1fSXin Li /* Decoder needs at least 4 reference buffers in order to support format conversion in a thread and
24*a97c2a1fSXin Li to support B pictures. Because of format conversion in a thread, codec delay is now 2 frames instead of 1.
25*a97c2a1fSXin Li To reduce this delay, format conversion has to wait for MB status before converting for B pictures.
26*a97c2a1fSXin Li To avoid this check the delay is increased to 2 and hence number of reference frames minimum is 4.
27*a97c2a1fSXin Li Because of temporal dependency in deinterlacer one additional buffer is also needed */
28*a97c2a1fSXin Li #define NUM_INT_FRAME_BUFFERS                     5
29*a97c2a1fSXin Li 
30*a97c2a1fSXin Li 
31*a97c2a1fSXin Li #define MAX_WIDTH               4096
32*a97c2a1fSXin Li #define MAX_HEIGHT              2160
33*a97c2a1fSXin Li 
34*a97c2a1fSXin Li #define MIN_WIDTH               16
35*a97c2a1fSXin Li #define MIN_HEIGHT              16
36*a97c2a1fSXin Li 
37*a97c2a1fSXin Li 
38*a97c2a1fSXin Li #define MAX_FRM_SIZE            (MAX_WIDTH * MAX_HEIGHT * 2)  /* Supports only 420P and 422ILE */
39*a97c2a1fSXin Li 
40*a97c2a1fSXin Li #define DEC_ORDER               0
41*a97c2a1fSXin Li 
42*a97c2a1fSXin Li #define MAX_BITSTREAM_BUFFER_SIZE       (MAX_WIDTH * MAX_HEIGHT * 3 / 2)
43*a97c2a1fSXin Li #define MIN_BUFFER_BYTES_AT_EOS 8
44*a97c2a1fSXin Li 
45*a97c2a1fSXin Li /* Flag to signal that buffer is held by deinterlacing */
46*a97c2a1fSXin Li #define MPEG2_BUF_MGR_DEINT (BUF_MGR_DISP << 1)
47*a97c2a1fSXin Li 
48*a97c2a1fSXin Li typedef enum
49*a97c2a1fSXin Li {
50*a97c2a1fSXin Li     CMD_PROCESS,
51*a97c2a1fSXin Li     CMD_FMTCONV,
52*a97c2a1fSXin Li }e_jobq_cmd_t;
53*a97c2a1fSXin Li 
54*a97c2a1fSXin Li /**
55*a97c2a1fSXin Li  * Structure to represent a processing job entry
56*a97c2a1fSXin Li  */
57*a97c2a1fSXin Li typedef struct
58*a97c2a1fSXin Li {
59*a97c2a1fSXin Li     /**
60*a97c2a1fSXin Li      * Command
61*a97c2a1fSXin Li      * Currently: PROCESS, FMTCONV are the only two jobs
62*a97c2a1fSXin Li      */
63*a97c2a1fSXin Li     WORD32 i4_cmd;
64*a97c2a1fSXin Li 
65*a97c2a1fSXin Li     /**
66*a97c2a1fSXin Li      * MB y of the starting MB
67*a97c2a1fSXin Li      */
68*a97c2a1fSXin Li     WORD16 i2_start_mb_y;
69*a97c2a1fSXin Li 
70*a97c2a1fSXin Li     /**
71*a97c2a1fSXin Li      * MB y of the last MB
72*a97c2a1fSXin Li      */
73*a97c2a1fSXin Li 
74*a97c2a1fSXin Li     WORD16 i2_end_mb_y;
75*a97c2a1fSXin Li 
76*a97c2a1fSXin Li     /**
77*a97c2a1fSXin Li      * Bitstream offset for the current job
78*a97c2a1fSXin Li      */
79*a97c2a1fSXin Li     WORD32 i4_bistream_ofst;
80*a97c2a1fSXin Li 
81*a97c2a1fSXin Li }job_t;
82*a97c2a1fSXin Li 
83*a97c2a1fSXin Li typedef struct
84*a97c2a1fSXin Li {
85*a97c2a1fSXin Li     /* Params of the reference buffer used as input to MC */
86*a97c2a1fSXin Li     UWORD32 u4_src_wd;
87*a97c2a1fSXin Li     UWORD32 u4_src_offset;
88*a97c2a1fSXin Li 
89*a97c2a1fSXin Li     /* Params of the buffer where MC output will be written */
90*a97c2a1fSXin Li     UWORD32 u4_dst_wd_res_buf;
91*a97c2a1fSXin Li     UWORD32 u4_dst_wd_cur_frm;
92*a97c2a1fSXin Li     UWORD32 u4_dst_offset_res_buf;
93*a97c2a1fSXin Li     UWORD32 u4_dst_offset_cur_frm;
94*a97c2a1fSXin Li 
95*a97c2a1fSXin Li     /* Operation Parameters */
96*a97c2a1fSXin Li     UWORD32 u4_rows;
97*a97c2a1fSXin Li     UWORD32 u4_cols;
98*a97c2a1fSXin Li     UWORD32 u4_mode;
99*a97c2a1fSXin Li }comp_mc_params_t;
100*a97c2a1fSXin Li 
101*a97c2a1fSXin Li typedef struct
102*a97c2a1fSXin Li {
103*a97c2a1fSXin Li     yuv_buf_t        s_ref;
104*a97c2a1fSXin Li     comp_mc_params_t s_luma;
105*a97c2a1fSXin Li     comp_mc_params_t s_chroma;
106*a97c2a1fSXin Li }mb_mc_params_t;
107*a97c2a1fSXin Li 
108*a97c2a1fSXin Li struct _dec_mb_params_t;
109*a97c2a1fSXin Li 
110*a97c2a1fSXin Li typedef WORD32 pf_inv_quant_t (WORD16 *blk,
111*a97c2a1fSXin Li                                 UWORD8 *weighting_matrix,
112*a97c2a1fSXin Li                                 UWORD8 quant_scale,
113*a97c2a1fSXin Li                                 WORD32 intra_flag,
114*a97c2a1fSXin Li                                 WORD32 i4_num_coeffs,
115*a97c2a1fSXin Li                                 WORD16 *pi2_coeffs,
116*a97c2a1fSXin Li                                 UWORD8 *pu1_pos,
117*a97c2a1fSXin Li                                 const UWORD8   *scan,
118*a97c2a1fSXin Li                                 UWORD16 *u2_def_dc_pred,
119*a97c2a1fSXin Li                                 UWORD16 u2_intra_dc_precision);
120*a97c2a1fSXin Li 
121*a97c2a1fSXin Li typedef IMPEG2D_ERROR_CODES_T  pf_vld_inv_quant_t  (void  *dec,
122*a97c2a1fSXin Li                              WORD16       *out_addr,
123*a97c2a1fSXin Li                              const UWORD8 *scan,
124*a97c2a1fSXin Li                              UWORD16      intra_flag,
125*a97c2a1fSXin Li                              UWORD16      colr_comp,
126*a97c2a1fSXin Li                              UWORD16      d_picture);
127*a97c2a1fSXin Li 
128*a97c2a1fSXin Li typedef void  pf_mc_t(void *, UWORD8 *, UWORD32 , UWORD8 *, UWORD32 ,
129*a97c2a1fSXin Li                  UWORD32 , UWORD32  );
130*a97c2a1fSXin Li 
131*a97c2a1fSXin Li typedef struct dec_state_struct_t
132*a97c2a1fSXin Li {
133*a97c2a1fSXin Li     WORD16          ai2_vld_buf[NUM_PELS_IN_BLOCK];
134*a97c2a1fSXin Li     WORD16          ai2_idct_stg1[NUM_PELS_IN_BLOCK];
135*a97c2a1fSXin Li 
136*a97c2a1fSXin Li 
137*a97c2a1fSXin Li     UWORD8          au1_intra_quant_matrix[NUM_PELS_IN_BLOCK];
138*a97c2a1fSXin Li     UWORD8          au1_inter_quant_matrix[NUM_PELS_IN_BLOCK];
139*a97c2a1fSXin Li 
140*a97c2a1fSXin Li     IMPEG2D_ERROR_CODES_T (*pf_decode_slice)(struct dec_state_struct_t *);
141*a97c2a1fSXin Li 
142*a97c2a1fSXin Li     pf_vld_inv_quant_t *pf_vld_inv_quant;
143*a97c2a1fSXin Li 
144*a97c2a1fSXin Li     pf_idct_recon_t *pf_idct_recon[4];
145*a97c2a1fSXin Li 
146*a97c2a1fSXin Li     pf_mc_t         *pf_mc[4];
147*a97c2a1fSXin Li     pf_interpred_t  *pf_fullx_halfy_8x8;
148*a97c2a1fSXin Li     pf_interpred_t  *pf_halfx_fully_8x8;
149*a97c2a1fSXin Li     pf_interpred_t  *pf_halfx_halfy_8x8;
150*a97c2a1fSXin Li     pf_interpred_t  *pf_fullx_fully_8x8;
151*a97c2a1fSXin Li 
152*a97c2a1fSXin Li 
153*a97c2a1fSXin Li     pf_interpolate_t *pf_interpolate;
154*a97c2a1fSXin Li     pf_copy_mb_t     *pf_copy_mb;
155*a97c2a1fSXin Li 
156*a97c2a1fSXin Li     pf_memset0_one_16bit_buf_t *pf_memset_16bit_8x8_linear_block;
157*a97c2a1fSXin Li     pf_memset_8bit_t    *pf_memset_8bit_8x8_block;
158*a97c2a1fSXin Li     pf_copy_yuv420p_buf_t *pf_copy_yuv420p_buf;
159*a97c2a1fSXin Li     pf_fmt_conv_yuv420p_to_yuv422ile_t *pf_fmt_conv_yuv420p_to_yuv422ile;
160*a97c2a1fSXin Li     pf_fmt_conv_yuv420p_to_yuv420sp_t  *pf_fmt_conv_yuv420p_to_yuv420sp_uv;
161*a97c2a1fSXin Li     pf_fmt_conv_yuv420p_to_yuv420sp_t  *pf_fmt_conv_yuv420p_to_yuv420sp_vu;
162*a97c2a1fSXin Li 
163*a97c2a1fSXin Li     stream_t         s_bit_stream;
164*a97c2a1fSXin Li /* @ */
165*a97c2a1fSXin Li 
166*a97c2a1fSXin Li     UWORD16         u2_is_mpeg2; /* 0 if stream is MPEG1 1 otherwise */
167*a97c2a1fSXin Li     UWORD16         u2_frame_width;  /* Width of the frame */
168*a97c2a1fSXin Li     UWORD16         u2_frame_height; /* Height of the frame */
169*a97c2a1fSXin Li     UWORD16         u2_picture_width;
170*a97c2a1fSXin Li     UWORD16         u2_horizontal_size;
171*a97c2a1fSXin Li     UWORD16         u2_vertical_size;
172*a97c2a1fSXin Li     UWORD16         u2_create_max_width;
173*a97c2a1fSXin Li     UWORD16         u2_create_max_height;
174*a97c2a1fSXin Li     UWORD16         u2_reinit_max_width;
175*a97c2a1fSXin Li     UWORD16         u2_reinit_max_height;
176*a97c2a1fSXin Li     UWORD16         u2_header_done;
177*a97c2a1fSXin Li     UWORD16         u2_decode_header;
178*a97c2a1fSXin Li 
179*a97c2a1fSXin Li     UWORD16         u2_mb_x;
180*a97c2a1fSXin Li     UWORD16         u2_mb_y;
181*a97c2a1fSXin Li     UWORD16         u2_num_horiz_mb;
182*a97c2a1fSXin Li     UWORD16         u2_num_vert_mb;
183*a97c2a1fSXin Li     UWORD16         u2_num_flds_decoded;
184*a97c2a1fSXin Li     void            *pv_pic_buf_mg;
185*a97c2a1fSXin Li 
186*a97c2a1fSXin Li     UWORD32         u4_frm_buf_stride; /* for display Buffer */
187*a97c2a1fSXin Li 
188*a97c2a1fSXin Li     UWORD16         u2_field_dct;
189*a97c2a1fSXin Li     UWORD16         u2_read_dct_type;
190*a97c2a1fSXin Li 
191*a97c2a1fSXin Li     UWORD16         u2_read_motion_type;
192*a97c2a1fSXin Li     UWORD16         u2_motion_type;
193*a97c2a1fSXin Li 
194*a97c2a1fSXin Li     const UWORD16   *pu2_mb_type;
195*a97c2a1fSXin Li     UWORD16         u2_fld_pic;
196*a97c2a1fSXin Li     UWORD16         u2_frm_pic;
197*a97c2a1fSXin Li 
198*a97c2a1fSXin Li     yuv_buf_t       s_cur_frm_buf;
199*a97c2a1fSXin Li 
200*a97c2a1fSXin Li     UWORD16         u2_fld_parity;
201*a97c2a1fSXin Li     UWORD16         u2_def_dc_pred[MAX_COLR_COMPS];
202*a97c2a1fSXin Li 
203*a97c2a1fSXin Li     /* Variables related to Motion Vector predictors */
204*a97c2a1fSXin Li 
205*a97c2a1fSXin Li     WORD16          ai2_pred_mv[2][2][2];
206*a97c2a1fSXin Li     e_pred_direction_t   e_mb_pred;
207*a97c2a1fSXin Li     UWORD16         au2_fcode_data[2];
208*a97c2a1fSXin Li 
209*a97c2a1fSXin Li     /* Variables related to reference pictures */
210*a97c2a1fSXin Li     yuv_buf_t       as_recent_fld[2][2];
211*a97c2a1fSXin Li 
212*a97c2a1fSXin Li     UWORD8          u1_quant_scale;
213*a97c2a1fSXin Li     UWORD16         u2_num_mbs_left;
214*a97c2a1fSXin Li     UWORD16         u2_first_mb;
215*a97c2a1fSXin Li     UWORD16         u2_num_skipped_mbs;
216*a97c2a1fSXin Li 
217*a97c2a1fSXin Li     UWORD8          *pu1_inv_scan_matrix;
218*a97c2a1fSXin Li 
219*a97c2a1fSXin Li     UWORD16         u2_progressive_sequence;
220*a97c2a1fSXin Li     e_pic_type_t         e_pic_type;
221*a97c2a1fSXin Li 
222*a97c2a1fSXin Li     UWORD16         u2_full_pel_forw_vector;
223*a97c2a1fSXin Li     UWORD16         u2_forw_f_code;
224*a97c2a1fSXin Li     UWORD16         u2_full_pel_back_vector;
225*a97c2a1fSXin Li     UWORD16         u2_back_f_code;
226*a97c2a1fSXin Li 
227*a97c2a1fSXin Li     WORD16          ai2_mv[2][2][2]; /* Motion vectors */
228*a97c2a1fSXin Li 
229*a97c2a1fSXin Li     /* Bitstream code present in Picture coding extension */
230*a97c2a1fSXin Li     UWORD16         au2_f_code[2][2];
231*a97c2a1fSXin Li     UWORD16         u2_intra_dc_precision;
232*a97c2a1fSXin Li     UWORD16         u2_picture_structure;
233*a97c2a1fSXin Li     UWORD16         u2_top_field_first;
234*a97c2a1fSXin Li     UWORD16         u2_frame_pred_frame_dct;
235*a97c2a1fSXin Li     UWORD16         u2_concealment_motion_vectors;
236*a97c2a1fSXin Li     UWORD16         u2_q_scale_type;
237*a97c2a1fSXin Li     UWORD16         u2_intra_vlc_format;
238*a97c2a1fSXin Li     UWORD16         u2_alternate_scan;
239*a97c2a1fSXin Li     UWORD16         u2_repeat_first_field;
240*a97c2a1fSXin Li     UWORD16         u2_progressive_frame;
241*a97c2a1fSXin Li 
242*a97c2a1fSXin Li 
243*a97c2a1fSXin Li     /* Bitstream code related to frame rate of the bitstream */
244*a97c2a1fSXin Li     UWORD16         u2_frame_rate_code;
245*a97c2a1fSXin Li     UWORD16         u2_frame_rate_extension_n;
246*a97c2a1fSXin Li     UWORD16         u2_frame_rate_extension_d;
247*a97c2a1fSXin Li     UWORD16         u2_framePeriod;   /* Frame period in milli seconds */
248*a97c2a1fSXin Li 
249*a97c2a1fSXin Li     /* Members related to display dimensions of bitstream */
250*a97c2a1fSXin Li     /* The size values may not be returned right now. But they are read */
251*a97c2a1fSXin Li     /* and can be returned if there is a requirement.                   */
252*a97c2a1fSXin Li     UWORD8          u1_video_format;
253*a97c2a1fSXin Li     UWORD8          u1_colour_description;
254*a97c2a1fSXin Li     UWORD8          u1_colour_primaries;
255*a97c2a1fSXin Li     UWORD8          u1_transfer_characteristics;
256*a97c2a1fSXin Li     UWORD8          u1_matrix_coefficients;
257*a97c2a1fSXin Li     UWORD16         u2_display_horizontal_size;
258*a97c2a1fSXin Li     UWORD16         u2_display_vertical_size;
259*a97c2a1fSXin Li     UWORD16         u2_aspect_ratio_info;
260*a97c2a1fSXin Li 
261*a97c2a1fSXin Li     /* Members related to motion compensation */
262*a97c2a1fSXin Li     yuv_buf_t       s_mc_fw_buf;
263*a97c2a1fSXin Li     yuv_buf_t       s_mc_bk_buf;
264*a97c2a1fSXin Li     yuv_buf_t       s_mc_buf;
265*a97c2a1fSXin Li     mb_mc_params_t  as_mb_mc_params[2][2];
266*a97c2a1fSXin Li     yuv_buf_t       as_ref_buf[2][2];
267*a97c2a1fSXin Li     e_mb_type_t       s_mb_type;
268*a97c2a1fSXin Li 
269*a97c2a1fSXin Li     yuv_buf_t       s_dest_buf;
270*a97c2a1fSXin Li 
271*a97c2a1fSXin Li     /* Variable to handle intra MB */
272*a97c2a1fSXin Li     UWORD16         u2_prev_intra_mb;
273*a97c2a1fSXin Li     UWORD16         u2_coded_mb;
274*a97c2a1fSXin Li 
275*a97c2a1fSXin Li     /* Bidirect function pointers */
276*a97c2a1fSXin Li     const struct _dec_mb_params_t *ps_func_bi_direct;
277*a97c2a1fSXin Li 
278*a97c2a1fSXin Li     /* Forw or Back function pointers */
279*a97c2a1fSXin Li     const struct _dec_mb_params_t *ps_func_forw_or_back;
280*a97c2a1fSXin Li 
281*a97c2a1fSXin Li 
282*a97c2a1fSXin Li     /* CBP of the current MB        */
283*a97c2a1fSXin Li     UWORD16         u2_cbp;
284*a97c2a1fSXin Li     void            *pv_video_scratch;
285*a97c2a1fSXin Li 
286*a97c2a1fSXin Li 
287*a97c2a1fSXin Li     /* For global error handling */
288*a97c2a1fSXin Li     void            *pv_stack_cntxt;
289*a97c2a1fSXin Li 
290*a97c2a1fSXin Li /* @ */
291*a97c2a1fSXin Li     WORD32          i4_chromaFormat;
292*a97c2a1fSXin Li     UWORD32         u4_xdmBufID;
293*a97c2a1fSXin Li     UWORD32         u4_num_mem_records;
294*a97c2a1fSXin Li     /* For holding memRecords */
295*a97c2a1fSXin Li     void            *pv_memTab;
296*a97c2a1fSXin Li 
297*a97c2a1fSXin Li     UWORD8          u1_flushfrm;
298*a97c2a1fSXin Li     UWORD8          u1_flushcnt;
299*a97c2a1fSXin Li     iv_yuv_buf_t    as_frame_buf[MAX_FRAME_BUFFER];
300*a97c2a1fSXin Li     iv_yuv_buf_t    ps_yuv_buf;
301*a97c2a1fSXin Li 
302*a97c2a1fSXin Li     ivd_get_display_frame_op_t  s_disp_op;
303*a97c2a1fSXin Li 
304*a97c2a1fSXin Li 
305*a97c2a1fSXin Li     UWORD32         u4_non_zero_cols;
306*a97c2a1fSXin Li     UWORD32         u4_non_zero_rows;
307*a97c2a1fSXin Li 
308*a97c2a1fSXin Li     UWORD32         u4_num_frames_decoded;
309*a97c2a1fSXin Li 
310*a97c2a1fSXin Li     /* Adding error code variable to signal benign errors. */
311*a97c2a1fSXin Li     UWORD32         u4_error_code;
312*a97c2a1fSXin Li 
313*a97c2a1fSXin Li     WORD32          i4_num_cores;
314*a97c2a1fSXin Li 
315*a97c2a1fSXin Li     UWORD8          u1_first_frame_done;
316*a97c2a1fSXin Li 
317*a97c2a1fSXin Li     void            *pv_codec_thread_handle;
318*a97c2a1fSXin Li     void            *ps_dec_state_multi_core;
319*a97c2a1fSXin Li     UWORD32         currThreadId;
320*a97c2a1fSXin Li     /**
321*a97c2a1fSXin Li      * Condition variable to signal process start
322*a97c2a1fSXin Li      */
323*a97c2a1fSXin Li     void *pv_proc_start_condition;
324*a97c2a1fSXin Li 
325*a97c2a1fSXin Li     /**
326*a97c2a1fSXin Li      * Mutex used to keep the functions thread-safe
327*a97c2a1fSXin Li      */
328*a97c2a1fSXin Li     void *pv_proc_start_mutex;
329*a97c2a1fSXin Li 
330*a97c2a1fSXin Li     /**
331*a97c2a1fSXin Li      * Condition variable to signal process done
332*a97c2a1fSXin Li      */
333*a97c2a1fSXin Li     void *pv_proc_done_condition;
334*a97c2a1fSXin Li 
335*a97c2a1fSXin Li     /**
336*a97c2a1fSXin Li      * Mutex used to keep the functions thread-safe
337*a97c2a1fSXin Li      */
338*a97c2a1fSXin Li     void *pv_proc_done_mutex;
339*a97c2a1fSXin Li 
340*a97c2a1fSXin Li     /**
341*a97c2a1fSXin Li      * Process state start- One for each thread
342*a97c2a1fSXin Li      */
343*a97c2a1fSXin Li     WORD32 ai4_process_start;
344*a97c2a1fSXin Li 
345*a97c2a1fSXin Li     /**
346*a97c2a1fSXin Li      * Process state end- One for each thread
347*a97c2a1fSXin Li      */
348*a97c2a1fSXin Li     WORD32 ai4_process_done;
349*a97c2a1fSXin Li     UWORD32         u4_inp_ts;
350*a97c2a1fSXin Li     pic_buf_t       *ps_cur_pic;
351*a97c2a1fSXin Li     pic_buf_t       *ps_disp_pic;
352*a97c2a1fSXin Li     pic_buf_t       *aps_ref_pics[2];
353*a97c2a1fSXin Li 
354*a97c2a1fSXin Li     WORD32          i4_disp_buf_id;
355*a97c2a1fSXin Li     WORD32          i4_cur_buf_id;
356*a97c2a1fSXin Li     iv_yuv_buf_t    *ps_disp_frm_buf;
357*a97c2a1fSXin Li 
358*a97c2a1fSXin Li     UWORD32         u4_share_disp_buf;
359*a97c2a1fSXin Li     void            *pv_pic_buf_base;
360*a97c2a1fSXin Li 
361*a97c2a1fSXin Li     disp_mgr_t      s_disp_mgr;
362*a97c2a1fSXin Li     UWORD8          *pu1_chroma_ref_buf[BUF_MGR_MAX_CNT];
363*a97c2a1fSXin Li     ivd_out_bufdesc_t as_disp_buffers[BUF_MGR_MAX_CNT];
364*a97c2a1fSXin Li 
365*a97c2a1fSXin Li     /* Count the number of pictures decoded after init/reset */
366*a97c2a1fSXin Li     WORD32          i4_pic_count;
367*a97c2a1fSXin Li 
368*a97c2a1fSXin Li     /* Flag to signal last coeff in a 8x8 block is one
369*a97c2a1fSXin Li     after mismatch contol */
370*a97c2a1fSXin Li     WORD32          i4_last_value_one;
371*a97c2a1fSXin Li 
372*a97c2a1fSXin Li     WORD32          i4_start_mb_y;
373*a97c2a1fSXin Li     WORD32          i4_end_mb_y;
374*a97c2a1fSXin Li 
375*a97c2a1fSXin Li     /* Buffer to store the input stream */
376*a97c2a1fSXin Li     UWORD8 *pu1_input_buffer;
377*a97c2a1fSXin Li 
378*a97c2a1fSXin Li     /**
379*a97c2a1fSXin Li      * Job queue buffer base
380*a97c2a1fSXin Li      */
381*a97c2a1fSXin Li     void            *pv_jobq_buf;
382*a97c2a1fSXin Li 
383*a97c2a1fSXin Li     /**
384*a97c2a1fSXin Li      * Job Queue mem tab size
385*a97c2a1fSXin Li      */
386*a97c2a1fSXin Li     WORD32          i4_jobq_buf_size;
387*a97c2a1fSXin Li 
388*a97c2a1fSXin Li     /**
389*a97c2a1fSXin Li      * Job Queue context
390*a97c2a1fSXin Li      */
391*a97c2a1fSXin Li     void            *pv_jobq;
392*a97c2a1fSXin Li 
393*a97c2a1fSXin Li     /* Pointer to input bitstream */
394*a97c2a1fSXin Li     UWORD8          *pu1_inp_bits_buf;
395*a97c2a1fSXin Li 
396*a97c2a1fSXin Li     /* Number of bytes in the input bitstream */
397*a97c2a1fSXin Li     UWORD32         u4_num_inp_bytes;
398*a97c2a1fSXin Li 
399*a97c2a1fSXin Li     ivd_out_bufdesc_t *ps_out_buf;
400*a97c2a1fSXin Li 
401*a97c2a1fSXin Li     /* Bytes consumed */
402*a97c2a1fSXin Li     WORD32          i4_bytes_consumed;
403*a97c2a1fSXin Li 
404*a97c2a1fSXin Li     IVD_ARCH_T      e_processor_arch;
405*a97c2a1fSXin Li 
406*a97c2a1fSXin Li     IVD_SOC_T       e_processor_soc;
407*a97c2a1fSXin Li 
408*a97c2a1fSXin Li     WORD32          i4_frame_decoded;
409*a97c2a1fSXin Li 
410*a97c2a1fSXin Li     /** Flag to enable deinterlace */
411*a97c2a1fSXin Li     UWORD32          u4_deinterlace;
412*a97c2a1fSXin Li 
413*a97c2a1fSXin Li     /** Deinterlacer context */
414*a97c2a1fSXin Li     void            *pv_deinterlacer_ctxt;
415*a97c2a1fSXin Li 
416*a97c2a1fSXin Li     /** Picture buffer held by deinterlacer */
417*a97c2a1fSXin Li     pic_buf_t       *ps_deint_pic;
418*a97c2a1fSXin Li 
419*a97c2a1fSXin Li     /** Buffer used after deinterlacer for format conversion */
420*a97c2a1fSXin Li     UWORD8          *pu1_deint_fmt_buf;
421*a97c2a1fSXin Li 
422*a97c2a1fSXin Li     /** Flag to indicate if Seq Display Extn is present */
423*a97c2a1fSXin Li     UWORD8          u1_seq_disp_extn_present;
424*a97c2a1fSXin Li 
425*a97c2a1fSXin Li     /** Keeps thread active*/
426*a97c2a1fSXin Li     UWORD8          i4_threads_active;
427*a97c2a1fSXin Li }dec_state_t;
428*a97c2a1fSXin Li 
429*a97c2a1fSXin Li 
430*a97c2a1fSXin Li 
431*a97c2a1fSXin Li 
432*a97c2a1fSXin Li typedef void (*func_decmb_params)(dec_state_t *);
433*a97c2a1fSXin Li typedef void  (*mc_funcs)(dec_state_t *);
434*a97c2a1fSXin Li typedef struct _dec_mb_params_t
435*a97c2a1fSXin Li {
436*a97c2a1fSXin Li     func_decmb_params    pf_func_mb_params;
437*a97c2a1fSXin Li     e_mb_type_t            s_mb_type;
438*a97c2a1fSXin Li     mc_funcs             pf_mc;
439*a97c2a1fSXin Li }dec_mb_params_t;
440*a97c2a1fSXin Li 
441*a97c2a1fSXin Li 
442*a97c2a1fSXin Li 
443*a97c2a1fSXin Li #define MAX_THREADS     4
444*a97c2a1fSXin Li 
445*a97c2a1fSXin Li 
446*a97c2a1fSXin Li #define MAX_MB_ROWS     (MAX_HEIGHT / 16) // number of rows for 1080p
447*a97c2a1fSXin Li 
448*a97c2a1fSXin Li typedef struct _dec_state_multi_core
449*a97c2a1fSXin Li {
450*a97c2a1fSXin Li     // contains the decoder state of decoder for each of the max (MAX_THREADS-1) threads
451*a97c2a1fSXin Li     // ps_dec_state[0] and au4_thread_launched[0] are used for main thread
452*a97c2a1fSXin Li     dec_state_t *ps_dec_state[MAX_THREADS];
453*a97c2a1fSXin Li     UWORD32     au4_thread_launched[MAX_THREADS];
454*a97c2a1fSXin Li     // number of rows: first thread will populate the row offsets and update
455*a97c2a1fSXin Li     // row_offset_cnt. Other threads should pick up offset from this thread
456*a97c2a1fSXin Li     // and start decoding
457*a97c2a1fSXin Li     UWORD32     au4_row_offset[MAX_MB_ROWS];
458*a97c2a1fSXin Li     volatile    UWORD32 u4_row_offset_cnt;
459*a97c2a1fSXin Li     /**
460*a97c2a1fSXin Li      * Flag to signal processing thread to exit
461*a97c2a1fSXin Li      */
462*a97c2a1fSXin Li     WORD32 i4_break_threads;
463*a97c2a1fSXin Li }dec_state_multi_core_t;
464*a97c2a1fSXin Li 
465*a97c2a1fSXin Li 
466*a97c2a1fSXin Li 
467*a97c2a1fSXin Li #endif /* #ifndef __IMPEG2D_STRUCTS_H__ */
468