Changeset 924 in SHVCSoftware for branches/SHM-dev/source/App/TAppDecoder
- Timestamp:
- 17 Nov 2014, 17:09:25 (10 years ago)
- Location:
- branches/SHM-dev/source/App/TAppDecoder
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/SHM-dev/source/App/TAppDecoder/TAppDecCfg.cpp
r856 r924 72 72 Int olsIdx; 73 73 #endif 74 #if CONFORMANCE_BITSTREAM_MODE 75 string cfg_confPrefix; 76 #endif 74 77 #if AVC_BASE 75 78 string cfg_BLReconFile; … … 106 109 #if OUTPUT_LAYER_SET_INDEX 107 110 ("OutpuLayerSetIdx,-olsidx", olsIdx, -1, "Index of output layer set to be decoded.") 111 #endif 112 #if CONFORMANCE_BITSTREAM_MODE 113 ("ConformanceBitstremMode,-confMode", m_confModeFlag, false, "Enable generation of conformance bitstream metadata; True: Generate metadata, False: No metadata generated") 114 ("ConformanceMetadataPrefix,-confPrefix", cfg_confPrefix, string(""), "Prefix for the file name of the conformance data. Default name - 'decodedBitstream'") 108 115 #endif 109 116 #endif … … 145 152 #endif 146 153 #if OUTPUT_LAYER_SET_INDEX 154 #if CONFORMANCE_BITSTREAM_MODE 155 if( m_confModeFlag ) 156 { 157 assert( olsIdx != -1 ); // In the conformance mode, target output layer set index is to be explicitly specified. 158 159 if( cfg_confPrefix.empty() ) 160 { 161 m_confPrefix = string("decodedBitstream"); 162 } 163 else 164 { 165 m_confPrefix = cfg_confPrefix; 166 } 167 // Open metadata file and write 168 char fileNameSuffix[255]; 169 sprintf(fileNameSuffix, "%s-OLS%d.opl", m_confPrefix.c_str(), olsIdx); // olsIdx is the target output layer set index. 170 m_metadataFileName = string(fileNameSuffix); 171 m_metadataFileRefresh = true; 172 173 // Decoded layer YUV files 174 for(UInt layer=0; layer<= m_tgtLayerId; layer++) 175 { 176 sprintf(fileNameSuffix, "%s-L%d.yuv", m_confPrefix.c_str(), layer); // olsIdx is the target output layer set index. 177 m_decodedYuvLayerFileName[layer] = std::string( fileNameSuffix ); 178 m_decodedYuvLayerRefresh[layer] = true; 179 } 180 } 181 #endif 147 182 this->getCommonDecoderParams()->setTargetOutputLayerSetIdx( olsIdx ); 148 183 this->getCommonDecoderParams()->setTargetLayerId ( m_tgtLayerId ); -
branches/SHM-dev/source/App/TAppDecoder/TAppDecCfg.h
r856 r924 89 89 CommonDecoderParams m_commonDecoderParams; 90 90 #endif 91 #if CONFORMANCE_BITSTREAM_MODE 92 Bool m_confModeFlag; 93 std::string m_confPrefix; 94 std::string m_metadataFileName; 95 Bool m_metadataFileRefresh; 96 std::string m_decodedYuvLayerFileName[63]; 97 Bool m_decodedYuvLayerRefresh[63]; 98 #endif 91 99 92 100 public: … … 119 127 CommonDecoderParams* getCommonDecoderParams() {return &m_commonDecoderParams;} 120 128 #endif 129 #if CONFORMANCE_BITSTREAM_MODE 130 Bool const getConfModeFlag() { return m_confModeFlag; } 131 std::string const getConfPrefix() { return m_confPrefix;} 132 std::string const getMetadataFileName() { return m_metadataFileName; } 133 Bool const getMetadataFileRefresh() {return m_metadataFileRefresh; } 134 Void setMetadataFileRefresh(Bool const x) {m_metadataFileRefresh = x; } 135 Void setDecodedYuvLayerFileName(Int layerId, std::string x) { m_decodedYuvLayerFileName[layerId] = x; } 136 std::string const getDecodedYuvLayerFileName(Int layerId) { return m_decodedYuvLayerFileName[layerId]; } 137 Bool const getDecodedYuvLayerRefresh(Int const layerId) {return m_decodedYuvLayerRefresh[layerId]; } 138 Void setDecodedYuvLayerRefresh(Int const layerId, Bool const x) {m_decodedYuvLayerRefresh[layerId] = x; } 139 #endif 121 140 }; 122 141 -
branches/SHM-dev/source/App/TAppDecoder/TAppDecTop.cpp
r874 r924 45 45 #include "TLibDecoder/AnnexBread.h" 46 46 #include "TLibDecoder/NALread.h" 47 #include "TLibCommon/TComPicYuv.h" 48 #include "libmd5/MD5.h" 47 49 //! \ingroup TAppDecoder 48 50 //! \{ … … 576 578 #endif 577 579 } 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 578 586 #else 579 587 m_cTDecTop.init(); … … 1101 1109 conf.getWindowBottomOffset()* yScal + defDisp.getWindowBottomOffset() ); 1102 1110 } 1111 1103 1112 // update POC of display order 1104 1113 pocLastDisplay = pic->getPOC(); … … 1313 1322 1314 1323 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 1315 1389 1316 1390 listOfPocsInEachLayer[layerIdx].erase( it ); -
branches/SHM-dev/source/App/TAppDecoder/TAppDecTop.h
r845 r924 71 71 TVideoIOYuv m_cTVideoIOYuvReconFile; ///< reconstruction YUV class 72 72 #endif 73 73 #if CONFORMANCE_BITSTREAM_MODE 74 TVideoIOYuv m_confReconFile[63]; ///< decode YUV files 75 #endif 74 76 // for output control 75 77 #if SVC_EXTENSION
Note: See TracChangeset for help on using the changeset viewer.