shithub: openh264

Download patch

ref: 5a1aedb622fa15f0d6fb9fbf8306e7cf9312972a
parent: 2da0ce64519c6648d6d4d28c8d7ee35b86fa138a
parent: 153dd0d3f505b68cd15c3ca8fdad132237da44c4
author: sijchen <sijchen@cisco.com>
date: Tue Mar 3 06:01:46 EST 2015

Merge pull request #1827 from dongzha/cleanlog

modify decoder log

--- a/codec/api/svc/codec_app_def.h
+++ b/codec/api/svc/codec_app_def.h
@@ -659,7 +659,12 @@
   uiFreezingIDRNum;               ///< number of freezing IDR with error (partly received), under resolution change
   unsigned int uiFreezingNonIDRNum;            ///< number of freezing non-IDR with error
   int iAvgLumaQp;                              ///< average luma QP. default: -1, no correct frame outputted
-
+  int iSpsReportErrorNum;             ///< number of Sps Invalid report
+  int iSubSpsReportErrorNum;          ///< number of SubSps Invalid report
+  int iPpsReportErrorNum;             ///< number of Pps Invalid report
+  int			iSpsNoExistNalNum;          ///< number of Sps NoExist Nal
+  int			iSubSpsNoExistNalNum;       ///< number of SubSps NoExist Nal
+  int			iPpsNoExistNalNum;          ///< number of Pps NoExist Nal
 } SDecoderStatistics; // in building, coming soon
 
 #endif//WELS_VIDEO_CODEC_APPLICATION_DEFINITION_H__
--- a/codec/decoder/core/inc/decoder_context.h
+++ b/codec/decoder/core/inc/decoder_context.h
@@ -66,16 +66,15 @@
 typedef struct SWels_Cabac_Element {
   uint8_t uiState;
   uint8_t uiMPS;
-}SWelsCabacCtx, *PWelsCabacCtx;
+} SWelsCabacCtx, *PWelsCabacCtx;
 
-typedef struct
-{
+typedef struct {
   uint64_t uiRange;
   uint64_t uiOffset;
   int32_t iBitsLeft;
-  uint8_t *pBuffStart;
-  uint8_t *pBuffCurr;
-  uint8_t *pBuffEnd;
+  uint8_t* pBuffStart;
+  uint8_t* pBuffCurr;
+  uint8_t* pBuffEnd;
 } SWelsCabacDecEngine, *PWelsCabacDecEngine;
 
 #define NEW_CTX_OFFSET_MB_TYPE_I 3
@@ -96,11 +95,11 @@
 #define CTX_NUM_CBP 4
 
 typedef struct TagDataBuffer {
-uint8_t* pHead;
-uint8_t* pEnd;
+  uint8_t* pHead;
+  uint8_t* pEnd;
 
-uint8_t* pStartPos;
-uint8_t* pCurPos;
+  uint8_t* pStartPos;
+  uint8_t* pCurPos;
 } SDataBuffer;
 
 //limit size for SPS PPS total permitted size for parse_only
@@ -134,19 +133,19 @@
 
 /**/
 typedef struct TagRefPic {
-PPicture			pRefList[LIST_A][MAX_REF_PIC_COUNT];	// reference picture marking plus FIFO scheme
-PPicture			pShortRefList[LIST_A][MAX_SHORT_REF_COUNT];
-PPicture			pLongRefList[LIST_A][MAX_LONG_REF_COUNT];
-uint8_t				uiRefCount[LIST_A];
-uint8_t				uiShortRefCount[LIST_A];
-uint8_t				uiLongRefCount[LIST_A];	// dependend on ref pic module
-int32_t				iMaxLongTermFrameIdx;
+  PPicture			pRefList[LIST_A][MAX_REF_PIC_COUNT];	// reference picture marking plus FIFO scheme
+  PPicture			pShortRefList[LIST_A][MAX_SHORT_REF_COUNT];
+  PPicture			pLongRefList[LIST_A][MAX_LONG_REF_COUNT];
+  uint8_t				uiRefCount[LIST_A];
+  uint8_t				uiShortRefCount[LIST_A];
+  uint8_t				uiLongRefCount[LIST_A];	// dependend on ref pic module
+  int32_t				iMaxLongTermFrameIdx;
 } SRefPic, *PRefPic;
 
 typedef void (*PCopyFunc) (uint8_t* pDst, int32_t iStrideD, uint8_t* pSrc, int32_t iStrideS);
 typedef struct TagCopyFunc {
-PCopyFunc pCopyLumaFunc;
-PCopyFunc pCopyChromaFunc;
+  PCopyFunc pCopyLumaFunc;
+  PCopyFunc pCopyChromaFunc;
 } SCopyFunc;
 
 //deblock module defination
@@ -153,14 +152,14 @@
 struct TagDeblockingFunc;
 
 typedef struct tagDeblockingFilter {
-uint8_t*	pCsData[3];	// pointer to reconstructed picture data
-int32_t	iCsStride[2];	// Cs stride
-EWelsSliceType  eSliceType;
-int8_t	iSliceAlphaC0Offset;
-int8_t	iSliceBetaOffset;
-int8_t  iChromaQP[2];
-int8_t  iLumaQP;
-struct TagDeblockingFunc*  pLoopf;
+  uint8_t*	pCsData[3];	// pointer to reconstructed picture data
+  int32_t	iCsStride[2];	// Cs stride
+  EWelsSliceType  eSliceType;
+  int8_t	iSliceAlphaC0Offset;
+  int8_t	iSliceBetaOffset;
+  int8_t  iChromaQP[2];
+  int8_t  iLumaQP;
+  struct TagDeblockingFunc*  pLoopf;
 } SDeblockingFilter, *PDeblockingFilter;
 
 typedef void (*PDeblockingFilterMbFunc) (PDqLayer pCurDqLayer, PDeblockingFilter  filter, int32_t boundry_flag);
@@ -171,35 +170,35 @@
     int32_t iBeta, int8_t* iTc);
 typedef void (*PChromaDeblockingEQ4Func) (uint8_t* iSampleCb, uint8_t* iSampleCr, int32_t iStride, int32_t iAlpha,
     int32_t iBeta);
