208 lines
7.0 KiB
C++
208 lines
7.0 KiB
C++
/*!
|
|
* \copy
|
|
* Copyright (c) 2013, Cisco Systems
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*/
|
|
|
|
//wels_slice.h
|
|
#ifndef WELS_SLICE_H__
|
|
#define WELS_SLICE_H__
|
|
|
|
#include "typedefs.h"
|
|
#include "wels_const.h"
|
|
#include "wels_common_basis.h"
|
|
#include "picture.h"
|
|
#include "parameter_sets.h"
|
|
|
|
//#pragma pack(1)
|
|
|
|
namespace WelsDec {
|
|
|
|
/*
|
|
* Reference picture list reordering syntax, refer to page 64 in JVT X201wcm
|
|
*/
|
|
typedef struct TagRefPicListReorderSyntax {
|
|
struct {
|
|
uint32_t uiAbsDiffPicNumMinus1;
|
|
uint16_t uiLongTermPicNum;
|
|
uint16_t uiReorderingOfPicNumsIdc;
|
|
} sReorderingSyn[LIST_A][MAX_REF_PIC_COUNT];
|
|
bool_t bRefPicListReorderingFlag[LIST_A];
|
|
} SRefPicListReorderSyn, *PRefPicListReorderSyn;
|
|
|
|
/*
|
|
* Prediction weight table syntax, refer to page 65 in JVT X201wcm
|
|
*/
|
|
typedef struct TagPredWeightTabSyntax {
|
|
uint32_t uiLumaLog2WeightDenom;
|
|
uint32_t uiChromaLog2WeightDenom;
|
|
struct {
|
|
int32_t iLumaWeight[MAX_REF_PIC_COUNT];
|
|
int32_t iLumaOffset[MAX_REF_PIC_COUNT];
|
|
int32_t iChromaWeight[MAX_REF_PIC_COUNT][2];
|
|
int32_t iChromaOffset[MAX_REF_PIC_COUNT][2];
|
|
bool_t bLumaWeightFlag;
|
|
bool_t bChromaWeightFlag;
|
|
} sPredList[LIST_A];
|
|
} SPredWeightTabSyn;
|
|
|
|
/* Decoded reference picture marking syntax, refer to Page 66 in JVT X201wcm */
|
|
typedef struct TagRefPicMarking {
|
|
struct {
|
|
uint32_t uiMmcoType;
|
|
int32_t iShortFrameNum;
|
|
int32_t iDiffOfPicNum;
|
|
uint32_t uiLongTermPicNum;
|
|
int32_t iLongTermFrameIdx;
|
|
int32_t iMaxLongTermFrameIdx;
|
|
} sMmcoRef[MAX_MMCO_COUNT];
|
|
|
|
bool_t bNoOutputOfPriorPicsFlag;
|
|
bool_t bLongTermRefFlag;
|
|
bool_t bAdaptiveRefPicMarkingModeFlag;
|
|
} SRefPicMarking, *PRefPicMarking;
|
|
|
|
/* Decode reference base picture marking syntax in Page 396 of JVT X201wcm */
|
|
typedef struct TagRefBasePicMarkingSyn {
|
|
struct {
|
|
uint32_t uiMmcoType;
|
|
int32_t iShortFrameNum;
|
|
uint32_t uiDiffOfPicNums;
|
|
uint32_t uiLongTermPicNum; //should uint32_t, cover larger range of iFrameNum.
|
|
} mmco_base[MAX_MMCO_COUNT]; // MAX_REF_PIC for reference picture based on frame
|
|
|
|
bool_t bAdaptiveRefBasePicMarkingModeFlag;
|
|
} SRefBasePicMarking, *PRefBasePicMarking;
|
|
|
|
/* Header of slice syntax elements, refer to Page 63 in JVT X201wcm */
|
|
typedef struct TagSliceHeaders {
|
|
/*****************************slice header syntax and generated****************************/
|
|
int32_t iFirstMbInSlice;
|
|
int32_t iFrameNum;
|
|
int32_t iPicOrderCntLsb;
|
|
int32_t iDeltaPicOrderCntBottom;
|
|
int32_t iDeltaPicOrderCnt[2];
|
|
int32_t iRedundantPicCnt;
|
|
int32_t uiRefCount[LIST_A];
|
|
int32_t iSliceQpDelta; //no use for iSliceQp is used directly
|
|
int32_t iSliceQp;
|
|
int32_t iSliceQsDelta; // For SP/SI slices
|
|
uint32_t uiDisableDeblockingFilterIdc;
|
|
int32_t iSliceAlphaC0Offset;
|
|
int32_t iSliceBetaOffset;
|
|
int32_t iSliceGroupChangeCycle;
|
|
|
|
PSps pSps;
|
|
PPps pPps;
|
|
int32_t iSpsId;
|
|
int32_t iPpsId;
|
|
|
|
/*********************got from other layer for efficency if possible*********************/
|
|
SRefPicListReorderSyn pRefPicListReordering; // Reference picture list reordering syntaxs
|
|
SPredWeightTabSyn sPredWeightTable;
|
|
int32_t iCabacInitIdc;
|
|
int32_t iMbWidth; //from?
|
|
int32_t iMbHeight; //from?
|
|
SRefPicMarking sRefMarking; // Decoded reference picture marking syntaxs
|
|
|
|
uint16_t uiIdrPicId;
|
|
ESliceType eSliceType;
|
|
bool_t bNumRefIdxActiveOverrideFlag;
|
|
bool_t bFieldPicFlag; //not supported in base profile
|
|
bool_t bBottomFiledFlag; //not supported in base profile
|
|
uint8_t uiPadding1Byte;
|
|
bool_t bSpForSwitchFlag; // For SP/SI slices
|
|
int16_t iPadding2Bytes;
|
|
} SSliceHeader, *PSliceHeader;
|
|
|
|
|
|
/* Slice header in scalable extension syntax, refer to Page 394 in JVT X201wcm */
|
|
typedef struct TagSliceHeaderExt {
|
|
SSliceHeader sSliceHeader;
|
|
PSubsetSps pSubsetSps;
|
|
|
|
uint32_t uiNumMbsInSlice;
|
|
uint32_t uiDisableInterLayerDeblockingFilterIdc;
|
|
int32_t iInterLayerSliceAlphaC0Offset;
|
|
int32_t iInterLayerSliceBetaOffset;
|
|
|
|
//SPosOffset sScaledRefLayer;
|
|
int32_t iScaledRefLayerPicWidthInSampleLuma;
|
|
int32_t iScaledRefLayerPicHeightInSampleLuma;
|
|
|
|
SRefBasePicMarking sRefBasePicMarking;
|
|
bool_t bBasePredWeightTableFlag;
|
|
bool_t bStoreRefBasePicFlag;
|
|
bool_t bConstrainedIntraResamplingFlag;
|
|
bool_t bSliceSkipFlag;
|
|
|
|
bool_t bAdaptiveBaseModeFlag;
|
|
bool_t bDefaultBaseModeFlag;
|
|
bool_t bAdaptiveMotionPredFlag;
|
|
bool_t bDefaultMotionPredFlag;
|
|
bool_t bAdaptiveResidualPredFlag;
|
|
bool_t bDefaultResidualPredFlag;
|
|
bool_t bTCoeffLevelPredFlag;
|
|
uint8_t uiRefLayerChromaPhaseXPlus1Flag;
|
|
|
|
uint8_t uiRefLayerChromaPhaseYPlus1;
|
|
uint8_t uiRefLayerDqId;
|
|
uint8_t uiScanIdxStart;
|
|
uint8_t uiScanIdxEnd;
|
|
} SSliceHeaderExt, *PSliceHeaderExt;
|
|
|
|
|
|
typedef struct TagSlice {
|
|
/*******************************slice_header****************************/
|
|
SSliceHeaderExt sSliceHeaderExt;
|
|
|
|
/*******************************use for future****************************/
|
|
// for Macroblock coding within slice
|
|
int32_t iLastMbQp; // stored qp for last mb coded, maybe more efficient for mb skip detection etc.
|
|
|
|
/*******************************slice_data****************************/
|
|
/*slice_data_ext()*/
|
|
int32_t iMbSkipRun;
|
|
int32_t iTotalMbInCurSlice; //record the total number of MB in current slice.
|
|
|
|
/*slice_data_ext() generate*/
|
|
|
|
/*******************************misc use****************************/
|
|
bool_t bSliceHeaderExtFlag; // Indicate which slice header is used, avc or ext?
|
|
/*************got from other layer for effiency if possible***************/
|
|
/*from lower layer: slice header*/
|
|
uint8_t eSliceType;
|
|
uint8_t uiPadding[2];
|
|
} SSlice, *PSlice;
|
|
|
|
} // namespace WelsDec
|
|
|
|
//#pragma pack()
|
|
#endif//WELS_SLICE_H__
|