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