| /* ------------------------------------------------------------------ |
| * Copyright (C) 1998-2009 PacketVideo |
| * |
| * 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. |
| * ------------------------------------------------------------------- |
| */ |
| /** |
| This file contains common code shared between AVC decoder and AVC encoder for |
| internal use only. |
| @publishedAll |
| */ |
| |
| #ifndef AVCINT_COMMON_H_INCLUDED |
| #define AVCINT_COMMON_H_INCLUDED |
| |
| #ifndef OSCL_TYPES_H_INCLUDED |
| #include "oscl_types.h" |
| #endif |
| #ifndef AVCAPI_COMMON_H_INCLUDED |
| #include "avcapi_common.h" |
| #endif |
| |
| |
| #ifndef TRUE |
| #define TRUE 1 |
| #define FALSE 0 |
| #endif |
| |
| |
| |
| /** |
| Mathematic functions defined in subclause 5.7. |
| Can be replaced with assembly instructions for speedup. |
| @publishedAll |
| */ |
| #define AVC_ABS(x) (((x)<0)? -(x) : (x)) |
| #define AVC_SIGN(x) (((x)<0)? -1 : 1) |
| #define AVC_SIGN0(x) (((x)<0)? -1 : (((x)>0) ? 1 : 0)) |
| #define AVC_MAX(x,y) ((x)>(y)? (x):(y)) |
| #define AVC_MIN(x,y) ((x)<(y)? (x):(y)) |
| #define AVC_MEDIAN(A,B,C) ((A) > (B) ? ((A) < (C) ? (A) : (B) > (C) ? (B) : (C)): (B) < (C) ? (B) : (C) > (A) ? (C) : (A)) |
| #define AVC_CLIP3(a,b,x) (AVC_MAX(a,AVC_MIN(x,b))) /* clip x between a and b */ |
| #define AVC_CLIP(x) AVC_CLIP3(0,255,x) |
| #define AVC_FLOOR(x) ((int)(x)) |
| #define AVC_RASTER_SCAN(x,y,n) ((x)+(y)*(n)) |
| #define AVC_ROUND(x) (AVC_SIGN(x)*AVC_FLOOR(AVC_ABS(x)+0.5)) |
| #define AVC_INVERSE_RASTER_SCAN(a,b,c,d,e) (((e)==0)? (((a)%((d)/(b)))*(b)): (((a)/((d)/(b)))*(c))) |
| /* a:block address, b:block width, c:block height, d:total_width, e:x or y coordinate */ |
| |
| #define DEFAULT_ATTR 0 /* default memory attribute */ |
| #define FAST_MEM_ATTR 1 /* fast memory attribute */ |
| |
| |
| /* This section is for definition of constants. */ |
| #define MB_SIZE 16 |
| #define BLOCK_SIZE 4 |
| #define EMULATION_PREVENTION_THREE_BYTE 0x3 |
| #define NUM_PIXELS_IN_MB (24*16) |
| #define NUM_BLKS_IN_MB 24 |
| |
| #define AVCNumI4PredMode 9 |
| #define AVCNumI16PredMode 4 |
| #define AVCNumIChromaMode 4 |
| |
| /* constants used in the structures below */ |
| #define MAXIMUMVALUEOFcpb_cnt 32 /* used in HRDParams */ |
| #define MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE 255 /* used in SeqParamSet */ |
| #define MAX_NUM_SLICE_GROUP 8 /* used in PicParamSet */ |
| #define MAX_REF_PIC_LIST_REORDERING 32 /* 32 is maximum according to Annex A, SliceHeader */ |
| #define MAX_DEC_REF_PIC_MARKING 64 /* 64 is the maximum possible given the max num ref pictures to 31. */ |
| #define MAX_FS (16+1) /* pre-defined size of frame store array */ |
| #define MAX_LEVEL_IDX 15 /* only 15 levels defined for now */ |
| #define MAX_REF_PIC_LIST 33 /* max size of the RefPicList0 and RefPicList1 */ |
| |
| |
| /** |
| Architectural related macros. |
| @publishedAll |
| */ |
| #ifdef USE_PRED_BLOCK |
| #define MB_BASED_DEBLOCK |
| #endif |
| |
| /** |
| Picture type, PV created. |
| @publishedAll |
| */ |
| typedef enum |
| { |
| AVC_FRAME = 3 |
| } AVCPictureType; |
| |
| /** |
| This slice type follows Table 7-3. The bottom 5 items may not needed. |
| @publishedAll |
| */ |
| typedef enum |
| { |
| AVC_P_SLICE = 0, |
| AVC_B_SLICE = 1, |
| AVC_I_SLICE = 2, |
| AVC_SP_SLICE = 3, |
| AVC_SI_SLICE = 4, |
| AVC_P_ALL_SLICE = 5, |
| AVC_B_ALL_SLICE = 6, |
| AVC_I_ALL_SLICE = 7, |
| AVC_SP_ALL_SLICE = 8, |
| AVC_SI_ALL_SLICE = 9 |
| } AVCSliceType; |
| |
| /** |
| Types of the macroblock and partition. PV Created. |
| @publishedAll |
| */ |
| typedef enum |
| { |
| /* intra */ |
| AVC_I4, |
| AVC_I16, |
| AVC_I_PCM, |
| AVC_SI4, |
| |
| /* inter for both P and B*/ |
| AVC_BDirect16, |
| AVC_P16, |
| AVC_P16x8, |
| AVC_P8x16, |
| AVC_P8, |
| AVC_P8ref0, |
| AVC_SKIP |
| } AVCMBMode; |
| |
| /** |
| Enumeration for sub-macroblock mode, interpreted from sub_mb_type. |
| @publishedAll |
| */ |
| typedef enum |
| { |
| /* for sub-partition mode */ |
| AVC_BDirect8, |
| AVC_8x8, |
| AVC_8x4, |
| AVC_4x8, |
| AVC_4x4 |
| } AVCSubMBMode; |
| |
| /** |
| Mode of prediction of partition or sub-partition. PV Created. |
| Do not change the order!!! Used in table look-up mode prediction in |
| vlc.c. |
| @publishedAll |
| */ |
| typedef enum |
| { |
| AVC_Pred_L0 = 0, |
| AVC_Pred_L1, |
| AVC_BiPred, |
| AVC_Direct |
| } AVCPredMode; |
| |
| |
| /** |
| Mode of intra 4x4 prediction. Table 8-2 |
| @publishedAll |
| */ |
| typedef enum |
| { |
| AVC_I4_Vertical = 0, |
| AVC_I4_Horizontal, |
| AVC_I4_DC, |
| AVC_I4_Diagonal_Down_Left, |
| AVC_I4_Diagonal_Down_Right, |
| AVC_I4_Vertical_Right, |
| AVC_I4_Horizontal_Down, |
| AVC_I4_Vertical_Left, |
| AVC_I4_Horizontal_Up |
| } AVCIntra4x4PredMode; |
| |
| /** |
| Mode of intra 16x16 prediction. Table 8-3 |
| @publishedAll |
| */ |
| typedef enum |
| { |
| AVC_I16_Vertical = 0, |
| AVC_I16_Horizontal, |
| AVC_I16_DC, |
| AVC_I16_Plane |
| } AVCIntra16x16PredMode; |
| |
| |
| /** |
| Mode of intra chroma prediction. Table 8-4 |
| @publishedAll |
| */ |
| typedef enum |
| { |
| AVC_IC_DC = 0, |
| AVC_IC_Horizontal, |
| AVC_IC_Vertical, |
| AVC_IC_Plane |
| } AVCIntraChromaPredMode; |
| |
| /** |
| Type of residual going to residual_block_cavlc function, PV created. |
| @publishedAll |
| */ |
| typedef enum |
| { |
| AVC_Luma, |
| AVC_Intra16DC, |
| AVC_Intra16AC, |
| AVC_ChromaDC, |
| AVC_ChromaAC |
| } AVCResidualType; |
| |
| |
| /** |
| This structure contains VUI parameters as specified in Annex E. |
| Some variables may be removed from the structure if they are found to be useless to store. |
| @publishedAll |
| */ |
| typedef struct tagHRDParams |
| { |
| uint cpb_cnt_minus1; /* ue(v), range 0..31 */ |
| uint bit_rate_scale; /* u(4) */ |
| uint cpb_size_scale; /* u(4) */ |
| uint32 bit_rate_value_minus1[MAXIMUMVALUEOFcpb_cnt];/* ue(v), range 0..2^32-2 */ |
| uint32 cpb_size_value_minus1[MAXIMUMVALUEOFcpb_cnt]; /* ue(v), range 0..2^32-2 */ |
| uint cbr_flag[MAXIMUMVALUEOFcpb_cnt]; /* u(1) */ |
| uint initial_cpb_removal_delay_length_minus1; /* u(5), default 23 */ |
| uint cpb_removal_delay_length_minus1; /* u(5), default 23 */ |
| uint dpb_output_delay_length_minus1; /* u(5), default 23 */ |
| uint time_offset_length; /* u(5), default 24 */ |
| } AVCHRDParams; |
| |
| /** |
| This structure contains VUI parameters as specified in Annex E. |
| Some variables may be removed from the structure if they are found to be useless to store. |
| @publishedAll |
| */ |
| typedef struct tagVUIParam |
| { |
| uint aspect_ratio_info_present_flag; /* u(1) */ |
| uint aspect_ratio_idc; /* u(8), table E-1 */ |
| uint sar_width; /* u(16) */ |
| uint sar_height; /* u(16) */ |
| uint overscan_info_present_flag; /* u(1) */ |
| uint overscan_appropriate_flag; /* u(1) */ |
| uint video_signal_type_present_flag; /* u(1) */ |
| uint video_format; /* u(3), Table E-2, default 5, unspecified */ |
| uint video_full_range_flag; /* u(1) */ |
| uint colour_description_present_flag; /* u(1) */ |
| uint colour_primaries; /* u(8), Table E-3, default 2, unspecified */ |
| uint transfer_characteristics; /* u(8), Table E-4, default 2, unspecified */ |
| uint matrix_coefficients; /* u(8), Table E-5, default 2, unspecified */ |
| uint chroma_location_info_present_flag; /* u(1) */ |
| uint chroma_sample_loc_type_top_field; /* ue(v), Fig. E-1range 0..5, default 0 */ |
| uint chroma_sample_loc_type_bottom_field; /* ue(v) */ |
| uint timing_info_present_flag; /* u(1) */ |
| uint num_units_in_tick; /* u(32), must be > 0 */ |
| uint time_scale; /* u(32), must be > 0 */ |
| uint fixed_frame_rate_flag; /* u(1), Eq. C-13 */ |
| uint nal_hrd_parameters_present_flag; /* u(1) */ |
| AVCHRDParams nal_hrd_parameters; /* hrd_paramters */ |
| uint vcl_hrd_parameters_present_flag; /* u(1) */ |
| AVCHRDParams vcl_hrd_parameters; /* hrd_paramters */ |
| /* if ((nal_hrd_parameters_present_flag || (vcl_hrd_parameters_present_flag)) */ |
| uint low_delay_hrd_flag; /* u(1) */ |
| uint pic_struct_present_flag; |
| uint bitstream_restriction_flag; /* u(1) */ |
| uint motion_vectors_over_pic_boundaries_flag; /* u(1) */ |
| uint max_bytes_per_pic_denom; /* ue(v), default 2 */ |
| uint max_bits_per_mb_denom; /* ue(v), range 0..16, default 1 */ |
| uint log2_max_mv_length_vertical; /* ue(v), range 0..16, default 16 */ |
| uint log2_max_mv_length_horizontal; /* ue(v), range 0..16, default 16 */ |
| uint max_dec_frame_reordering; /* ue(v) */ |
| uint max_dec_frame_buffering; /* ue(v) */ |
| } AVCVUIParams; |
| |
| |
| /** |
| This structure contains information in a sequence parameter set NAL. |
| Some variables may be removed from the structure if they are found to be useless to store. |
| @publishedAll |
| */ |
| typedef struct tagSeqParamSet |
| { |
| uint Valid; /* indicates the parameter set is valid */ |
| |
| uint profile_idc; /* u(8) */ |
| uint constrained_set0_flag; /* u(1) */ |
| uint constrained_set1_flag; /* u(1) */ |
| uint constrained_set2_flag; /* u(1) */ |
| uint constrained_set3_flag; /* u(1) */ |
| uint level_idc; /* u(8) */ |
| uint seq_parameter_set_id; /* ue(v), range 0..31 */ |
| uint log2_max_frame_num_minus4; /* ue(v), range 0..12 */ |
| uint pic_order_cnt_type; /* ue(v), range 0..2 */ |
| /* if( pic_order_cnt_type == 0 ) */ |
| uint log2_max_pic_order_cnt_lsb_minus4; /* ue(v), range 0..12 */ |
| /* else if( pic_order_cnt_type == 1 ) */ |
| uint delta_pic_order_always_zero_flag; /* u(1) */ |
| int32 offset_for_non_ref_pic; /* se(v) */ |
| int32 offset_for_top_to_bottom_field; /* se(v) */ |
| uint num_ref_frames_in_pic_order_cnt_cycle; /* ue(v) , range 0..255 */ |
| /* for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ ) */ |
| int32 offset_for_ref_frame[MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE]; /* se(v) */ |
| uint num_ref_frames; /* ue(v), range 0..16 */ |
| uint gaps_in_frame_num_value_allowed_flag; /* u(1) */ |
| uint pic_width_in_mbs_minus1; /* ue(v) */ |
| uint pic_height_in_map_units_minus1; /* ue(v) */ |
| uint frame_mbs_only_flag; /* u(1) */ |
| /* if( !frame_mbs_only_flag ) */ |
| uint mb_adaptive_frame_field_flag; /* u(1) */ |
| uint direct_8x8_inference_flag; /* u(1), must be 1 when frame_mbs_only_flag is 0 */ |
| uint frame_cropping_flag; /* u(1) */ |
| /* if( frmae_cropping_flag) */ |
| uint frame_crop_left_offset; /* ue(v) */ |
| uint frame_crop_right_offset; /* ue(v) */ |
| uint frame_crop_top_offset; /* ue(v) */ |
| uint frame_crop_bottom_offset; /* ue(v) */ |
| uint vui_parameters_present_flag; /* u(1) */ |
| // uint nal_hrd_parameters_present_flag; |
| // uint vcl_hrd_parameters_present_flag; |
| // AVCHRDParams *nal_hrd_parameters; |
| // AVCHRDParams *vcl_hrd_parameters; |
| #if 1 /* not supported for now */ |
| AVCVUIParams vui_parameters; /* AVCVUIParam */ |
| #endif |
| } AVCSeqParamSet; |
| |
| /** |
| This structure contains information in a picture parameter set NAL. |
| Some variables may be removed from the structure if they are found to be useless to store. |
| @publishedAll |
| */ |
| typedef struct tagPicParamSet |
| { |
| uint pic_parameter_set_id; /* ue(v), range 0..255 */ |
| uint seq_parameter_set_id; /* ue(v), range 0..31 */ |
| uint entropy_coding_mode_flag; /* u(1) */ |
| uint pic_order_present_flag; /* u(1) */ |
| uint num_slice_groups_minus1; /* ue(v), range in Annex A */ |
| /* if( num_slice_groups_minus1 > 0) */ |
| uint slice_group_map_type; /* ue(v), range 0..6 */ |
| /* if( slice_group_map_type = = 0 ) */ |
| /* for(0:1:num_slice_groups_minus1) */ |
| uint run_length_minus1[MAX_NUM_SLICE_GROUP]; /* ue(v) */ |
| /* else if( slice_group_map_type = = 2 ) */ |
| /* for(0:1:num_slice_groups_minus1-1) */ |
| uint top_left[MAX_NUM_SLICE_GROUP-1]; /* ue(v) */ |
| uint bottom_right[MAX_NUM_SLICE_GROUP-1]; /* ue(v) */ |
| /* else if( slice_group_map_type = = 3 || 4 || 5 */ |
| uint slice_group_change_direction_flag; /* u(1) */ |
| uint slice_group_change_rate_minus1; /* ue(v) */ |
| /* else if( slice_group_map_type = = 6 ) */ |
| uint pic_size_in_map_units_minus1; /* ue(v) */ |
| /* for(0:1:pic_size_in_map_units_minus1) */ |
| uint *slice_group_id; /* complete MBAmap u(v) */ |
| uint num_ref_idx_l0_active_minus1; /* ue(v), range 0..31 */ |
| uint num_ref_idx_l1_active_minus1; /* ue(v), range 0..31 */ |
| uint weighted_pred_flag; /* u(1) */ |
| uint weighted_bipred_idc; /* u(2), range 0..2 */ |
| int pic_init_qp_minus26; /* se(v), range -26..25 */ |
| int pic_init_qs_minus26; /* se(v), range -26..25 */ |
| int chroma_qp_index_offset; /* se(v), range -12..12 */ |
| uint deblocking_filter_control_present_flag; /* u(1) */ |
| uint constrained_intra_pred_flag; /* u(1) */ |
| uint redundant_pic_cnt_present_flag; /* u(1) */ |
| } AVCPicParamSet; |
| |
| |
| /** |
| This structure contains slice header information. |
| Some variables may be removed from the structure if they are found to be useless to store. |
| @publishedAll |
| */ |
| typedef struct tagSliceHeader |
| { |
| uint first_mb_in_slice; /* ue(v) */ |
| AVCSliceType slice_type; /* ue(v), Table 7-3, range 0..9 */ |
| uint pic_parameter_set_id; /* ue(v), range 0..255 */ |
| uint frame_num; /* u(v), see log2max_frame_num_minus4 */ |
| /* if( !frame_mbs_only_flag) */ |
| uint field_pic_flag; /* u(1) */ |
| /* if(field_pic_flag) */ |
| uint bottom_field_flag; /* u(1) */ |
| /* if(nal_unit_type == 5) */ |
| uint idr_pic_id; /* ue(v), range 0..65535 */ |
| /* if(pic_order_cnt_type==0) */ |
| uint pic_order_cnt_lsb; /* u(v), range 0..MaxPicOrderCntLsb-1 */ |
| /* if(pic_order_present_flag && !field_pic_flag) */ |
| int32 delta_pic_order_cnt_bottom; /* se(v) */ |
| /* if(pic_order_cnt_type==1 && !delta_pic_order_always_zero_flag) */ |
| /* if(pic_order_present_flag && !field_pic_flag) */ |
| int32 delta_pic_order_cnt[2]; |
| /* if(redundant_pic_cnt_present_flag) */ |
| uint redundant_pic_cnt; /* ue(v), range 0..127 */ |
| /* if(slice_type == B) */ |
| uint direct_spatial_mv_pred_flag; /* u(1) */ |
| /* if(slice_type == P || slice_type==SP || slice_type==B) */ |
| uint num_ref_idx_active_override_flag; /* u(1) */ |
| /* if(num_ref_idx_active_override_flag) */ |
| uint num_ref_idx_l0_active_minus1; /* ue(v) */ |
| /* if(slie_type == B) */ |
| uint num_ref_idx_l1_active_minus1; /* ue(v) */ |
| |
| /* ref_pic_list_reordering() */ |
| uint ref_pic_list_reordering_flag_l0; /* u(1) */ |
| uint reordering_of_pic_nums_idc_l0[MAX_REF_PIC_LIST_REORDERING]; /* ue(v), range 0..3 */ |
| uint abs_diff_pic_num_minus1_l0[MAX_REF_PIC_LIST_REORDERING]; /* ue(v) */ |
| uint long_term_pic_num_l0[MAX_REF_PIC_LIST_REORDERING]; /* ue(v) */ |
| uint ref_pic_list_reordering_flag_l1; /* u(1) */ |
| uint reordering_of_pic_nums_idc_l1[MAX_REF_PIC_LIST_REORDERING]; /* ue(v), range 0..3 */ |
| uint abs_diff_pic_num_minus1_l1[MAX_REF_PIC_LIST_REORDERING]; /* ue(v) */ |
| uint long_term_pic_num_l1[MAX_REF_PIC_LIST_REORDERING]; /* ue(v) */ |
| |
| /* end ref_pic_list_reordering() */ |
| /* if(nal_ref_idc!=0) */ |
| /* dec_ref_pic_marking() */ |
| uint no_output_of_prior_pics_flag; /* u(1) */ |
| uint long_term_reference_flag; /* u(1) */ |
| uint adaptive_ref_pic_marking_mode_flag; /* u(1) */ |
| uint memory_management_control_operation[MAX_DEC_REF_PIC_MARKING]; /* ue(v), range 0..6 */ |
| uint difference_of_pic_nums_minus1[MAX_DEC_REF_PIC_MARKING]; /* ue(v) */ |
| uint long_term_pic_num[MAX_DEC_REF_PIC_MARKING]; /* ue(v) */ |
| uint long_term_frame_idx[MAX_DEC_REF_PIC_MARKING]; /* ue(v) */ |
| uint max_long_term_frame_idx_plus1[MAX_DEC_REF_PIC_MARKING]; /* ue(v) */ |
| /* end dec_ref_pic_marking() */ |
| /* if(entropy_coding_mode_flag && slice_type!=I && slice_type!=SI) */ |
| uint cabac_init_idc; /* ue(v), range 0..2 */ |
| int slice_qp_delta; /* se(v), range 0..51 */ |
| /* if(slice_type==SP || slice_type==SI) */ |
| /* if(slice_type==SP) */ |
| uint sp_for_switch_flag; /* u(1) */ |
| int slice_qs_delta; /* se(v) */ |
| |
| /* if(deblocking_filter_control_present_flag)*/ |
| uint disable_deblocking_filter_idc; /* ue(v), range 0..2 */ |
| /* if(disable_deblocking_filter_idc!=1) */ |
| int slice_alpha_c0_offset_div2; /* se(v), range -6..6, default 0 */ |
| int slice_beta_offset_div_2; /* se(v), range -6..6, default 0 */ |
| /* if(num_slice_groups_minus1>0 && slice_group_map_type>=3 && slice_group_map_type<=5)*/ |
| uint slice_group_change_cycle; /* u(v), use ceil(log2(PicSizeInMapUnits/SliceGroupChangeRate + 1)) bits*/ |
| |
| } AVCSliceHeader; |
| |
| /** |
| This struct contains information about the neighboring pixel. |
| @publishedAll |
| */ |
| typedef struct tagPixPos |
| { |
| int available; |
| int mb_addr; /* macroblock address of the current pixel, see below */ |
| int x; /* x,y positions of current pixel relative to the macroblock mb_addr */ |
| int y; |
| int pos_x; /* x,y positions of current pixel relative to the picture. */ |
| int pos_y; |
| } AVCPixelPos; |
| |
| typedef struct tagNeighborAvailability |
| { |
| int left; |
| int top; /* macroblock address of the current pixel, see below */ |
| int top_right; /* x,y positions of current pixel relative to the macroblock mb_addr */ |
| } AVCNeighborAvailability; |
| |
| |
| /** |
| This structure contains picture data and related information necessary to be used as |
| reference frame. |
| @publishedAll |
| */ |
| typedef struct tagPictureData |
| { |
| uint16 RefIdx; /* index used for reference frame */ |
| uint8 *Sl; /* derived from base_dpb in AVCFrameStore */ |
| uint8 *Scb; /* for complementary fields, YUV are interlaced */ |
| uint8 *Scr; /* Sl of top_field and bottom_fields will be one line apart and the |
| stride will be 2 times the width. */ |
| /* For non-complementary field, the above still applies. A special |
| output formatting is required. */ |
| |
| /* Then, necessary variables that need to be stored */ |
| AVCPictureType picType; /* frame, top-field or bot-field */ |
| /*bool*/ |
| uint isReference; |
| /*bool*/ |
| uint isLongTerm; |
| int PicOrderCnt; |
| int PicNum; |
| int LongTermPicNum; |
| |
| int width; /* how many pixel per line */ |
| int height;/* how many line */ |
| int pitch; /* how many pixel between the line */ |
| |
| uint padded; /* flag for being padded */ |
| |
| } AVCPictureData; |
| |
| /** |
| This structure contains information for frame storage. |
| @publishedAll |
| */ |
| typedef struct tagFrameStore |
| { |
| uint8 *base_dpb; /* base pointer for the YCbCr */ |
| |
| int IsReference; /* 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used */ |
| int IsLongTerm; /* 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used */ |
| /* if IsLongTerm is true, IsReference can be ignored. */ |
| /* if IsReference is true, IsLongterm will be checked for short-term or long-term. */ |
| /* IsUsed must be true to enable the validity of IsReference and IsLongTerm */ |
| |
| int IsOutputted; /* has it been outputted via AVCDecGetOutput API, then don't output it again, |
| wait until it is returned. */ |
| AVCPictureData frame; |
| |
| int FrameNum; |
| int FrameNumWrap; |
| int LongTermFrameIdx; |
| int PicOrderCnt; /* of the frame, smaller of the 2 fields */ |
| |
| } AVCFrameStore; |
| |
| /** |
| This structure maintains the actual memory for the decoded picture buffer (DPB) which is |
| allocated at the beginning according to profile/level. |
| Once decoded_picture_buffer is allocated, Sl,Scb,Scr in |
| AVCPictureData structure just point to the address in decoded_picture_buffer. |
| used_size maintains the used space. |
| NOTE:: In order to maintain contiguous memory space, memory equal to a single frame is |
| assigned at a time. Two opposite fields reside in the same frame memory. |
| |
| |-------|---|---|---|xxx|-------|xxx|---|-------| decoded_picture_buffer |
| frame top bot top frame bot frame |
| 0 1 1 2 3 4 5 |
| |
| bot 2 and top 4 do not exist, the memory is not used. |
| |
| @publishedAll |
| */ |
| typedef struct tagDecPicBuffer |
| { |
| uint8 *decoded_picture_buffer; /* actual memory */ |
| uint32 dpb_size; /* size of dpb in bytes */ |
| uint32 used_size; /* used size */ |
| struct tagFrameStore *fs[MAX_FS]; /* list of frame stored, actual buffer */ |
| int num_fs; /* size of fs */ |
| |
| } AVCDecPicBuffer; |
| |
| |
| /** |
| This structure contains macroblock related variables. |
| @publishedAll |
| */ |
| typedef struct tagMacroblock |
| { |
| AVCIntraChromaPredMode intra_chroma_pred_mode; /* ue(v) */ |
| |
| int32 mvL0[16]; /* motion vectors, 16 bit packed (x,y) per element */ |
| int32 mvL1[16]; |
| int16 ref_idx_L0[4]; |
| int16 ref_idx_L1[4]; |
| uint16 RefIdx[4]; /* ref index, has value of AVCPictureData->RefIdx */ |
| /* stored data */ |
| /*bool*/ |
| uint mb_intra; /* intra flag */ |
| /*bool*/ |
| uint mb_bottom_field; |
| |
| AVCMBMode mbMode; /* type of MB prediction */ |
| AVCSubMBMode subMbMode[4]; /* for each 8x8 partition */ |
| |
| uint CBP; /* CodeBlockPattern */ |
| AVCIntra16x16PredMode i16Mode; /* Intra16x16PredMode */ |
| AVCIntra4x4PredMode i4Mode[16]; /* Intra4x4PredMode, in raster scan order */ |
| int NumMbPart; /* number of partition */ |
| AVCPredMode MBPartPredMode[4][4]; /* prediction mode [MBPartIndx][subMBPartIndx] */ |
| int MbPartWidth; |
| int MbPartHeight; |
| int NumSubMbPart[4]; /* for each 8x8 partition */ |
| int SubMbPartWidth[4]; /* for each 8x8 partition */ |
| int SubMbPartHeight[4]; /* for each 8x8 partition */ |
| |
| uint8 nz_coeff[NUM_BLKS_IN_MB]; /* [blk_y][blk_x], Chroma is [4..5][0...3], see predict_nnz() function */ |
| |
| int QPy; /* Luma QP */ |
| int QPc; /* Chroma QP */ |
| int QSc; /* Chroma QP S-picture */ |
| |
| int slice_id; // MC slice |
| } AVCMacroblock; |
| |
| |
| /** |
| This structure contains common internal variables between the encoder and decoder |
| such that some functions can be shared among them. |
| @publishedAll |
| */ |
| typedef struct tagCommonObj |
| { |
| /* put these 2 up here to make sure they are word-aligned */ |
| int16 block[NUM_PIXELS_IN_MB]; /* for transformed residue coefficient */ |
| uint8 *pred_block; /* pointer to prediction block, could point to a frame */ |
| #ifdef USE_PRED_BLOCK |
| uint8 pred[688]; /* for prediction */ |
| /* Luma [0-399], Cb [400-543], Cr[544-687] */ |
| #endif |
| int pred_pitch; /* either equal to 20 or to frame pitch */ |
| |
| /* temporary buffers for intra prediction */ |
| /* these variables should remain inside fast RAM */ |
| #ifdef MB_BASED_DEBLOCK |
| uint8 *intra_pred_top; /* a row of pixel for intra prediction */ |
| uint8 intra_pred_left[17]; /* a column of pixel for intra prediction */ |
| uint8 *intra_pred_top_cb; |
| uint8 intra_pred_left_cb[9]; |
| uint8 *intra_pred_top_cr; |
| uint8 intra_pred_left_cr[9]; |
| #endif |
| /* pointer to the prediction area for intra prediction */ |
| uint8 *pintra_pred_top; /* pointer to the top intra prediction value */ |
| uint8 *pintra_pred_left; /* pointer to the left intra prediction value */ |
| uint8 intra_pred_topleft; /* the [-1,-1] neighboring pixel */ |
| uint8 *pintra_pred_top_cb; |
| uint8 *pintra_pred_left_cb; |
| uint8 intra_pred_topleft_cb; |
| uint8 *pintra_pred_top_cr; |
| uint8 *pintra_pred_left_cr; |
| uint8 intra_pred_topleft_cr; |
| |
| int QPy; |
| int QPc; |
| int QPy_div_6; |
| int QPy_mod_6; |
| int QPc_div_6; |
| int QPc_mod_6; |
| /**** nal_unit ******/ |
| /* previously in AVCNALUnit format */ |
| uint NumBytesInRBSP; |
| int forbidden_bit; |
| int nal_ref_idc; |
| AVCNalUnitType nal_unit_type; |
| AVCNalUnitType prev_nal_unit_type; |
| /*bool*/ |
| uint slice_data_partitioning; /* flag when nal_unit_type is between 2 and 4 */ |
| /**** ******** ******/ |
| AVCSliceType slice_type; |
| AVCDecPicBuffer *decPicBuf; /* decoded picture buffer */ |
| |
| AVCSeqParamSet *currSeqParams; /* the currently used one */ |
| |
| AVCPicParamSet *currPicParams; /* the currently used one */ |
| uint seq_parameter_set_id; |
| /* slice header */ |
| AVCSliceHeader *sliceHdr; /* slice header param syntax variables */ |
| |
| AVCPictureData *currPic; /* pointer to current picture */ |
| AVCFrameStore *currFS; /* pointer to current frame store */ |
| AVCPictureType currPicType; /* frame, top-field or bot-field */ |
| /*bool*/ |
| uint newPic; /* flag for new picture */ |
| uint newSlice; /* flag for new slice */ |
| AVCPictureData *prevRefPic; /* pointer to previous picture */ |
| |
| AVCMacroblock *mblock; /* array of macroblocks covering entire picture */ |
| AVCMacroblock *currMB; /* pointer to current macroblock */ |
| uint mbNum; /* number of current MB */ |
| int mb_x; /* x-coordinate of the current mbNum */ |
| int mb_y; /* y-coordinate of the current mbNum */ |
| |
| /* For internal operation, scratch memory for MV, prediction, transform, etc.*/ |
| uint32 cbp4x4; /* each bit represent nonzero 4x4 block in reverse raster scan order */ |
| /* starting from luma, Cb and Cr, lsb toward msb */ |
| int mvd_l0[4][4][2]; /* [mbPartIdx][subMbPartIdx][compIdx], se(v) */ |
| int mvd_l1[4][4][2]; /* [mbPartIdx][subMbPartIdx][compIdx], se(v) */ |
| |
| int mbAddrA, mbAddrB, mbAddrC, mbAddrD; /* address of neighboring MBs */ |
| /*bool*/ |
| uint mbAvailA, mbAvailB, mbAvailC, mbAvailD; /* availability */ |
| /*bool*/ |
| uint intraAvailA, intraAvailB, intraAvailC, intraAvailD; /* for intra mode */ |
| /***********************************************/ |
| /* The following variables are defined in the draft. */ |
| /* They may need to be stored in PictureData structure and used for reference. */ |
| /* In that case, just move or copy it to AVCDecPictureData structure. */ |
| |
| int padded_size; /* size of extra padding to a frame */ |
| |
| uint MaxFrameNum; /*2^(log2_max_frame_num_minus4+4), range 0.. 2^16-1 */ |
| uint MaxPicOrderCntLsb; /*2^(log2_max_pic_order_cnt_lsb_minus4+4), 0..2^16-1 */ |
| uint PicWidthInMbs; /*pic_width_in_mbs_minus1+1 */ |
| uint PicWidthInSamplesL; /* PicWidthInMbs*16 */ |
| uint PicWidthInSamplesC; /* PicWIdthInMbs*8 */ |
| uint PicHeightInMapUnits; /* pic_height_in_map_units_minus1+1 */ |
| uint PicSizeInMapUnits; /* PicWidthInMbs*PicHeightInMapUnits */ |
| uint FrameHeightInMbs; /*(2-frame_mbs_only_flag)*PicHeightInMapUnits */ |
| |
| uint SliceGroupChangeRate; /* slice_group_change_rate_minus1 + 1 */ |
| |
| /* access unit */ |
| uint primary_pic_type; /* u(3), Table 7-2, kinda informative only */ |
| |
| /* slice data partition */ |
| uint slice_id; /* ue(v) */ |
| |
| uint UnusedShortTermFrameNum; |
| uint PrevRefFrameNum; |
| uint MbaffFrameFlag; /* (mb_adaptive_frame_field_flag && !field_pic_flag) */ |
| uint PicHeightInMbs; /* FrameHeightInMbs/(1+field_pic_flag) */ |
| int PicHeightInSamplesL; /* PicHeightInMbs*16 */ |
| int PicHeightInSamplesC; /* PicHeightInMbs*8 */ |
| uint PicSizeInMbs; /* PicWidthInMbs*PicHeightInMbs */ |
| uint level_idc; |
| int numMBs; |
| uint MaxPicNum; |
| uint CurrPicNum; |
| int QSy; /* 26+pic_init_qp_minus26+slice_qs_delta */ |
| int FilterOffsetA; |
| int FilterOffsetB; |
| uint MapUnitsInSliceGroup0; /* Min(slie_group_change_cycle*SliceGroupChangeRate,PicSizeInMapUnits) */ |
| /* dec_ref_pic_marking */ |
| int MaxLongTermFrameIdx; |
| int LongTermFrameIdx; |
| |
| /* POC related variables */ |
| /*bool*/ |
| uint mem_mgr_ctrl_eq_5; /* if memory_management_control_operation equal to 5 flag */ |
| int PicOrderCnt; |
| int BottomFieldOrderCnt, TopFieldOrderCnt; |
| /* POC mode 0 */ |
| int prevPicOrderCntMsb; |
| uint prevPicOrderCntLsb; |
| int PicOrderCntMsb; |
| /* POC mode 1 */ |
| int prevFrameNumOffset, FrameNumOffset; |
| uint prevFrameNum; |
| int absFrameNum; |
| int picOrderCntCycleCnt, frameNumInPicOrderCntCycle; |
| int expectedDeltaPerPicOrderCntCycle; |
| int expectedPicOrderCnt; |
| |
| /* FMO */ |
| int *MbToSliceGroupMap; /* to be re-calculate at the beginning */ |
| |
| /* ref pic list */ |
| AVCPictureData *RefPicList0[MAX_REF_PIC_LIST]; /* list 0 */ |
| AVCPictureData *RefPicList1[MAX_REF_PIC_LIST]; /* list 1 */ |
| AVCFrameStore *refFrameList0ShortTerm[32]; |
| AVCFrameStore *refFrameList1ShortTerm[32]; |
| AVCFrameStore *refFrameListLongTerm[32]; |
| int refList0Size; |
| int refList1Size; |
| |
| /* slice data semantics*/ |
| int mb_skip_run; /* ue(v) */ |
| /*uint mb_skip_flag;*/ /* ae(v) */ |
| /* uint end_of_slice_flag;*//* ae(v) */ |
| /***********************************************/ |
| |
| /* function pointers */ |
| int (*is_short_ref)(AVCPictureData *s); |
| int (*is_long_ref)(AVCPictureData *s); |
| |
| } AVCCommonObj; |
| |
| /** |
| Commonly used constant arrays. |
| @publishedAll |
| */ |
| /** |
| Zigzag scan from 1-D to 2-D. */ |
| const static uint8 ZZ_SCAN[16] = {0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15}; |
| /* Zigzag scan from 1-D to 2-D output to block[24][16]. */ |
| const static uint8 ZZ_SCAN_BLOCK[16] = {0, 1, 16, 32, 17, 2, 3, 18, 33, 48, 49, 34, 19, 35, 50, 51}; |
| |
| /** |
| From zigzag to raster for luma DC value */ |
| const static uint8 ZIGZAG2RASTERDC[16] = {0, 4, 64, 128, 68, 8, 12, 72, 132, 192, 196, 136, 76, 140, 200, 204}; |
| |
| |
| /** |
| Mapping from coding scan block indx to raster scan block index */ |
| const static int blkIdx2blkX[16] = {0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3}; |
| const static int blkIdx2blkY[16] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3}; |
| /** from [blk8indx][blk4indx] to raster scan index */ |
| const static int blkIdx2blkXY[4][4] = {{0, 1, 4, 5}, {2, 3, 6, 7}, {8, 9, 12, 13}, {10, 11, 14, 15}}; |
| |
| /* |
| Availability of the neighboring top-right block relative to the current block. */ |
| const static int BlkTopRight[16] = {2, 2, 2, 3, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0}; |
| |
| /** |
| Table 8-13 Specification of QPc as a function of qPI. */ |
| const static uint8 mapQPi2QPc[52] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, |
| 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, |
| 37, 37, 37, 38, 38, 38, 39, 39, 39, 39 |
| }; |
| |
| /** |
| See 8.5.5 equation (8-252 and 8-253) the definition of v matrix. */ |
| /* in zigzag scan */ |
| const static int dequant_coefres[6][16] = |
| { |
| {10, 13, 13, 10, 16, 10, 13, 13, 13, 13, 16, 10, 16, 13, 13, 16}, |
| {11, 14, 14, 11, 18, 11, 14, 14, 14, 14, 18, 11, 18, 14, 14, 18}, |
| {13, 16, 16, 13, 20, 13, 16, 16, 16, 16, 20, 13, 20, 16, 16, 20}, |
| {14, 18, 18, 14, 23, 14, 18, 18, 18, 18, 23, 14, 23, 18, 18, 23}, |
| {16, 20, 20, 16, 25, 16, 20, 20, 20, 20, 25, 16, 25, 20, 20, 25}, |
| {18, 23, 23, 18, 29, 18, 23, 23, 23, 23, 29, 18, 29, 23, 23, 29} |
| }; |
| |
| /** |
| From jm7.6 block.c. (in zigzag scan) */ |
| const static int quant_coef[6][16] = |
| { |
| {13107, 8066, 8066, 13107, 5243, 13107, 8066, 8066, 8066, 8066, 5243, 13107, 5243, 8066, 8066, 5243}, |
| {11916, 7490, 7490, 11916, 4660, 11916, 7490, 7490, 7490, 7490, 4660, 11916, 4660, 7490, 7490, 4660}, |
| {10082, 6554, 6554, 10082, 4194, 10082, 6554, 6554, 6554, 6554, 4194, 10082, 4194, 6554, 6554, 4194}, |
| {9362, 5825, 5825, 9362, 3647, 9362, 5825, 5825, 5825, 5825, 3647, 9362, 3647, 5825, 5825, 3647}, |
| {8192, 5243, 5243, 8192, 3355, 8192, 5243, 5243, 5243, 5243, 3355, 8192, 3355, 5243, 5243, 3355}, |
| {7282, 4559, 4559, 7282, 2893, 7282, 4559, 4559, 4559, 4559, 2893, 7282, 2893, 4559, 4559, 2893} |
| }; |
| |
| /** |
| Convert scan from raster scan order to block decoding order and |
| from block decoding order to raster scan order. Same table!!! |
| */ |
| const static uint8 ras2dec[16] = {0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15}; |
| |
| /* mapping from level_idc to index map */ |
| const static uint8 mapLev2Idx[61] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 1, |
| 0, 1, 2, 3, 255, 255, 255, 255, 255, 255, |
| 4, 5, 6, 255, 255, 255, 255, 255, 255, 255, |
| 7, 8, 9, 255, 255, 255, 255, 255, 255, 255, |
| 10, 11, 12, 255, 255, 255, 255, 255, 255, 255, |
| 13, 14, 255, 255, 255, 255, 255, 255, 255, 255 |
| }; |
| /* map back from index to Level IDC */ |
| const static uint8 mapIdx2Lev[MAX_LEVEL_IDX] = {10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41, 42, 50, 51}; |
| |
| /** |
| from the index map to the MaxDPB value times 2 */ |
| const static int32 MaxDPBX2[MAX_LEVEL_IDX] = {297, 675, 1782, 1782, 1782, 3564, 6075, 6075, |
| 13500, 15360, 24576, 24576, 24576, 82620, 138240 |
| }; |
| |
| /* map index to the max frame size */ |
| const static int MaxFS[MAX_LEVEL_IDX] = {99, 396, 396, 396, 396, 792, 1620, 1620, 3600, 5120, |
| 8192, 8192, 8192, 22080, 36864 |
| }; |
| |
| /* map index to max MB processing rate */ |
| const static int32 MaxMBPS[MAX_LEVEL_IDX] = {1485, 3000, 6000, 11880, 11880, 19800, 20250, 40500, |
| 108000, 216000, 245760, 245760, 491520, 589824, 983040 |
| }; |
| |
| /* map index to max video bit rate */ |
| const static uint32 MaxBR[MAX_LEVEL_IDX] = {64, 192, 384, 768, 2000, 4000, 4000, 10000, 14000, 20000, |
| 20000, 50000, 50000, 135000, 240000 |
| }; |
| |
| /* map index to max CPB size */ |
| const static uint32 MaxCPB[MAX_LEVEL_IDX] = {175, 500, 1000, 2000, 2000, 4000, 4000, 10000, 14000, |
| 20000, 25000, 62500, 62500, 135000, 240000 |
| }; |
| |
| /* map index to max vertical MV range */ |
| const static int MaxVmvR[MAX_LEVEL_IDX] = {64, 128, 128, 128, 128, 256, 256, 256, 512, 512, 512, 512, 512, 512, 512}; |
| |
| #endif /* _AVCINT_COMMON_H_ */ |