| /* |
| * 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_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 fence *fence; |
| u32 decoded_frame_size; |
| }; |
| |
| /* #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; |
| u32 without_display_mode; |
| }; |
| |
| |
| 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); |
| |
| #endif |