blob: e1d1ab483893c0410648a2cd25da8104fa790bc7 [file] [log] [blame]
/*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Description:
*/
#ifndef H264_DPB_H_
#define H264_DPB_H_
#define ERROR_CHECK
#define OUTPUT_BUFFER_IN_C
#define PRINT_FLAG_ERROR 0x0
#define PRINT_FLAG_VDEC_STATUS 0X0001
#define PRINT_FLAG_UCODE_EVT 0x0002
#define PRINT_FLAG_MMU_DETAIL 0x0004
#define PRINT_FLAG_ERRORFLAG_DBG 0x0008
#define PRINT_FLAG_DPB_DETAIL 0x0010
#define PRINT_FLAG_DEC_DETAIL 0x0020
#define PRINT_FLAG_VDEC_DETAIL 0x0040
#define PRINT_FLAG_DUMP_DPB 0x0080
#define PRINT_FRAMEBASE_DATA 0x0100
#define PRINT_FLAG_DEBUG_POC 0x0200
#define RRINT_FLAG_RPM 0x0400
#define DEBUG_DISABLE_RUNREADY_RMBUF 0x0800
#define PRINT_FLAG_DUMP_BUFSPEC 0x1000
#define PRINT_FLAG_FCC_STATUS 0x2000
#define PRINT_FLAG_SEI_DETAIL 0x4000
#define PRINT_FLAG_V4L_DETAIL 0x8000
#define DISABLE_ERROR_HANDLE 0x10000
#define DEBUG_DUMP_STAT 0x80000
#define DEBUG_TIMEOUT_DEC_STAT 0x800000
/*setting canvas mode and endian.
if this flag is set, value of canvas mode
will according to the value of mem_map_mode.
endian will be forced set to 0 in
CANVAS_BLKMODE_LINEAR mode.
otherwise picture will display abnormal.
if this flag is not set, value of canvas mode
will be determined by the user speace config.
endian will be set 7 in CANVAS_BLKMODE_LINEAR mode.
*/
#define IGNORE_PARAM_FROM_CONFIG 0x8000000
#define MVC_EXTENSION_ENABLE 0
#define PRINTREFLIST 0
#define MAX_LIST_SIZE 33
#define H264_OUTPUT_MODE_NORMAL 0x4
#define H264_OUTPUT_MODE_FAST 0x8
//#define FALSE 0
#define H264_SLICE_HEAD_DONE 0x01
#define H264_PIC_DATA_DONE 0x02
/*#define H264_SPS_DONE 0x03*/
/*#define H264_PPS_DONE 0x04*/
/*#define H264_SLICE_DATA_DONE 0x05*/
/*#define H264_DATA_END 0x06*/
#define H264_CONFIG_REQUEST 0x11
#define H264_DATA_REQUEST 0x12
#define H264_WRRSP_REQUEST 0x13
#define H264_WRRSP_DONE 0x14
#define H264_DECODE_BUFEMPTY 0x20
#define H264_DECODE_TIMEOUT 0x21
#define H264_SEARCH_BUFEMPTY 0x22
#define H264_DECODE_OVER_SIZE 0x23
#define VIDEO_SIGNAL_LOW 0x26
#define VIDEO_SIGNAL_HIGHT 0x27
#define H264_FIND_NEXT_PIC_NAL 0x50
#define H264_FIND_NEXT_DVEL_NAL 0x51
#define H264_AUX_DATA_READY 0x52
#define H264_SEI_DATA_READY 0x53
#define H264_SEI_DATA_DONE 0x54
/* 0x8x, search state*/
#define H264_STATE_SEARCH_AFTER_SPS 0x80
#define H264_STATE_SEARCH_AFTER_PPS 0x81
#define H264_STATE_PARSE_SLICE_HEAD 0x82
#define H264_STATE_SEARCH_HEAD 0x83
/**/
#define H264_ACTION_SEARCH_HEAD 0xf0
#define H264_ACTION_DECODE_SLICE 0xf1
#define H264_ACTION_CONFIG_DONE 0xf2
#define H264_ACTION_DECODE_NEWPIC 0xf3
#define H264_ACTION_DECODE_START 0xff
#define RPM_BEGIN 0x0
#define RPM_END 0x400
#define val(s) (s[0]|(s[1]<<16))
#define FRAME_IN_DPB 24
#define DPB_OFFSET 0x100
#define MMCO_OFFSET 0x200
union param {
#if 0
#define H_TIME_STAMP_START 0X00
#define H_TIME_STAMP_END 0X17
#define PTS_ZERO_0 0X18
#define PTS_ZERO_1 0X19
#endif
#define FIXED_FRAME_RATE_FLAG 0X21
#define OFFSET_DELIMITER_LO 0x2f
#define OFFSET_DELIMITER_HI 0x30
#define SLICE_IPONLY_BREAK 0X5C
#define PREV_MAX_REFERENCE_FRAME_NUM 0X5D
#define EOS 0X5E
#define FRAME_PACKING_TYPE 0X5F
#define OLD_POC_PAR_1 0X60
#define OLD_POC_PAR_2 0X61
#define PREV_MBX 0X62
#define PREV_MBY 0X63
#define ERROR_SKIP_MB_NUM 0X64
#define ERROR_MB_STATUS 0X65
#define L0_PIC0_STATUS 0X66
#define TIMEOUT_COUNTER 0X67
#define BUFFER_SIZE 0X68
#define BUFFER_SIZE_HI 0X69
#define CROPPING_LEFT_RIGHT 0X6A
#define CROPPING_TOP_BOTTOM 0X6B
#if 1
/* sps_flags2:
*bit 3, bitstream_restriction_flag
*bit 2, pic_struct_present_flag
*bit 1, vcl_hrd_parameters_present_flag
*bit 0, nal_hrd_parameters_present_flag
*/
#define SPS_FLAGS2 0x6c
#define NUM_REORDER_FRAMES 0x6d
#else
#define POC_SELECT_NEED_SWAP 0X6C
#define POC_SELECT_SWAP 0X6D
#endif
#define MAX_BUFFER_FRAME 0X6E
#define NON_CONFORMING_STREAM 0X70
#define RECOVERY_POINT 0X71
#define POST_CANVAS 0X72
#define POST_CANVAS_H 0X73
#define SKIP_PIC_COUNT 0X74
#define TARGET_NUM_SCALING_LIST 0X75
#define FF_POST_ONE_FRAME 0X76
#define PREVIOUS_BIT_CNT 0X77
#define MB_NOT_SHIFT_COUNT 0X78
#define PIC_STATUS 0X79
#define FRAME_COUNTER 0X7A
#define NEW_SLICE_TYPE 0X7B
#define NEW_PICTURE_STRUCTURE 0X7C
#define NEW_FRAME_NUM 0X7D
#define NEW_IDR_PIC_ID 0X7E
#define IDR_PIC_ID 0X7F
/* h264 LOCAL */
#define NAL_UNIT_TYPE 0X80
#define NAL_REF_IDC 0X81
#define SLICE_TYPE 0X82
#define LOG2_MAX_FRAME_NUM 0X83
#define FRAME_MBS_ONLY_FLAG 0X84
#define PIC_ORDER_CNT_TYPE 0X85
#define LOG2_MAX_PIC_ORDER_CNT_LSB 0X86
#define PIC_ORDER_PRESENT_FLAG 0X87
#define REDUNDANT_PIC_CNT_PRESENT_FLAG 0X88
#define PIC_INIT_QP_MINUS26 0X89
#define DEBLOCKING_FILTER_CONTROL_PRESENT_FLAG 0X8A
#define NUM_SLICE_GROUPS_MINUS1 0X8B
#define MODE_8X8_FLAGS 0X8C
#define ENTROPY_CODING_MODE_FLAG 0X8D
#define SLICE_QUANT 0X8E
#define TOTAL_MB_HEIGHT 0X8F
#define PICTURE_STRUCTURE 0X90
#define TOP_INTRA_TYPE 0X91
#define RV_AI_STATUS 0X92
#define AI_READ_START 0X93
#define AI_WRITE_START 0X94
#define AI_CUR_BUFFER 0X95
#define AI_DMA_BUFFER 0X96
#define AI_READ_OFFSET 0X97
#define AI_WRITE_OFFSET 0X98
#define AI_WRITE_OFFSET_SAVE 0X99
#define RV_AI_BUFF_START 0X9A
#define I_PIC_MB_COUNT 0X9B
#define AI_WR_DCAC_DMA_CTRL 0X9C
#define SLICE_MB_COUNT 0X9D
#define PICTYPE 0X9E
#define SLICE_GROUP_MAP_TYPE 0X9F
#define MB_TYPE 0XA0
#define MB_AFF_ADDED_DMA 0XA1
#define PREVIOUS_MB_TYPE 0XA2
#define WEIGHTED_PRED_FLAG 0XA3
#define WEIGHTED_BIPRED_IDC 0XA4
/* bit 3:2 - PICTURE_STRUCTURE
* bit 1 - MB_ADAPTIVE_FRAME_FIELD_FLAG
* bit 0 - FRAME_MBS_ONLY_FLAG
*/
#define MBFF_INFO 0XA5
#define TOP_INTRA_TYPE_TOP 0XA6
#define RV_AI_BUFF_INC 0xa7
#define DEFAULT_MB_INFO_LO 0xa8
/* 0 -- no need to read
* 1 -- need to wait Left
* 2 -- need to read Intra
* 3 -- need to read back MV
*/
#define NEED_READ_TOP_INFO 0xa9
/* 0 -- idle
* 1 -- wait Left
* 2 -- reading top Intra
* 3 -- reading back MV
*/
#define READ_TOP_INFO_STATE 0xaa
#define DCAC_MBX 0xab
#define TOP_MB_INFO_OFFSET 0xac
#define TOP_MB_INFO_RD_IDX 0xad
#define TOP_MB_INFO_WR_IDX 0xae
#define VLD_NO_WAIT 0
#define VLD_WAIT_BUFFER 1
#define VLD_WAIT_HOST 2
#define VLD_WAIT_GAP 3
#define VLD_WAITING 0xaf
#define MB_X_NUM 0xb0
/* #define MB_WIDTH 0xb1 */
#define MB_HEIGHT 0xb2
#define MBX 0xb3
#define TOTAL_MBY 0xb4
#define INTR_MSK_SAVE 0xb5
/* #define has_time_stamp 0xb6 */
#define NEED_DISABLE_PPE 0xb6
#define IS_NEW_PICTURE 0XB7
#define PREV_NAL_REF_IDC 0XB8
#define PREV_NAL_UNIT_TYPE 0XB9
#define FRAME_MB_COUNT 0XBA
#define SLICE_GROUP_UCODE 0XBB
#define SLICE_GROUP_CHANGE_RATE 0XBC
#define SLICE_GROUP_CHANGE_CYCLE_LEN 0XBD
#define DELAY_LENGTH 0XBE
#define PICTURE_STRUCT 0XBF
/* #define pre_picture_struct 0xc0 */
#define DCAC_PREVIOUS_MB_TYPE 0xc1
#define TIME_STAMP 0XC2
#define H_TIME_STAMP 0XC3
#define VPTS_MAP_ADDR 0XC4
#define H_VPTS_MAP_ADDR 0XC5
/*#define MAX_DPB_SIZE 0XC6*/
#define PIC_INSERT_FLAG 0XC7
#define TIME_STAMP_START 0XC8
#define TIME_STAMP_END 0XDF
#define OFFSET_FOR_NON_REF_PIC 0XE0
#define OFFSET_FOR_TOP_TO_BOTTOM_FIELD 0XE2
#define MAX_REFERENCE_FRAME_NUM 0XE4
#define FRAME_NUM_GAP_ALLOWED 0XE5
#define NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE 0XE6
#define PROFILE_IDC_MMCO 0XE7
#define LEVEL_IDC_MMCO 0XE8
#define FRAME_SIZE_IN_MB 0XE9
#define DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG 0XEA
#define PPS_NUM_REF_IDX_L0_ACTIVE_MINUS1 0XEB
#define PPS_NUM_REF_IDX_L1_ACTIVE_MINUS1 0XEC
#define CURRENT_SPS_ID 0XED
#define CURRENT_PPS_ID 0XEE
/* bit 0 - sequence parameter set may change
* bit 1 - picture parameter set may change
* bit 2 - new dpb just inited
* bit 3 - IDR picture not decoded yet
* bit 5:4 - 0: mb level code loaded 1: picture
* level code loaded 2: slice level code loaded
*/
#define DECODE_STATUS 0XEF
#define FIRST_MB_IN_SLICE 0XF0
#define PREV_MB_WIDTH 0XF1
#define PREV_FRAME_SIZE_IN_MB 0XF2
/*#define MAX_REFERENCE_FRAME_NUM_IN_MEM 0XF3*/
/* bit 0 - aspect_ratio_info_present_flag
* bit 1 - timing_info_present_flag
* bit 2 - nal_hrd_parameters_present_flag
* bit 3 - vcl_hrd_parameters_present_flag
* bit 4 - pic_struct_present_flag
* bit 5 - bitstream_restriction_flag
*/
#define VUI_STATUS 0XF4
#define ASPECT_RATIO_IDC 0XF5
#define ASPECT_RATIO_SAR_WIDTH 0XF6
#define ASPECT_RATIO_SAR_HEIGHT 0XF7
#define NUM_UNITS_IN_TICK 0XF8
#define TIME_SCALE 0XFA
#define CURRENT_PIC_INFO 0XFC
#define DPB_BUFFER_INFO 0XFD
#define REFERENCE_POOL_INFO 0XFE
#define REFERENCE_LIST_INFO 0XFF
struct{
unsigned short data[RPM_END-RPM_BEGIN];
} l;
struct{
unsigned short dump[DPB_OFFSET];
unsigned short dpb_base[FRAME_IN_DPB<<3];
unsigned short dpb_max_buffer_frame;
unsigned short actual_dpb_size;
unsigned short colocated_buf_status;
unsigned short num_forward_short_term_reference_pic;
unsigned short num_short_term_reference_pic;
unsigned short num_reference_pic;
unsigned short current_dpb_index;
unsigned short current_decoded_frame_num;
unsigned short current_reference_frame_num;
unsigned short l0_size;
unsigned short l1_size;
/* [6:5] : nal_ref_idc */
/* [4:0] : nal_unit_type */
unsigned short NAL_info_mmco;
/* [1:0] : 00 - top field, 01 - bottom field,
* 10 - frame, 11 - mbaff frame
*/
unsigned short picture_structure_mmco;
unsigned short frame_num;
unsigned short pic_order_cnt_lsb;
unsigned short num_ref_idx_l0_active_minus1;
unsigned short num_ref_idx_l1_active_minus1;
unsigned short PrevPicOrderCntLsb;
unsigned short PreviousFrameNum;
/* 32 bits variables */
unsigned short delta_pic_order_cnt_bottom[2];
unsigned short delta_pic_order_cnt_0[2];
unsigned short delta_pic_order_cnt_1[2];
unsigned short PrevPicOrderCntMsb[2];
unsigned short PrevFrameNumOffset[2];
unsigned short frame_pic_order_cnt[2];
unsigned short top_field_pic_order_cnt[2];
unsigned short bottom_field_pic_order_cnt[2];
unsigned short colocated_mv_addr_start[2];
unsigned short colocated_mv_addr_end[2];
unsigned short colocated_mv_wr_addr[2];
unsigned short frame_crop_left_offset;
unsigned short frame_crop_right_offset;
unsigned short frame_crop_top_offset;
unsigned short frame_crop_bottom_offset;
unsigned short chroma_format_idc;
} dpb;
struct {
unsigned short dump[MMCO_OFFSET];
/* array base address for offset_for_ref_frame */
unsigned short offset_for_ref_frame_base[128];
/* 0 - Index in DPB
* 1 - Picture Flag
* [ 2] : 0 - short term reference,
* 1 - long term reference
* [ 1] : bottom field
* [ 0] : top field
* 2 - Picture Number (short term or long term) low 16 bits
* 3 - Picture Number (short term or long term) high 16 bits
*/
unsigned short reference_base[128];
/* command and parameter, until command is 3 */
unsigned short l0_reorder_cmd[66];
unsigned short l1_reorder_cmd[66];
/* command and parameter, until command is 0 */
unsigned short mmco_cmd[44];
unsigned short l0_base[40];
unsigned short l1_base[40];
} mmco;
struct {
/* from ucode lmem, do not change this struct */
} p;
};
struct StorablePicture;
struct VideoParameters;
struct DecodedPictureBuffer;
/* New enum for field processing */
enum PictureStructure {
FRAME,
TOP_FIELD,
BOTTOM_FIELD
};
typedef enum {
PIC_SINGLE_FRAME = 0,
PIC_TOP,
PIC_BOT,
PIC_TOP_BOT,
PIC_BOT_TOP,
PIC_TOP_BOT_TOP = 5,
PIC_BOT_TOP_BOT,
PIC_DOUBLE_FRAME,
PIC_TRIPLE_FRAME,
PIC_INVALID,
} PicStruct_E;
#define I_Slice 2
#define P_Slice 5
#define B_Slice 6
#define P_Slice_0 0
#define B_Slice_1 1
#define I_Slice_7 7
enum SliceType {
P_SLICE = 0,
B_SLICE = 1,
I_SLICE = 2,
SP_SLICE = 3,
SI_SLICE = 4,
NUM_SLICE_TYPES = 5
};
enum ProfileIDC {
FREXT_CAVLC444 = 44, /*!< YUV 4:4:4/14 "CAVLC 4:4:4"*/
BASELINE = 66, /*!< YUV 4:2:0/8 "Baseline"*/
MAIN = 77, /*!< YUV 4:2:0/8 "Main"*/
EXTENDED = 88, /*!< YUV 4:2:0/8 "Extended"*/
FREXT_HP = 100, /*!< YUV 4:2:0/8 "High"*/
FREXT_Hi10P = 110, /*!< YUV 4:2:0/10 "High 10"*/
FREXT_Hi422 = 122, /*!< YUV 4:2:2/10 "High 4:2:2"*/
FREXT_Hi444 = 244, /*!< YUV 4:4:4/14 "High 4:4:4"*/
MVC_HIGH = 118, /*!< YUV 4:2:0/8 "Multiview High"*/
STEREO_HIGH = 128 /*!< YUV 4:2:0/8 "Stereo High"*/
};
enum FirstInsertFrm_State {
FirstInsertFrm_IDLE = 0,
FirstInsertFrm_OUT = 1,
FirstInsertFrm_RESET = 2,
FirstInsertFrm_SKIPDONE = 3,
};
struct SPSParameters {
unsigned int profile_idc;
unsigned int level_idc;
int pic_order_cnt_type;
int log2_max_pic_order_cnt_lsb_minus4;
int num_ref_frames_in_pic_order_cnt_cycle;
short offset_for_ref_frame[128];
short offset_for_non_ref_pic;
short offset_for_top_to_bottom_field;
/**/
int frame_mbs_only_flag;
int num_ref_frames;
int max_dpb_size;
int log2_max_frame_num_minus4;
int frame_num_gap_allowed;
};
#define DEC_REF_PIC_MARKING_BUFFER_NUM_MAX 45
struct DecRefPicMarking_s {
int memory_management_control_operation;
int difference_of_pic_nums_minus1;
int long_term_pic_num;
int long_term_frame_idx;
int max_long_term_frame_idx_plus1;
struct DecRefPicMarking_s *Next;
};
#define REORDERING_COMMAND_MAX_SIZE 33
struct Slice {
int first_mb_in_slice;
int mode_8x8_flags;
int picture_structure_mmco;
int frame_num;
int idr_flag;
int toppoc;
int bottompoc;
int framepoc;
int pic_order_cnt_lsb;
int PicOrderCntMsb;
unsigned char field_pic_flag;
unsigned char bottom_field_flag;
int ThisPOC;
int nal_reference_idc;
int AbsFrameNum;
int delta_pic_order_cnt_bottom;
int delta_pic_order_cnt[2];
/**/
char listXsize[6];
struct StorablePicture *listX[6][MAX_LIST_SIZE * 2];
/**/
enum PictureStructure structure;
int long_term_reference_flag;
int no_output_of_prior_pics_flag;
int adaptive_ref_pic_buffering_flag;
struct VideoParameters *p_Vid;
struct DecodedPictureBuffer *p_Dpb;
int num_ref_idx_active[2]; /* number of available list references */
/*modification*/
int slice_type; /* slice type */
int ref_pic_list_reordering_flag[2];
int modification_of_pic_nums_idc[2][REORDERING_COMMAND_MAX_SIZE];
int abs_diff_pic_num_minus1[2][REORDERING_COMMAND_MAX_SIZE];
int long_term_pic_idx[2][REORDERING_COMMAND_MAX_SIZE];
/**/
unsigned char dec_ref_pic_marking_buffer_valid;
struct DecRefPicMarking_s
dec_ref_pic_marking_buffer[DEC_REF_PIC_MARKING_BUFFER_NUM_MAX];
int pic_struct;
};
struct OldSliceParams {
unsigned int field_pic_flag;
unsigned int frame_num;
int nal_ref_idc;
unsigned int pic_oder_cnt_lsb;
int delta_pic_oder_cnt_bottom;
int delta_pic_order_cnt[2];
unsigned char bottom_field_flag;
unsigned char idr_flag;
int idr_pic_id;
int pps_id;
#if (MVC_EXTENSION_ENABLE)
int view_id;
int inter_view_flag;
int anchor_pic_flag;
#endif
int layer_id;
};
struct VideoParameters {
int PrevPicOrderCntMsb;
int PrevPicOrderCntLsb;
unsigned char last_has_mmco_5;
unsigned char last_pic_bottom_field;
int ThisPOC;
int PreviousFrameNum;
int FrameNumOffset;
int PreviousFrameNumOffset;
int max_frame_num;
unsigned int pre_frame_num;
int ExpectedDeltaPerPicOrderCntCycle;
int PicOrderCntCycleCnt;
int FrameNumInPicOrderCntCycle;
int ExpectedPicOrderCnt;
/**/
struct SPSParameters *active_sps;
struct Slice **ppSliceList;
int iSliceNumOfCurrPic;
int conceal_mode;
int earlier_missing_poc;
int pocs_in_dpb[100];
struct OldSliceParams old_slice;
/**/
struct StorablePicture *dec_picture;
struct StorablePicture *no_reference_picture;
/*modification*/
int non_conforming_stream;
int recovery_point;
};
static inline int imin(int a, int b)
{
return ((a) < (b)) ? (a) : (b);
}
static inline int imax(int a, int b)
{
return ((a) > (b)) ? (a) : (b);
}
#define MAX_PIC_BUF_NUM 128
#define MAX_NUM_SLICES 50
struct StorablePicture {
/**/
int width;
int height;
int y_canvas_index;
int u_canvas_index;
int v_canvas_index;
/**/
int index;
unsigned char is_used;
enum PictureStructure structure;
int poc;
int top_poc;
int bottom_poc;
int frame_poc;
unsigned int frame_num;
unsigned int recovery_frame;
int pic_num;
int buf_spec_num;
int buf_spec_is_alloced;
int colocated_buf_index;
int long_term_pic_num;
int long_term_frame_idx;
unsigned char is_long_term;
int used_for_reference;
int is_output;
#if 1
/* rain */
int pre_output;
#endif
int non_existing;
int separate_colour_plane_flag;
short max_slice_id;
int size_x, size_y, size_x_cr, size_y_cr;
int size_x_m1, size_y_m1, size_x_cr_m1, size_y_cr_m1;
int coded_frame;
int mb_aff_frame_flag;
unsigned int PicWidthInMbs;
unsigned int PicSizeInMbs;
int iLumaPadY, iLumaPadX;
int iChromaPadY, iChromaPadX;
/* for mb aff, if frame for referencing the top field */
struct StorablePicture *top_field;
/* for mb aff, if frame for referencing the bottom field */
struct StorablePicture *bottom_field;
/* for mb aff, if field for referencing the combined frame */
struct StorablePicture *frame;
int slice_type;
int idr_flag;
int no_output_of_prior_pics_flag;
int long_term_reference_flag;
int adaptive_ref_pic_buffering_flag;
int chroma_format_idc;
int frame_mbs_only_flag;
int frame_cropping_flag;
int frame_crop_left_offset;
int frame_crop_right_offset;
int frame_crop_top_offset;
int frame_crop_bottom_offset;
int qp;
int chroma_qp_offset[2];
int slice_qp_delta;
/* stores the memory management control operations */
struct DecRefPicMarking_s *dec_ref_pic_marking_buffer;
/* picture error concealment */
/*indicates if this is a concealed picture */
int concealed_pic;
/* variables for tone mapping */
int seiHasTone_mapping;
int tone_mapping_model_id;
int tonemapped_bit_depth;
/* imgpel* tone_mapping_lut; tone mapping look up table */
int proc_flag;
#if (MVC_EXTENSION_ENABLE)
int view_id;
int inter_view_flag;
int anchor_pic_flag;
#endif
int iLumaStride;
int iChromaStride;
int iLumaExpandedHeight;
int iChromaExpandedHeight;
/* imgpel **cur_imgY; for more efficient get_block_luma */
int no_ref;
int iCodingType;
char listXsize[MAX_NUM_SLICES][2];
struct StorablePicture **listX[MAX_NUM_SLICES][2];
int layer_id;
u32 offset_delimiter;
u32 pts;
u64 pts64;
u64 timestamp;
unsigned char data_flag;
int pic_struct;
/* picture qos infomation*/
int frame_size;
int max_qp;
int avg_qp;
int min_qp;
int max_skip;
int avg_skip;
int min_skip;
int max_mv;
int min_mv;
int avg_mv;
u32 pic_size;
};
struct FrameStore {
/* rain */
int buf_spec_num;
/* rain */
int colocated_buf_index;
/* 0=empty; 1=top; 2=bottom; 3=both fields (or frame) */
int is_used;
/* 0=not used for ref; 1=top used; 2=bottom used;
* 3=both fields (or frame) used
*/
int is_reference;
/* 0=not used for ref; 1=top used; 2=bottom used;
* 3=both fields (or frame) used
*/
int is_long_term;
/* original marking by nal_ref_idc: 0=not used for ref; 1=top used;
* 2=bottom used; 3=both fields (or frame) used
*/
int is_orig_reference;
int is_non_existent;
unsigned int frame_num;
unsigned int recovery_frame;
int frame_num_wrap;
int long_term_frame_idx;
int is_output;
#if 1
/* rain */
int pre_output;
/* index in gFrameStore */
int index;
#define I_FLAG 0x01
#define IDR_FLAG 0x02
#define ERROR_FLAG 0x10
#define NULL_FLAG 0x20
#define NODISP_FLAG 0x80
unsigned char data_flag;
#endif
int poc;
/* picture error concealment */
int concealment_reference;
struct StorablePicture *frame;
struct StorablePicture *top_field;
struct StorablePicture *bottom_field;
#if (MVC_EXTENSION_ENABLE)
int view_id;
int inter_view_flag[2];
int anchor_pic_flag[2];
#endif
int layer_id;
u32 offset_delimiter;
u32 pts;
u64 pts64;
u64 timestamp;
/* picture qos infomation*/
int slice_type;
int frame_size;
int max_qp;
int avg_qp;
int min_qp;
int max_skip;
int avg_skip;
int min_skip;
int max_mv;
int min_mv;
int avg_mv;
int dpb_frame_count;
u32 hw_decode_time;
u32 frame_size2; // For recording the chunk->size in frame mode
bool show_frame;
struct dma_fence *fence;
u32 decoded_frame_size;
u64 last_field_timestamp;
};
/* #define DPB_SIZE_MAX 16 */
#define DPB_SIZE_MAX 32
struct DecodedPictureBuffer {
struct VideoParameters *p_Vid;
/* InputParameters *p_Inp; ??? */
struct FrameStore *fs[DPB_SIZE_MAX];
struct FrameStore *fs_ref[DPB_SIZE_MAX];
struct FrameStore *fs_ltref[DPB_SIZE_MAX];
/* inter-layer reference (for multi-layered codecs) */
struct FrameStore *fs_ilref[DPB_SIZE_MAX];
/**/
struct FrameStore *fs_list0[DPB_SIZE_MAX];
struct FrameStore *fs_list1[DPB_SIZE_MAX];
struct FrameStore *fs_listlt[DPB_SIZE_MAX];
/**/
unsigned int size;
unsigned int used_size;
unsigned int ref_frames_in_buffer;
unsigned int ltref_frames_in_buffer;
int last_output_poc;
#if (MVC_EXTENSION_ENABLE)
int last_output_view_id;
#endif
int max_long_term_pic_idx;
int init_done;
int first_pic_done; /*by rain*/
int num_ref_frames;
struct FrameStore *last_picture;
unsigned int used_size_il;
int layer_id;
/* DPB related function; */
};
struct h264_dpb_stru {
struct vdec_s *vdec;
int decoder_index;
union param dpb_param;
int decode_idx;
int buf_num;
int curr_POC;
int reorder_pic_num;
unsigned int dec_dpb_size;
u8 fast_output_enable;
/*poc_even_flag:
0, init; 1, odd; 2, even*/
u8 poc_even_odd_flag;
u32 decode_pic_count;
/**/
unsigned int max_reference_size;
unsigned int colocated_buf_map;
unsigned int colocated_buf_count;
unsigned int colocated_mv_addr_start;
unsigned int colocated_mv_addr_end;
unsigned int colocated_buf_size;
struct DecodedPictureBuffer mDPB;
struct Slice mSlice;
struct VideoParameters mVideo;
struct SPSParameters mSPS;
struct StorablePicture m_PIC[MAX_PIC_BUF_NUM];
struct FrameStore mFrameStore[DPB_SIZE_MAX];
/*vui*/
unsigned int vui_status;
unsigned int num_units_in_tick;
unsigned int time_scale;
unsigned int fixed_frame_rate_flag;
unsigned int aspect_ratio_idc;
unsigned int aspect_ratio_sar_width;
unsigned int aspect_ratio_sar_height;
u8 bitstream_restriction_flag;
u16 num_reorder_frames;
u16 max_dec_frame_buffering;
unsigned int frame_crop_left_offset;
unsigned int frame_crop_right_offset;
unsigned int frame_crop_top_offset;
unsigned int frame_crop_bottom_offset;
unsigned int chroma_format_idc;
unsigned int dec_dpb_status;
unsigned int last_dpb_status;
unsigned char buf_alloc_fail;
unsigned int dpb_error_flag;
unsigned int reorder_output;
unsigned int first_insert_frame;
int first_output_poc;
int dpb_frame_count;
/* need wait aux data when there is data after pic done in dv stream */
bool wait_aux_data_flag;
u32 without_display_mode;
int long_term_reference_flag;
};
extern unsigned int h264_debug_flag;
extern unsigned int h264_debug_mask;
int dpb_print(int indext, int debug_flag, const char *fmt, ...);
int dpb_print_cont(int index, int debug_flag, const char *fmt, ...);
unsigned char dpb_is_debug(int index, int debug_flag);
int prepare_display_buf(struct vdec_s *vdec, struct FrameStore *frame);
int release_buf_spec_num(struct vdec_s *vdec, int buf_spec_num);
void set_frame_output_flag(struct h264_dpb_stru *p_H264_Dpb, int index);
int is_there_unused_frame_from_dpb(struct DecodedPictureBuffer *p_Dpb);
int h264_slice_header_process(struct h264_dpb_stru *p_H264_Dpb, int *frame_num_gap);
void dpb_init_global(struct h264_dpb_stru *p_H264_Dpb,
int id, int actual_dpb_size, int max_reference_size);
void init_colocate_buf(struct h264_dpb_stru *p_H264_Dpb, int count);
int release_colocate_buf(struct h264_dpb_stru *p_H264_Dpb, int index);
int get_free_buf_idx(struct vdec_s *vdec);
int store_picture_in_dpb(struct h264_dpb_stru *p_H264_Dpb,
struct StorablePicture *p, unsigned char data_flag);
int release_picture(struct h264_dpb_stru *p_H264_Dpb,
struct StorablePicture *pic);
void remove_dpb_pictures(struct h264_dpb_stru *p_H264_Dpb);
void bufmgr_post(struct h264_dpb_stru *p_H264_Dpb);
void bufmgr_force_recover(struct h264_dpb_stru *p_H264_Dpb);
int get_long_term_flag_by_buf_spec_num(struct h264_dpb_stru *p_H264_Dpb,
int buf_spec_num);
void bufmgr_h264_remove_unused_frame(struct h264_dpb_stru *p_H264_Dpb,
u8 force_flag);
void flush_dpb(struct h264_dpb_stru *p_H264_Dpb);
void print_pic_info(int decindex, const char *info,
struct StorablePicture *pic,
int slice_type);
void dump_dpb(struct DecodedPictureBuffer *p_Dpb, u8 force);
void dump_pic(struct h264_dpb_stru *p_H264_Dpb);
void * vh264_get_bufspec_lock(struct vdec_s *vdec);
enum PictureStructure get_cur_slice_picture_struct(
struct h264_dpb_stru *p_H264_Dpb);
int dpb_check_ref_list_error(
struct h264_dpb_stru *p_H264_Dpb);
void unmark_for_reference(struct DecodedPictureBuffer *p_Dpb,
struct FrameStore *fs);
void update_ref_list(struct DecodedPictureBuffer *p_Dpb);
int post_picture_early(struct vdec_s *vdec, int index);
int is_used_for_reference(struct FrameStore *fs);
#endif