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

📄 h264avcdecodertest.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		RNOK( m_pcH264AVCDecoderSuffix->uninit( false ));  // THAT'S REALLY BAD !!!

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

#ifdef SHARP_AVC_REWRITE_OUTPUT
  if (m_pcH264AVCDecoder->getAvcRewriteFlag())
  {
	  if (avcRewriteInitialized==false )
	  {	  
		  // initialize, this is called only once
		  avcRewriteBinData = new BinData;
		  avcRewriteBinData->setMemAccessor(avcRewriteExtBinDataAccessor);
		  m_pcH264AVCDecoder->startAvcRewrite(avcRewriteBinDataBuffer, avcRewriteBinData, &avcRewriteExtBinDataAccessor);
		  avcRewriteInitialized = true;

		  // open the rewrite bit stream file
		  RNOKS( WriteBitstreamToFile::create(m_pcAvcReWriteBitstream) );	  
		  RNOKS( m_pcAvcReWriteBitstream->init(m_cAvcReWriteBitstreamFileName) );

		  //===== set start code =====
		  m_aucStartCodeBuffer[0] = 0;
		  m_aucStartCodeBuffer[1] = 0;
		  m_aucStartCodeBuffer[2] = 0;
		  m_aucStartCodeBuffer[3] = 1;
		  m_cBinDataStartCode.reset ();
		  m_cBinDataStartCode.set   ( m_aucStartCodeBuffer, 4 );

		  // write parameter sets
		  bool moreSet = true;
		  UInt index = 0;
		  while (moreSet) {
			  moreSet = m_pcH264AVCDecoder->writeAvcRewriteParameterSets(7, index);	   // NAL_UNIT_SPS

			  RNOK(m_pcAvcReWriteBitstream->writePacket( &m_cBinDataStartCode ) );
			  RNOK(m_pcAvcReWriteBitstream->writePacket(avcRewriteBinData));
			  index ++;
		  }

		  moreSet = true;
		  index = 0;
		  while (moreSet) 
		  {
			  moreSet = m_pcH264AVCDecoder->writeAvcRewriteParameterSets(8, index);	   //NAL_UNIT_PPS
			  RNOK(m_pcAvcReWriteBitstream->writePacket( &m_cBinDataStartCode ) );
			  RNOK(m_pcAvcReWriteBitstream->writePacket(avcRewriteBinData));
			  index ++;
		  }
	  }	  
  }
  
#endif

  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) && !bEOS) 
	{
		SuffixEnable = true;
		RNOK( m_pcReadBitstream->getPosition( iPos ) );
    RNOK( m_pcReadBitstream->extractPacket( pcBinDataAVCNALU, bEOS ) ); //NS leak fix
    pcBinDataAVCNALU->setMemAccessor( cBinDataAccessor ); //NS leak fix
   
   //TMM_EC
    bFinish = false;
    RNOK( removeRedundencySlice( &cBinDataAccessor,  bFinish ) );
    if ( bFinish )
    {
      RNOK( m_pcReadBitstream->releasePacket( pcBinDataAVCNALU ) ); //NS leak fix
      pcBinDataAVCNALU = NULL; //NS leak fix
    }
    else
    {
       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 ) );
			    bEOS = false; 
		   }
    //bug-fix suffix{{
		   else
		   {
			   m_pcH264AVCDecoder->decreaseNumOfNALInAU(); 
		   }
     }
//bug-fix suffix}}
	//NS leak fix begin
  if (pcBinDataAVCNALU)
    {
      RNOK( m_pcReadBitstream->releasePacket( pcBinDataAVCNALU ) );
      pcBinDataAVCNALU = NULL;
    } 
    //NS leak fix end
  }
//JVT-S036 lsj end

    // decode the NAL unit
    RNOK( m_pcH264AVCDecoder->process( pcPicBuffer, cPicBufferOutputList, cPicBufferUnusedList, cPicBufferReleaseList ) );
    
    //JVT-T054_FIX{
    //add last decoded frame to SVC DPB if last frame was an AVC unit
   if(bWasAVCNALUnit && m_pcH264AVCDecoder->getBaseSVCActive())
   {
      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 );
      }

      RNOK( m_pcH264AVCDecoder->process( pcPicBuffer, cPicBufferOutputList, cPicBufferUnusedList, cPicBufferReleaseList ) );
   }
    //JVT-T054}

