You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
430 lines
12 KiB
430 lines
12 KiB
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
#ifndef __IMPEG2D_STRUCTS_H__
|
|
#define __IMPEG2D_STRUCTS_H__
|
|
|
|
/* Decoder needs at least 4 reference buffers in order to support format conversion in a thread and
|
|
to support B pictures. Because of format conversion in a thread, codec delay is now 2 frames instead of 1.
|
|
To reduce this delay, format conversion has to wait for MB status before converting for B pictures.
|
|
To avoid this check the delay is increased to 2 and hence number of reference frames minimum is 4.
|
|
Because of temporal dependency in deinterlacer one additional buffer is also needed */
|
|
#define NUM_INT_FRAME_BUFFERS 5
|
|
|
|
|
|
#define MAX_WIDTH 4096
|
|
#define MAX_HEIGHT 2160
|
|
|
|
#define MIN_WIDTH 16
|
|
#define MIN_HEIGHT 16
|
|
|
|
|
|
#define MAX_FRM_SIZE (MAX_WIDTH * MAX_HEIGHT * 2) /* Supports only 420P and 422ILE */
|
|
|
|
#define DEC_ORDER 0
|
|
|
|
#define MAX_BITSTREAM_BUFFER_SIZE 2000 * 1024
|
|
#define MIN_BUFFER_BYTES_AT_EOS 8
|
|
|
|
/* Flag to signal that buffer is held by deinterlacing */
|
|
#define MPEG2_BUF_MGR_DEINT (BUF_MGR_DISP << 1)
|
|
|
|
typedef enum
|
|
{
|
|
CMD_PROCESS,
|
|
CMD_FMTCONV,
|
|
}e_jobq_cmd_t;
|
|
|
|
/**
|
|
* Structure to represent a processing job entry
|
|
*/
|
|
typedef struct
|
|
{
|
|
/**
|
|
* Command
|
|
* Currently: PROCESS, FMTCONV are the only two jobs
|
|
*/
|
|
WORD32 i4_cmd;
|
|
|
|
/**
|
|
* MB y of the starting MB
|
|
*/
|
|
WORD16 i2_start_mb_y;
|
|
|
|
/**
|
|
* MB y of the last MB
|
|
*/
|
|
|
|
WORD16 i2_end_mb_y;
|
|
|
|
/**
|
|
* Bitstream offset for the current job
|
|
*/
|
|
WORD32 i4_bistream_ofst;
|
|
|
|
}job_t;
|
|
|
|
typedef struct
|
|
{
|
|
/* Params of the reference buffer used as input to MC */
|
|
UWORD32 u4_src_wd;
|
|
UWORD32 u4_src_offset;
|
|
|
|
/* Params of the buffer where MC output will be written */
|
|
UWORD32 u4_dst_wd_res_buf;
|
|
UWORD32 u4_dst_wd_cur_frm;
|
|
UWORD32 u4_dst_offset_res_buf;
|
|
UWORD32 u4_dst_offset_cur_frm;
|
|
|
|
/* Operation Parameters */
|
|
UWORD32 u4_rows;
|
|
UWORD32 u4_cols;
|
|
UWORD32 u4_mode;
|
|
}comp_mc_params_t;
|
|
|
|
typedef struct
|
|
{
|
|
yuv_buf_t s_ref;
|
|
comp_mc_params_t s_luma;
|
|
comp_mc_params_t s_chroma;
|
|
}mb_mc_params_t;
|
|
|
|
struct _dec_mb_params_t;
|
|
|
|
typedef WORD32 pf_inv_quant_t (WORD16 *blk,
|
|
UWORD8 *weighting_matrix,
|
|
UWORD8 quant_scale,
|
|
WORD32 intra_flag,
|
|
WORD32 i4_num_coeffs,
|
|
WORD16 *pi2_coeffs,
|
|
UWORD8 *pu1_pos,
|
|
const UWORD8 *scan,
|
|
UWORD16 *u2_def_dc_pred,
|
|
UWORD16 u2_intra_dc_precision);
|
|
|
|
typedef IMPEG2D_ERROR_CODES_T pf_vld_inv_quant_t (void *dec,
|
|
WORD16 *out_addr,
|
|
const UWORD8 *scan,
|
|
UWORD16 intra_flag,
|
|
UWORD16 colr_comp,
|
|
UWORD16 d_picture);
|
|
|
|
typedef void pf_mc_t(void *, UWORD8 *, UWORD32 , UWORD8 *, UWORD32 ,
|
|
UWORD32 , UWORD32 );
|
|
|
|
typedef struct dec_state_struct_t
|
|
{
|
|
WORD16 ai2_vld_buf[NUM_PELS_IN_BLOCK];
|
|
WORD16 ai2_idct_stg1[NUM_PELS_IN_BLOCK];
|
|
|
|
|
|
UWORD8 au1_intra_quant_matrix[NUM_PELS_IN_BLOCK];
|
|
UWORD8 au1_inter_quant_matrix[NUM_PELS_IN_BLOCK];
|
|
|
|
IMPEG2D_ERROR_CODES_T (*pf_decode_slice)(struct dec_state_struct_t *);
|
|
|
|
pf_vld_inv_quant_t *pf_vld_inv_quant;
|
|
|
|
pf_idct_recon_t *pf_idct_recon[4];
|
|
|
|
pf_mc_t *pf_mc[4];
|
|
pf_interpred_t *pf_fullx_halfy_8x8;
|
|
pf_interpred_t *pf_halfx_fully_8x8;
|
|
pf_interpred_t *pf_halfx_halfy_8x8;
|
|
pf_interpred_t *pf_fullx_fully_8x8;
|
|
|
|
|
|
pf_interpolate_t *pf_interpolate;
|
|
pf_copy_mb_t *pf_copy_mb;
|
|
|
|
pf_memset0_one_16bit_buf_t *pf_memset_16bit_8x8_linear_block;
|
|
pf_memset_8bit_t *pf_memset_8bit_8x8_block;
|
|
pf_copy_yuv420p_buf_t *pf_copy_yuv420p_buf;
|
|
pf_fmt_conv_yuv420p_to_yuv422ile_t *pf_fmt_conv_yuv420p_to_yuv422ile;
|
|
pf_fmt_conv_yuv420p_to_yuv420sp_t *pf_fmt_conv_yuv420p_to_yuv420sp_uv;
|
|
pf_fmt_conv_yuv420p_to_yuv420sp_t *pf_fmt_conv_yuv420p_to_yuv420sp_vu;
|
|
|
|
stream_t s_bit_stream;
|
|
/* @ */
|
|
|
|
UWORD16 u2_is_mpeg2; /* 0 if stream is MPEG1 1 otherwise */
|
|
UWORD16 u2_frame_width; /* Width of the frame */
|
|
UWORD16 u2_frame_height; /* Height of the frame */
|
|
UWORD16 u2_picture_width;
|
|
UWORD16 u2_horizontal_size;
|
|
UWORD16 u2_vertical_size;
|
|
UWORD16 u2_create_max_width;
|
|
UWORD16 u2_create_max_height;
|
|
UWORD16 u2_reinit_max_width;
|
|
UWORD16 u2_reinit_max_height;
|
|
UWORD16 u2_header_done;
|
|
UWORD16 u2_decode_header;
|
|
|
|
UWORD16 u2_mb_x;
|
|
UWORD16 u2_mb_y;
|
|
UWORD16 u2_num_horiz_mb;
|
|
UWORD16 u2_num_vert_mb;
|
|
UWORD16 u2_num_flds_decoded;
|
|
void *pv_pic_buf_mg;
|
|
|
|
UWORD32 u4_frm_buf_stride; /* for display Buffer */
|
|
|
|
UWORD16 u2_field_dct;
|
|
UWORD16 u2_read_dct_type;
|
|
|
|
UWORD16 u2_read_motion_type;
|
|
UWORD16 u2_motion_type;
|
|
|
|
const UWORD16 *pu2_mb_type;
|
|
UWORD16 u2_fld_pic;
|
|
UWORD16 u2_frm_pic;
|
|
|
|
yuv_buf_t s_cur_frm_buf;
|
|
|
|
UWORD16 u2_fld_parity;
|
|
UWORD16 u2_def_dc_pred[MAX_COLR_COMPS];
|
|
|
|
/* Variables related to Motion Vector predictors */
|
|
|
|
WORD16 ai2_pred_mv[2][2][2];
|
|
e_pred_direction_t e_mb_pred;
|
|
UWORD16 au2_fcode_data[2];
|
|
|
|
/* Variables related to reference pictures */
|
|
yuv_buf_t as_recent_fld[2][2];
|
|
|
|
UWORD8 u1_quant_scale;
|
|
UWORD16 u2_num_mbs_left;
|
|
UWORD16 u2_first_mb;
|
|
UWORD16 u2_num_skipped_mbs;
|
|
|
|
UWORD8 *pu1_inv_scan_matrix;
|
|
|
|
UWORD16 u2_progressive_sequence;
|
|
e_pic_type_t e_pic_type;
|
|
|
|
UWORD16 u2_full_pel_forw_vector;
|
|
UWORD16 u2_forw_f_code;
|
|
UWORD16 u2_full_pel_back_vector;
|
|
UWORD16 u2_back_f_code;
|
|
|
|
WORD16 ai2_mv[2][2][2]; /* Motion vectors */
|
|
|
|
/* Bitstream code present in Picture coding extension */
|
|
UWORD16 au2_f_code[2][2];
|
|
UWORD16 u2_intra_dc_precision;
|
|
UWORD16 u2_picture_structure;
|
|
UWORD16 u2_top_field_first;
|
|
UWORD16 u2_frame_pred_frame_dct;
|
|
UWORD16 u2_concealment_motion_vectors;
|
|
UWORD16 u2_q_scale_type;
|
|
UWORD16 u2_intra_vlc_format;
|
|
UWORD16 u2_alternate_scan;
|
|
UWORD16 u2_repeat_first_field;
|
|
UWORD16 u2_progressive_frame;
|
|
|
|
|
|
/* Bitstream code related to frame rate of the bitstream */
|
|
UWORD16 u2_frame_rate_code;
|
|
UWORD16 u2_frame_rate_extension_n;
|
|
UWORD16 u2_frame_rate_extension_d;
|
|
UWORD16 u2_framePeriod; /* Frame period in milli seconds */
|
|
|
|
/* Members related to display dimensions of bitstream */
|
|
/* The size values may not be returned right now. But they are read */
|
|
/* and can be returned if there is a requirement. */
|
|
UWORD8 u1_video_format;
|
|
UWORD8 u1_colour_description;
|
|
UWORD8 u1_colour_primaries;
|
|
UWORD8 u1_transfer_characteristics;
|
|
UWORD8 u1_matrix_coefficients;
|
|
UWORD16 u2_display_horizontal_size;
|
|
UWORD16 u2_display_vertical_size;
|
|
UWORD16 u2_aspect_ratio_info;
|
|
|
|
/* Members related to motion compensation */
|
|
yuv_buf_t s_mc_fw_buf;
|
|
yuv_buf_t s_mc_bk_buf;
|
|
yuv_buf_t s_mc_buf;
|
|
mb_mc_params_t as_mb_mc_params[2][2];
|
|
yuv_buf_t as_ref_buf[2][2];
|
|
e_mb_type_t s_mb_type;
|
|
|
|
yuv_buf_t s_dest_buf;
|
|
|
|
/* Variable to handle intra MB */
|
|
UWORD16 u2_prev_intra_mb;
|
|
UWORD16 u2_coded_mb;
|
|
|
|
/* Bidirect function pointers */
|
|
const struct _dec_mb_params_t *ps_func_bi_direct;
|
|
|
|
/* Forw or Back function pointers */
|
|
const struct _dec_mb_params_t *ps_func_forw_or_back;
|
|
|
|
|
|
/* CBP of the current MB */
|
|
UWORD16 u2_cbp;
|
|
void *pv_video_scratch;
|
|
|
|
|
|
/* For global error handling */
|
|
void *pv_stack_cntxt;
|
|
|
|
/* @ */
|
|
WORD32 i4_chromaFormat;
|
|
UWORD32 u4_xdmBufID;
|
|
UWORD32 u4_num_mem_records;
|
|
/* For holding memRecords */
|
|
void *pv_memTab;
|
|
|
|
UWORD8 u1_flushfrm;
|
|
UWORD8 u1_flushcnt;
|
|
iv_yuv_buf_t as_frame_buf[MAX_FRAME_BUFFER];
|
|
iv_yuv_buf_t ps_yuv_buf;
|
|
|
|
ivd_get_display_frame_op_t s_disp_op;
|
|
|
|
|
|
UWORD32 u4_non_zero_cols;
|
|
UWORD32 u4_non_zero_rows;
|
|
|
|
UWORD32 u4_num_frames_decoded;
|
|
|
|
/* Adding error code variable to signal benign errors. */
|
|
UWORD32 u4_error_code;
|
|
|
|
WORD32 i4_num_cores;
|
|
|
|
UWORD8 u1_first_frame_done;
|
|
|
|
void *pv_codec_thread_handle;
|
|
void *ps_dec_state_multi_core;
|
|
UWORD32 u4_inp_ts;
|
|
pic_buf_t *ps_cur_pic;
|
|
pic_buf_t *ps_disp_pic;
|
|
pic_buf_t *aps_ref_pics[2];
|
|
|
|
WORD32 i4_disp_buf_id;
|
|
WORD32 i4_cur_buf_id;
|
|
iv_yuv_buf_t *ps_disp_frm_buf;
|
|
|
|
UWORD32 u4_share_disp_buf;
|
|
void *pv_pic_buf_base;
|
|
|
|
disp_mgr_t s_disp_mgr;
|
|
UWORD8 *pu1_chroma_ref_buf[BUF_MGR_MAX_CNT];
|
|
ivd_out_bufdesc_t as_disp_buffers[BUF_MGR_MAX_CNT];
|
|
|
|
/* Count the number of pictures decoded after init/reset */
|
|
WORD32 i4_pic_count;
|
|
|
|
/* Flag to signal last coeff in a 8x8 block is one
|
|
after mismatch contol */
|
|
WORD32 i4_last_value_one;
|
|
|
|
WORD32 i4_start_mb_y;
|
|
WORD32 i4_end_mb_y;
|
|
|
|
/* Buffer to store the input stream */
|
|
UWORD8 *pu1_input_buffer;
|
|
|
|
/**
|
|
* Job queue buffer base
|
|
*/
|
|
void *pv_jobq_buf;
|
|
|
|
/**
|
|
* Job Queue mem tab size
|
|
*/
|
|
WORD32 i4_jobq_buf_size;
|
|
|
|
/**
|
|
* Job Queue context
|
|
*/
|
|
void *pv_jobq;
|
|
|
|
/* Pointer to input bitstream */
|
|
UWORD8 *pu1_inp_bits_buf;
|
|
|
|
/* Number of bytes in the input bitstream */
|
|
UWORD32 u4_num_inp_bytes;
|
|
|
|
ivd_out_bufdesc_t *ps_out_buf;
|
|
|
|
/* Bytes consumed */
|
|
WORD32 i4_bytes_consumed;
|
|
|
|
IVD_ARCH_T e_processor_arch;
|
|
|
|
IVD_SOC_T e_processor_soc;
|
|
|
|
WORD32 i4_frame_decoded;
|
|
|
|
/** Flag to enable deinterlace */
|
|
UWORD32 u4_deinterlace;
|
|
|
|
/** Deinterlacer context */
|
|
void *pv_deinterlacer_ctxt;
|
|
|
|
/** Picture buffer held by deinterlacer */
|
|
pic_buf_t *ps_deint_pic;
|
|
|
|
/** Buffer used after deinterlacer for format conversion */
|
|
UWORD8 *pu1_deint_fmt_buf;
|
|
|
|
/** Flag to indicate if Seq Display Extn is present */
|
|
UWORD8 u1_seq_disp_extn_present;
|
|
}dec_state_t;
|
|
|
|
|
|
|
|
|
|
typedef void (*func_decmb_params)(dec_state_t *);
|
|
typedef void (*mc_funcs)(dec_state_t *);
|
|
typedef struct _dec_mb_params_t
|
|
{
|
|
func_decmb_params pf_func_mb_params;
|
|
e_mb_type_t s_mb_type;
|
|
mc_funcs pf_mc;
|
|
}dec_mb_params_t;
|
|
|
|
|
|
|
|
#define MAX_THREADS 4
|
|
|
|
|
|
#define MAX_MB_ROWS (MAX_HEIGHT / 16) // number of rows for 1080p
|
|
|
|
typedef struct _dec_state_multi_core
|
|
{
|
|
// contains the decoder state of decoder for each thread
|
|
dec_state_t *ps_dec_state[MAX_THREADS];
|
|
UWORD32 au4_thread_launched[MAX_THREADS];
|
|
// number of rows: first thread will populate the row offsets and update
|
|
// row_offset_cnt. Other threads should pick up offset from this thread
|
|
// and start decoding
|
|
UWORD32 au4_row_offset[MAX_MB_ROWS];
|
|
volatile UWORD32 u4_row_offset_cnt;
|
|
}dec_state_multi_core_t;
|
|
|
|
|
|
|
|
#endif /* #ifndef __IMPEG2D_STRUCTS_H__ */
|