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

📄 qualitylevelassigner.cpp

📁 JMVM MPEG MVC/3DAV 测试平台 国际通用标准
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  {
    Int             iPos;
    Bool            bFinishChecking;
    BinData*        pcBinData;
    BinDataAccessor cBinDataAccessor;

    //----- analyse access unit -----
    RNOK( pcReadBitStream->getPosition( iPos ) );
    do
    {
      RNOK( xGetNextValidPacket( pcBinData, pcReadBitStream, uiTopLayer, uiLayer, uiFGSLayer, uiLevel, bIndependent, bEOS, auiFrameNumAnalysis ) );
      pcBinData->setMemAccessor( cBinDataAccessor );

      bFinishChecking = false;
      if( m_pcH264AVCDecoder->getNumOfNALInAU() == 0 )
      {
        m_pcH264AVCDecoder->setDependencyInitialized( false );
        m_pcH264AVCDecoder->initNumberOfFragment    ();
      }
      RNOK( m_pcH264AVCDecoder->checkSliceLayerDependency( &cBinDataAccessor, bFinishChecking ) );
      RNOK( pcReadBitStream->releasePacket( pcBinData ) );

    } while( !bFinishChecking );


#define MAX_FRAGMENTS 10 // see H264AVCDecoderTest::go()

    Bool            bFragmented       = false;
    Bool            bDiscardable      = false;
    Bool            bStart            = false;
    Bool            bFirst            = true;
    Bool            bConcatenated     = false;
    UInt            uiTotalLength     = 0;
    UInt            uiFragmentNumber  = 0;
    BinData*        apcBinDataTmp       [MAX_FRAGMENTS];
    BinDataAccessor acBinDataAccessorTmp[MAX_FRAGMENTS];
    UInt            auiStartPos         [MAX_FRAGMENTS];
    UInt            auiEndPos           [MAX_FRAGMENTS];

    for( pcBinData = 0, bEOS = false; !bStart && !bEOS; )
    {
      if( bFirst )
      {
        RNOK( pcReadBitStream->setPosition( iPos ) );
        bFirst = false;
      }
      RNOK( xGetNextValidPacket( apcBinDataTmp[uiFragmentNumber], pcReadBitStream, uiTopLayer, uiLayer, uiFGSLayer, uiLevel, bIndependent, bEOS, auiFrameNumDecoding ) );
      ::memcpy( auiFrameNumAnalysis, auiFrameNumDecoding, MAX_LAYERS*sizeof(UInt) );
      apcBinDataTmp[uiFragmentNumber]->setMemAccessor( acBinDataAccessorTmp[uiFragmentNumber] );

      RNOK( m_pcH264AVCDecoder->initPacket( &acBinDataAccessorTmp[uiFragmentNumber],
                                            uiNalUnitType, uiMbX, uiMbY, uiSize, 
											//uiNonRequiredPic,  //NonRequired JVT-Q066
											true, false, //FRAG_FIX_3
                                            bStart, auiStartPos[uiFragmentNumber], auiEndPos[uiFragmentNumber],
                                            bFragmented, bDiscardable ) );

//NonRequired JVT-Q066
	  /*
	  if( uiNonRequiredPic )
	  {
		  continue;
	  }
*/
//NonRequired JVT-Q066

      uiTotalLength += ( auiEndPos[uiFragmentNumber] - auiStartPos[uiFragmentNumber] );

      if( !bStart )
      {
        uiFragmentNumber++;
      }
      else
      {
        if( apcBinDataTmp[0]->size() != 0 )
        {
          pcBinData = new BinData();
          pcBinData->set( new UChar[uiTotalLength], uiTotalLength );
          UInt uiOffset = 0;
          for( UInt uiFragment = 0; uiFragment <= uiFragmentNumber; uiFragment++ )
          {
            ::memcpy  ( pcBinData->data()+uiOffset,
                        apcBinDataTmp[uiFragment]->data() + auiStartPos[uiFragment],
                        auiEndPos[uiFragment] - auiStartPos[uiFragment] );
            uiOffset += auiEndPos[uiFragment] - auiStartPos[uiFragment];

            RNOK( pcReadBitStream->releasePacket( apcBinDataTmp[uiFragment] ) );
            apcBinDataTmp[uiFragment] = 0;
            if(uiNalUnitType != 6) //JVT-T054
            m_pcH264AVCDecoder->decreaseNumOfNALInAU();

            if( uiFragment > 0 )
            {
              bConcatenated = true;
            }
          }

          pcBinData->setMemAccessor( cBinDataAccessor );
          bToDecode = false;
          if( ( uiTotalLength != 0 ) && ( !bDiscardable || bFragmented ) )
          {
            if( ( uiNalUnitType == 20 ) || ( uiNalUnitType == 21 ) || ( uiNalUnitType == 1 ) || ( uiNalUnitType == 5 ) )
            {

              RNOK( m_pcH264AVCDecoder->initPacket( &cBinDataAccessor, uiNalUnitType,
                                                    uiMbX, uiMbY, uiSize, 
													//uiNonRequiredPic, //NonRequired JVT-Q066
                                                    false, bConcatenated, bStart,
                                                    auiStartPos[uiFragmentNumber+1], auiEndPos[uiFragmentNumber+1],
                                                    bFragmented, bDiscardable ) );
            }
            else
            {
              RNOK( m_pcH264AVCDecoder->initPacket( &cBinDataAccessor ) );
            }
            bToDecode = true;
          }
        }
       //manu.mathew@samsung : memory leak fix
        else
        {
            RNOK( pcReadBitStream->releasePacket( apcBinDataTmp[0] ) );
          apcBinDataTmp[0] = NULL;
        }
       //--
      }
    }
//NonRequired JVT-Q066{
	if(m_pcH264AVCDecoder->isNonRequiredPic())
		continue;
//NonRequired JVT-Q066}

    if( bToDecode )
    {
      //----- get pic buffer -----
      pcPicBuffer = 0;
      if( uiNalUnitType == 1 || uiNalUnitType == 5 || uiNalUnitType == 20 || uiNalUnitType == 21 )
      {
        RNOK( xGetNewPicBuffer( pcPicBuffer, uiSize ) );
        if( !bYuvDimSet )
        {
          RNOK( xGetNewPicBuffer( pcPicBufferOrig, uiSize ) );
          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;
        }
      }

      //----- decode packet -----
      {
        //----- re-direct stdout -----
#if WIN32 // for linux, this have to be slightly re-formulated
        Int   orig_stdout     = _dup(1);
        FILE* stdout_copy     = freopen( tmp_file_name, "wt", stdout );
#endif
        //----- decode -----
        RNOK( m_pcH264AVCDecoder->process( pcPicBuffer,
                                           cPicBufferOutputList,
                                           cPicBufferUnusedList,
                                           cPicBufferReleaseList ) );
        //---- restore stdout -----
#if WIN32 // for linux, this have to be slightly re-formulated
        fclose( stdout );
        _dup2( orig_stdout, 1 );
        _iob[1] = *fdopen( 1, "wt" );
        fclose(  fdopen( orig_stdout, "w" ) );
#endif
      }

      //----- determine distortion (and output for debugging) -----
      while( ! cPicBufferOutputList.empty() )
      {
        PicBuffer* pcPicBufferTmp = cPicBufferOutputList.front();
        cPicBufferOutputList.pop_front();
        if( pcPicBufferTmp )
        {
          //----- output (for debugging) -----
          if( pcWriteYuv )
          {
            RNOK( pcWriteYuv->writeFrame( *pcPicBufferTmp + uiLumOffset,
                                          *pcPicBufferTmp + uiCbOffset,
                                          *pcPicBufferTmp + uiCrOffset,
                                           uiMbY << 4,
                                           uiMbX << 4,
                                          (uiMbX << 4) + YUV_X_MARGIN*2 ) );
          }

          //----- read in reference picture ------
          RNOK( pcReadYuv->readFrame    ( *pcPicBufferOrig + uiLumOffset,
                                          *pcPicBufferOrig + uiCbOffset,
                                          *pcPicBufferOrig + uiCrOffset,
                                           uiMbY << 4,
                                           uiMbX << 4,
                                          (uiMbX << 4) + YUV_X_MARGIN*2 ) );

          //----- get distortion -----
          RNOK( xGetDistortion          (  auiDistortion[uiFrame],
                                          *pcPicBufferTmp  + uiLumOffset,
                                          *pcPicBufferOrig + uiLumOffset,
                                           uiMbY << 4,
                                           uiMbX << 4,
                                          (uiMbX << 4) + YUV_X_MARGIN*2 ) );

          //----- increment output picture number -----
          uiFrame++;
          if( uiLevel == MSYS_UINT_MAX )
            printf( "\rdetermine distortion (layer %d - FGS %d - base layer  ) --> frame %d completed", uiLayer, uiFGSLayer,                                    uiFrame );
          else
            printf( "\rdetermine distortion (layer %d - FGS %d - lev%2d - %s ) --> frame %d completed", uiLayer, uiFGSLayer, uiLevel, bIndependent?"ind":"dep", uiFrame );
        }
      }
    } // if( bToDecode )

    //----- free buffers -----
    RNOK( xRemovePicBuffer( cPicBufferReleaseList ) );
    RNOK( xRemovePicBuffer( cPicBufferUnusedList  ) );

    //----- delete bin data -----
    if( pcBinData )
    {
      RNOK( pcReadBitStream->releasePacket( pcBinData ) );
      pcBinData = 0;
    }
  }
  //----- remove original pic buffer -----
  PicBufferList cPicBufferListOrig; cPicBufferListOrig.push_back( pcPicBufferOrig );
  RNOK( xRemovePicBuffer( cPicBufferListOrig ) );
