⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h264avcdecodertest.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                auiStartPos[uiFragNb+1], 
                auiEndPos[uiFragNb+1], 
                bFragmented, 
                bDiscardable, 
                0,
                &uiNumFragments,
                apucFragBuffers ) );
              }
              else
                  m_pcH264AVCDecoder->initPacket( cBinDataAccessor );
              bDecode = true;
          }
        }
      else {RNOK(m_pcReadBitstream->releasePacket(pcBinDataTmp[uiFragNb])); }//NS leak fix 
      }
  }

  return Err::m_nOK;
}

ErrVal H264AVCDecoderTest::go()
{
  PicBuffer*    pcPicBuffer = NULL;
  PicBufferList cPicBufferOutputList; 
  PicBufferList cPicBufferUnusedList;
  PicBufferList cPicBufferReleaseList;
#ifdef SHARP_AVC_REWRITE_OUTPUT
  ExtBinDataAccessor avcRewriteExtBinDataAccessor;
  UChar*          avcRewriteBinDataBuffer = NULL;
  BinData*		  avcRewriteBinData = NULL;
  int             avcRewriteBufsize=0;
  bool            avcRewriteInitialized = false;
#endif

  UInt      uiMbX           = 0;
  UInt      uiMbY           = 0;
  UInt      uiNalUnitType   = 0;
  UInt      uiSize          = 0;
  //UInt      uiNonRequiredPic= 0; //NonRequired JVT-Q066
  UInt      uiLumOffset     = 0;
  UInt      uiCbOffset      = 0;
  UInt      uiCrOffset      = 0;
  UInt      uiFrame;
  
  Bool      bEOS            = false;
  Bool      bYuvDimSet      = false;
  Bool 	    bFinish         = false;

  Bool		SuffixEnable;  //JVT-S036 lsj 

  // HS: packet trace
  Int   iMaxPocDiff = (Int)m_pcParameter->uiMaxPocDiff;
  Int   iLastPoc    = MSYS_INT_MAX;
  UChar* pcLastFrame  = 0;
  UInt   uiPreNalUnitType = 0;

  cPicBufferOutputList.clear();
  cPicBufferUnusedList.clear();

  RNOK( m_pcH264AVCDecoder->init( true ) );

  Bool bToDecode = false; //JVT-P031
  Bool bVirtual = false; //TMM_EC_FIX

  for( uiFrame = 0; ( uiFrame <= MSYS_UINT_MAX && ! bEOS); )
  {
    BinData* pcBinData = 0;
    BinData* pcBinDataAVCNALU; //NS leak fix
    BinDataAccessor cBinDataAccessor;

    Int  iPos;
    Bool bFinishChecking  = false;
    RNOK( m_pcReadBitstream->getPosition(iPos) );
    do 
    {
      // analyze the dependency information
      RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
      //TMM_EC {{
      {
         pcBinData->setMemAccessor( cBinDataAccessor );
         bFinish = false;
         RNOK( removeRedundencySlice( &cBinDataAccessor,  bFinish ) );
         if ( bFinish )
         {
           RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
           pcBinData = NULL; //TMM_JV
           continue;
         }
      }
      //TMM_EC }}
      
//TMM_EC {{
			if ( !bEOS && ((pcBinData->data())[0] & 0x1f) == 0x0b)
			{
				bEOS	=	true;
        RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
        pcBinData	= new BinData;
				UInt	uiTotalLength	=	0;
        pcBinData->set( new UChar[uiTotalLength], uiTotalLength );
			}
//TMM_EC }}      
      pcBinData->setMemAccessor( cBinDataAccessor );

      // open the NAL Unit, determine the type and if it's a slice get the frame size
      bFinishChecking = false;
      RNOK( m_pcH264AVCDecoder->checkSliceLayerDependency( &cBinDataAccessor, bFinishChecking ) );

      RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
      pcBinData = NULL;
    } while( ! bFinishChecking );

    RNOK( m_pcReadBitstream->setPosition(iPos) );

    //TMM_EC {{	check slice gap and process virtual slice

    if ( m_pcParameter->uiErrorConceal != 0)
    {
      RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
      pcBinData->setMemAccessor( cBinDataAccessor );
      //TMM_EC {{
      bFinish = false;
      RNOK( removeRedundencySlice( &cBinDataAccessor,  bFinish ) );
      if ( bFinish )
      {
         RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
         continue;
      }
      //TMM_EC }}
      do
		  {
			  BinDataAccessor	lcBinDataAccessor;
			  lcBinDataAccessor	=	cBinDataAccessor;

			  MyList<BinData*>	cVirtualSliceList;
			  while ( Err::m_nERR == m_pcH264AVCDecoder->checkSliceGap( &lcBinDataAccessor, cVirtualSliceList))
			  {
	        RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
		      RNOK( m_pcReadBitstream->getPosition(iPos) );
				  RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
				  pcBinData->setMemAccessor( cBinDataAccessor );
				  lcBinDataAccessor	=	cBinDataAccessor;
			  }

			  if ( cVirtualSliceList.empty())
			  {
	        RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
				  RNOK( m_pcReadBitstream->setPosition(iPos) );
				  break;
			  }

        bVirtual = false;
			  while( !cVirtualSliceList.empty())
			  {
				  Bool bStart = false;
          bVirtual = true;//TMM_EC_FIX
          BinData	*pcBinDataS = 0;
          RNOK(initPacketToDecode(bToDecode, pcBinDataS, &lcBinDataAccessor, bEOS,
                   uiNalUnitType, uiMbX, uiMbY, uiSize, uiPreNalUnitType, iPos, cVirtualSliceList, true));

  //NonRequired JVT-Q066{
				  if(m_pcH264AVCDecoder->isNonRequiredPic())
					  continue;
  //NonRequired JVT-Q066}
				  if(bToDecode)//JVT-P031
				  {
					  // get new picture buffer if required if coded Slice || coded IDR slice
					  pcPicBuffer = NULL;
			      
					  if( uiNalUnitType == 1 || uiNalUnitType == 5 || uiNalUnitType == 20 || uiNalUnitType == 21)
					  {
						  RNOK( xGetNewPicBuffer( pcPicBuffer, uiSize ) );
			        
						  if( ! bYuvDimSet )
						  {
							  UInt uiLumSize  = ((uiMbX<<3)+  YUV_X_MARGIN) * ((uiMbY<<3)    + YUV_Y_MARGIN ) * 4;
							  uiLumOffset     = ((uiMbX<<4)+2*YUV_X_MARGIN) * YUV_Y_MARGIN   + YUV_X_MARGIN;  
							  uiCbOffset      = ((uiMbX<<3)+  YUV_X_MARGIN) * YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + uiLumSize; 
							  uiCrOffset      = ((uiMbX<<3)+  YUV_X_MARGIN) * YUV_Y_MARGIN/2 + YUV_X_MARGIN/2 + 5*uiLumSize/4;
							  bYuvDimSet = true;

							  // HS: decoder robustness
							  pcLastFrame = new UChar [uiSize];
							  ROF( pcLastFrame );
						  }
					  }

				    //JVT-S036 lsj start
					  if( (uiNalUnitType == 1 || uiNalUnitType == 5 )  && !bVirtual) //TMM_EC_FIX
					  {
						  SuffixEnable = true;
					//	  RNOK(m_pcH264AVCDecoderSuffix->init( false ));     // THAT'S REALLY BAD !!!
						  RNOK( m_pcReadBitstream->getPosition( iPos ) );
						  RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
						  pcBinData->setMemAccessor( cBinDataAccessor );
              //EMM_TC {{
              bFinish = false;
              RNOK( removeRedundencySlice( &cBinDataAccessor,  bFinish ) );
              if ( bFinish )
              {
                RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
                pcBinData = NULL;
              }
              else
              {
              //TMM_EC
                 RNOK(m_pcH264AVCDecoderSuffix->init( false ));     // THAT'S REALLY BAD !!!
						     RNOK( m_pcH264AVCDecoderSuffix->initPacketSuffix( &cBinDataAccessor, uiNalUnitType, true, 
								      false, //FRAG_FIX_3
								      bStart, m_pcH264AVCDecoder,SuffixEnable
								      )
							      );

						      RNOK( m_pcH264AVCDecoderSuffix->uninit( false ));  // THAT'S REALLY BAD !!!

						      if( !SuffixEnable )
						      {
							       RNOK( m_pcReadBitstream->setPosition( iPos ) );
        //bug-fix suffix{{
							       bEOS = false;
						       }
						       else
						       {
							        m_pcH264AVCDecoder->decreaseNumOfNALInAU(); 
        //bug-fix suffix}}
						        }
                }

						  if( pcBinData)
						  { 
                             m_pcReadBitstream->releasePacket( pcBinData ) ;
                             pcBinData=NULL;
						  }

					  }
				  //JVT-S036 lsj end
		      
					  // decode the NAL unit
					  RNOK( m_pcH264AVCDecoder->process( pcPicBuffer, cPicBufferOutputList, cPicBufferUnusedList, cPicBufferReleaseList ) );

					  // ROI DECODE ICU/ETRI
					  m_pcH264AVCDecoder->RoiDecodeInit();
			      
					  // picture output
					  while( ! cPicBufferOutputList.empty() )
					  {
                PicBuffer* pcPicBufferTmp = cPicBufferOutputList.front();
						    cPicBufferOutputList.pop_front();
                if( pcPicBufferTmp != NULL )
                {
							  // HS: decoder robustness
				          while( abs( iLastPoc + iMaxPocDiff ) < abs( (Int)pcPicBufferTmp->getCts() ) )
                 // while( uiLastPoc + uiMaxPocDiff < (UInt)pcPicBufferTmp->getCts() && (Int)pcPicBufferTmp->getCts() > 0) //EIDR bug-fix
                  {
								    RNOK( m_pcWriteYuv->writeFrame( pcLastFrame + uiLumOffset, 
																								  pcLastFrame + uiCbOffset, 
																								  pcLastFrame + uiCrOffset,
																								  uiMbY << 4,
																								  uiMbX << 4,
																								  (uiMbX << 4)+ YUV_X_MARGIN*2 ) );
								    printf("REPEAT FRAME\n");
								    uiFrame   ++;
								    iLastPoc += iMaxPocDiff;
                  }

			          
                  RNOK( m_pcWriteYuv->writeFrame( *pcPicBufferTmp + uiLumOffset, 
                    *pcPicBufferTmp + uiCbOffset, 
                    *pcPicBufferTmp + uiCrOffset,
																							  uiMbY << 4,
																							  uiMbX << 4,
																							  (uiMbX << 4)+ YUV_X_MARGIN*2 ) );
							    uiFrame++;
			        
			      
							  // HS: decoder robustness
                  iLastPoc = (Int) pcPicBufferTmp->getCts();
                  ::memcpy( pcLastFrame, *pcPicBufferTmp+0, uiSize*sizeof(UChar) );
						  }
					  }
			      
					  RNOK( xRemovePicBuffer( cPicBufferReleaseList ) );
					  RNOK( xRemovePicBuffer( cPicBufferUnusedList ) );
           // if(pcBinDataS) //TMM_JV
           //     RNOK( m_pcReadBitstream->releasePacket( pcBinDataS ) );
				  }
			    //TMM_JV
          if(pcBinDataS)
          RNOK( m_pcReadBitstream->releasePacket( pcBinDataS ) );
        }
		  }	while( true);
		}
//TMM_EC }}

    Bool bStart = false;
    MyList<BinData*>	cVirtualSliceList;
    pcBinData = 0;
    RNOK(initPacketToDecode(bToDecode, pcBinData, &cBinDataAccessor, bEOS,
      uiNalUnitType, uiMbX, uiMbY, uiSize, uiPreNalUnitType, iPos, cVirtualSliceList, false));
//prefix unit{{
		  if(uiNalUnitType == 14)
		  {
			  RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
				continue;
		  }
//prefix unit}}
    //JVT-T054_FIX{
    Bool bWasAVCNALUnit = (uiNalUnitType == 1 || uiNalUnitType == 5);
    //JVT-T054}

//NonRequired JVT-Q066{
	if(m_pcH264AVCDecoder->isNonRequiredPic())
		continue;
//NonRequired JVT-Q066}

// JVT-Q054 Red. Picture {
  RNOK( m_pcH264AVCDecoder->checkRedundantPic() );
  if ( m_pcH264AVCDecoder->isRedundantPic() )
//bug-fix suffix{{
  {
	if((uiNalUnitType == 1 || uiNalUnitType == 5) && !bEOS) 
	{
		SuffixEnable = true;
		RNOK(m_pcH264AVCDecoderSuffix->init( false ));   // THAT'S REALLY BAD !!!
		RNOK( m_pcReadBitstream->getPosition( iPos ) );
		RNOK( m_pcReadBitstream->extractPacket( pcBinData, bEOS ) );
		pcBinData->setMemAccessor( cBinDataAccessor );
		RNOK( m_pcH264AVCDecoderSuffix->initPacketSuffix( &cBinDataAccessor, uiNalUnitType, true, 
				false, //FRAG_FIX_3
				bStart, m_pcH264AVCDecoder,SuffixEnable
				)
			);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -