Files
luban-lite-t3e-pro/packages/artinchip/mpp/ve/decoder/h264/h264_hal.h
刘可亮 7bbc029dae v1.0.0
2023-08-30 16:21:18 +08:00

321 lines
8.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright (C) 2020-2022 Artinchip Technology Co. Ltd
*
* author: <qi.xu@artinchip.com>
* Desc: avc register
*/
#ifndef __H264_HAL_H__
#define __H264_HAL_H__
#define AVC_RESET_REG 0x100
struct reg_avc_sps
{
unsigned pic_height_in_map_units_minus1 : 7; //[6:0]
unsigned r0 : 1;
unsigned pic_width_in_mbs_minus1 : 7;// [14:8]
unsigned r1 : 1;
unsigned direct_8x8_inference_flag : 1;
unsigned mb_adaptive_frame_filed_flag : 1;
unsigned frame_mbs_only_flag : 1;
unsigned uv_interleave : 1;
unsigned uv_alter : 1;
unsigned chroma_format_idc : 2; //[22:21]:
unsigned r : 8;
unsigned pic_init : 1;
};
#define AVC_SPS_REG 0x104
struct reg_avc_pps
{
unsigned transform_8x8_mode_flag : 1;
unsigned constrained_intra_pred_flag : 1;
unsigned weighted_bipred_idc : 2;
unsigned weighted_pred_flag : 1;
unsigned entropy_coding_mode_flag : 1;
unsigned r0 : 2;
unsigned num_ref_idx_l1_active_minus1_pic : 5;
unsigned r1 : 3;
unsigned num_ref_idx_l0_active_minus1_pic : 5;
unsigned r2 : 11;
};
#define AVC_PPS_REG 0x108
struct reg_avc_sh1
{
unsigned cabac_init_idc : 2; // [1:0]
unsigned direct_spatial_mv_pred_flag : 1;
unsigned bottom_field_flag : 1;
unsigned field_pic_flag : 1;
unsigned first_slice_in_pic : 1;
unsigned r0 : 2;
unsigned slice_type : 4;
unsigned nal_ref_flag : 1;
unsigned r1 : 3;
unsigned first_mb_y : 7;
unsigned r2 : 1;
unsigned first_mb_x : 7;
unsigned r3 : 1;
};
#define AVC_SHS1_REG 0x10C
struct reg_avc_sh2
{
unsigned slice_beta_offset_div2 : 4;
unsigned slice_alpha_offset_div2 : 4;
unsigned disable_deblocking_filter_idc : 2;
unsigned r0 : 2;
unsigned num_ref_idx_active_override_flag : 1;
unsigned r1 : 3;
unsigned num_ref_idx_l1_active_minus1 : 5;
unsigned r2 : 3;
unsigned num_ref_idx_l0_active_minus1 : 5;
unsigned r3 : 3;
};
#define AVC_SHS2_REG 0x110
struct reg_avc_shs_wp
{
unsigned r : 24;
unsigned chroma_log2_weight_denom : 3;
unsigned r0 : 1;
unsigned luma_log2_weight_denom : 3;
unsigned r1 : 1;
};
#define AVC_SHS_WP_REG 0x114
struct reg_avc_weight_pred
{
unsigned offset : 8; // [7:0]:offset
unsigned weight : 9; // [16:8]:weight
unsigned r : 7;
/*
0x00-0x1F is Luma_L0;
0x20-0x3F is Chroma_Cb_L0;
0x40-0x5F is Chroma_Cr_L0;
0x60-0x7F is Luma_L1;
0x80-0x9F is Chroma_Cb_L1;
0xA0-0xBF is Chroma_Cr_L1
*/
unsigned weight_pred_addr : 8;
};
#define AVC_WEIGHT_PRED_REGISTER 0x118
struct reg_avc_scaling_matrix
{
unsigned scaling_matrix_data : 9; // [8:0],
unsigned r0 : 7;
/*
000: S1_4x4_intra_Y
001: S1_4x4_intra_Cb
010: S1_4x4_intra_Cr
011: S1_4x4_inter_Y
100: S1_4x4_inter_Cb
101: S1_4x4_inter_Cr
110: S1_8x8_intra_Y
111: S1_8x8_inter_Y
*/
unsigned matrix_addr : 8; // [23:16]
unsigned r1 : 6;
unsigned write_enable : 1; // [30]
unsigned matrix_access : 1; // [31]
};
#define AVC_SCALING_MATRIX_REGISTER 0x11C
struct reg_avc_shs_qp
{
unsigned slice_qpy : 6; // [5:0]: Slice header qp_y, value range 0~51
unsigned r0 : 2;
unsigned chroma_qp_idx_offset : 6; // [13:8]: Cb qp offset, value range -12~12
unsigned r1 : 2;
unsigned second_chroma_qp_idx_offset : 6; // [21:16]: Cr qp offset, value range -12~12
unsigned r2 : 10;
};
#define AVC_SHS_QP_REG 0x120
struct reg_avc_ctrl
{
unsigned r0 : 3;
unsigned dec_finish_int_enable : 1; // [3]: finish irq enable
unsigned dec_error_int_enable : 1; // [4]: error irq enable
unsigned bit_request_int_enable : 1; // [5]: bit request irq enable
unsigned r1 : 7;
unsigned eptb_detection : 1; // [13], detect emulation_prevention_three_byte (0x03) enable
unsigned stcd_detect_en : 1; // [14], detect startcode enable
unsigned r2 : 16;
unsigned slice_start : 1; // [31], slice decode start
};
#define AVC_CTRL_REG 0x124
struct reg_ve_status
{
unsigned busy_status : 9; // [0]: (RO) internal module status
unsigned r0 : 7;
unsigned ve_finish : 1; // [16]: finish status, write 1 clear irq
unsigned bit_request : 1; // [17]: bitrequest status, write 1 clear irq
unsigned ve_error : 1; // [18]: error status, write 1 clear irq
unsigned r1 : 9;
unsigned error_case : 4; // [28]: mb_prefix dec err
// [29]: mb header dec err
// [30]: blk coeff dec err
// [31]: bit stream err
};
#define VE_STATUS_REG 0x128
#define CORRECT_DECODE_MB_NUMBER_REG 0x12C
struct reg_ve_bit_buffer_valid
{
unsigned data_first : 1; // [0]: first part of a picture data
unsigned data_last : 1; // [1]: last part
unsigned r : 29;
unsigned data_valid : 1; // [31]: valid data
};
#define BIT_BUFFER_DATA_VALID_REG 0x130
#define BIT_BUFFER_START_ADDR_REG 0x134
#define BIT_BUFFER_END_ADDR_REG 0x138
#define BIT_BUFFER_BIT_OFFSET_REG 0x13C
#define BIT_BUFFER_BIT_LEN_REG 0x140
struct reg_avc_ref_list
{
unsigned field_sel_list0 : 1; // [0]: 0:top field, 1:bottom field
unsigned buf_idx_list0 : 5; // [5:1]: frame idx of forward reference
unsigned r0 : 2;
unsigned field_sel_list1 : 1; // [8]: 0:top field, 1:bottom field
unsigned buf_idx_list1 : 5; // [13:9]: frame idx of backward reference
unsigned r1 : 2;
unsigned ref_idx : 5; // [20:16]: ref idx of refrence list, val range 0-31.
unsigned r2 : 10;
unsigned ref_idx_rw : 1; // [31]: 0:read from ve; 1: write to ve
};
#define AVC_REF_LIST_REGISTER 0x144
struct frame_struct_ref_info
{
// top field refrence type: 00 (short-term); 01 (long-term); 10 (non-refrence); 11(reserve)
unsigned top_ref_type : 2;
unsigned r0 : 2;
// bottom field refrence type: 00 (short-term); 01 (long-term); 10 (non-refrence); 11(reserve)
unsigned bot_ref_type : 2;
unsigned r1 : 2;
// picture type: 00 (frame); 01(field); 10(mbaff)
unsigned frm_struct : 2;
unsigned r2 : 22;
};
struct reg_avc_buf_info
{
/*
select content of frame buffer
000top poc
001bottom poc
010pic info, Frame_Struct_Ref_Info
101top field/frame mv collocated info start address in DRAM
110bottpm field/frame mv collocated info start address in DRAM
*/
unsigned curr_frame_idx : 5; // [4:0]
unsigned r0 : 3;
unsigned buf_idx : 5; // [12:8]
unsigned r1 : 3;
unsigned content_select : 3; // [18:16]
unsigned r2 : 12;
unsigned buf_info_rw : 1; // [31]:
};
#define AVC_BUF_INFO_REGISTER 0x148
#define AVC_BUF_INFO_CONTENT_REGISTER 0x14C
// co-located info used for direct pred in B-skip, need memory size(17 * 4K byte)
#define MB_COL_BUF_ADDR_REG 0x150
#define MBINFO_BUF_ADDR_REG 0x154
//* store the last line data of last mb line for intra-pred
#define MB_INTRAP_ADDR_REG 0x1D4
#define CYCLES_REG 0x1F8
/***************************************************************************************************/
/***************************** DBLK reg **********************************************************/
struct reg_pic_type
{
unsigned bottom_field_flag : 1; // 0: top field, 1: bottom field;
unsigned field : 1; // 0: frame picture, 1: field
unsigned mbaff : 1; // mbaffFrameFlag
unsigned r1 : 29;
};
#define DBLK_PIC_TYPE_REG 0x210
struct reg_pic_size
{
unsigned pic_ysize : 12; // [11:0]
unsigned r0 : 4;
unsigned pic_xsize : 12; // [27:16]
unsigned r1 : 4;
};
#define DBLK_PIC_SIZE_REG 0x214
struct reg_dblk_type
{
unsigned dblk_enable : 1; //
unsigned r1 : 31;
};
#define DBLK_EN_REG 0x240
#define DBLK_BUF_Y_REG 0x244
#define DBLK_BUF_C_REG 0x248
struct reg_dec_config
{
unsigned r0 : 2;
unsigned uv_interleave : 1; //
unsigned uv_alternative : 1; // 0:cbcr 1:crcb
unsigned dec_chroma_idc : 2; // 00-420; 01-400
unsigned dec_luma_only : 1;
unsigned r1 : 1;
unsigned dec_wr_en : 1; // write 1
unsigned r : 23;
};
#define DEC_CONFIG_REG 0x24C
#define DEC_FRAME_IDX_REG 0x250
/********************************** MC *************************************************************/
#define MC_DMA_MODE_REG 0x448
struct mc_wp_en
{
unsigned implicited_en: 1; // B slice && weighted_bipred_idc == 2, set 1
unsigned weighted_en : 1; // weighted pred enable
unsigned r : 30;
};
#define MC_WP_EN_REG 0x480
struct mc_wp_logwd
{
unsigned logwd_y : 3;
unsigned logwd_c : 3;
unsigned r : 26;
};
#define MC_WP_LOGWD_REG 0x484
/*******************************************************************************************************/
enum AVC_STATUS
{
AVC_FINISH = 1<<16,
AVC_BIT_REQ = 1 << 17,
AVC_ERROR = 1 << 18,
};
#endif