#if WIN32
  remove( tmp_file_name );
#endif


  //===== uninit =====
  RNOK( m_pcH264AVCPacketAnalyzer ->uninit  () );
  RNOK( m_pcH264AVCDecoder        ->uninit  ( true ) );
  RNOK( pcReadBitStream           ->uninit  () );
  RNOK( pcReadYuv                 ->uninit  () );
  RNOK( pcReadBitStream           ->destroy () );
  RNOK( pcReadYuv                 ->destroy () );
  if( pcWriteYuv )
  {
    RNOK( pcWriteYuv->destroy() );
  }

  //---- re-create decoder (there's something wrong) -----
  RNOK( m_pcH264AVCDecoder->destroy() );
  RNOK( CreaterH264AVCDecoder::create( m_pcH264AVCDecoder ) );

  printf("\n");

  return Err::m_nOK;
}


ErrVal
QualityLevelAssigner::xWriteDataFile( const std::string&  cFileName )
{
  printf( "write data to file \"%s\" ...", cFileName.c_str() );

  FILE* pFile = fopen( cFileName.c_str(), "wt" );
  if( !pFile )
  {
    fprintf( stderr, "\nERROR: Cannot open file \"%s\" for writing!\n\n", cFileName.c_str() );
    return Err::m_nERR;
  }

  for( UInt uiLayer = 0; uiLayer <  m_uiNumLayers;               uiLayer ++ )
  for( UInt uiFGS   = 0; uiFGS   <= m_auiNumFGSLayers[uiLayer];  uiFGS   ++ )
  for( UInt uiFrame = 0; uiFrame <  m_auiNumFrames   [uiLayer];  uiFrame ++ )
  {
    fprintf( pFile,
             "%d  %d  %5d  %6d  %lf\n",
              uiLayer, uiFGS, uiFrame,
              m_aaauiPacketSize [uiLayer][uiFGS][uiFrame],
              m_aaadDeltaDist   [uiLayer][uiFGS][uiFrame] );

  }

  fclose( pFile );

  printf("\n");
  return Err::m_nOK;
}