#ifdef SHARP_AVC_REWRITE_OUTPUT
	if (avcRewriteInitialized && avcRewriteBinData->size())
	{
		RNOK(m_pcAvcReWriteBitstream->writePacket( &m_cBinDataStartCode ) );		
		RNOK(m_pcAvcReWriteBitstream->writePacket(avcRewriteBinData));      // SVC-AVC rewrite -- slice header and data
		avcRewriteBinData->reset();
	}
#endif

	// 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 = (UInt)pcPicBufferTmp->getCts();
        ::memcpy( pcLastFrame, *pcPicBufferTmp+0, uiSize*sizeof(UChar) );
      }
    }
   } 
    RNOK( xRemovePicBuffer( cPicBufferReleaseList ) );
    RNOK( xRemovePicBuffer( cPicBufferUnusedList ) );
    if( pcBinData )
    {
      RNOK( m_pcReadBitstream->releasePacket( pcBinData ) );
      pcBinData = 0;
    }
  }

  printf("\n %d frames decoded\n", uiFrame );

  delete [] pcLastFrame; // HS: decoder robustness
  
#ifdef SHARP_AVC_REWRITE_OUTPUT
  if (avcRewriteInitialized==true) {	
	  avcRewriteBinData->reset();
	  m_pcH264AVCDecoder->closeAvcRewrite(); // free the avcRewriteBinDataBuffer inside this function

	  // close file
	  if( NULL != m_pcAvcReWriteBitstream )     
	  {
		  RNOK( m_pcAvcReWriteBitstream->uninit() );  
		  RNOK( m_pcAvcReWriteBitstream->destroy() );  
	  }
	  m_pcAvcReWriteBitstream = NULL;
  }
#endif

  RNOK( m_pcH264AVCDecoder->uninit( true ) );
  
  m_pcParameter->nFrames  = uiFrame;
  m_pcParameter->nResult  = 0;

  return Err::m_nOK;
}

#ifdef SHARP_AVC_REWRITE_OUTPUT
ErrVal
H264AVCDecoderTest::setAvcReWriteBitstreamFile (char* AvcReWriteBitstreamFileName) {
	
	m_cAvcReWriteBitstreamFileName = AvcReWriteBitstreamFileName;
	return Err::m_nOK;
}

#endif

//TMM_EC
ErrVal
H264AVCDecoderTest::removeRedundencySlice(BinDataAccessor*  pcBinDataAccessor,
                                     Bool&             bFinishChecking  )
{
  Bool bEos;
  bFinishChecking = false;
  UInt eNalUnitType;
  int uiLayerId;
  int uiQualityLevel;
  int m_bFGSFragFlag;

  if ( m_pcParameter->uiErrorConceal == 0)
    return Err::m_nOK; 

  ROT( NULL == pcBinDataAccessor );
  bEos = ( NULL == pcBinDataAccessor->data() ) || ( 0 == pcBinDataAccessor->size() );

  if ( bEos )
  {
    return Err::m_nOK;
  }

  ROF( pcBinDataAccessor->size() );
   ROF( pcBinDataAccessor->data() );

   UChar ucByte          = pcBinDataAccessor->data()[0];
   ROT( ucByte & 0x80 );                                     // forbidden_zero_bit ( &10000000b)
   eNalUnitType        =  ( ucByte &  0x1F  );  // nal_unit_type      ( &00011111b)

  if ( *(int*)(pcBinDataAccessor->data()+1) != 0xdeadface)
	{
		if( eNalUnitType == 20 ||
				eNalUnitType == 21 )
		{
		  ROF( pcBinDataAccessor->size() > 3 );
	
		  ucByte              = pcBinDataAccessor->data()[1];
	    ucByte              = pcBinDataAccessor->data()[2];
	    uiLayerId         = ( ucByte >> 2 ) & 7;
      uiQualityLevel    = ( ucByte      ) & 3;  

      ucByte              = pcBinDataAccessor->data()[3];
      // JVT-U116 LMI {
      //ROT( ucByte & 0x80 );
      m_bFGSFragFlag        = ( ucByte >> 4) & 1;
      // JVT-U116 LMI {
    }
		else
		{
			uiLayerId       = 0;
		}
	}
	else //TMM_EC
	{
    uiLayerId       = 0;
    return Err::m_nERR;
	}

  if (   ( eNalUnitType == 20 
      ||   eNalUnitType == 21)  
      &&   uiLayerId == 0     )
  {
    bFinishChecking = true;
  }


  return Err::m_nOK;
}
//TMM_EC }}


⌨️ 快捷键说明

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