/*
|
* Copyright 2015 Rockchip Electronics Co. LTD
|
*
|
* 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.
|
*/
|
|
#ifndef __H265E_SLICE_H__
|
#define __H265E_SLICE_H__
|
|
#include "rk_type.h"
|
#include "mpp_err.h"
|
#include "mpp_list.h"
|
#include "h265e_dpb.h"
|
#include "h265_syntax.h"
|
#include "h265e_enctropy.h"
|
#include "h265e_context_table.h"
|
|
#define MIN_PU_SIZE 4
|
#define MIN_TU_SIZE 4
|
#define MAX_NUM_SPU_W (64 / MIN_PU_SIZE) // maximum number of SPU in horizontal line
|
|
/*
|
* For H.265 encoder slice header process.
|
* Remove some syntax that encoder not supported.
|
* Field, mbaff, B slice are not supported yet.
|
*/
|
typedef struct H265eDpbFrm_t H265eDpbFrm;
|
|
typedef struct DataCu_t {
|
RK_U8 m_cuSize[256];
|
RK_U8 m_cuDepth[256];
|
RK_U32 pixelX;
|
RK_U32 pixelY;
|
RK_U32 mb_w;
|
RK_U32 mb_h;
|
RK_U32 cur_addr;
|
} DataCu;
|
|
typedef struct H265eReferencePictureSet_e {
|
RK_S32 m_deltaRIdxMinus1;
|
RK_S32 m_deltaRPS;
|
RK_S32 m_numRefIdc;
|
RK_S32 m_refIdc[MAX_REFS + 1];
|
|
// Parameters for long term references
|
RK_U32 check_lt_msb[MAX_REFS];
|
RK_S32 m_pocLSBLT[MAX_REFS];
|
RK_S32 m_deltaPOCMSBCycleLT[MAX_REFS];
|
RK_U32 m_deltaPocMSBPresentFlag[MAX_REFS];
|
|
RK_S32 m_numberOfPictures;
|
RK_S32 num_negative_pic;
|
RK_S32 num_positive_pic;
|
RK_S32 delta_poc[MAX_REFS];
|
RK_U32 m_used[MAX_REFS];
|
RK_U32 m_ref[MAX_REFS];
|
RK_S32 poc[MAX_REFS];
|
RK_S32 m_RealPoc[MAX_REFS];
|
|
RK_U32 m_interRPSPrediction;
|
RK_S32 num_long_term_pic; // Zero when disabled
|
} H265eReferencePictureSet;
|
|
typedef struct H265eRPSList_e {
|
RK_S32 m_numberOfReferencePictureSets;
|
H265eReferencePictureSet *m_referencePictureSets;
|
} H265eRPSList;
|
|
typedef struct H265eRefPicListModification_e {
|
RK_U32 m_refPicListModificationFlagL0;
|
RK_U32 m_refPicListModificationFlagL1;
|
RK_U32 m_RefPicSetIdxL0[REF_PIC_LIST_NUM_IDX];
|
RK_U32 m_RefPicSetIdxL1[REF_PIC_LIST_NUM_IDX];
|
} H265eRefPicListModification;
|
|
typedef struct ProfileTierLevel_e {
|
RK_S32 m_profileSpace;
|
RK_S32 m_tierFlag;
|
RK_S32 m_profileIdc;
|
RK_S32 m_profileCompatibilityFlag[32];
|
RK_S32 m_levelIdc;
|
RK_S32 m_progressiveSourceFlag;
|
RK_S32 m_interlacedSourceFlag;
|
RK_S32 m_nonPackedConstraintFlag;
|
RK_S32 m_frameOnlyConstraintFlag;
|
} ProfileTierLevel;
|
|
typedef struct H265ePTL_e {
|
ProfileTierLevel m_generalPTL;
|
ProfileTierLevel m_subLayerPTL[6]; // max. value of max_sub_layers_minus1 is 6
|
RK_S32 m_subLayerProfilePresentFlag[6];
|
RK_S32 m_subLayerLevelPresentFlag[6];
|
} H265ePTL;
|
|
typedef struct TimeingInfo_e {
|
RK_U32 m_timingInfoPresentFlag;
|
RK_U32 m_numUnitsInTick;
|
RK_U32 m_timeScale;
|
RK_U32 m_pocProportionalToTimingFlag;
|
RK_U32 m_numTicksPocDiffOneMinus1;
|
} TimingInfo;
|
|
typedef struct H265HrdSubLayerInfo_e {
|
RK_U32 fixedPicRateFlag;
|
RK_U32 fixedPicRateWithinCvsFlag;
|
RK_U32 picDurationInTcMinus1;
|
RK_U32 lowDelayHrdFlag;
|
RK_U32 cpbCntMinus1;
|
RK_U32 bitRateValueMinus1[MAX_CPB_CNT][2];
|
RK_U32 cpbSizeValue[MAX_CPB_CNT][2];
|
RK_U32 ducpbSizeValue[MAX_CPB_CNT][2];
|
RK_U32 cbrFlag[MAX_CPB_CNT][2];
|
RK_U32 duBitRateValue[MAX_CPB_CNT][2];
|
} H265eHrdSubLayerInfo;
|
|
typedef struct H265eHrdParameters_e {
|
RK_U32 m_nalHrdParametersPresentFlag;
|
RK_U32 m_vclHrdParametersPresentFlag;
|
RK_U32 m_subPicHrdParamsPresentFlag;
|
RK_U32 m_tickDivisorMinus2;
|
RK_U32 m_duCpbRemovalDelayLengthMinus1;
|
RK_U32 m_subPicCpbParamsInPicTimingSEIFlag;
|
RK_U32 m_dpbOutputDelayDuLengthMinus1;
|
RK_U32 m_bitRateScale;
|
RK_U32 m_cpbSizeScale;
|
RK_U32 m_ducpbSizeScale;
|
RK_U32 m_initialCpbRemovalDelayLengthMinus1;
|
RK_U32 m_cpbRemovalDelayLengthMinus1;
|
RK_U32 m_dpbOutputDelayLengthMinus1;
|
H265eHrdSubLayerInfo m_HRD[MAX_SUB_LAYERS];
|
} H265eHrdParameters;
|
|
typedef struct H265eVps_e {
|
RK_S32 m_VPSId;
|
RK_U32 m_maxTLayers;
|
RK_U32 m_maxLayers;
|
RK_U32 m_bTemporalIdNestingFlag;
|
|
RK_U32 m_numReorderPics[MAX_SUB_LAYERS];
|
RK_U32 m_maxDecPicBuffering[MAX_SUB_LAYERS];
|
RK_U32 m_maxLatencyIncrease[MAX_SUB_LAYERS]; // Really max latency increase plus 1 (value 0 expresses no limit)
|
|
RK_U32 m_numHrdParameters;
|
RK_U32 m_maxNuhReservedZeroLayerId;
|
H265eHrdParameters *m_hrdParameters;
|
RK_U32 *m_hrdOpSetIdx;
|
RK_U32 *m_cprmsPresentFlag;
|
RK_U32 m_numOpSets;
|
RK_U32 m_layerIdIncludedFlag[MAX_VPS_OP_SETS_PLUS1][MAX_VPS_NUH_RESERVED_ZERO_LAYER_ID_PLUS1];
|
|
H265ePTL m_ptl;
|
TimingInfo m_timingInfo;
|
} H265eVps;
|
|
typedef struct H265eCropInfo_e {
|
RK_U32 m_enabledFlag;
|
RK_S32 m_winLeftOffset;
|
RK_S32 m_winRightOffset;
|
RK_S32 m_winTopOffset;
|
RK_S32 m_winBottomOffset;
|
} H265eCropInfo;
|
|
typedef struct H265eVuiInfo_e {
|
RK_U32 m_aspectRatioInfoPresentFlag;
|
RK_S32 m_aspectRatioIdc;
|
RK_S32 m_sarWidth;
|
RK_S32 m_sarHeight;
|
RK_U32 m_overscanInfoPresentFlag;
|
RK_U32 m_overscanAppropriateFlag;
|
RK_U32 m_videoSignalTypePresentFlag;
|
RK_S32 m_videoFormat;
|
RK_U32 m_videoFullRangeFlag;
|
RK_U32 m_colourDescriptionPresentFlag;
|
RK_S32 m_colourPrimaries;
|
RK_S32 m_transferCharacteristics;
|
RK_S32 m_matrixCoefficients;
|
RK_U32 m_chromaLocInfoPresentFlag;
|
RK_S32 m_chromaSampleLocTypeTopField;
|
RK_S32 m_chromaSampleLocTypeBottomField;
|
RK_U32 m_neutralChromaIndicationFlag;
|
RK_U32 m_fieldSeqFlag;
|
|
H265eCropInfo m_defaultDisplayWindow;
|
RK_U32 m_frameFieldInfoPresentFlag;
|
RK_U32 m_hrdParametersPresentFlag;
|
RK_U32 m_bitstreamRestrictionFlag;
|
RK_U32 m_tilesFixedStructureFlag;
|
RK_U32 m_motionVectorsOverPicBoundariesFlag;
|
RK_U32 m_restrictedRefPicListsFlag;
|
RK_S32 m_minSpatialSegmentationIdc;
|
RK_S32 m_maxBytesPerPicDenom;
|
RK_S32 m_maxBitsPerMinCuDenom;
|
RK_S32 m_log2MaxMvLengthHorizontal;
|
RK_S32 m_log2MaxMvLengthVertical;
|
H265eHrdParameters m_hrdParameters;
|
TimingInfo m_timingInfo;
|
} H265eVuiInfo;
|
|
typedef struct H265eSps_e {
|
|
RK_S32 m_SPSId;
|
RK_S32 m_VPSId;
|
RK_S32 m_chromaFormatIdc;
|
RK_U32 m_colorPlaneFlag;
|
RK_U32 m_maxTLayers; // maximum number of temporal layers
|
|
// Structure
|
RK_U32 m_picWidthInLumaSamples;
|
RK_U32 m_picHeightInLumaSamples;
|
|
RK_S32 m_log2MinCodingBlockSize;
|
RK_S32 m_log2DiffMaxMinCodingBlockSize;
|
RK_U32 m_maxCUSize;
|
RK_U32 m_maxCUDepth;
|
RK_U32 m_addCUDepth;
|
|
H265eCropInfo m_conformanceWindow;
|
|
H265eRPSList m_RPSList;
|
RK_U32 m_bLongTermRefsPresent;
|
RK_U32 m_TMVPFlagsPresent;
|
RK_S32 m_numReorderPics[MAX_SUB_LAYERS];
|
|
// Tool list
|
RK_U32 m_quadtreeTULog2MaxSize;
|
RK_U32 m_quadtreeTULog2MinSize;
|
RK_U32 m_quadtreeTUMaxDepthInter;
|
RK_U32 m_quadtreeTUMaxDepthIntra;
|
RK_U32 m_usePCM;
|
RK_U32 m_pcmLog2MaxSize;
|
RK_U32 m_pcmLog2MinSize;
|
RK_U32 m_useAMP;
|
|
// Parameter
|
RK_S32 m_bitDepthY;
|
RK_S32 m_bitDepthC;
|
RK_S32 m_qpBDOffsetY;
|
RK_S32 m_qpBDOffsetC;
|
|
RK_U32 m_useLossless;
|
|
RK_U32 m_pcmBitDepthLuma;
|
RK_U32 m_pcmBitDepthChroma;
|
RK_U32 m_bPCMFilterDisableFlag;
|
|
RK_U32 m_bitsForPOC;
|
RK_U32 m_numLongTermRefPicSPS;
|
RK_U32 m_ltRefPicPocLsbSps[33];
|
RK_U32 m_usedByCurrPicLtSPSFlag[33];
|
|
// Max physical transform size
|
RK_U32 m_maxTrSize;
|
|
RK_S32 m_iAMPAcc[MAX_CU_DEPTH];
|
RK_U32 m_bUseSAO;
|
|
RK_U32 m_bTemporalIdNestingFlag; // temporal_id_nesting_flag
|
|
RK_U32 m_scalingListEnabledFlag;
|
RK_U32 m_scalingListPresentFlag;
|
RK_U32 m_maxDecPicBuffering[MAX_SUB_LAYERS];
|
|
RK_U32 m_maxLatencyIncrease[MAX_SUB_LAYERS]; // Really max latency increase plus 1 (value 0 expresses no limit)
|
|
RK_U32 m_useDF;
|
RK_U32 m_useStrongIntraSmoothing;
|
|
RK_S32 m_vuiParametersPresentFlag;
|
H265eVuiInfo vui;
|
H265ePTL *m_ptl;
|
RK_U32 zscan2raster[MAX_NUM_SPU_W * MAX_NUM_SPU_W];
|
RK_U32 raster2zscan[MAX_NUM_SPU_W * MAX_NUM_SPU_W];
|
RK_U32 raster2pelx[MAX_NUM_SPU_W * MAX_NUM_SPU_W];
|
RK_U32 raster2pely[MAX_NUM_SPU_W * MAX_NUM_SPU_W];
|
} H265eSps;
|
|
typedef struct H265ePps_e {
|
RK_S32 m_PPSId; // pic_parameter_set_id
|
RK_S32 m_SPSId; // seq_parameter_set_id
|
RK_S32 m_picInitQPMinus26;
|
RK_U32 m_useDQP;
|
RK_U32 m_bConstrainedIntraPred; // constrained_intra_pred_flag
|
RK_U32 m_bSliceChromaQpFlag; // slicelevel_chroma_qp_flag
|
|
// access channel
|
H265eSps *m_sps;
|
RK_U32 m_maxCuDQPDepth;
|
RK_U32 m_minCuDQPSize;
|
|
RK_S32 m_chromaCbQpOffset;
|
RK_S32 m_chromaCrQpOffset;
|
|
RK_U32 m_numRefIdxL0DefaultActive;
|
RK_U32 m_numRefIdxL1DefaultActive;
|
|
RK_U32 m_bUseWeightPred; // Use of Weighting Prediction (P_SLICE)
|
RK_U32 m_useWeightedBiPred; // Use of Weighting Bi-Prediction (B_SLICE)
|
RK_U32 m_outputFlagPresentFlag; // Indicates the presence of output_flag in slice header
|
|
RK_U32 m_transquantBypassEnableFlag; // Indicates presence of cu_transquant_bypass_flag in CUs.
|
RK_U32 m_useTransformSkip;
|
RK_U32 m_entropyCodingSyncEnabledFlag; //!< Indicates the presence of wavefronts
|
|
|
RK_S32 m_signHideFlag;
|
RK_S32 m_tiles_enabled_flag;
|
RK_U32 m_bTileUniformSpacing;
|
RK_S32 m_nNumTileColumnsMinus1;
|
RK_S32 m_nTileColumnWidthArray[33];
|
RK_S32 m_nNumTileRowsMinus1;
|
RK_S32 m_nTileRowHeightArray[128];
|
RK_U32 m_loopFilterAcrossTilesEnabledFlag;
|
|
RK_U32 m_cabacInitPresentFlag;
|
RK_U32 m_encCABACTableIdx; // Used to transmit table selection across slices
|
|
RK_U32 m_sliceHeaderExtensionPresentFlag;
|
RK_U32 m_deblockingFilterControlPresentFlag;
|
RK_U32 m_LFCrossSliceBoundaryFlag;
|
RK_U32 m_deblockingFilterOverrideEnabledFlag;
|
RK_U32 m_picDisableDeblockingFilterFlag;
|
RK_S32 m_deblockingFilterBetaOffsetDiv2; //< beta offset for deblocking filter
|
RK_S32 m_deblockingFilterTcOffsetDiv2; //< tc offset for deblocking filter
|
RK_U32 m_scalingListPresentFlag;
|
|
// TComScalingList* m_scalingList; //!< ScalingList class pointer
|
RK_U32 m_listsModificationPresentFlag;
|
RK_U32 m_log2ParallelMergeLevelMinus2;
|
RK_S32 m_numExtraSliceHeaderBits;
|
} H265ePps;
|
|
typedef struct H265eSlice_e {
|
|
RK_U32 m_saoEnabledFlag;
|
RK_U32 m_saoEnabledFlagChroma; ///< SAO Cb&Cr enabled flag
|
RK_S32 m_ppsId; ///< picture parameter set ID
|
RK_U32 m_picOutputFlag; ///< pic_output_flag
|
RK_S32 poc;
|
RK_S32 gop_idx;
|
RK_S32 last_idr;
|
|
H265eReferencePictureSet *m_rps;
|
H265eReferencePictureSet m_localRPS;
|
RK_S32 m_bdIdx;
|
H265eRefPicListModification m_RefPicListModification;
|
H265eContextModel_t m_contextModels[MAX_OFF_CTX_MOD];
|
H265eCabacCtx m_cabac;
|
|
enum NALUnitType m_nalUnitType; ///< Nal unit type for the slice
|
SliceType m_sliceType;
|
RK_U32 m_IsGenB;
|
RK_S32 m_sliceQp;
|
RK_U32 m_dependentSliceSegmentFlag;
|
RK_U32 m_deblockingFilterDisable;
|
RK_U32 m_deblockingFilterOverrideFlag; //< offsets for deblocking filter inherit from PPS
|
RK_S32 m_deblockingFilterBetaOffsetDiv2; //< beta offset for deblocking filter
|
RK_S32 m_deblockingFilterTcOffsetDiv2; //< tc offset for deblocking filter
|
RK_S32 m_numRefIdx[2]; // for multiple reference of current slice
|
|
RK_U32 m_bCheckLDC;
|
|
// Data
|
RK_S32 m_sliceQpDelta;
|
RK_S32 m_sliceQpDeltaCb;
|
RK_S32 m_sliceQpDeltaCr;
|
H265eDpbFrm *m_refPicList[2][MAX_REFS + 1];
|
RK_S32 m_refPOCList[2][MAX_REFS + 1];
|
RK_U32 m_bIsUsedAsLongTerm[2][MAX_REFS + 1];
|
|
// referenced slice?
|
RK_U32 is_referenced;
|
|
// access channel
|
H265eSps* m_sps;
|
H265ePps* m_pps;
|
H265eVps* m_vps;
|
RK_U32 m_colFromL0Flag; // collocated picture from List0 flag
|
|
RK_U32 m_colRefIdx;
|
RK_U32 m_maxNumMergeCand;
|
|
RK_U32 m_sliceCurEndCUAddr;
|
RK_U32 m_nextSlice;
|
RK_U32 m_sliceBits;
|
RK_U32 m_sliceSegmentBits;
|
RK_U32 m_bFinalized;
|
|
RK_U32 m_tileOffstForMultES;
|
|
RK_U32* m_substreamSizes;
|
|
// TComScalingList* m_scalingList; //!< pointer of quantization matrix
|
RK_U32 m_cabacInitFlag;
|
|
RK_U32 m_bLMvdL1Zero;
|
RK_S32 m_numEntryPointOffsets;
|
RK_U32 m_temporalLayerNonReferenceFlag;
|
RK_U32 m_LFCrossSliceBoundaryFlag;
|
RK_U32 m_enableTMVPFlag;
|
|
RK_U32 slice_reserved_flag;
|
RK_U32 no_output_of_prior_pics_flag;
|
RK_U32 slice_header_extension_length;
|
RK_U32 ref_pic_list_modification_flag_l0;
|
RK_U32 lst_entry_l0;
|
RK_U32 tot_poc_num;
|
RK_U32 num_long_term_sps;
|
RK_U32 num_long_term_pics;
|
} H265eSlice;
|
|
#ifdef __cplusplus
|
extern "C" {
|
#endif
|
|
void h265e_slice_set_ref_list(H265eDpbFrm *frame_list, H265eSlice *slice);
|
void h265e_slice_set_ref_poc_list(H265eSlice *slice);
|
void h265e_slice_init(void *ctx, EncFrmStatus curr);
|
RK_S32 h265e_code_slice_skip_frame(void *ctx, H265eSlice *slice, RK_U8 *buf, RK_S32 len);
|
|
#ifdef __cplusplus
|
}
|
#endif
|
|
#endif /* __H265E_SLICE_H__ */
|