ErrVal
QualityLevelAssigner::xReadDataFile( const std::string&  cFileName )
{
  printf( "read data from file \"%s\" ...", cFileName.c_str() );

  FILE* pFile = fopen( cFileName.c_str(), "rt" );
  if( !pFile )
  {
    fprintf( stderr, "\nERROR: Cannot open file \"%s\" for reading!\n\n", cFileName.c_str() );
    return Err::m_nERR;
  }

  Bool    bEOS    = false;
  UInt    uiLayer, uiFGS, uiFrame, uiPacketSize, uiNumPackets;
  Double  dDeltaDist;
  for( uiNumPackets = 0; !bEOS; uiNumPackets++ )
  {
    Int iNumRead = fscanf( pFile,
                           " %d %d %d %d %lf",
                           &uiLayer, &uiFGS, &uiFrame, &uiPacketSize, &dDeltaDist );
    if( iNumRead == 5 )
    {
      ROF( uiLayer <  m_uiNumLayers );
      ROF( uiFGS   <= m_auiNumFGSLayers[uiLayer] );
      ROF( uiFrame <  m_auiNumFrames   [uiLayer] );
      m_aaauiPacketSize [uiLayer][uiFGS][uiFrame]  = uiPacketSize;
      m_aaadDeltaDist   [uiLayer][uiFGS][uiFrame]  = dDeltaDist;
    }
    else
    {
      bEOS = true;
      uiNumPackets--;
    }
  }

  //----- check number of elements -----
  UInt uiTargetPackets = 0;
  for( uiLayer = 0; uiLayer < m_uiNumLayers; uiLayer++ )
  {
    uiTargetPackets += ( 1 + m_auiNumFGSLayers[uiLayer] ) * m_auiNumFrames[uiLayer];
  }
  if( uiTargetPackets != uiNumPackets )
  {
    fprintf( stderr, "\nERROR: File \"%s\" contains incomplete data!\n\n", cFileName.c_str() );
    return Err::m_nERR;
  }

⌨️ 快捷键说明

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