Ignore:
Timestamp:
17 Nov 2014, 17:09:25 (10 years ago)
Author:
seregin
Message:

in order to generate the metadata related to conformance bitstreams, patch was provided by Ramasubramonian, Adarsh Krishnan <aramasub@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-dev/source/App/TAppDecoder/TAppDecTop.cpp

    r874 r924  
    4545#include "TLibDecoder/AnnexBread.h"
    4646#include "TLibDecoder/NALread.h"
     47#include "TLibCommon/TComPicYuv.h"
     48#include "libmd5/MD5.h"
    4749//! \ingroup TAppDecoder
    4850//! \{
     
    576578#endif
    577579  }
     580#if CONFORMANCE_BITSTREAM_MODE
     581  for(UInt layer = 0; layer <= MAX_LAYERS; layer++)
     582  {
     583    m_acTDecTop[layer].setConfModeFlag ( this->getConfModeFlag() );
     584  }
     585#endif
    578586#else
    579587  m_cTDecTop.init();
     
    11011109      conf.getWindowBottomOffset()* yScal + defDisp.getWindowBottomOffset() );
    11021110  }
     1111
    11031112  // update POC of display order
    11041113  pocLastDisplay = pic->getPOC();
     
    13131322
    13141323      xOutputAndMarkPic( pic, m_pchReconFile[layerIdx], layerIdx, m_aiPOCLastDisplay[layerIdx], dpbStatus );
     1324
     1325#if CONFORMANCE_BITSTREAM_MODE
     1326  FILE *fptr;
     1327  if( this->getConfModeFlag() )
     1328  {
     1329    if( this->getMetadataFileRefresh() )
     1330    {
     1331      fptr = fopen( this->getMetadataFileName().c_str(), "w" );
     1332      fprintf(fptr, " LayerId      POC    MD5\n");
     1333      fprintf(fptr, "------------------------\n");
     1334    }
     1335    else
     1336    {
     1337      fptr = fopen( this->getMetadataFileName().c_str(), "a+" );
     1338    }
     1339    this->setMetadataFileRefresh(false);
     1340    UChar recon_digest[3][16];
     1341    calcMD5(*pic->getPicYuvRec(), recon_digest);
     1342    fprintf(fptr, "%8d%9d    MD5:%s\n", pic->getLayerId(), pic->getSlice(0)->getPOC(), digestToString(recon_digest, 16));
     1343    fclose(fptr);
     1344
     1345    // Output all picutres "decoded" in that layer that have POC less than the current picture
     1346    std::vector<TComPic> *layerBuffer = (m_acTDecTop->getLayerDec(pic->getLayerId()))->getConfListPic();
     1347    // Write all pictures to the file.
     1348    if( this->getDecodedYuvLayerRefresh(layerIdx) )
     1349    {
     1350      if (!m_outputBitDepthY) { m_outputBitDepthY = g_bitDepthY; }
     1351      if (!m_outputBitDepthC) { m_outputBitDepthC = g_bitDepthC; }
     1352
     1353      char tempFileName[256];
     1354      strcpy(tempFileName, this->getDecodedYuvLayerFileName( layerIdx ).c_str());
     1355      m_confReconFile[layerIdx].open(tempFileName, true, m_outputBitDepthY, m_outputBitDepthC, g_bitDepthY, g_bitDepthC ); // write mode
     1356      this->setDecodedYuvLayerRefresh( layerIdx, false );
     1357    }
     1358    const Window &conf = pic->getConformanceWindow();
     1359    const Window &defDisp = m_respectDefDispWindow ? pic->getDefDisplayWindow() : Window();
     1360    Int xScal =  1, yScal = 1;
     1361  #if REPN_FORMAT_IN_VPS
     1362    UInt chromaFormatIdc = pic->getSlice(0)->getChromaFormatIdc();
     1363    xScal = TComSPS::getWinUnitX( chromaFormatIdc );
     1364    yScal = TComSPS::getWinUnitY( chromaFormatIdc );
     1365  #endif
     1366    std::vector<TComPic>::iterator iterPic;
     1367    for(iterPic = layerBuffer->begin(); iterPic != layerBuffer->end(); iterPic++)
     1368    {
     1369       TComPic checkPic = *iterPic;
     1370       if( checkPic.getPOC() <= pic->getPOC() )
     1371       {
     1372         TComPicYuv* pPicCYuvRec = checkPic.getPicYuvRec();
     1373         m_confReconFile[layerIdx].write( pPicCYuvRec,
     1374                                  conf.getWindowLeftOffset()  * xScal + defDisp.getWindowLeftOffset(),
     1375                                  conf.getWindowRightOffset() * xScal + defDisp.getWindowRightOffset(),
     1376                                  conf.getWindowTopOffset()   * yScal + defDisp.getWindowTopOffset(),
     1377                                  conf.getWindowBottomOffset()* yScal + defDisp.getWindowBottomOffset() );
     1378         layerBuffer->erase(iterPic);
     1379         iterPic = layerBuffer->begin();  // Ensure doesn't go to infinite loop
     1380         if(layerBuffer->size() == 0)
     1381         {
     1382           break;
     1383         }
     1384       }
     1385    }
     1386  }
     1387  // Now to remove the pictures that have been output
     1388#endif
    13151389
    13161390      listOfPocsInEachLayer[layerIdx].erase( it );
Note: See TracChangeset for help on using the changeset viewer.