1 /*! 2 * \copy 3 * Copyright (c) 2009-2013, Cisco Systems 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 * 31 * 32 * \file encoder_context.h 33 * 34 * \brief Main pData to be operated over Wels encoder all modules 35 * 36 * \date 2/4/2009 Created 37 * 38 ************************************************************************************* 39 */ 40 #ifndef WELS_ENCODER_CONTEXT_H__ 41 #define WELS_ENCODER_CONTEXT_H__ 42 43 #include <stdio.h> 44 #include "typedefs.h" 45 #include "param_svc.h" 46 #include "nal_encap.h" 47 #include "picture.h" 48 #include "paraset_strategy.h" 49 #include "dq_map.h" 50 #include "stat.h" 51 #include "macros.h" 52 #include "rc.h" 53 #include "as264_common.h" 54 #include "wels_preprocess.h" 55 #include "wels_func_ptr_def.h" 56 #include "crt_util_safe_x.h" 57 #include "utils.h" 58 59 #include "mt_defs.h" // for multiple threadin, 60 #include "WelsThreadLib.h" 61 #include "wels_task_management.h" 62 63 namespace WelsEnc { 64 65 class IWelsTaskManage; 66 class IWelsReferenceStrategy; 67 68 /* 69 * reference list for each quality layer in SVC 70 */ 71 typedef struct TagRefList { 72 SPicture* pShortRefList[1 + MAX_SHORT_REF_COUNT]; // reference list 0 - int16_t 73 SPicture* pLongRefList[1 + MAX_REF_PIC_COUNT]; // reference list 1 - int32_t 74 SPicture* pNextBuffer; 75 SPicture* pRef[1 + MAX_REF_PIC_COUNT]; // plus 1 for swap intend 76 uint8_t uiShortRefCount; 77 uint8_t uiLongRefCount; // dependend on pRef pic module 78 } SRefList; 79 80 typedef struct TagLTRState { 81 // LTR mark feedback 82 uint32_t uiLtrMarkState; // LTR mark state, indicate whether there is a LTR mark feedback unsolved 83 int32_t iLtrMarkFbFrameNum;// the unsolved LTR mark feedback, the marked iFrameNum feedback from decoder 84 85 // LTR used as recovery reference 86 int32_t iLastRecoverFrameNum; // reserve the last LTR or IDR recover iFrameNum 87 int32_t iLastCorFrameNumDec; // reserved the last correct position in decoder side, use to select valid LTR to recover or to decide the LTR mark validation 88 int32_t iCurFrameNumInDec; // current iFrameNum in decoder side, use to select valid LTR to recover or to decide the LTR mark validation 89 90 // LTR mark 91 int32_t iLTRMarkMode; // direct mark or delay mark 92 int32_t iLTRMarkSuccessNum; //successful marked num, for mark mode switch 93 int32_t iCurLtrIdx;// current int32_t term reference index to mark 94 int32_t iLastLtrIdx[MAX_TEMPORAL_LAYER_NUM]; 95 int32_t iSceneLtrIdx;// related to Scene LTR, used by screen content 96 97 uint32_t uiLtrMarkInterval;// the interval from the last int32_t term pRef mark 98 99 bool bLTRMarkingFlag; //decide whether current frame marked as LTR 100 bool bLTRMarkEnable; //when LTR is confirmed and the interval is no smaller than the marking period 101 bool bReceivedT0LostFlag; // indicate whether a t0 lost feedback is recieved, for LTR recovery 102 } SLTRState; 103 104 typedef struct TagSpatialPicIndex { 105 SPicture* pSrc; // I420 based and after color space converted 106 int32_t iDid; // dependency id 107 } SSpatialPicIndex; 108 109 typedef struct TagStrideTables { 110 int32_t* pStrideDecBlockOffset[MAX_DEPENDENCY_LAYER][2]; // [iDid][tid==0][24 x 4]: luma+chroma= 24 x 4 111 int32_t* pStrideEncBlockOffset[MAX_DEPENDENCY_LAYER]; // [iDid][24 x 4]: luma+chroma= 24 x 4 112 int16_t* pMbIndexX[MAX_DEPENDENCY_LAYER]; // [iDid][iMbX]: map for iMbX in each spatial layer coding 113 int16_t* pMbIndexY[MAX_DEPENDENCY_LAYER]; // [iDid][iMbY]: map for iMbY in each spatial layer coding 114 } SStrideTables; 115 116 typedef struct TagWelsEncCtx { 117 SLogContext sLogCtx; 118 // Input 119 SWelsSvcCodingParam* pSvcParam; // SVC parameter, WelsSVCParamConfig in svc_param_settings.h 120 121 int32_t* pSadCostMb; 122 /* MVD cost tables for Inter MB */ 123 int32_t iMvRange; 124 uint16_t* pMvdCostTable; //[52]; // adaptive to spatial layers 125 int32_t iMvdCostTableSize; //the size of above table 126 int32_t iMvdCostTableStride; //the stride of above table 127 SMVUnitXY* 128 pMvUnitBlock4x4; // (*pMvUnitBlock4x4[2])[MB_BLOCK4x4_NUM]; // for store each 4x4 blocks' mv unit, the two swap after different d layer 129 int8_t* 130 pRefIndexBlock4x4; // (*pRefIndexBlock4x4[2])[MB_BLOCK8x8_NUM]; // for store each 4x4 blocks' pRef index, the two swap after different d layer 131 int8_t* pNonZeroCountBlocks; // (*pNonZeroCountBlocks)[MB_LUMA_CHROMA_BLOCK4x4_NUM]; 132 int8_t* 133 pIntra4x4PredModeBlocks; // (*pIntra4x4PredModeBlocks)[INTRA_4x4_MODE_NUM]; //last byte is not used; the first 4 byte is for the bottom 12,13,14,15 4x4 block intra mode, and 3 byte for (3,7,11) 134 135 SMB** ppMbListD; // [MAX_DEPENDENCY_LAYER]; 136 SStrideTables* pStrideTab; // stride tables for internal coding used 137 SWelsFuncPtrList* pFuncList; 138 139 SSliceThreading* pSliceThreading; 140 IWelsTaskManage* pTaskManage; //was planning to put it under CWelsH264SVCEncoder but it may be updated (lock/no lock) when param is changed 141 IWelsReferenceStrategy* pReferenceStrategy; 142 143 // pointers 144 SPicture* pEncPic; // pointer to current picture to be encoded 145 SPicture* pDecPic; // pointer to current picture being reconstructed 146 SPicture* pRefPic; // pointer to current reference picture 147 148 SDqLayer* pCurDqLayer; // DQ layer context used to being encoded currently, for reference base layer to refer: pCurDqLayer->pRefLayer if applicable 149 SDqLayer** ppDqLayerList; // overall DQ layers encoded for storage 150 151 SRefList** ppRefPicListExt; // reference picture list for SVC 152 SPicture* pRefList0[16]; 153 SLTRState* pLtr;//[MAX_DEPENDENCY_LAYER]; 154 bool bCurFrameMarkedAsSceneLtr; 155 // Derived 156 157 EWelsSliceType eSliceType; // currently coding slice type 158 EWelsNalUnitType eNalType; // NAL type 159 EWelsNalRefIdc eNalPriority; // NAL_Reference_Idc currently 160 EWelsNalRefIdc eLastNalPriority[MAX_DEPENDENCY_LAYER]; // NAL_Reference_Idc in last frame 161 uint8_t iNumRef0; 162 163 uint8_t uiDependencyId; // Idc of dependecy layer to be coded 164 uint8_t uiTemporalId; // Idc of temporal layer to be coded 165 bool bNeedPrefixNalFlag; // whether add prefix nal 166 167 // Rate control routine 168 SWelsSvcRc* pWelsSvcRc; 169 bool bCheckWindowStatusRefreshFlag; 170 int64_t iCheckWindowStartTs; 171 int64_t iCheckWindowCurrentTs; 172 int32_t iCheckWindowInterval; 173 int32_t iCheckWindowIntervalShift; 174 bool bCheckWindowShiftResetFlag; 175 int32_t iGlobalQp; // global qp 176 177 // VAA 178 SVAAFrameInfo* pVaa; // VAA information of reference 179 CWelsPreProcess* pVpp; 180 181 SWelsSPS* pSpsArray; // MAX_SPS_COUNT by standard compatible 182 SWelsSPS* pSps; 183 SWelsPPS* pPPSArray; // MAX_PPS_COUNT by standard compatible 184 SWelsPPS* pPps; 185 /* SVC only */ 186 SSubsetSps* pSubsetArray; // MAX_SPS_COUNT by standard compatible 187 SSubsetSps* pSubsetSps; 188 int32_t iSpsNum; // number of pSps used 189 int32_t iSubsetSpsNum; // number of pSps used 190 int32_t iPpsNum; // number of pPps used 191 192 // Output 193 SWelsEncoderOutput* pOut; // for NAL raw pData (need allocating memory for sNalList internal) 194 uint8_t* pFrameBs; // restoring bitstream pBuffer of all NALs in a frame 195 int32_t iFrameBsSize; // count size of frame bs in bytes allocated 196 int32_t iPosBsBuffer; // current writing position of frame bs pBuffer 197 198 SSpatialPicIndex sSpatialIndexMap[MAX_DEPENDENCY_LAYER]; 199 int32_t iSliceBufferSize[MAX_DEPENDENCY_LAYER]; 200 201 bool bRefOfCurTidIsLtr[MAX_DEPENDENCY_LAYER][MAX_TEMPORAL_LEVEL]; 202 // uint16_t uiIdrPicId; // IDR picture id: [0, 65535], this one is used for LTR 203 int32_t iMaxSliceCount;// maximal count number of slices for all layers observation 204 int16_t iActiveThreadsNum; // number of threads active so far 205 206 /* 207 * DQ layer idc map for svc encoding, might be a better scheme than that of design before, 208 * can aware idc of referencing layer and that idc of successive layer to be coded 209 */ 210 /* SVC only */ 211 SDqIdc* pDqIdcMap; // overall DQ map of full scalability in specific frame (All full D/T/Q layers involved) // pDqIdcMap[dq_index] for each SDqIdc pData 212 213 SParaSetOffset sPSOVector; 214 SParaSetOffset* pPSOVector; 215 CMemoryAlign* pMemAlign; 216 217 #if defined(STAT_OUTPUT) 218 // overall stat pData, refer to SStatData in stat.h, in case avc to use stat[0][0] 219 SStatData sStatData [ MAX_DEPENDENCY_LAYER ] [ MAX_QUALITY_LEVEL ]; 220 SStatSliceInfo sPerInfo; 221 #endif//STAT_OUTPUT 222 223 //related to Statistics 224 int64_t uiStartTimestamp; 225 SEncoderStatistics sEncoderStatistics[MAX_DEPENDENCY_LAYER]; 226 int32_t iStatisticsLogInterval; 227 int64_t iLastStatisticsLogTs; 228 229 int32_t iEncoderError; 230 WELS_MUTEX mutexEncoderError; 231 bool bDeliveryFlag; 232 SStateCtx sWelsCabacContexts[4][WELS_QP_MAX + 1][WELS_CONTEXT_COUNT]; 233 #ifdef ENABLE_FRAME_DUMP 234 bool bDependencyRecFlag[MAX_DEPENDENCY_LAYER]; 235 #endif 236 int64_t uiLastTimestamp; 237 uint8_t* pDynamicBsBuffer[MAX_THREADS_NUM]; 238 } sWelsEncCtx/*, *PWelsEncCtx*/; 239 } 240 #endif//sWelsEncCtx_H__ 241