Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 #ifndef __IMPEG2D_STRUCTS_H__
     21 #define __IMPEG2D_STRUCTS_H__
     22 
     23 typedef enum
     24 {
     25     CMD_PROCESS,
     26     CMD_FMTCONV,
     27 }e_jobq_cmd_t;
     28 
     29 /**
     30  * Structure to represent a processing job entry
     31  */
     32 typedef struct
     33 {
     34     /**
     35      * Command
     36      * Currently: PROCESS, FMTCONV are the only two jobs
     37      */
     38     WORD32 i4_cmd;
     39 
     40     /**
     41      * MB y of the starting MB
     42      */
     43     WORD16 i2_start_mb_y;
     44 
     45     /**
     46      * MB y of the last MB
     47      */
     48 
     49     WORD16 i2_end_mb_y;
     50 
     51     /**
     52      * Bitstream offset for the current job
     53      */
     54     WORD32 i4_bistream_ofst;
     55 
     56 }job_t;
     57 
     58 typedef struct
     59 {
     60     /* Params of the reference buffer used as input to MC */
     61     UWORD32 u4_src_wd;
     62     UWORD32 u4_src_offset;
     63 
     64     /* Params of the buffer where MC output will be written */
     65     UWORD32 u4_dst_wd_res_buf;
     66     UWORD32 u4_dst_wd_cur_frm;
     67     UWORD32 u4_dst_offset_res_buf;
     68     UWORD32 u4_dst_offset_cur_frm;
     69 
     70     /* Operation Parameters */
     71     UWORD32 u4_rows;
     72     UWORD32 u4_cols;
     73     UWORD32 u4_mode;
     74 }comp_mc_params_t;
     75 
     76 typedef struct
     77 {
     78     yuv_buf_t        s_ref;
     79     comp_mc_params_t s_luma;
     80     comp_mc_params_t s_chroma;
     81 }mb_mc_params_t;
     82 
     83 struct _dec_mb_params_t;
     84 
     85 typedef UWORD8 pf_inv_quant_t (WORD16 *blk,
     86                                 UWORD8 *weighting_matrix,
     87                                 UWORD8 quant_scale,
     88                                 WORD32 intra_flag,
     89                                 WORD32 i4_num_coeffs,
     90                                 WORD16 *pi2_coeffs,
     91                                 UWORD8 *pu1_pos,
     92                                 const UWORD8   *scan,
     93                                 UWORD16 *u2_def_dc_pred,
     94                                 UWORD16 u2_intra_dc_precision);
     95 
     96 typedef IMPEG2D_ERROR_CODES_T  pf_vld_inv_quant_t  (void  *dec,
     97                              WORD16       *out_addr,
     98                              const UWORD8 *scan,
     99                              UWORD16      intra_flag,
    100                              UWORD16      colr_comp,
    101                              UWORD16      d_picture);
    102 
    103 typedef void  pf_mc_t(void *, UWORD8 *, UWORD32 , UWORD8 *, UWORD32 ,
    104                  UWORD32 , UWORD32  );
    105 
    106 typedef struct dec_state_struct_t
    107 {
    108     WORD16          ai2_vld_buf[NUM_PELS_IN_BLOCK];
    109     WORD16          ai2_idct_stg1[NUM_PELS_IN_BLOCK];
    110 
    111 
    112     UWORD8          au1_intra_quant_matrix[NUM_PELS_IN_BLOCK];
    113     UWORD8          au1_inter_quant_matrix[NUM_PELS_IN_BLOCK];
    114 
    115     IMPEG2D_ERROR_CODES_T (*pf_decode_slice)(struct dec_state_struct_t *);
    116 
    117     pf_vld_inv_quant_t *pf_vld_inv_quant;
    118 
    119     pf_idct_recon_t *pf_idct_recon[4];
    120 
    121     pf_mc_t         *pf_mc[4];
    122     pf_interpred_t  *pf_fullx_halfy_8x8;
    123     pf_interpred_t  *pf_halfx_fully_8x8;
    124     pf_interpred_t  *pf_halfx_halfy_8x8;
    125     pf_interpred_t  *pf_fullx_fully_8x8;
    126 
    127 
    128     pf_interpolate_t *pf_interpolate;
    129     pf_copy_mb_t     *pf_copy_mb;
    130 
    131     pf_memset0_one_16bit_buf_t *pf_memset_16bit_8x8_linear_block;
    132     pf_memset_8bit_t    *pf_memset_8bit_8x8_block;
    133     pf_copy_yuv420p_buf_t *pf_copy_yuv420p_buf;
    134     pf_fmt_conv_yuv420p_to_yuv422ile_t *pf_fmt_conv_yuv420p_to_yuv422ile;
    135     pf_fmt_conv_yuv420p_to_yuv420sp_t  *pf_fmt_conv_yuv420p_to_yuv420sp_uv;
    136     pf_fmt_conv_yuv420p_to_yuv420sp_t  *pf_fmt_conv_yuv420p_to_yuv420sp_vu;
    137 
    138     stream_t         s_bit_stream;
    139 /* @ */
    140 
    141     UWORD16         u2_is_mpeg2; /* 0 if stream is MPEG1 1 otherwise */
    142     UWORD16         u2_frame_width;  /* Width of the frame */
    143     UWORD16         u2_frame_height; /* Height of the frame */
    144     UWORD16         u2_picture_width;
    145     UWORD16         u2_horizontal_size;
    146     UWORD16         u2_vertical_size;
    147     UWORD16         u2_create_max_width;
    148     UWORD16         u2_create_max_height;
    149     UWORD16         u2_reinit_max_width;
    150     UWORD16         u2_reinit_max_height;
    151     UWORD16         u2_header_done;
    152     UWORD16         u2_decode_header;
    153 
    154     UWORD16         u2_mb_x;
    155     UWORD16         u2_mb_y;
    156     UWORD16         u2_num_horiz_mb;
    157     UWORD16         u2_num_vert_mb;
    158     UWORD16         u2_num_flds_decoded;
    159     void            *pv_pic_buf_mg;
    160 
    161     UWORD32         u4_frm_buf_stride; /* for display Buffer */
    162 
    163     UWORD16         u2_field_dct;
    164     UWORD16         u2_read_dct_type;
    165 
    166     UWORD16         u2_read_motion_type;
    167     UWORD16         u2_motion_type;
    168 
    169     const UWORD16   *pu2_mb_type;
    170     UWORD16         u2_fld_pic;
    171     UWORD16         u2_frm_pic;
    172 
    173     yuv_buf_t       s_cur_frm_buf;
    174 
    175     UWORD16         u2_fld_parity;
    176     UWORD16         u2_def_dc_pred[MAX_COLR_COMPS];
    177 
    178     /* Variables related to Motion Vector predictors */
    179 
    180     WORD16          ai2_pred_mv[2][2][2];
    181     e_pred_direction_t   e_mb_pred;
    182     UWORD16         au2_fcode_data[2];
    183 
    184     /* Variables related to reference pictures */
    185     yuv_buf_t       as_recent_fld[2][2];
    186 
    187     UWORD8          u1_quant_scale;
    188     UWORD16         u2_num_mbs_left;
    189     UWORD16         u2_first_mb;
    190     UWORD16         u2_num_skipped_mbs;
    191 
    192     UWORD8          *pu1_inv_scan_matrix;
    193 
    194     UWORD16         u2_progressive_sequence;
    195     e_pic_type_t         e_pic_type;
    196 
    197     UWORD16         u2_full_pel_forw_vector;
    198     UWORD16         u2_forw_f_code;
    199     UWORD16         u2_full_pel_back_vector;
    200     UWORD16         u2_back_f_code;
    201 
    202     WORD16          ai2_mv[2][2][2]; /* Motion vectors */
    203 
    204     /* Bitstream code present in Picture coding extension */
    205     UWORD16         au2_f_code[2][2];
    206     UWORD16         u2_intra_dc_precision;
    207     UWORD16         u2_picture_structure;
    208     UWORD16         u2_top_field_first;
    209     UWORD16         u2_frame_pred_frame_dct;
    210     UWORD16         u2_concealment_motion_vectors;
    211     UWORD16         u2_q_scale_type;
    212     UWORD16         u2_intra_vlc_format;
    213     UWORD16         u2_alternate_scan;
    214     UWORD16         u2_repeat_first_field;
    215     UWORD16         u2_progressive_frame;
    216 
    217 
    218     /* Bitstream code related to frame rate of the bitstream */
    219     UWORD16         u2_frame_rate_code;
    220     UWORD16         u2_frame_rate_extension_n;
    221     UWORD16         u2_frame_rate_extension_d;
    222     UWORD16         u2_framePeriod;   /* Frame period in milli seconds */
    223 
    224     /* Members related to display dimensions of bitstream */
    225     /* The size values may not be returned right now. But they are read */
    226     /* and can be returned if there is a requirement.                   */
    227     UWORD16         u2_display_horizontal_size;
    228     UWORD16         u2_display_vertical_size;
    229     UWORD16         u2_aspect_ratio_info;
    230 
    231     /* Members related to motion compensation */
    232     yuv_buf_t       s_mc_fw_buf;
    233     yuv_buf_t       s_mc_bk_buf;
    234     yuv_buf_t       s_mc_buf;
    235     mb_mc_params_t  as_mb_mc_params[2][2];
    236     yuv_buf_t       as_ref_buf[2][2];
    237     e_mb_type_t       s_mb_type;
    238 
    239     yuv_buf_t       s_dest_buf;
    240 
    241     /* Variable to handle intra MB */
    242     UWORD16         u2_prev_intra_mb;
    243     UWORD16         u2_coded_mb;
    244 
    245     /* Bidirect function pointers */
    246     const struct _dec_mb_params_t *ps_func_bi_direct;
    247 
    248     /* Forw or Back function pointers */
    249     const struct _dec_mb_params_t *ps_func_forw_or_back;
    250 
    251 
    252     /* CBP of the current MB        */
    253     UWORD16         u2_cbp;
    254     void            *pv_video_scratch;
    255 
    256 
    257     /* For global error handling */
    258     void            *pv_stack_cntxt;
    259 
    260 /* @ */
    261     WORD32          i4_chromaFormat;
    262     UWORD32         u4_xdmBufID;
    263     UWORD32         u4_num_mem_records;
    264     /* For holding memRecords */
    265     void            *pv_memTab;
    266 
    267     UWORD8          u1_flushfrm;
    268     UWORD8          u1_flushcnt;
    269     iv_yuv_buf_t    as_frame_buf[MAX_FRAME_BUFFER];
    270     iv_yuv_buf_t    ps_yuv_buf;
    271 
    272     ivd_get_display_frame_op_t  s_disp_op;
    273 
    274 
    275     UWORD32         u4_non_zero_cols;
    276     UWORD32         u4_non_zero_rows;
    277 
    278     UWORD32         u4_num_frames_decoded;
    279 
    280     /* Adding error code variable to signal benign errors. */
    281     UWORD32         u4_error_code;
    282 
    283     WORD32          i4_num_cores;
    284 
    285     UWORD8          u1_first_frame_done;
    286 
    287     void            *pv_codec_thread_handle;
    288     void            *ps_dec_state_multi_core;
    289     UWORD32         u4_inp_ts;
    290     pic_buf_t       *ps_cur_pic;
    291     pic_buf_t       *ps_disp_pic;
    292     pic_buf_t       *aps_ref_pics[2];
    293 
    294     WORD32          i4_disp_buf_id;
    295     WORD32          i4_cur_buf_id;
    296     iv_yuv_buf_t    *ps_disp_frm_buf;
    297 
    298     UWORD32         u4_share_disp_buf;
    299     void            *pv_pic_buf_base;
    300 
    301     disp_mgr_t      s_disp_mgr;
    302     UWORD8          *pu1_chroma_ref_buf[BUF_MGR_MAX_CNT];
    303     ivd_out_bufdesc_t as_disp_buffers[BUF_MGR_MAX_CNT];
    304 
    305     /* Flag to signal last coeff in a 8x8 block is one
    306     after mismatch contol */
    307     WORD32          i4_last_value_one;
    308 
    309     WORD32          i4_start_mb_y;
    310     WORD32          i4_end_mb_y;
    311 
    312     /**
    313      * Job queue buffer base
    314      */
    315     void            *pv_jobq_buf;
    316 
    317     /**
    318      * Job Queue mem tab size
    319      */
    320     WORD32          i4_jobq_buf_size;
    321 
    322     /**
    323      * Job Queue context
    324      */
    325     void            *pv_jobq;
    326 
    327     /* Pointer to input bitstream */
    328     UWORD8          *pu1_inp_bits_buf;
    329 
    330     /* Number of bytes in the input bitstream */
    331     UWORD32         u4_num_inp_bytes;
    332 
    333     /* Bytes consumed */
    334     WORD32          i4_bytes_consumed;
    335 
    336     IVD_ARCH_T      e_processor_arch;
    337 
    338     IVD_SOC_T       e_processor_soc;
    339 
    340     WORD32          i4_frame_decoded;
    341 
    342 }dec_state_t;
    343 
    344 
    345 
    346 
    347 typedef void (*func_decmb_params)(dec_state_t *);
    348 typedef void  (*mc_funcs)(dec_state_t *);
    349 typedef struct _dec_mb_params_t
    350 {
    351     func_decmb_params    pf_func_mb_params;
    352     e_mb_type_t            s_mb_type;
    353     mc_funcs             pf_mc;
    354 }dec_mb_params_t;
    355 
    356 
    357 
    358 #define MAX_THREADS     4
    359 
    360 
    361 #define MAX_MB_ROWS     (MAX_HEIGHT / 16) // number of rows for 1080p
    362 
    363 typedef struct _dec_state_multi_core
    364 {
    365     // contains the decoder state of decoder for each thread
    366     dec_state_t *ps_dec_state[MAX_THREADS];
    367     UWORD32     au4_thread_launched[MAX_THREADS];
    368     // number of rows: first thread will populate the row offsets and update
    369     // row_offset_cnt. Other threads should pick up offset from this thread
    370     // and start decoding
    371     UWORD32     au4_row_offset[MAX_MB_ROWS];
    372     volatile    UWORD32 u4_row_offset_cnt;
    373 }dec_state_multi_core_t;
    374 
    375 
    376 
    377 #endif /* #ifndef __IMPEG2D_STRUCTS_H__ */
    378