-    typedef void (*PChromaDeblockingLT4Func2) (uint8_t* iSampleCbr,int32_t iStride, int32_t iAlpha,
-    int32_t iBeta,int8_t* iTc);
-    typedef void (*PChromaDeblockingEQ4Func2) (uint8_t* iSampleCbr,int32_t iStride, int32_t iAlpha,
+typedef void (*PChromaDeblockingLT4Func2) (uint8_t* iSampleCbr, int32_t iStride, int32_t iAlpha,
+    int32_t iBeta, int8_t* iTc);
+typedef void (*PChromaDeblockingEQ4Func2) (uint8_t* iSampleCbr, int32_t iStride, int32_t iAlpha,
     int32_t iBeta);
 
 typedef struct TagDeblockingFunc {
-PLumaDeblockingLT4Func    pfLumaDeblockingLT4Ver;
-PLumaDeblockingEQ4Func    pfLumaDeblockingEQ4Ver;
-PLumaDeblockingLT4Func    pfLumaDeblockingLT4Hor;
-PLumaDeblockingEQ4Func    pfLumaDeblockingEQ4Hor;
+  PLumaDeblockingLT4Func    pfLumaDeblockingLT4Ver;
+  PLumaDeblockingEQ4Func    pfLumaDeblockingEQ4Ver;
+  PLumaDeblockingLT4Func    pfLumaDeblockingLT4Hor;
+  PLumaDeblockingEQ4Func    pfLumaDeblockingEQ4Hor;
 
-PChromaDeblockingLT4Func  pfChromaDeblockingLT4Ver;
-PChromaDeblockingEQ4Func  pfChromaDeblockingEQ4Ver;
-PChromaDeblockingLT4Func  pfChromaDeblockingLT4Hor;
-PChromaDeblockingEQ4Func  pfChromaDeblockingEQ4Hor;
+  PChromaDeblockingLT4Func  pfChromaDeblockingLT4Ver;
+  PChromaDeblockingEQ4Func  pfChromaDeblockingEQ4Ver;
+  PChromaDeblockingLT4Func  pfChromaDeblockingLT4Hor;
+  PChromaDeblockingEQ4Func  pfChromaDeblockingEQ4Hor;
 
-PChromaDeblockingLT4Func2  pfChromaDeblockingLT4Ver2;
-PChromaDeblockingEQ4Func2  pfChromaDeblockingEQ4Ver2;
-PChromaDeblockingLT4Func2  pfChromaDeblockingLT4Hor2;
-PChromaDeblockingEQ4Func2  pfChromaDeblockingEQ4Hor2; 
+  PChromaDeblockingLT4Func2  pfChromaDeblockingLT4Ver2;
+  PChromaDeblockingEQ4Func2  pfChromaDeblockingEQ4Ver2;
+  PChromaDeblockingLT4Func2  pfChromaDeblockingLT4Hor2;
+  PChromaDeblockingEQ4Func2  pfChromaDeblockingEQ4Hor2;
 
 } SDeblockingFunc, *PDeblockingFunc;
 
 typedef void (*PWelsNonZeroCountFunc) (int8_t* pNonZeroCount);
-typedef void (*PWelsBlockZeroFunc) (int16_t* block,int32_t stride);
+typedef void (*PWelsBlockZeroFunc) (int16_t* block, int32_t stride);
 typedef  struct  TagBlockFunc {
-PWelsNonZeroCountFunc		pWelsSetNonZeroCountFunc;
-PWelsBlockZeroFunc			pWelsBlockZero16x16Func;
-PWelsBlockZeroFunc			pWelsBlockZero8x8Func;
+  PWelsNonZeroCountFunc		pWelsSetNonZeroCountFunc;
+  PWelsBlockZeroFunc			pWelsBlockZero16x16Func;
+  PWelsBlockZeroFunc			pWelsBlockZero8x8Func;
 } SBlockFunc;
 
 typedef void (*PWelsFillNeighborMbInfoIntra4x4Func) (PWelsNeighAvail pNeighAvail, uint8_t* pNonZeroCount,
@@ -211,10 +210,10 @@
 typedef int32_t (*PWelsParseIntra16x16ModeFunc) (PWelsNeighAvail pNeighAvail, PBitStringAux pBs, PDqLayer pCurDqLayer);
 
 enum {
-OVERWRITE_NONE = 0,
-OVERWRITE_PPS = 1,
-OVERWRITE_SPS = 1 << 1,
-OVERWRITE_SUBSETSPS = 1 << 2
+  OVERWRITE_NONE = 0,
+  OVERWRITE_PPS = 1,
+  OVERWRITE_SPS = 1 << 1,
+  OVERWRITE_SUBSETSPS = 1 << 2
 };
 
 /*
@@ -222,210 +221,221 @@
  */
 
 typedef struct TagWelsDecoderContext {
-SLogContext sLogCtx;
+  SLogContext sLogCtx;
 // Input
-void*				pArgDec;			// structured arguments for decoder, reserved here for extension in the future
+  void*				pArgDec;			// structured arguments for decoder, reserved here for extension in the future
 
-SDataBuffer                     sRawData;
-SDataBuffer                     sSavedData; //for parse only purpose
+  SDataBuffer                     sRawData;
+  SDataBuffer                     sSavedData; //for parse only purpose
 
 // Configuration
-SDecodingParam*                 pParam;
-uint32_t			uiCpuFlag;			// CPU compatibility detected
+  SDecodingParam*                 pParam;
+  uint32_t			uiCpuFlag;			// CPU compatibility detected
 
-EVideoFormatType eOutputColorFormat;		// color space format to be outputed
-VIDEO_BITSTREAM_TYPE eVideoType; //indicate the type of video to decide whether or not to do qp_delta error detection.
-bool				bHaveGotMemory;	// global memory for decoder context related ever requested?
+  EVideoFormatType eOutputColorFormat;		// color space format to be outputed
+  VIDEO_BITSTREAM_TYPE eVideoType; //indicate the type of video to decide whether or not to do qp_delta error detection.
+  bool				bHaveGotMemory;	// global memory for decoder context related ever requested?
 
-int32_t				iImgWidthInPixel;	// width of image in pixel reconstruction picture to be output
-int32_t				iImgHeightInPixel;// height of image in pixel reconstruction picture to be output
-int32_t				iLastImgWidthInPixel;	// width of image in last successful pixel reconstruction picture to be output
-int32_t				iLastImgHeightInPixel;// height of image in last successful pixel reconstruction picture to be output
-bool bFreezeOutput; // indicating current frame freezing. Default: true
+  int32_t				iImgWidthInPixel;	// width of image in pixel reconstruction picture to be output
+  int32_t				iImgHeightInPixel;// height of image in pixel reconstruction picture to be output
+  int32_t				iLastImgWidthInPixel;	// width of image in last successful pixel reconstruction picture to be output
+  int32_t				iLastImgHeightInPixel;// height of image in last successful pixel reconstruction picture to be output
+  bool bFreezeOutput; // indicating current frame freezing. Default: true
 
 
 // Derived common elements
-SNalUnitHeader		sCurNalHead;
-EWelsSliceType			eSliceType;			// Slice type
-int32_t				iFrameNum;
-int32_t				iPrevFrameNum;		// frame number of previous frame well decoded for non-truncated mode yet
-bool              bLastHasMmco5;      //
-int32_t				iErrorCode;			// error code return while decoding in case packets lost
-SFmo				sFmoList[MAX_PPS_COUNT];	// list for FMO storage
-PFmo				pFmo;				// current fmo context after parsed slice_header
-int32_t				iActiveFmoNum;		// active count number of fmo context in list
+  SNalUnitHeader		sCurNalHead;
+  EWelsSliceType			eSliceType;			// Slice type
+  int32_t				iFrameNum;
+  int32_t				iPrevFrameNum;		// frame number of previous frame well decoded for non-truncated mode yet
+  bool              bLastHasMmco5;      //
+  int32_t				iErrorCode;			// error code return while decoding in case packets lost
+  SFmo				sFmoList[MAX_PPS_COUNT];	// list for FMO storage
+  PFmo				pFmo;				// current fmo context after parsed slice_header
+  int32_t				iActiveFmoNum;		// active count number of fmo context in list
 
-/*needed info by decode slice level and mb level*/
-int32_t
-iDecBlockOffsetArray[24];	// address talbe for sub 4x4 block in intra4x4_mb, so no need to caculta the address every time.
+  /*needed info by decode slice level and mb level*/
+  int32_t
+  iDecBlockOffsetArray[24];	// address talbe for sub 4x4 block in intra4x4_mb, so no need to caculta the address every time.
 
-struct {
-  int8_t*  pMbType[LAYER_NUM_EXCHANGEABLE];                      /* mb type */
-  int16_t	(*pMv[LAYER_NUM_EXCHANGEABLE][LIST_A])[MB_BLOCK4x4_NUM][MV_A]; //[LAYER_NUM_EXCHANGEABLE   MB_BLOCK4x4_NUM*]
-  int8_t	(*pRefIndex[LAYER_NUM_EXCHANGEABLE][LIST_A])[MB_BLOCK4x4_NUM];
-  int8_t*	pLumaQp[LAYER_NUM_EXCHANGEABLE];	/*mb luma_qp*/
-  int8_t	(*pChromaQp[LAYER_NUM_EXCHANGEABLE])[2];					/*mb chroma_qp*/
-  int16_t	(*pMvd[LAYER_NUM_EXCHANGEABLE][LIST_A])[MB_BLOCK4x4_NUM][MV_A]; //[LAYER_NUM_EXCHANGEABLE   MB_BLOCK4x4_NUM*]
-  uint8_t *pCbfDc[LAYER_NUM_EXCHANGEABLE];
-  int8_t	(*pNzc[LAYER_NUM_EXCHANGEABLE])[24];
-  int8_t	(*pNzcRs[LAYER_NUM_EXCHANGEABLE])[24];
-  int16_t (*pScaledTCoeff[LAYER_NUM_EXCHANGEABLE])[MB_COEFF_LIST_SIZE]; /*need be aligned*/
-  int8_t	(*pIntraPredMode[LAYER_NUM_EXCHANGEABLE])[8]; //0~3 top4x4 ; 4~6 left 4x4; 7 intra16x16
-  int8_t (*pIntra4x4FinalMode[LAYER_NUM_EXCHANGEABLE])[MB_BLOCK4x4_NUM];
-  int8_t*  pChromaPredMode[LAYER_NUM_EXCHANGEABLE];
-  int8_t*  pCbp[LAYER_NUM_EXCHANGEABLE];
-  uint8_t (*pMotionPredFlag[LAYER_NUM_EXCHANGEABLE][LIST_A])[MB_PARTITION_SIZE]; // 8x8
-  int8_t (*pSubMbType[LAYER_NUM_EXCHANGEABLE])[MB_SUB_PARTITION_SIZE];
-  int32_t* pSliceIdc[LAYER_NUM_EXCHANGEABLE];		// using int32_t for slice_idc
-  int8_t*  pResidualPredFlag[LAYER_NUM_EXCHANGEABLE];
-  int8_t*  pInterPredictionDoneFlag[LAYER_NUM_EXCHANGEABLE];
-  bool*    pMbCorrectlyDecodedFlag[LAYER_NUM_EXCHANGEABLE];
-  bool*    pMbRefConcealedFlag[LAYER_NUM_EXCHANGEABLE];
-  uint32_t iMbWidth;
-  uint32_t iMbHeight;
-} sMb;
+  struct {
+    int8_t*  pMbType[LAYER_NUM_EXCHANGEABLE];                      /* mb type */
+    int16_t	(*pMv[LAYER_NUM_EXCHANGEABLE][LIST_A])[MB_BLOCK4x4_NUM][MV_A]; //[LAYER_NUM_EXCHANGEABLE   MB_BLOCK4x4_NUM*]
+    int8_t	(*pRefIndex[LAYER_NUM_EXCHANGEABLE][LIST_A])[MB_BLOCK4x4_NUM];
+    int8_t*	pLumaQp[LAYER_NUM_EXCHANGEABLE];	/*mb luma_qp*/
+    int8_t	(*pChromaQp[LAYER_NUM_EXCHANGEABLE])[2];					/*mb chroma_qp*/
+    int16_t	(*pMvd[LAYER_NUM_EXCHANGEABLE][LIST_A])[MB_BLOCK4x4_NUM][MV_A]; //[LAYER_NUM_EXCHANGEABLE   MB_BLOCK4x4_NUM*]
+    uint8_t* pCbfDc[LAYER_NUM_EXCHANGEABLE];
+    int8_t	(*pNzc[LAYER_NUM_EXCHANGEABLE])[24];
+    int8_t	(*pNzcRs[LAYER_NUM_EXCHANGEABLE])[24];
+    int16_t (*pScaledTCoeff[LAYER_NUM_EXCHANGEABLE])[MB_COEFF_LIST_SIZE]; /*need be aligned*/
+    int8_t	(*pIntraPredMode[LAYER_NUM_EXCHANGEABLE])[8]; //0~3 top4x4 ; 4~6 left 4x4; 7 intra16x16
+    int8_t (*pIntra4x4FinalMode[LAYER_NUM_EXCHANGEABLE])[MB_BLOCK4x4_NUM];
+    int8_t*  pChromaPredMode[LAYER_NUM_EXCHANGEABLE];
+    int8_t*  pCbp[LAYER_NUM_EXCHANGEABLE];
+    uint8_t (*pMotionPredFlag[LAYER_NUM_EXCHANGEABLE][LIST_A])[MB_PARTITION_SIZE]; // 8x8
+    int8_t (*pSubMbType[LAYER_NUM_EXCHANGEABLE])[MB_SUB_PARTITION_SIZE];
+    int32_t* pSliceIdc[LAYER_NUM_EXCHANGEABLE];		// using int32_t for slice_idc
+    int8_t*  pResidualPredFlag[LAYER_NUM_EXCHANGEABLE];
+    int8_t*  pInterPredictionDoneFlag[LAYER_NUM_EXCHANGEABLE];
+    bool*    pMbCorrectlyDecodedFlag[LAYER_NUM_EXCHANGEABLE];
+    bool*    pMbRefConcealedFlag[LAYER_NUM_EXCHANGEABLE];
+    uint32_t iMbWidth;
+    uint32_t iMbHeight;
+  } sMb;
 
 
 // reconstruction picture
-PPicture			pDec;			//pointer to current picture being reconstructed
+  PPicture			pDec;			//pointer to current picture being reconstructed
 
 // reference pictures
-SRefPic				sRefPic;
+  SRefPic				sRefPic;
 
-SVlcTable			sVlcTable;		 // vlc table
+  SVlcTable			sVlcTable;		 // vlc table
 
-SBitStringAux		sBs;
-int32_t iMaxBsBufferSizeInByte; //actual memory size for BS buffer
+  SBitStringAux		sBs;
+  int32_t iMaxBsBufferSizeInByte; //actual memory size for BS buffer
 
-/* Global memory external */
+  /* Global memory external */
 
-SPosOffset	sFrameCrop;
+  SPosOffset	sFrameCrop;
 
-SSps				sSpsBuffer[MAX_SPS_COUNT + 1];
-SPps				sPpsBuffer[MAX_PPS_COUNT + 1];
-PSliceHeader		pSliceHeader;
+  SSps				sSpsBuffer[MAX_SPS_COUNT + 1];
+  SPps				sPpsBuffer[MAX_PPS_COUNT + 1];
+  PSliceHeader		pSliceHeader;
 
-PPicBuff	        pPicBuff[LIST_A];	// Initially allocated memory for pictures which are used in decoding.
-int32_t				iPicQueueNumber;
+  PPicBuff	        pPicBuff[LIST_A];	// Initially allocated memory for pictures which are used in decoding.
+  int32_t				iPicQueueNumber;
 
-SSubsetSps			sSubsetSpsBuffer[MAX_SPS_COUNT + 1];
-SNalUnit            sPrefixNal;
+  SSubsetSps			sSubsetSpsBuffer[MAX_SPS_COUNT + 1];
+  SNalUnit            sPrefixNal;
 
-PAccessUnit			pAccessUnitList;	// current access unit list to be performed
-PSps        pActiveLayerSps[MAX_LAYER_NUM];
-PSps				pSps;	// used by current AU
-PPps				pPps;	// used by current AU
+  PAccessUnit			pAccessUnitList;	// current access unit list to be performed
+  PSps        pActiveLayerSps[MAX_LAYER_NUM];
+  PSps				pSps;	// used by current AU
+  PPps				pPps;	// used by current AU
 // Memory for pAccessUnitList is dynamically held till decoder destruction.
-PDqLayer			pCurDqLayer;		// current DQ layer representation, also carry reference base layer if applicable
-PDqLayer			pDqLayersList[LAYER_NUM_EXCHANGEABLE];	// DQ layers list with memory allocated
+  PDqLayer			pCurDqLayer;		// current DQ layer representation, also carry reference base layer if applicable
+  PDqLayer			pDqLayersList[LAYER_NUM_EXCHANGEABLE];	// DQ layers list with memory allocated
 
-int32_t             iPicWidthReq;		// picture width have requested the memory
-int32_t             iPicHeightReq;		// picture height have requested the memory
+  int32_t             iPicWidthReq;		// picture width have requested the memory
+  int32_t             iPicHeightReq;		// picture height have requested the memory
 
-uint8_t				uiTargetDqId;		// maximal DQ ID in current access unit, meaning target layer ID
-bool				bAvcBasedFlag;		// For decoding bitstream:
-bool				bEndOfStreamFlag;	// Flag on end of stream requested by external application layer
-bool                          bInstantDecFlag;        // Flag for no-delay decoding
-bool				bInitialDqLayersMem;	// dq layers related memory is available?
+  uint8_t				uiTargetDqId;		// maximal DQ ID in current access unit, meaning target layer ID
+  bool				bAvcBasedFlag;		// For decoding bitstream:
+  bool				bEndOfStreamFlag;	// Flag on end of stream requested by external application layer
+  bool                          bInstantDecFlag;        // Flag for no-delay decoding
+  bool				bInitialDqLayersMem;	// dq layers related memory is available?
 
-bool              bOnlyOneLayerInCurAuFlag; //only one layer in current AU: 1
+  bool              bOnlyOneLayerInCurAuFlag; //only one layer in current AU: 1
 
 // for EC parameter sets
-bool				bSpsExistAheadFlag;	// whether does SPS NAL exist ahead of sequence?
-bool				bSubspsExistAheadFlag;// whether does Subset SPS NAL exist ahead of sequence?
-bool				bPpsExistAheadFlag;	// whether does PPS NAL exist ahead of sequence?
+  bool				bSpsExistAheadFlag;	// whether does SPS NAL exist ahead of sequence?
+  bool				bSubspsExistAheadFlag;// whether does Subset SPS NAL exist ahead of sequence?
+  bool				bPpsExistAheadFlag;	// whether does PPS NAL exist ahead of sequence?
 
-bool				bSpsAvailFlags[MAX_SPS_COUNT];
-bool				bSubspsAvailFlags[MAX_SPS_COUNT];
-bool				bPpsAvailFlags[MAX_PPS_COUNT];
-bool				bReferenceLostAtT0Flag;
-int32_t     iTotalNumMbRec; //record current number of decoded MB
+  int32_t			iSpsErrorIgnored;
+  int32_t			iSubSpsErrorIgnored;
+  int32_t			iPpsErrorIgnored;
+
+  bool				bSpsAvailFlags[MAX_SPS_COUNT];
+  bool				bSubspsAvailFlags[MAX_SPS_COUNT];
+  bool				bPpsAvailFlags[MAX_PPS_COUNT];
+  int32_t     iPPSLastInvalidId;
+  int32_t     iPPSInvalidNum;
+  int32_t     iSPSLastInvalidId;
+  int32_t     iSPSInvalidNum;
+  int32_t     iSubSPSLastInvalidId;
+  int32_t     iSubSPSInvalidNum;
+
+  bool				bReferenceLostAtT0Flag;
+  int32_t     iTotalNumMbRec; //record current number of decoded MB
 #ifdef LONG_TERM_REF
-bool				bParamSetsLostFlag;	//sps or pps do not exist or not correct
+  bool				bParamSetsLostFlag;	//sps or pps do not exist or not correct
 
-bool
-bCurAuContainLtrMarkSeFlag; //current AU has the LTR marking syntax element, mark the previous frame or self
-int32_t             iFrameNumOfAuMarkedLtr; //if bCurAuContainLtrMarkSeFlag==true, SHOULD set this variable
+  bool
+  bCurAuContainLtrMarkSeFlag; //current AU has the LTR marking syntax element, mark the previous frame or self
+  int32_t             iFrameNumOfAuMarkedLtr; //if bCurAuContainLtrMarkSeFlag==true, SHOULD set this variable
 
-uint16_t            uiCurIdrPicId;
+  uint16_t            uiCurIdrPicId;
 #endif
-bool       bNewSeqBegin;
-bool       bNextNewSeqBegin;
-int        iOverwriteFlags;
-ERROR_CON_IDC eErrorConMethod; //
+  bool       bNewSeqBegin;
+  bool       bNextNewSeqBegin;
+  int        iOverwriteFlags;
+  ERROR_CON_IDC eErrorConMethod; //
 
 //for Parse only
-bool bParseOnly;
-SSpsBsInfo sSpsBsInfo [MAX_SPS_COUNT];
-SSpsBsInfo sSubsetSpsBsInfo [MAX_PPS_COUNT];
-SPpsBsInfo sPpsBsInfo [MAX_PPS_COUNT];
-SParserBsInfo* pParserBsInfo;
+  bool bParseOnly;
+  SSpsBsInfo sSpsBsInfo [MAX_SPS_COUNT];
+  SSpsBsInfo sSubsetSpsBsInfo [MAX_PPS_COUNT];
+  SPpsBsInfo sPpsBsInfo [MAX_PPS_COUNT];
+  SParserBsInfo* pParserBsInfo;
 
-PPicture pPreviousDecodedPictureInDpb; //pointer to previously decoded picture in DPB for error concealment
-PGetIntraPredFunc pGetI16x16LumaPredFunc[7];		//h264_predict_copy_16x16;
-PGetIntraPredFunc pGetI4x4LumaPredFunc[14];		// h264_predict_4x4_t
-PGetIntraPredFunc pGetIChromaPredFunc[7];		// h264_predict_8x8_t
-PIdctResAddPredFunc	pIdctResAddPredFunc;
-SMcFunc				sMcFunc;
+  PPicture pPreviousDecodedPictureInDpb; //pointer to previously decoded picture in DPB for error concealment
+  PGetIntraPredFunc pGetI16x16LumaPredFunc[7];		//h264_predict_copy_16x16;
+  PGetIntraPredFunc pGetI4x4LumaPredFunc[14];		// h264_predict_4x4_t
+  PGetIntraPredFunc pGetIChromaPredFunc[7];		// h264_predict_8x8_t
+  PIdctResAddPredFunc	pIdctResAddPredFunc;
+  SMcFunc				sMcFunc;
 
 //For error concealment
-SCopyFunc sCopyFunc;
-/* For Deblocking */
-SDeblockingFunc     sDeblockingFunc;
-SExpandPicFunc	    sExpandPicFunc;
+  SCopyFunc sCopyFunc;
+  /* For Deblocking */
+  SDeblockingFunc     sDeblockingFunc;
+  SExpandPicFunc	    sExpandPicFunc;
 
-/* For Block */
-SBlockFunc          sBlockFunc;
+  /* For Block */
+  SBlockFunc          sBlockFunc;
 
-int32_t iCurSeqIntervalTargetDependId;
-int32_t iCurSeqIntervalMaxPicWidth;
-int32_t iCurSeqIntervalMaxPicHeight;
+  int32_t iCurSeqIntervalTargetDependId;
+  int32_t iCurSeqIntervalMaxPicWidth;
+  int32_t iCurSeqIntervalMaxPicHeight;
 
-PWelsFillNeighborMbInfoIntra4x4Func  pFillInfoCacheIntra4x4Func;
-PWelsMapNeighToSample pMap4x4NeighToSampleFunc;
-PWelsMap16NeighToSample pMap16x16NeighToSampleFunc;
+  PWelsFillNeighborMbInfoIntra4x4Func  pFillInfoCacheIntra4x4Func;
+  PWelsMapNeighToSample pMap4x4NeighToSampleFunc;
+  PWelsMap16NeighToSample pMap16x16NeighToSampleFunc;
 
 //feedback whether or not have VCL in current AU, and the temporal ID
-int32_t iFeedbackVclNalInAu;
-int32_t iFeedbackTidInAu;
+  int32_t iFeedbackVclNalInAu;
+  int32_t iFeedbackTidInAu;
 
-bool bAuReadyFlag;   // true: one au is ready for decoding; false: default value
+  bool bAuReadyFlag;   // true: one au is ready for decoding; false: default value
 
-bool bPrintFrameErrorTraceFlag; //true: can print info for upper layer
-int32_t iIgnoredErrorInfoPacketCount; //store the packet number with error decoding info
+  bool bPrintFrameErrorTraceFlag; //true: can print info for upper layer
+  int32_t iIgnoredErrorInfoPacketCount; //store the packet number with error decoding info
 //trace handle
-void*      pTraceHandle;
+  void*      pTraceHandle;
 
 //Save the last nal header info
-SNalUnitHeaderExt sLastNalHdrExt;
-SSliceHeader      sLastSliceHeader;
-SWelsCabacCtx sWelsCabacContexts[4][WELS_QP_MAX + 1][WELS_CONTEXT_COUNT];
-bool bCabacInited;
-SWelsCabacCtx   pCabacCtx[WELS_CONTEXT_COUNT];
-PWelsCabacDecEngine   pCabacDecEngine;
-double dDecTime;
-SDecoderStatistics sDecoderStatistics;// For real time debugging
-int32_t iMbEcedNum;
-int32_t iMbEcedPropNum;
-int32_t iMbNum;
-bool bMbRefConcealed;
-bool bRPLRError;
-int32_t iECMVs[16][2];
-PPicture pECRefPic[16];
-unsigned long long uiTimeStamp;
+  SNalUnitHeaderExt sLastNalHdrExt;
+  SSliceHeader      sLastSliceHeader;
+  SWelsCabacCtx sWelsCabacContexts[4][WELS_QP_MAX + 1][WELS_CONTEXT_COUNT];
+  bool bCabacInited;
+  SWelsCabacCtx   pCabacCtx[WELS_CONTEXT_COUNT];
+  PWelsCabacDecEngine   pCabacDecEngine;
+  double dDecTime;
+  SDecoderStatistics sDecoderStatistics;// For real time debugging
+  int32_t iMbEcedNum;
+  int32_t iMbEcedPropNum;
+  int32_t iMbNum;
+  bool bMbRefConcealed;
+  bool bRPLRError;
+  int32_t iECMVs[16][2];
+  PPicture pECRefPic[16];
+  unsigned long long uiTimeStamp;
 // To support scaling list HP
-uint16_t  pDequant_coeff_buffer4x4[6][52][16];
-uint16_t  pDequant_coeff_buffer8x8[6][52][64];
-uint16_t (*pDequant_coeff4x4[6])[16];// 4x4 sclaing list value pointer
-uint16_t (*pDequant_coeff8x8[6])[64];//64 residual coeff ,with 6 kinds of residual type, 52 qp level
-int iDequantCoeffPpsid;//When a new pps actived, reinitialised the scaling list value
-bool bDequantCoeff4x4Init;
-bool bSpsLatePps;
-bool bUseScalingList;
+  uint16_t  pDequant_coeff_buffer4x4[6][52][16];
+  uint16_t  pDequant_coeff_buffer8x8[6][52][64];
+  uint16_t (*pDequant_coeff4x4[6])[16];// 4x4 sclaing list value pointer
+  uint16_t (*pDequant_coeff8x8[6])[64];//64 residual coeff ,with 6 kinds of residual type, 52 qp level
+  int iDequantCoeffPpsid;//When a new pps actived, reinitialised the scaling list value
+  bool bDequantCoeff4x4Init;
+  bool bSpsLatePps;
+  bool bUseScalingList;
 } SWelsDecoderContext, *PWelsDecoderContext;
 
 static inline void ResetActiveSPSForEachLayer (PWelsDecoderContext pCtx) {
-  if ( pCtx->iTotalNumMbRec == 0 ) {
+  if (pCtx->iTotalNumMbRec == 0) {
     for (int i = 0; i < MAX_LAYER_NUM; i++) {
       pCtx->pActiveLayerSps[i] = NULL;
     }
--- a/codec/decoder/core/inc/wels_const.h
+++ b/codec/decoder/core/inc/wels_const.h
@@ -77,11 +77,10 @@
 #define MAX_BUFFERED_NUM 3 //mamixum stored number of AU|packet to prevent overwrite
 #define MAX_ACCESS_UNIT_CAPACITY 7077888 //Maximum AU size in bytes for level 5.2 for single frame
 #define MAX_MACROBLOCK_CAPACITY 5000 //Maximal legal MB capacity, 15000 bits is enough
-
 enum {
-    BASE_MB = 0,
-    NON_AVC_REWRITE_ENHANCE_MB =1,
-    AVC_REWRITE_ENHANCE_MB = 2
+  BASE_MB = 0,
+  NON_AVC_REWRITE_ENHANCE_MB = 1,
+  AVC_REWRITE_ENHANCE_MB = 2
 };
 
 #endif//WELS_CONST_H__
--- a/codec/decoder/core/src/au_parser.cpp
+++ b/codec/decoder/core/src/au_parser.cpp
@@ -146,36 +146,47 @@
 
   if (! (IS_SEI_NAL (pNalUnitHeader->eNalUnitType) || IS_SPS_NAL (pNalUnitHeader->eNalUnitType)
          || pCtx->bSpsExistAheadFlag)) {
-    if (pCtx->bPrintFrameErrorTraceFlag) {
+    if (pCtx->bPrintFrameErrorTraceFlag && pCtx->iSpsErrorIgnored == 0) {
       WelsLog (pLogCtx, WELS_LOG_WARNING,
                "parse_nal(), no exist Sequence Parameter Sets ahead of sequence when try to decode NAL(type:%d).",
                pNalUnitHeader->eNalUnitType);
+    } else {
+      pCtx->iSpsErrorIgnored++;
     }
+    pCtx->sDecoderStatistics.iSpsNoExistNalNum++;
     pCtx->iErrorCode	= dsNoParamSets;
     return NULL;
   }
+  pCtx->iSpsErrorIgnored = 0;
   if (! (IS_SEI_NAL (pNalUnitHeader->eNalUnitType) || IS_PARAM_SETS_NALS (pNalUnitHeader->eNalUnitType)
          || pCtx->bPpsExistAheadFlag)) {
-    if (pCtx->bPrintFrameErrorTraceFlag) {
+    if (pCtx->bPrintFrameErrorTraceFlag && pCtx->iPpsErrorIgnored == 0) {
       WelsLog (pLogCtx, WELS_LOG_WARNING,
                "parse_nal(), no exist Picture Parameter Sets ahead of sequence when try to decode NAL(type:%d).",
                pNalUnitHeader->eNalUnitType);
+    } else {
+      pCtx->iPpsErrorIgnored++;
     }
+    pCtx->sDecoderStatistics.iPpsNoExistNalNum++;
     pCtx->iErrorCode	= dsNoParamSets;
     return NULL;
   }
+  pCtx->iPpsErrorIgnored = 0;
   if ((IS_VCL_NAL_AVC_BASE (pNalUnitHeader->eNalUnitType) && ! (pCtx->bSpsExistAheadFlag || pCtx->bPpsExistAheadFlag)) ||
       (IS_NEW_INTRODUCED_SVC_NAL (pNalUnitHeader->eNalUnitType) && ! (pCtx->bSpsExistAheadFlag || pCtx->bSubspsExistAheadFlag
           || pCtx->bPpsExistAheadFlag))) {
-    if (pCtx->bPrintFrameErrorTraceFlag) {
+    if (pCtx->bPrintFrameErrorTraceFlag && pCtx->iSubSpsErrorIgnored == 0) {
       WelsLog (pLogCtx, WELS_LOG_WARNING,
                "ParseNalHeader(), no exist Parameter Sets ahead of sequence when try to decode slice(type:%d).",
                pNalUnitHeader->eNalUnitType);
+    } else {
+      pCtx->iSubSpsErrorIgnored++;
     }
+    pCtx->sDecoderStatistics.iSubSpsNoExistNalNum++;
     pCtx->iErrorCode	|= dsNoParamSets;
     return NULL;
   }
-
+  pCtx->iSubSpsErrorIgnored = 0;
 
   switch (pNalUnitHeader->eNalUnitType) {
   case NAL_UNIT_AU_DELIMITER:
--- a/codec/decoder/core/src/decoder.cpp
+++ b/codec/decoder/core/src/decoder.cpp
@@ -311,7 +311,15 @@
   pCtx->sDecoderStatistics.iAvgLumaQp = -1;
   pCtx->bSpsLatePps = false;
   pCtx->bUseScalingList = false;
-
+  pCtx->iSpsErrorIgnored = 0;
+  pCtx->iSubSpsErrorIgnored = 0;
+  pCtx->iPpsErrorIgnored = 0;
+  pCtx->iPPSInvalidNum = 0;
+  pCtx->iPPSLastInvalidId = -1;
+  pCtx->iSPSInvalidNum = 0;
+  pCtx->iSPSLastInvalidId = -1;
+  pCtx->iSubSPSInvalidNum = 0;
+  pCtx->iSubSPSLastInvalidId = -1;
 }
 
 /*
@@ -993,7 +1001,7 @@
     pDecStat->iAvgLumaQp = iTotalQp;
   } else
     pDecStat->iAvgLumaQp = (int) ((uint64_t) (pDecStat->iAvgLumaQp * pDecStat->uiDecodedFrameCount + iTotalQp) /
-                           (pDecStat->uiDecodedFrameCount + 1));
+                                  (pDecStat->uiDecodedFrameCount + 1));
 
   //update IDR number
   if (pCurDq->sLayerInfo.sNalHeaderExt.bIdrFlag) {
--- a/codec/decoder/core/src/decoder_core.cpp
+++ b/codec/decoder/core/src/decoder_core.cpp
@@ -566,10 +566,19 @@
 
   //add check PPS available here
   if (pCtx->bPpsAvailFlags[iPpsId] == false) {
-    WelsLog (pLogCtx, WELS_LOG_ERROR, "PPS id is invalid!");
+    pCtx->sDecoderStatistics.iPpsReportErrorNum++;
+    if (pCtx->iPPSLastInvalidId != iPpsId) {
+      WelsLog (pLogCtx, WELS_LOG_ERROR, "PPS id (%d) is invalid, previous id (%d) error ignored (%d)!", iPpsId,
+               pCtx->iPPSLastInvalidId, pCtx->iPPSInvalidNum);
+      pCtx->iPPSLastInvalidId = iPpsId;
+      pCtx->iPPSInvalidNum = 0;
+    } else {
+      pCtx->iPPSInvalidNum++;
+    }
     pCtx->iErrorCode |= dsNoParamSets;
     return GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_PPS_ID);
   }
+  pCtx->iPPSLastInvalidId = -1;
 
   pPps    = &pCtx->sPpsBuffer[iPpsId];
 
@@ -583,16 +592,34 @@
     pSubsetSps      = &pCtx->sSubsetSpsBuffer[pPps->iSpsId];
     pSps		= &pSubsetSps->sSps;
     if (pCtx->bSubspsAvailFlags[pPps->iSpsId] == false) {
-      WelsLog (pLogCtx, WELS_LOG_ERROR, "SPS id is invalid!");
+      pCtx->sDecoderStatistics.iSubSpsReportErrorNum++;
+      if (pCtx->iSubSPSLastInvalidId != pPps->iSpsId) {
+        WelsLog (pLogCtx, WELS_LOG_ERROR, "Sub SPS id (%d) is invalid, previous id (%d) error ignored (%d)!", pPps->iSpsId,
+                 pCtx->iSubSPSLastInvalidId, pCtx->iSubSPSInvalidNum);
+        pCtx->iSubSPSLastInvalidId = pPps->iSpsId;
+        pCtx->iSubSPSInvalidNum = 0;
+      } else {
+        pCtx->iSubSPSInvalidNum++;
+      }
       pCtx->iErrorCode |= dsNoParamSets;
       return GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_SPS_ID);
     }
+    pCtx->iSubSPSLastInvalidId = -1;
   } else {
     if (pCtx->bSpsAvailFlags[pPps->iSpsId] == false) {
-      WelsLog (pLogCtx, WELS_LOG_ERROR, "SPS id is invalid!");
+      pCtx->sDecoderStatistics.iSpsReportErrorNum++;
+      if (pCtx->iSPSLastInvalidId != pPps->iSpsId) {
+        WelsLog (pLogCtx, WELS_LOG_ERROR, "SPS id (%d) is invalid, previous id (%d) error ignored (%d)!", pPps->iSpsId,
+                 pCtx->iSPSLastInvalidId, pCtx->iSPSInvalidNum);
+        pCtx->iSPSLastInvalidId = pPps->iSpsId;
+        pCtx->iSPSInvalidNum = 0;
+      } else {
+        pCtx->iSPSInvalidNum++;
+      }
       pCtx->iErrorCode |= dsNoParamSets;
       return GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_SPS_ID);
     }
+    pCtx->iSPSLastInvalidId = -1;
     pSps		= &pCtx->sSpsBuffer[pPps->iSpsId];
   }
   pSliceHead->iPpsId = iPpsId;
@@ -1042,7 +1069,8 @@
                            "pCtx->sMb.pMbType[]");
     pCtx->sMb.pMv[i][0] = (int16_t (*)[16][2])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (
                             int16_t) * MV_A * MB_BLOCK4x4_NUM, "pCtx->sMb.pMv[][]");
-    pCtx->sMb.pRefIndex[i][0] = (int8_t (*)[MB_BLOCK4x4_NUM])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (
+    pCtx->sMb.pRefIndex[i][0] = (int8_t (*)[MB_BLOCK4x4_NUM])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight *
+                                sizeof (
                                   int8_t) * MB_BLOCK4x4_NUM, "pCtx->sMb.pRefIndex[][]");
     pCtx->sMb.pLumaQp[i] = (int8_t*)WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int8_t),
                            "pCtx->sMb.pLumaQp[]");
@@ -1058,7 +1086,8 @@
                           "pCtx->sMb.pNzcRs[]");
     pCtx->sMb.pScaledTCoeff[i] = (int16_t (*)[MB_COEFF_LIST_SIZE])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight *
                                  sizeof (int16_t) * MB_COEFF_LIST_SIZE, "pCtx->sMb.pScaledTCoeff[]");
-    pCtx->sMb.pIntraPredMode[i] = (int8_t (*)[8])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int8_t) * 8,
+    pCtx->sMb.pIntraPredMode[i] = (int8_t (*)[8])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (
+                                    int8_t) * 8,
                                   "pCtx->sMb.pIntraPredMode[]");
     pCtx->sMb.pIntra4x4FinalMode[i] = (int8_t (*)[MB_BLOCK4x4_NUM])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight *
                                       sizeof (int8_t) * MB_BLOCK4x4_NUM, "pCtx->sMb.pIntra4x4FinalMode[]");
@@ -1066,7 +1095,8 @@
                                    "pCtx->sMb.pChromaPredMode[]");
     pCtx->sMb.pCbp[i] = (int8_t*)WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int8_t),
                         "pCtx->sMb.pCbp[]");
-    pCtx->sMb.pSubMbType[i] = (int8_t (*)[MB_PARTITION_SIZE])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (
+    pCtx->sMb.pSubMbType[i] = (int8_t (*)[MB_PARTITION_SIZE])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight *
+                              sizeof (
                                 int8_t) * MB_PARTITION_SIZE, "pCtx->sMb.pSubMbType[]");
     pCtx->sMb.pSliceIdc[i] = (int32_t*) WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int32_t),
                              "pCtx->sMb.pSliceIdc[]");	// using int32_t for slice_idc, 4/21/2010
@@ -2051,7 +2081,7 @@
             pCtx->bRPLRError = true;
             bAllRefComplete = false; // RPLR error, set ref pictures complete flag false
             HandleReferenceLost (pCtx, pNalCur);
-            WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING,
+            WelsLog (& (pCtx->sLogCtx), WELS_LOG_DEBUG,
                      "reference picture introduced by this frame is lost during transmission! uiTId: %d",
                      pNalCur->sNalHeaderExt.uiTemporalId);
             if (pCtx->eErrorConMethod == ERROR_CON_DISABLE) {