Changeset 368 in 3DVCSoftware for branches/HTM-DEV-0.1-dev/source/App
- Timestamp:
- 3 May 2013, 17:16:12 (12 years ago)
- Location:
- branches/HTM-DEV-0.1-dev/source/App
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-DEV-0.1-dev/source/App/TAppDecoder/TAppDecCfg.cpp
r367 r368 42 42 #include "TAppCommon/program_options_lite.h" 43 43 44 #if H_MV 45 #include <cassert> 46 #endif 44 47 #ifdef WIN32 45 48 #define strdup _strdup … … 75 78 ("OutputBitDepth,d", m_outputBitDepthY, 0, "bit depth of YUV output luma component (default: use 0 for native depth)") 76 79 ("OutputBitDepthC,d", m_outputBitDepthC, 0, "bit depth of YUV output chroma component (default: use 0 for native depth)") 80 #if H_MV 81 ("MaxLayerId,-ls", m_maxLayerId, MAX_NUM_LAYER_IDS-1, "Maximum LayerId to be decoded.") 82 #endif 77 83 ("MaxTemporalLayer,t", m_iMaxTemporalLayer, -1, "Maximum Temporal Layer to be decoded. -1 to decode all layers") 78 84 ("SEIDecodedPictureHash", m_decodedPictureHashSEIEnabled, 1, "Control handling of decoded picture hash SEI messages\n" … … 151 157 } 152 158 } 159 #if H_MV 160 else 161 { 162 for ( Int curLayerId = 0; curLayerId <= m_maxLayerId; curLayerId++ ) 163 { 164 m_targetDecLayerIdSet.push_back( curLayerId ); 165 } 166 } 167 #endif 153 168 154 169 return true; 155 170 } 156 171 172 #if H_MV 173 Void TAppDecCfg::xAppendToFileNameEnd( Char* pchInputFileName, const Char* pchStringToAppend, Char*& rpchOutputFileName) 174 { 175 size_t iInLength = strlen(pchInputFileName); 176 size_t iAppendLength = strlen(pchStringToAppend); 177 178 rpchOutputFileName = (Char*) malloc(iInLength+iAppendLength+1); 179 Char* pCDot = strrchr(pchInputFileName,'.'); 180 pCDot = pCDot ? pCDot : pchInputFileName + iInLength; 181 size_t iCharsToDot = pCDot - pchInputFileName ; 182 size_t iCharsToEnd = iInLength - iCharsToDot; 183 strncpy(rpchOutputFileName , pchInputFileName , iCharsToDot ); 184 strncpy(rpchOutputFileName+ iCharsToDot , pchStringToAppend , iAppendLength); 185 strncpy(rpchOutputFileName+ iCharsToDot+iAppendLength , pchInputFileName+iCharsToDot, iCharsToEnd ); 186 rpchOutputFileName[iInLength+iAppendLength] = '\0'; 187 } 188 #endif 157 189 //! \} -
branches/HTM-DEV-0.1-dev/source/App/TAppDecoder/TAppDecCfg.h
r367 r368 58 58 protected: 59 59 Char* m_pchBitstreamFile; ///< input bitstream file name 60 #if H_MV 61 Int m_maxLayerId; ///< maximum nuh_layer_id decoded 62 std::vector<Char*> m_pchReconFiles; ///< array of output reconstruction file name create from output reconstruction file name 63 #endif 60 64 Char* m_pchReconFile; ///< output reconstruction file name 61 65 Int m_iSkipFrame; ///< counter for frames prior to the random access point to skip … … 69 73 Int m_respectDefDispWindow; ///< Only output content inside the default display window 70 74 75 #if H_MV 76 Void xAppendToFileNameEnd( Char* pchInputFileName, const Char* pchStringToAppend, Char*& rpchOutputFileName); ///< create filenames 77 #endif 71 78 public: 72 79 TAppDecCfg() 73 80 : m_pchBitstreamFile(NULL) 81 #if H_MV 82 , m_maxLayerId(0) 83 , m_pchReconFiles(NULL) 84 #endif 74 85 , m_pchReconFile(NULL) 75 86 , m_iSkipFrame(0) -
branches/HTM-DEV-0.1-dev/source/App/TAppDecoder/TAppDecTop.cpp
r367 r368 54 54 55 55 TAppDecTop::TAppDecTop() 56 #if !H_MV 56 57 : m_iPOCLastDisplay(-MAX_INT) 58 #else 59 : m_numDecoders( 0 ) 60 #endif 57 61 { 58 62 ::memset (m_abDecFlag, 0, sizeof (m_abDecFlag)); 63 #if H_MV 64 for (Int i = 0; i < MAX_NUM_LAYER_IDS; i++) m_layerIdToDecIdx[i] = -1; 65 #endif 59 66 } 60 67 … … 70 77 m_pchBitstreamFile = NULL; 71 78 } 79 #if H_MV 80 for (Int decIdx = 0; decIdx < m_numDecoders; decIdx++) 81 { 82 if (m_pchReconFiles[decIdx]) 83 { 84 free (m_pchReconFiles[decIdx]); 85 m_pchReconFiles[decIdx] = NULL; 86 } 87 } 88 #endif 72 89 if (m_pchReconFile) 73 90 { … … 92 109 { 93 110 Int poc; 111 #if H_MV 112 poc = -1; 113 #endif 94 114 TComList<TComPic*>* pcListPic = NULL; 95 115 … … 106 126 xCreateDecLib(); 107 127 xInitDecLib (); 128 #if !H_MV 108 129 m_iPOCLastDisplay += m_iSkipFrame; // set the last displayed POC correctly for skip forward. 109 130 110 131 // main decoder loop 111 132 Bool recon_opened = false; // reconstruction file not yet opened. (must be performed after SPS is seen) 133 #else 134 Int pocCurrPic = -MAX_INT; 135 Int pocLastPic = -MAX_INT; 136 137 Int layerIdLastPic = 0; 138 Int layerIdCurrPic = 0; 139 140 Int decIdxLastPic = 0; 141 Int decIdxCurrPic = 0; 142 143 Bool firstSlice = true; 144 #endif 112 145 113 146 while (!!bitstreamFile) … … 119 152 streampos location = bitstreamFile.tellg(); 120 153 AnnexBStats stats = AnnexBStats(); 154 #if !H_MV 121 155 Bool bPreviousPictureDecoded = false; 156 #endif 122 157 123 158 vector<uint8_t> nalUnit; … … 127 162 // call actual decoding function 128 163 Bool bNewPicture = false; 164 #if H_MV 165 Bool newSliceDiffPoc = false; 166 Bool newSliceDiffLayer = false; 167 Bool allLayersDecoded = false; 168 #endif 129 169 if (nalUnit.empty()) 130 170 { … … 139 179 { 140 180 read(nalu, nalUnit); 181 #if H_MV 182 Int decIdx = xGetDecoderIdx( nalu.m_layerId , true ); 183 184 if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer) || !isNaluWithinTargetDecLayerIdSet(&nalu) ) 185 { 186 bNewPicture = false; 187 } 188 else 189 { 190 newSliceDiffLayer = nalu.isSlice() && ( nalu.m_layerId != layerIdCurrPic ) && !firstSlice; 191 newSliceDiffPoc = m_tDecTop[decIdx]->decode(nalu, m_iSkipFrame, m_pocLastDisplay[decIdx], newSliceDiffLayer ); 192 // decode function only returns true when all of the following conditions are true 193 // - poc in particular layer changes 194 // - nalu does not belong to first slice in layer 195 // - nalu.isSlice() == true 196 197 bNewPicture = newSliceDiffLayer || newSliceDiffPoc; 198 199 if ( nalu.isSlice() && firstSlice ) 200 { 201 layerIdCurrPic = nalu.m_layerId; 202 pocCurrPic = m_tDecTop[decIdx]->getCurrPoc(); 203 decIdxCurrPic = decIdx; 204 firstSlice = false; 205 } 206 207 if ( bNewPicture || !bitstreamFile ) 208 { 209 layerIdLastPic = layerIdCurrPic; 210 layerIdCurrPic = nalu.m_layerId; 211 212 pocLastPic = pocCurrPic; 213 pocCurrPic = m_tDecTop[decIdx]->getCurrPoc(); 214 215 decIdxLastPic = decIdxCurrPic; 216 decIdxCurrPic = decIdx; 217 218 allLayersDecoded = ( pocCurrPic != pocLastPic ); 219 } 220 221 222 #else 141 223 if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer) || !isNaluWithinTargetDecLayerIdSet(&nalu) ) 142 224 { … … 154 236 { 155 237 bNewPicture = m_cTDecTop.decode(nalu, m_iSkipFrame, m_iPOCLastDisplay); 238 #endif 156 239 if (bNewPicture) 157 240 { … … 164 247 bytestream.reset(); 165 248 } 249 #if !H_MV 166 250 bPreviousPictureDecoded = true; 251 #endif 167 252 } 168 253 } 169 254 if (bNewPicture || !bitstreamFile) 170 255 { 256 #if H_MV 257 assert( decIdxLastPic != -1 ); 258 m_tDecTop[decIdxLastPic]->endPicDecoding(poc, pcListPic, m_targetDecLayerIdSet ); 259 #else 171 260 m_cTDecTop.executeLoopFilters(poc, pcListPic); 172 } 261 #endif 262 } 263 #if H_3D 264 if ( allLayersDecoded || !bitstreamFile ) 265 { 266 for( Int dI = 0; dI < m_numDecoders; dI++ ) 267 { 268 TComPic* picLastCoded = m_ivPicLists.getPic( m_tDecTop[dI]->getLayerId(), pocLastPic ); 269 assert( picLastCoded != NULL ); 270 picLastCoded->compressMotion(); 271 } 272 } 273 #endif 173 274 174 275 if( pcListPic ) 175 276 { 277 #if H_MV 278 if ( m_pchReconFiles[decIdxLastPic] && !m_reconOpen[decIdxLastPic] ) 279 #else 176 280 if ( m_pchReconFile && !recon_opened ) 281 #endif 177 282 { 178 283 if (!m_outputBitDepthY) { m_outputBitDepthY = g_bitDepthY; } 179 284 if (!m_outputBitDepthC) { m_outputBitDepthC = g_bitDepthC; } 180 285 286 #if H_MV 287 m_tVideoIOYuvReconFile[decIdxLastPic]->open( m_pchReconFiles[decIdxLastPic], true, m_outputBitDepthY, m_outputBitDepthC, g_bitDepthY, g_bitDepthC ); // write mode 288 m_reconOpen[decIdxLastPic] = true; 289 } 290 if ( bNewPicture && newSliceDiffPoc && 291 #else 181 292 m_cTVideoIOYuvReconFile.open( m_pchReconFile, true, m_outputBitDepthY, m_outputBitDepthC, g_bitDepthY, g_bitDepthC ); // write mode 182 293 recon_opened = true; 183 294 } 184 295 if ( bNewPicture && 296 #endif 185 297 ( nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL 186 298 || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP … … 189 301 || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_LP ) ) 190 302 { 303 #if H_MV 304 xFlushOutput( pcListPic, decIdxLastPic ); 305 #else 191 306 xFlushOutput( pcListPic ); 307 #endif 192 308 } 193 309 // write reconstruction to file 194 310 if(bNewPicture) 195 311 { 312 #if H_MV 313 xWriteOutput( pcListPic, decIdxLastPic, nalu.m_temporalId ); 314 } 315 } 316 } 317 318 for(UInt decIdx = 0; decIdx < m_numDecoders; decIdx++) 319 { 320 xFlushOutput( m_tDecTop[decIdx]->getListPic(), decIdx ); 321 } 322 #else 196 323 xWriteOutput( pcListPic, nalu.m_temporalId ); 197 324 } … … 202 329 // delete buffers 203 330 m_cTDecTop.deletePicBuffer(); 331 #endif 204 332 205 333 // destroy internal classes … … 213 341 Void TAppDecTop::xCreateDecLib() 214 342 { 343 #if H_MV 344 // initialize global variables 345 initROM(); 346 #else 215 347 // create decoder class 216 348 m_cTDecTop.create(); 349 #endif 217 350 } 218 351 219 352 Void TAppDecTop::xDestroyDecLib() 220 353 { 354 #if H_MV 355 // destroy ROM 356 destroyROM(); 357 358 for(Int decIdx = 0; decIdx < m_numDecoders ; decIdx++) 359 { 360 if( m_tVideoIOYuvReconFile[decIdx] ) 361 { 362 m_tVideoIOYuvReconFile[decIdx]->close(); 363 delete m_tVideoIOYuvReconFile[decIdx]; 364 m_tVideoIOYuvReconFile[decIdx] = NULL ; 365 } 366 367 if( m_tDecTop[decIdx] ) 368 { 369 m_tDecTop[decIdx]->deletePicBuffer(); 370 m_tDecTop[decIdx]->destroy() ; 371 } 372 delete m_tDecTop[decIdx] ; 373 m_tDecTop[decIdx] = NULL ; 374 } 375 #else 221 376 if ( m_pchReconFile ) 222 377 { … … 226 381 // destroy decoder class 227 382 m_cTDecTop.destroy(); 383 #endif 228 384 } 229 385 230 386 Void TAppDecTop::xInitDecLib() 231 387 { 388 #if !H_MV 232 389 // initialize decoder class 233 390 m_cTDecTop.init(); 234 391 m_cTDecTop.setDecodedPictureHashSEIEnabled(m_decodedPictureHashSEIEnabled); 392 #endif 235 393 } 236 394 … … 238 396 \todo DYN_REF_FREE should be revised 239 397 */ 398 #if H_MV 399 Void TAppDecTop::xWriteOutput( TComList<TComPic*>* pcListPic, Int decIdx, Int tId ) 400 #else 240 401 Void TAppDecTop::xWriteOutput( TComList<TComPic*>* pcListPic, UInt tId ) 402 #endif 241 403 { 242 404 TComList<TComPic*>::iterator iterPic = pcListPic->begin(); … … 246 408 { 247 409 TComPic* pcPic = *(iterPic); 410 #if H_MV 411 if(pcPic->getOutputMark() && pcPic->getPOC() > m_pocLastDisplay[decIdx]) 412 #else 248 413 if(pcPic->getOutputMark() && pcPic->getPOC() > m_iPOCLastDisplay) 414 #endif 249 415 { 250 416 not_displayed++; … … 258 424 TComPic* pcPic = *(iterPic); 259 425 426 #if H_MV 427 if ( pcPic->getOutputMark() && (not_displayed > pcPic->getNumReorderPics(tId) && pcPic->getPOC() > m_pocLastDisplay[decIdx])) 428 #else 260 429 if ( pcPic->getOutputMark() && (not_displayed > pcPic->getNumReorderPics(tId) && pcPic->getPOC() > m_iPOCLastDisplay)) 430 #endif 261 431 { 262 432 // write to file 263 433 not_displayed--; 434 #if H_MV 435 if ( m_pchReconFiles[decIdx] ) 436 #else 264 437 if ( m_pchReconFile ) 438 #endif 265 439 { 266 440 const Window &conf = pcPic->getConformanceWindow(); 267 441 const Window &defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window(); 442 #if H_MV 443 m_tVideoIOYuvReconFile[decIdx]->write( pcPic->getPicYuvRec(), 444 #else 268 445 m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(), 446 #endif 269 447 conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), 270 448 conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), … … 274 452 275 453 // update POC of display order 454 #if H_MV 455 m_pocLastDisplay[decIdx] = pcPic->getPOC(); 456 #else 276 457 m_iPOCLastDisplay = pcPic->getPOC(); 458 #endif 277 459 278 460 // erase non-referenced picture in the reference picture list after display … … 302 484 \todo DYN_REF_FREE should be revised 303 485 */ 486 #if H_MV 487 Void TAppDecTop::xFlushOutput( TComList<TComPic*>* pcListPic, Int decIdx ) 488 #else 304 489 Void TAppDecTop::xFlushOutput( TComList<TComPic*>* pcListPic ) 490 #endif 305 491 { 306 492 if(!pcListPic) … … 319 505 { 320 506 // write to file 507 #if H_MV 508 if ( m_pchReconFiles[decIdx] ) 509 #else 321 510 if ( m_pchReconFile ) 511 #endif 322 512 { 323 513 const Window &conf = pcPic->getConformanceWindow(); 324 514 const Window &defDisp = m_respectDefDispWindow ? pcPic->getDefDisplayWindow() : Window(); 515 #if H_MV 516 m_tVideoIOYuvReconFile[decIdx]->write( pcPic->getPicYuvRec(), 517 #else 325 518 m_cTVideoIOYuvReconFile.write( pcPic->getPicYuvRec(), 519 #endif 326 520 conf.getWindowLeftOffset() + defDisp.getWindowLeftOffset(), 327 521 conf.getWindowRightOffset() + defDisp.getWindowRightOffset(), … … 331 525 332 526 // update POC of display order 527 #if H_MV 528 m_pocLastDisplay[decIdx] = pcPic->getPOC(); 529 #else 333 530 m_iPOCLastDisplay = pcPic->getPOC(); 531 #endif 334 532 335 533 // erase non-referenced picture in the reference picture list after display … … 351 549 pcPic->setOutputMark(false); 352 550 } 551 #if !H_MV 353 552 #if !DYN_REF_FREE 354 553 if(pcPic) … … 359 558 } 360 559 #endif 560 #endif 361 561 iterPic++; 362 562 } 563 #if H_MV 564 m_pocLastDisplay[decIdx] = -MAX_INT; 565 #else 363 566 pcListPic->clear(); 364 567 m_iPOCLastDisplay = -MAX_INT; 568 #endif 365 569 } 366 570 … … 375 579 for (std::vector<Int>::iterator it = m_targetDecLayerIdSet.begin(); it != m_targetDecLayerIdSet.end(); it++) 376 580 { 581 #if H_MV 582 if ( nalu->m_layerId == (*it) ) 583 #else 377 584 if ( nalu->m_reservedZero6Bits == (*it) ) 585 #endif 378 586 { 379 587 return true; -
branches/HTM-DEV-0.1-dev/source/App/TAppDecoder/TAppDecTop.h
r367 r368 61 61 private: 62 62 // class interface 63 #if H_MV 64 TDecTop* m_tDecTop [ MAX_NUM_LAYERS ]; ///< decoder classes 65 TVideoIOYuv* m_tVideoIOYuvReconFile[ MAX_NUM_LAYERS ]; ///< reconstruction YUV class 66 Int m_layerIdToDecIdx [ MAX_NUM_LAYER_IDS ]; ///< maping from layer id to decoder index 67 Int m_numDecoders; ///< number of decoder instances 68 TComPicLists m_ivPicLists; ///< picture buffers of decoder instances 69 #else 63 70 TDecTop m_cTDecTop; ///< decoder class 64 71 TVideoIOYuv m_cTVideoIOYuvReconFile; ///< reconstruction YUV class 72 #endif 65 73 66 74 // for output control 67 75 Bool m_abDecFlag[ MAX_GOP ]; ///< decoded flag in one GOP 76 #if H_MV 77 Int m_pocLastDisplay [ MAX_NUM_LAYERS ]; ///< last POC in display order 78 Bool m_reconOpen [ MAX_NUM_LAYERS ]; ///< reconstruction file opened 79 #else 68 80 Int m_iPOCLastDisplay; ///< last POC in display order 81 #endif 69 82 70 83 public: … … 81 94 Void xInitDecLib (); ///< initialize decoder class 82 95 96 #if H_MV 97 Void xWriteOutput ( TComList<TComPic*>* pcListPic, Int layerId, Int tId ); ///< write YUV to file 98 Void xFlushOutput ( TComList<TComPic*>* pcListPic, Int layerId ); ///< flush all remaining decoded pictures to file 99 Int xGetDecoderIdx ( Int layerId, Bool createFlag = false ) 100 { 101 Int decIdx = -1; 102 if ( m_layerIdToDecIdx[ layerId ] != -1 ) 103 { 104 decIdx = m_layerIdToDecIdx[ layerId ]; 105 } 106 else 107 { 108 assert ( createFlag ); 109 assert( m_numDecoders < MAX_NUM_LAYERS ); 110 111 decIdx = m_numDecoders; 112 113 // Init decoder 114 m_tDecTop[ decIdx ] = new TDecTop; 115 m_tDecTop[ decIdx ]->create(); 116 m_tDecTop[ decIdx ]->init( ); 117 m_tDecTop[ decIdx ]->setLayerId( layerId ); 118 m_tDecTop[ decIdx ]->setDecodedPictureHashSEIEnabled(m_decodedPictureHashSEIEnabled); 119 m_tDecTop[ decIdx ]->setIvPicLists( &m_ivPicLists ); 120 121 // append pic list of new decoder to PicLists 122 assert( m_ivPicLists.size() == m_numDecoders ); 123 m_ivPicLists.push_back( m_tDecTop[ decIdx ]->getListPic() ); 124 125 // create recon file related stuff 126 Char* pchTempFilename = NULL; 127 if ( m_pchReconFile ) 128 { 129 Char buffer[4]; 130 sprintf(buffer,"_%i", layerId ); 131 assert ( m_pchReconFile ); 132 xAppendToFileNameEnd( m_pchReconFile , buffer, pchTempFilename ); 133 assert( m_pchReconFiles.size() == m_numDecoders ); 134 } 135 136 m_pchReconFiles.push_back( pchTempFilename ); 137 138 m_tVideoIOYuvReconFile[ decIdx ] = new TVideoIOYuv; 139 m_reconOpen [ decIdx ] = false; 140 141 // set others 142 m_pocLastDisplay [ decIdx ] = -MAX_INT; 143 m_layerIdToDecIdx [ layerId ] = decIdx; 144 145 m_numDecoders++; 146 }; 147 return decIdx; 148 } 149 #else 83 150 Void xWriteOutput ( TComList<TComPic*>* pcListPic , UInt tId); ///< write YUV to file 84 151 Void xFlushOutput ( TComList<TComPic*>* pcListPic ); ///< flush all remaining decoded pictures to file 152 #endif 85 153 Bool isNaluWithinTargetDecLayerIdSet ( InputNALUnit* nalu ); ///< check whether given Nalu is within targetDecLayerIdSet 86 154 }; -
branches/HTM-DEV-0.1-dev/source/App/TAppDecoder/decmain.cpp
r367 r368 56 56 // print information 57 57 fprintf( stdout, "\n" ); 58 #if H_MV 59 fprintf( stdout, "3D-HTM Software: Decoder Version [%s] based on HM Version [%s]", NV_VERSION, HM_VERSION ); 60 #else 58 61 fprintf( stdout, "HM software: Decoder Version [%s]", NV_VERSION ); 62 #endif 59 63 fprintf( stdout, NVM_ONOS ); 60 64 fprintf( stdout, NVM_COMPILEDBY ); -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncCfg.cpp
r367 r368 64 64 65 65 TAppEncCfg::TAppEncCfg() 66 #if H_MV 67 : m_pchBitstreamFile() 68 #else 66 69 : m_pchInputFile() 67 70 , m_pchBitstreamFile() 68 71 , m_pchReconFile() 72 #endif 69 73 , m_pchdQPFile() 70 74 , m_pColumnWidth() … … 72 76 , m_scalingListFile() 73 77 { 78 #if !H_MV 74 79 m_aidQP = NULL; 80 #endif 75 81 #if J0149_TONE_MAPPING_SEI 76 82 m_startOfCodedInterval = NULL; … … 82 88 TAppEncCfg::~TAppEncCfg() 83 89 { 90 #if H_MV 91 for( Int layer = 0; layer < m_aidQP.size(); layer++ ) 92 { 93 if ( m_aidQP[layer] != NULL ) 94 { 95 delete[] m_aidQP[layer]; 96 m_aidQP[layer] = NULL; 97 } 98 } 99 for(Int i = 0; i< m_pchInputFileList.size(); i++ ) 100 { 101 if ( m_pchInputFileList[i] != NULL ) 102 free (m_pchInputFileList[i]); 103 } 104 #else 84 105 if ( m_aidQP ) 85 106 { 86 107 delete[] m_aidQP; 87 108 } 109 #endif 88 110 #if J0149_TONE_MAPPING_SEI 89 111 if ( m_startOfCodedInterval ) … … 103 125 } 104 126 #endif 127 #if !H_MV 105 128 free(m_pchInputFile); 129 #endif 106 130 free(m_pchBitstreamFile); 131 #if H_MV 132 for(Int i = 0; i< m_pchReconFileList.size(); i++ ) 133 { 134 if ( m_pchReconFileList[i] != NULL ) 135 free (m_pchReconFileList[i]); 136 } 137 #else 107 138 free(m_pchReconFile); 139 #endif 108 140 free(m_pchdQPFile); 109 141 free(m_pColumnWidth); 110 142 free(m_pRowHeight); 111 143 free(m_scalingListFile); 144 #if H_MV 145 for( Int i = 0; i < m_GOPListMvc.size(); i++ ) 146 { 147 if( m_GOPListMvc[i] ) 148 { 149 delete[] m_GOPListMvc[i]; 150 m_GOPListMvc[i] = NULL; 151 } 152 } 153 #endif 112 154 } 113 155 … … 161 203 } 162 204 #endif 205 #if H_MV 206 in>>entry.m_numInterViewRefPics; 207 for( Int i = 0; i < entry.m_numInterViewRefPics; i++ ) 208 { 209 in>>entry.m_interViewRefs[i]; 210 } 211 for( Int i = 0; i < entry.m_numInterViewRefPics; i++ ) 212 { 213 in>>entry.m_interViewRefPosL[0][i]; 214 } 215 for( Int i = 0; i < entry.m_numInterViewRefPics; i++ ) 216 { 217 in>>entry.m_interViewRefPosL[1][i]; 218 } 219 #endif 163 220 return in; 164 221 } … … 172 229 {"main10", Profile::MAIN10}, 173 230 {"main-still-picture", Profile::MAINSTILLPICTURE}, 231 #if H_MV 232 {"main-stereo", Profile::MAINSTEREO}, 233 {"main-multiview", Profile::MAINMULTIVIEW}, 234 #if H_3D 235 {"main-3d" , Profile::MAIN3D}, 236 #endif 237 #endif 174 238 }; 175 239 … … 253 317 Bool do_help = false; 254 318 319 #if !H_MV 255 320 string cfg_InputFile; 321 #endif 256 322 string cfg_BitstreamFile; 323 #if !H_MV 257 324 string cfg_ReconFile; 325 #endif 326 #if H_MV 327 vector<Int> cfg_dimensionLength; 328 #if H_3D 329 cfg_dimensionLength.push_back( 2 ); // depth 330 cfg_dimensionLength.push_back( 32 ); // texture 331 #else 332 cfg_dimensionLength.push_back( 64 ); 333 #endif 334 #endif 258 335 string cfg_dQPFile; 259 336 string cfg_ColumnWidth; … … 279 356 280 357 // File, I/O and source parameters 358 #if H_MV 359 ("InputFile_%d,i_%d", m_pchInputFileList, (char *) 0 , MAX_NUM_LAYER_IDS , "original Yuv input file name %d") 360 #else 281 361 ("InputFile,i", cfg_InputFile, string(""), "Original YUV input file name") 362 #endif 282 363 ("BitstreamFile,b", cfg_BitstreamFile, string(""), "Bitstream output file name") 364 #if H_MV 365 ("ReconFile_%d,o_%d", m_pchReconFileList, (char *) 0 , MAX_NUM_LAYER_IDS , "reconstructed Yuv output file name %d") 366 #else 283 367 ("ReconFile,o", cfg_ReconFile, string(""), "Reconstructed YUV output file name") 368 #endif 369 #if H_MV 370 ("NumberOfLayers", m_numberOfLayers , 1, "Number of layers") 371 #if !H_3D 372 ("ScalabilityMask", m_scalabilityMask , 1 , "Scalability Mask") 373 #else 374 ("ScalabilityMask", m_scalabilityMask , 3 , "Scalability Mask, 1: Texture 3: Texture + Depth ") 375 #endif 376 ("DimensionIdLen", m_dimensionIdLen , cfg_dimensionLength , "Number of bits used to store dimensions Id") 377 ("ViewId", m_viewId , std::vector<Int>(1,0), "View Id") 378 #if H_3D 379 ("DepthFlag", m_depthFlag , std::vector<Int>(1,0), "Depth Flag") 380 #endif 381 ("LayerIdInNuh", m_layerIdInNuh , std::vector<Int>(1,0), "LayerId in Nuh") 382 ("SplittingFlag", m_splittingFlag , false , "Splitting Flag") 383 #endif 284 384 ("SourceWidth,-wdt", m_iSourceWidth, 0, "Source picture width") 285 385 ("SourceHeight,-hgt", m_iSourceHeight, 0, "Source picture height") … … 353 453 354 454 /* Quantization parameters */ 455 #if H_MV 456 ("QP,q", m_fQP, std::vector<double>(1,30.0), "Qp values for each layer, if value is float, QP is switched once during encoding") 457 #else 355 458 ("QP,q", m_fQP, 30.0, "Qp value, if value is float, QP is switched once during encoding") 459 #endif 356 460 ("DeltaQpRD,-dqr",m_uiDeltaQpRD, 0u, "max dQp offset for slice") 357 461 ("MaxDeltaQP,d", m_iMaxDeltaQP, 0, "max dQp offset for block") … … 377 481 378 482 // Deblocking filter parameters 483 #if H_MV 484 ("LoopFilterDisable", m_bLoopFilterDisable, std::vector<Bool>(1,false), "Disable Loop Filter per Layer" ) 485 #else 379 486 ("LoopFilterDisable", m_bLoopFilterDisable, false ) 487 #endif 380 488 ("LoopFilterOffsetInPPS", m_loopFilterOffsetInPPS, false ) 381 489 ("LoopFilterBetaOffset_div2", m_loopFilterBetaOffsetDiv2, 0 ) … … 390 498 ("TransformSkip", m_useTransformSkip, false, "Intra transform skipping") 391 499 ("TransformSkipFast", m_useTransformSkipFast, false, "Fast intra transform skipping") 500 #if H_MV 501 ("SAO", m_bUseSAO, std::vector<Bool>(1,true), "Enable Sample Adaptive Offset per Layer") 502 #else 392 503 ("SAO", m_bUseSAO, true, "Enable Sample Adaptive Offset") 504 #endif 393 505 ("MaxNumOffsetsPerPic", m_maxNumOffsetsPerPic, 2048, "Max number of SAO offset per picture (Default: 2048)") 394 506 ("SAOLcuBoundary", m_saoLcuBoundary, false, "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas") … … 572 684 ; 573 685 686 #if H_MV 687 // parse coding structure 688 for( Int k = 0; k < MAX_NUM_LAYERS; k++ ) 689 { 690 m_GOPListMvc.push_back( new GOPEntry[MAX_GOP + 1] ); 691 if( k == 0 ) 692 { 693 for( Int i = 1; i < MAX_GOP + 1; i++ ) 694 { 695 std::ostringstream cOSS; 696 cOSS<<"Frame"<<i; 697 opts.addOptions()( cOSS.str(), m_GOPListMvc[k][i-1], GOPEntry() ); 698 } 699 } 700 else 701 { 702 std::ostringstream cOSS1; 703 cOSS1<<"FrameI"<<"_l"<<k; 704 opts.addOptions()(cOSS1.str(), m_GOPListMvc[k][MAX_GOP], GOPEntry()); 705 706 for( Int i = 1; i < MAX_GOP + 1; i++ ) 707 { 708 std::ostringstream cOSS2; 709 cOSS2<<"Frame"<<i<<"_l"<<k; 710 opts.addOptions()(cOSS2.str(), m_GOPListMvc[k][i-1], GOPEntry()); 711 } 712 } 713 } 714 #else 574 715 for(Int i=1; i<MAX_GOP+1; i++) { 575 716 std::ostringstream cOSS; … … 577 718 opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry()); 578 719 } 720 #endif 579 721 po::setDefaults(opts); 580 722 const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv); … … 596 738 */ 597 739 /* convert std::string to c string for compatability */ 740 #if !H_MV 598 741 m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str()); 742 #endif 599 743 m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str()); 744 #if !H_MV 600 745 m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str()); 746 #endif 601 747 m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str()); 602 748 … … 658 804 m_pRowHeight = NULL; 659 805 } 806 #if H_MV 807 free ( pColumnWidth ); 808 free ( pRowHeight ); 809 #endif 660 810 #if SIGNAL_BITRATE_PICRATE_IN_VPS 661 811 readBoolString(cfg_bitRateInfoPresentFlag, m_bitRatePicRateMaxTLayers, m_bitRateInfoPresentFlag, "bit rate info. present flag" ); … … 737 887 738 888 // allocate slice-based dQP values 889 #if H_MV 890 xResizeVector( m_viewId ); 891 #if H_3D 892 xResizeVector( m_depthFlag ); 893 #endif 894 895 xResizeVector( m_fQP ); 896 897 for( Int layer = 0; layer < m_numberOfLayers; layer++ ) 898 { 899 m_aidQP.push_back( new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ] ); 900 ::memset( m_aidQP[layer], 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) ); 901 902 // handling of floating-point QP values 903 // if QP is not integer, sequence is split into two sections having QP and QP+1 904 m_iQP.push_back((Int)( m_fQP[layer] )); 905 if ( m_iQP[layer] < m_fQP[layer] ) 906 { 907 Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP[layer] - m_iQP[layer])*m_framesToBeEncoded + 0.5 ); 908 909 iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize; 910 for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ ) 911 { 912 m_aidQP[layer][i] = 1; 913 } 914 } 915 } 916 917 xResizeVector( m_bLoopFilterDisable ); 918 xResizeVector( m_bUseSAO ); 919 920 #else 739 921 m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ]; 740 922 ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) ); … … 753 935 } 754 936 } 937 #endif 755 938 756 939 // reading external dQP description from file … … 760 943 if ( fpt ) 761 944 { 945 #if H_MV 946 for( Int layer = 0; layer < m_numberOfLayers; layer++ ) 947 { 948 #endif 762 949 Int iValue; 763 950 Int iPOC = 0; … … 765 952 { 766 953 if ( fscanf(fpt, "%d", &iValue ) == EOF ) break; 954 #if H_MV 955 m_aidQP[layer][ iPOC ] = iValue; 956 iPOC++; 957 } 958 #else 767 959 m_aidQP[ iPOC ] = iValue; 768 960 iPOC++; 961 #endif 769 962 } 770 963 fclose(fpt); … … 932 1125 xConfirmPara( m_iFrameRate <= 0, "Frame rate must be more than 1" ); 933 1126 xConfirmPara( m_framesToBeEncoded <= 0, "Total Number Of Frames encoded must be more than 0" ); 1127 #if H_MV 1128 xConfirmPara( m_numberOfLayers > MAX_NUM_LAYER_IDS , "NumberOfLayers must be less than or equal to MAX_NUM_LAYER_IDS"); 1129 1130 1131 xConfirmPara( m_layerIdInNuh[0] != 0 , "LayerIdInNuh must be 0 for the first layer. "); 1132 xConfirmPara( (m_layerIdInNuh.size()!=1) && (m_layerIdInNuh.size() < m_numberOfLayers) , "LayerIdInNuh must be given for all layers. "); 1133 1134 #if H_3D 1135 xConfirmPara( m_scalabilityMask != 1 && m_scalabilityMask != 3, "Scalability Mask must be equal to 1 or 3. "); 1136 #else 1137 xConfirmPara( m_scalabilityMask != 1 , "Scalability Mask must be equal to 1. "); 1138 #endif 1139 1140 m_dimIds.push_back( m_viewId ); 1141 #if H_3D 1142 if ( m_scalabilityMask & ( 1 << DEPTH_ID ) ) 1143 m_dimIds.push_back( m_depthFlag ); 1144 #endif 1145 1146 xConfirmPara( m_dimensionIdLen.size() < m_dimIds.size(), "DimensionIdLen must be given for all dimensions. " ); 1147 1148 for( Int dim = 0; dim < m_dimIds.size(); dim++ ) 1149 { 1150 xConfirmPara( m_dimIds[dim].size() < m_numberOfLayers, "DimensionId must be given for all layers and all dimensions. "); 1151 xConfirmPara( m_dimIds[dim][0] != 0, "DimensionId of layer 0 must be 0 in all dimensions. " ); 1152 xConfirmPara( m_dimensionIdLen[dim] < 1 || m_dimensionIdLen[dim] > 8, "DimensionIdLen must be greater than 0 and less than 9 in all dimensions. " ); 1153 for( Int i = 1; i < m_numberOfLayers; i++ ) 1154 { 1155 xConfirmPara( ( m_dimIds[dim][i] < 0 ) || ( m_dimIds[dim][i] > ( ( 1 << m_dimensionIdLen[dim] ) - 1 ) ) , "DimensionId shall be in the range of 0 to 2^DimensionIdLen - 1. " ); 1156 } 1157 } 1158 1159 for( Int i = 0; i < m_numberOfLayers; i++ ) 1160 { 1161 for( Int j = 0; j < i; j++ ) 1162 { 1163 Int numDiff = 0; 1164 Int lastDiff = -1; 1165 for( Int dim = 0; dim < m_dimIds.size(); dim++ ) 1166 { 1167 if ( m_dimIds[dim][i] != m_dimIds[dim][j] ) 1168 { 1169 numDiff ++; 1170 lastDiff = dim; 1171 } 1172 } 1173 1174 Bool allEqual = ( numDiff == 0 ); 1175 1176 if ( allEqual ) 1177 { 1178 printf( "\nError: Positions of Layers %d and %d are identical in scalability space\n", i, j); 1179 } 1180 1181 xConfirmPara( allEqual , "Each layer shall have a different position in scalability space." ); 1182 1183 if ( numDiff == 1 ) 1184 { 1185 Bool inc = m_dimIds[ lastDiff ][ i ] > m_dimIds[ lastDiff ][ j ]; 1186 if ( !inc ) 1187 { 1188 printf( "\nError: Positions of Layers %d and %d is not increasing in dimension %d \n", i, j, lastDiff); 1189 } 1190 xConfirmPara( !inc, "DimensionIds shall be increasing within one dimension. " ); 1191 } 1192 } 1193 } 1194 1195 #endif 934 1196 xConfirmPara( m_iGOPSize < 1 , "GOP Size must be greater or equal to 1" ); 935 1197 xConfirmPara( m_iGOPSize > 1 && m_iGOPSize % 2, "GOP Size must be a multiple of 2, if GOP Size is greater than 1" ); 936 1198 xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" ); 937 1199 xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2, "Decoding Refresh Type must be equal to 0, 1 or 2" ); 1200 #if H_MV 1201 for( Int layer = 0; layer < m_numberOfLayers; layer++ ) 1202 { 1203 xConfirmPara( m_iQP[layer] < -6 * (m_internalBitDepthY - 8) || m_iQP[layer] > 51, "QP exceeds supported range (-QpBDOffsety to 51)" ); 1204 } 1205 #else 938 1206 xConfirmPara( m_iQP < -6 * (m_internalBitDepthY - 8) || m_iQP > 51, "QP exceeds supported range (-QpBDOffsety to 51)" ); 1207 #endif 939 1208 xConfirmPara( m_loopFilterBetaOffsetDiv2 < -13 || m_loopFilterBetaOffsetDiv2 > 13, "Loop Filter Beta Offset div. 2 exceeds supported range (-13 to 13)"); 940 1209 xConfirmPara( m_loopFilterTcOffsetDiv2 < -13 || m_loopFilterTcOffsetDiv2 > 13, "Loop Filter Tc Offset div. 2 exceeds supported range (-13 to 13)"); … … 980 1249 981 1250 #if ADAPTIVE_QP_SELECTION 1251 #if H_MV 1252 for( Int layer = 0; layer < m_numberOfLayers; layer++ ) 1253 { 1254 xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP[layer] < 0, "AdaptiveQpSelection must be disabled when QP < 0."); 1255 } 1256 #else 982 1257 xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP < 0, "AdaptiveQpSelection must be disabled when QP < 0."); 1258 #endif 983 1259 xConfirmPara( m_bUseAdaptQpSelect == true && (m_cbQpOffset !=0 || m_crQpOffset != 0 ), "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0."); 984 1260 #endif … … 1034 1310 } 1035 1311 1312 #if H_MV 1313 // validate that POC of same frame is identical across multiple layers 1314 Bool bErrorMvePoc = false; 1315 if( m_numberOfLayers > 1 ) 1316 { 1317 for( Int k = 1; k < m_numberOfLayers; k++ ) 1318 { 1319 for( Int i = 0; i < MAX_GOP; i++ ) 1320 { 1321 if( m_GOPListMvc[k][i].m_POC != m_GOPListMvc[0][i].m_POC ) 1322 { 1323 printf( "\nError: Frame%d_l%d POC %d is not identical to Frame%d POC\n", i, k, m_GOPListMvc[k][i].m_POC, i ); 1324 bErrorMvePoc = true; 1325 } 1326 } 1327 } 1328 } 1329 xConfirmPara( bErrorMvePoc, "Invalid inter-layer POC structure given" ); 1330 1331 // validate that baseview has no inter-view refs 1332 Bool bErrorIvpBase = false; 1333 for( Int i = 0; i < MAX_GOP; i++ ) 1334 { 1335 if( m_GOPListMvc[0][i].m_numInterViewRefPics != 0 ) 1336 { 1337 printf( "\nError: Frame%d inter_layer refs not available in layer 0\n", i ); 1338 bErrorIvpBase = true; 1339 } 1340 } 1341 xConfirmPara( bErrorIvpBase, "Inter-layer refs not possible in base layer" ); 1342 1343 // validate inter-view refs 1344 Bool bErrorIvpEnhV = false; 1345 if( m_numberOfLayers > 1 ) 1346 { 1347 for( Int k = 1; k < m_numberOfLayers; k++ ) 1348 { 1349 for( Int i = 0; i < MAX_GOP+1; i++ ) 1350 { 1351 for( Int j = 0; j < m_GOPListMvc[k][i].m_numInterViewRefPics; j++ ) 1352 { 1353 Int iAbsViewId = m_GOPListMvc[k][i].m_interViewRefs[j] + k; 1354 if( iAbsViewId < 0 || iAbsViewId >= k ) 1355 { 1356 printf( "\nError: inter-layer ref pic %d is not available for Frame%d_l%d\n", m_GOPListMvc[k][i].m_interViewRefs[j], i, k ); 1357 bErrorIvpEnhV = true; 1358 } 1359 if( m_GOPListMvc[k][i].m_interViewRefPosL[0][j] < -1 || m_GOPListMvc[k][i].m_interViewRefPosL[0][j] > m_GOPListMvc[k][i].m_numRefPicsActive ) 1360 { 1361 printf( "\nError: inter-layer ref pos %d on L0 is not available for Frame%d_l%d\n", m_GOPListMvc[k][i].m_interViewRefPosL[0][j], i, k ); 1362 bErrorIvpEnhV = true; 1363 } 1364 if( m_GOPListMvc[k][i].m_interViewRefPosL[1][j] < -1 || m_GOPListMvc[k][i].m_interViewRefPosL[1][j] > m_GOPListMvc[k][i].m_numRefPicsActive ) 1365 { 1366 printf( "\nError: inter-layer ref pos %d on L1 is not available for Frame%d_l%d\n", m_GOPListMvc[k][i].m_interViewRefPosL[1][j], i, k ); 1367 bErrorIvpEnhV = true; 1368 } 1369 } 1370 if( i == MAX_GOP ) // inter-view refs at I pic position in base view 1371 { 1372 if( m_GOPListMvc[k][MAX_GOP].m_sliceType != 'B' && m_GOPListMvc[k][MAX_GOP].m_sliceType != 'P' && m_GOPListMvc[k][MAX_GOP].m_sliceType != 'I' ) 1373 { 1374 printf( "\nError: slice type of FrameI_l%d must be equal to B or P or I\n", k ); 1375 bErrorIvpEnhV = true; 1376 } 1377 1378 if( m_GOPListMvc[k][MAX_GOP].m_POC != 0 ) 1379 { 1380 printf( "\nError: POC %d not possible for FrameI_l%d, must be 0\n", m_GOPListMvc[k][MAX_GOP].m_POC, k ); 1381 bErrorIvpEnhV = true; 1382 } 1383 1384 if( m_GOPListMvc[k][MAX_GOP].m_temporalId != 0 ) 1385 { 1386 printf( "\nWarning: Temporal id of FrameI_l%d must be 0 (cp. I-frame in base layer)\n", k ); 1387 m_GOPListMvc[k][MAX_GOP].m_temporalId = 0; 1388 } 1389 1390 if( m_GOPListMvc[k][MAX_GOP].m_numRefPics != 0 ) 1391 { 1392 printf( "\nWarning: temporal references not possible for FrameI_l%d\n", k ); 1393 for( Int j = 0; j < m_GOPListMvc[k][MAX_GOP].m_numRefPics; j++ ) 1394 { 1395 m_GOPListMvc[k][MAX_GOP].m_referencePics[j] = 0; 1396 } 1397 m_GOPListMvc[k][MAX_GOP].m_numRefPics = 0; 1398 } 1399 1400 if( m_GOPListMvc[k][MAX_GOP].m_interRPSPrediction ) 1401 { 1402 printf( "\nError: inter RPS prediction not possible for FrameI_l%d, must be 0\n", k ); 1403 bErrorIvpEnhV = true; 1404 } 1405 1406 if( m_GOPListMvc[k][MAX_GOP].m_sliceType == 'I' && m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics != 0 ) 1407 { 1408 printf( "\nError: inter-layer prediction not possible for FrameI_l%d with slice type I, #IL_ref_pics must be 0\n", k ); 1409 bErrorIvpEnhV = true; 1410 } 1411 1412 if( m_GOPListMvc[k][MAX_GOP].m_numRefPicsActive > m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics ) 1413 { 1414 m_GOPListMvc[k][MAX_GOP].m_numRefPicsActive = m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics; 1415 } 1416 1417 if( m_GOPListMvc[k][MAX_GOP].m_sliceType == 'P' ) 1418 { 1419 if( m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics < 1 ) 1420 { 1421 printf( "\nError: #IL_ref_pics must be at least one for FrameI_l%d with slice type P\n", k ); 1422 bErrorIvpEnhV = true; 1423 } 1424 else 1425 { 1426 for( Int j = 0; j < m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics; j++ ) 1427 { 1428 if( m_GOPListMvc[k][MAX_GOP].m_interViewRefPosL[1][j] != -1 ) 1429 { 1430 printf( "\nError: inter-layer ref pos %d on L1 not possible for FrameI_l%d with slice type P\n", m_GOPListMvc[k][MAX_GOP].m_interViewRefPosL[1][j], k ); 1431 bErrorIvpEnhV = true; 1432 } 1433 } 1434 } 1435 } 1436 1437 if( m_GOPListMvc[k][MAX_GOP].m_sliceType == 'B' && m_GOPListMvc[k][MAX_GOP].m_numInterViewRefPics < 1 ) 1438 { 1439 printf( "\nError: #IL_ref_pics must be at least one for FrameI_l%d with slice type B\n", k ); 1440 bErrorIvpEnhV = true; 1441 } 1442 } 1443 } 1444 } 1445 } 1446 xConfirmPara( bErrorIvpEnhV, "Invalid inter-layer coding structure for enhancement layers given" ); 1447 1448 // validate temporal coding structure 1449 if( !bErrorMvePoc && !bErrorIvpBase && !bErrorIvpEnhV ) 1450 { 1451 for( Int layer = 0; layer < m_numberOfLayers; layer++ ) 1452 { 1453 GOPEntry* m_GOPList = m_GOPListMvc [layer]; // It is not a member, but this name helps avoiding code duplication !!! 1454 Int& m_extraRPSs = m_extraRPSsMvc [layer]; // It is not a member, but this name helps avoiding code duplication !!! 1455 Int& m_maxTempLayer = m_maxTempLayerMvc [layer]; // It is not a member, but this name helps avoiding code duplication !!! 1456 Int* m_maxDecPicBuffering = m_maxDecPicBufferingMvc[layer]; // It is not a member, but this name helps avoiding code duplication !!! 1457 Int* m_numReorderPics = m_numReorderPicsMvc [layer]; // It is not a member, but this name helps avoiding code duplication !!! 1458 #endif 1036 1459 /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure 1037 1460 * This permits the ability to omit a GOP structure specification */ … … 1067 1490 } 1068 1491 1492 #if H_MV 1493 if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable[layer]) ) 1494 #else 1069 1495 if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) ) 1496 #endif 1070 1497 { 1071 1498 for(Int i=0; i<m_iGOPSize; i++) … … 1083 1510 if(m_GOPList[curGOP].m_POC<0) 1084 1511 { 1512 #if H_MV 1513 printf("\nError: found fewer Reference Picture Sets than GOPSize for layer %d\n", layer ); 1514 #else 1085 1515 printf("\nError: found fewer Reference Picture Sets than GOPSize\n"); 1516 #endif 1086 1517 errorGOP=true; 1087 1518 } … … 1120 1551 if(!found) 1121 1552 { 1553 #if H_MV 1554 printf("\nError: ref pic %d is not available for GOP frame %d of layer %d\n", m_GOPList[curGOP].m_referencePics[i], curGOP+1, layer); 1555 #else 1122 1556 printf("\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1); 1557 #endif 1123 1558 errorGOP=true; 1124 1559 } … … 1497 1932 } 1498 1933 #endif 1934 #if H_MV 1935 } 1936 } 1937 #endif 1499 1938 1500 1939 #undef xConfirmPara … … 1532 1971 { 1533 1972 printf("\n"); 1973 #if H_MV 1974 for( Int layer = 0; layer < m_numberOfLayers; layer++) 1975 { 1976 printf("Input File %i : %s\n", layer, m_pchInputFileList[layer]); 1977 } 1978 #else 1534 1979 printf("Input File : %s\n", m_pchInputFile ); 1980 #endif 1535 1981 printf("Bitstream File : %s\n", m_pchBitstreamFile ); 1982 #if H_MV 1983 for( Int layer = 0; layer < m_numberOfLayers; layer++) 1984 { 1985 printf("Reconstruction File %i : %s\n", layer, m_pchReconFileList[layer]); 1986 } 1987 #else 1536 1988 printf("Reconstruction File : %s\n", m_pchReconFile ); 1989 #endif 1990 #if H_MV 1991 xPrintParaVector( "ViewId", m_viewId ); 1992 #endif 1993 #if H_3D 1994 xPrintParaVector( "DepthFlag", m_depthFlag ); 1995 #endif 1996 #if H_MV 1997 xPrintParaVector( "QP" , m_fQP ); 1998 xPrintParaVector( "LoopFilterDisable", m_bLoopFilterDisable ); 1999 xPrintParaVector( "SAO" , m_bUseSAO ); 2000 #endif 1537 2001 printf("Real Format : %dx%d %dHz\n", m_iSourceWidth - m_confLeft - m_confRight, m_iSourceHeight - m_confTop - m_confBottom, m_iFrameRate ); 1538 2002 printf("Internal Format : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate ); … … 1546 2010 printf("Intra period : %d\n", m_iIntraPeriod ); 1547 2011 printf("Decoding refresh type : %d\n", m_iDecodingRefreshType ); 2012 #if !H_MV 1548 2013 printf("QP : %5.2f\n", m_fQP ); 2014 #endif 1549 2015 printf("Max dQP signaling depth : %d\n", m_iMaxCuDQPDepth); 1550 2016 … … 1611 2077 } 1612 2078 printf("CIP:%d ", m_bUseConstrainedIntraPred); 2079 #if !H_MV 1613 2080 printf("SAO:%d ", (m_bUseSAO)?(1):(0)); 2081 #endif 1614 2082 printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0); 1615 2083 printf("SAOLcuBasedOptimization:%d ", (m_saoLcuBasedOptimization)?(1):(0)); -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncCfg.h
r367 r368 55 55 protected: 56 56 // file I/O 57 #if H_MV 58 std::vector<char*> m_pchInputFileList; ///< source file names 59 #else 57 60 Char* m_pchInputFile; ///< source file name 61 #endif 58 62 Char* m_pchBitstreamFile; ///< output bitstream file 63 #if H_MV 64 std::vector<char*> m_pchReconFileList; ///< output reconstruction file names 65 Int m_numberOfLayers; ///< number of Layers to Encode 66 #else 59 67 Char* m_pchReconFile; ///< output reconstruction file 68 #endif 60 69 // VPS specification 70 #if H_MV 71 std::vector< std::vector<Int> > m_dimIds; ///< dimension ids ( pointers to m_viewId and m_depthFlag 72 std::vector<Int> m_viewId; ///< view id 73 #if H_3D 74 std::vector<Int> m_depthFlag; ///< depth flag 75 #endif 76 std::vector<Int> m_layerIdInNuh; ///< layer Id in Nuh for each layer 77 Bool m_splittingFlag; ///< Splitting Flag 78 Int m_scalabilityMask; ///< Mask indicating scalabilities, 1: texture; 3: texture + depth 79 std::vector<Int> m_dimensionIdLen; ///< Length of scalability dimension s 80 #endif 61 81 Double m_adLambdaModifier[ MAX_TLAYER ]; ///< Lambda modifier array for each temporal layer 62 82 // source specification … … 88 108 Int m_iDecodingRefreshType; ///< random access type 89 109 Int m_iGOPSize; ///< GOP size of hierarchical structure 110 #if H_MV 111 Int m_extraRPSsMvc[MAX_NUM_LAYERS]; ///< extra RPSs added to handle CRA for each layer 112 std::vector< GOPEntry* > m_GOPListMvc; ///< the coding structure entries from the config file for each layer 113 Int m_numReorderPicsMvc[MAX_NUM_LAYERS][MAX_TLAYER]; ///< total number of reorder pictures for each layer 114 Int m_maxDecPicBufferingMvc[MAX_NUM_LAYERS][MAX_TLAYER]; ///< total number of reference pictures needed for decoding for each layer 115 #else 90 116 Int m_extraRPSs; ///< extra RPSs added to handle CRA 91 117 GOPEntry m_GOPList[MAX_GOP]; ///< the coding structure entries from the config file … … 96 122 Int m_maxDecPicBuffering[MAX_TLAYER]; ///< total number of reference pictures needed for decoding 97 123 #endif 124 #endif 98 125 #if !L0034_COMBINED_LIST_CLEANUP 99 126 Bool m_bUseLComb; ///< flag for using combined reference list for uni-prediction in B-slices (JCTVC-D421) … … 103 130 Bool m_enableAMP; 104 131 // coding quality 132 #if H_MV 133 std::vector<Double> m_fQP; ///< QP value of key-picture (floating point) for each layer 134 std::vector<Int> m_iQP; ///< QP value of key-picture (integer) for each layer 135 #else 105 136 Double m_fQP; ///< QP value of key-picture (floating point) 106 137 Int m_iQP; ///< QP value of key-picture (integer) 138 #endif 107 139 Char* m_pchdQPFile; ///< QP offset for each slice (initialized from external file) 140 #if H_MV 141 std::vector<Int*> m_aidQP; ///< array of slice QP values for each layer 142 #else 108 143 Int* m_aidQP; ///< array of slice QP values 144 #endif 109 145 Int m_iMaxDeltaQP; ///< max. |delta QP| 110 146 UInt m_uiDeltaQpRD; ///< dQP range for multi-pass slice QP optimization … … 121 157 Int m_iQPAdaptationRange; ///< dQP range by QP adaptation 122 158 159 #if H_MV 160 Int m_maxTempLayerMvc[MAX_NUM_LAYER_IDS]; ///< Max temporal layer for each layer 161 #else 123 162 Int m_maxTempLayer; ///< Max temporal layer 163 #endif 124 164 125 165 // coding unit (CU) definition … … 148 188 // coding tool (lossless) 149 189 Bool m_useLossless; ///< flag for using lossless coding 190 #if H_MV 191 std::vector<Bool> m_bUseSAO; 192 #else 150 193 Bool m_bUseSAO; 194 #endif 151 195 Int m_maxNumOffsetsPerPic; ///< SAO maximun number of offset per picture 152 196 Bool m_saoLcuBoundary; ///< SAO parameter estimation using non-deblocked pixels for LCU bottom and right boundary areas 153 197 Bool m_saoLcuBasedOptimization; ///< SAO LCU-based optimization 154 198 // coding tools (loop filter) 199 #if H_MV 200 std::vector<Bool> m_bLoopFilterDisable; ///< flag for using deblocking filter for each layer 201 #else 155 202 Bool m_bLoopFilterDisable; ///< flag for using deblocking filter 203 #endif 156 204 Bool m_loopFilterOffsetInPPS; ///< offset for deblocking filter in 0 = slice header, 1 = PPS 157 205 Int m_loopFilterBetaOffsetDiv2; ///< beta offset for deblocking filter … … 324 372 Void xPrintParameter (); ///< print configuration values 325 373 Void xPrintUsage (); ///< print usage 374 #if H_MV 375 template <typename T> 376 Void xResizeVector( std::vector<T> & rpcVector ) 377 { 378 for( Int layer = 0; rpcVector.size() < m_numberOfLayers; layer++ ) 379 { 380 assert( rpcVector.size() > 0 ); 381 rpcVector.push_back( rpcVector[layer] ); 382 } 383 384 385 for( ; rpcVector.size() > m_numberOfLayers; ) 386 { 387 rpcVector.pop_back( ); 388 } 389 390 } 391 392 template <typename T> 393 Void xPrintParaVector( std::string description, std::vector<T> & rpcVector ) 394 { 395 Int iSpace = max(1, ENC_CFG_CONSOUT_SPACE - (Int) description.length() ); 396 397 for ( Int i = 0; i < iSpace; i++ ) 398 description.append( " " ); 399 400 description.append( ":" ); 401 printf( "%s", description.c_str() ); 402 403 for(Int i=0;i<rpcVector.size();i++) 404 xPrintVectorElem( rpcVector[i] ); 405 406 printf("\n"); 407 } 408 409 Void xPrintVectorElem( UInt elem ) { printf(" %d" , elem );}; 410 Void xPrintVectorElem( Int elem ) { printf(" %d" , elem );}; 411 412 Void xPrintVectorElem( Double elem ) { printf(" %5.2f", elem );}; 413 Void xPrintVectorElem( Bool elem ) { printf(" %d" , ( elem ? 1 : 0 ));}; 414 #endif 326 415 #if SIGNAL_BITRATE_PICRATE_IN_VPS 327 416 Int m_bitRatePicRateMaxTLayers; ///< Indicates max. number of sub-layers for which bit rate is signalled. … … 333 422 Int* m_constantPicRateIdc; ///< Indicates constant picture rate idc for various sub-layers 334 423 #endif 424 #if H_MV 425 Int getGOPSize() { return m_iGOPSize; } 426 #endif 335 427 public: 336 428 TAppEncCfg(); -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncTop.cpp
r367 r368 57 57 TAppEncTop::TAppEncTop() 58 58 { 59 #if !H_MV 59 60 m_iFrameRcvd = 0; 61 #endif 60 62 m_totalBytes = 0; 61 63 m_essentialBytes = 0; … … 70 72 TComVPS vps; 71 73 74 #if H_MV 75 Int maxTempLayer = -1; 76 for (Int j = 0; j < m_numberOfLayers; j++) 77 { 78 maxTempLayer = max( m_maxTempLayerMvc[ j ], maxTempLayer ); 79 } 80 81 vps.setMaxTLayers ( maxTempLayer ); 82 if ( maxTempLayer ) 83 { 84 vps.setTemporalNestingFlag(true); 85 } 86 vps.setMaxLayers( m_numberOfLayers ); 87 for(Int i = 0; i < MAX_TLAYER; i++) 88 { 89 Int maxNumReOrderPics = 0; 90 Int maxDecPicBuffering = 0; 91 for (Int j = 0; j < m_numberOfLayers; j++) 92 { 93 maxNumReOrderPics = max( maxNumReOrderPics, m_numReorderPicsMvc [ j ][ i ] ); 94 maxDecPicBuffering = max( maxDecPicBuffering, m_maxDecPicBufferingMvc[ j ][ i ] ); 95 } 96 97 vps.setNumReorderPics ( maxNumReOrderPics ,i ); 98 vps.setMaxDecPicBuffering ( maxDecPicBuffering ,i ); 99 } 100 #else 72 101 vps.setMaxTLayers ( m_maxTempLayer ); 73 102 if (m_maxTempLayer == 1) … … 81 110 vps.setMaxDecPicBuffering ( m_maxDecPicBuffering[i], i ); 82 111 } 112 #endif 113 #if H_MV 114 xSetLayerIds ( vps ); 115 xSetDimensionIdAndLength ( vps ); 116 xSetDirectDependencyFlags( vps ); 117 118 for(Int layer = 0; layer < m_numberOfLayers; layer++) 119 { 120 m_frameRcvd .push_back(0); 121 m_acTEncTopList .push_back(new TEncTop); 122 m_acTVideoIOYuvInputFileList.push_back(new TVideoIOYuv); 123 m_acTVideoIOYuvReconFileList.push_back(new TVideoIOYuv); 124 m_picYuvRec .push_back(new TComList<TComPicYuv*>) ; 125 126 m_ivPicLists.push_back( m_acTEncTopList[ layer ]->getListPic() ); 127 TEncTop& m_cTEncTop = *m_acTEncTopList[ layer ]; // It is not a member, but this name helps avoiding code duplication !!! 128 129 m_cTEncTop.setLayerIdInVps( layer ); 130 m_cTEncTop.setLayerId ( vps.getLayerIdInNuh( layer ) ); 131 m_cTEncTop.setViewId ( vps.getViewId ( layer ) ); 132 #if H_3D 133 m_cTEncTop.setIsDepth ( vps.getDepthId ( layer ) != 0 ); 134 #endif 135 m_cTEncTop.setIvPicLists ( &m_ivPicLists ); 136 #endif 83 137 m_cTEncTop.setVPS(&vps); 84 138 … … 103 157 m_cTEncTop.setDecodingRefreshType ( m_iDecodingRefreshType ); 104 158 m_cTEncTop.setGOPSize ( m_iGOPSize ); 159 #if H_MV 160 m_cTEncTop.setGopList ( m_GOPListMvc[layer] ); 161 m_cTEncTop.setExtraRPSs ( m_extraRPSsMvc[layer] ); 162 for(Int i = 0; i < MAX_TLAYER; i++) 163 { 164 m_cTEncTop.setNumReorderPics ( m_numReorderPicsMvc[layer][i], i ); 165 m_cTEncTop.setMaxDecPicBuffering ( m_maxDecPicBufferingMvc[layer][i], i ); 166 } 167 #else 105 168 m_cTEncTop.setGopList ( m_GOPList ); 106 169 m_cTEncTop.setExtraRPSs ( m_extraRPSs ); … … 110 173 m_cTEncTop.setMaxDecPicBuffering ( m_maxDecPicBuffering[i], i ); 111 174 } 175 #endif 112 176 for( UInt uiLoop = 0; uiLoop < MAX_TLAYER; ++uiLoop ) 113 177 { 114 178 m_cTEncTop.setLambdaModifier( uiLoop, m_adLambdaModifier[ uiLoop ] ); 115 179 } 180 #if H_MV 181 m_cTEncTop.setQP ( m_iQP[layer] ); 182 #else 116 183 m_cTEncTop.setQP ( m_iQP ); 184 #endif 117 185 118 186 m_cTEncTop.setPad ( m_aiPad ); 119 187 188 #if H_MV 189 m_cTEncTop.setMaxTempLayer ( m_maxTempLayerMvc[layer] ); 190 #else 120 191 m_cTEncTop.setMaxTempLayer ( m_maxTempLayer ); 192 #endif 121 193 m_cTEncTop.setUseAMP( m_enableAMP ); 122 194 … … 124 196 125 197 //====== Loop/Deblock Filter ======== 198 #if H_MV 199 m_cTEncTop.setLoopFilterDisable ( m_bLoopFilterDisable[layer]); 200 #else 126 201 m_cTEncTop.setLoopFilterDisable ( m_bLoopFilterDisable ); 202 #endif 127 203 m_cTEncTop.setLoopFilterOffsetInPPS ( m_loopFilterOffsetInPPS ); 128 204 m_cTEncTop.setLoopFilterBetaOffset ( m_loopFilterBetaOffsetDiv2 ); … … 151 227 Int lowestQP; 152 228 lowestQP = - 6*(g_bitDepthY - 8); // XXX: check 229 #if H_MV 230 if ((m_iMaxDeltaQP == 0 ) && (m_iQP[layer] == lowestQP) && (m_useLossless == true)) 231 #else 153 232 if ((m_iMaxDeltaQP == 0 ) && (m_iQP == lowestQP) && (m_useLossless == true)) 233 #endif 154 234 { 155 235 m_bUseAdaptiveQP = false; … … 167 247 m_cTEncTop.setUseLComb ( m_bUseLComb ); 168 248 #endif 249 #if H_MV 250 m_cTEncTop.setdQPs ( m_aidQP[layer] ); 251 #else 169 252 m_cTEncTop.setdQPs ( m_aidQP ); 253 #endif 170 254 m_cTEncTop.setUseRDOQ ( m_useRDOQ ); 171 255 m_cTEncTop.setUseRDOQTS ( m_useRDOQTS ); … … 224 308 } 225 309 m_cTEncTop.setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag ); 310 #if H_MV 311 m_cTEncTop.setUseSAO ( m_bUseSAO[layer] ); 312 #else 226 313 m_cTEncTop.setUseSAO ( m_bUseSAO ); 314 #endif 227 315 m_cTEncTop.setMaxNumOffsetsPerPic (m_maxNumOffsetsPerPic); 228 316 … … 372 460 } 373 461 #endif 462 #if H_MV 463 } 464 #endif 374 465 } 375 466 376 467 Void TAppEncTop::xCreateLib() 377 468 { 469 #if H_MV 470 // initialize global variables 471 initROM(); 472 473 for( Int layer=0; layer < m_numberOfLayers; layer++) 474 { 475 m_acTVideoIOYuvInputFileList[layer]->open( m_pchInputFileList[layer], false, m_inputBitDepthY, m_inputBitDepthC, m_internalBitDepthY, m_internalBitDepthC ); // read mode 476 m_acTVideoIOYuvInputFileList[layer]->skipFrames( m_FrameSkip, m_iSourceWidth - m_aiPad[0], m_iSourceHeight - m_aiPad[1]); 477 478 if (m_pchReconFileList[layer]) 479 { 480 m_acTVideoIOYuvReconFileList[layer]->open( m_pchReconFileList[layer], true, m_outputBitDepthY, m_outputBitDepthC, m_internalBitDepthY, m_internalBitDepthC); // write mode 481 } 482 m_acTEncTopList[layer]->create(); 483 } 484 #else 378 485 // Video I/O 379 486 m_cTVideoIOYuvInputFile.open( m_pchInputFile, false, m_inputBitDepthY, m_inputBitDepthC, m_internalBitDepthY, m_internalBitDepthC ); // read mode … … 385 492 // Neo Decoder 386 493 m_cTEncTop.create(); 494 #endif 387 495 } 388 496 389 497 Void TAppEncTop::xDestroyLib() 390 498 { 499 #if H_MV 500 // destroy ROM 501 destroyROM(); 502 503 for(Int layer=0; layer<m_numberOfLayers; layer++) 504 { 505 m_acTVideoIOYuvInputFileList[layer]->close(); 506 m_acTVideoIOYuvReconFileList[layer]->close(); 507 delete m_acTVideoIOYuvInputFileList[layer] ; 508 m_acTVideoIOYuvInputFileList[layer] = NULL; 509 delete m_acTVideoIOYuvReconFileList[layer] ; 510 m_acTVideoIOYuvReconFileList[layer] = NULL; 511 m_acTEncTopList[layer]->deletePicBuffer(); 512 m_acTEncTopList[layer]->destroy(); 513 delete m_acTEncTopList[layer] ; 514 m_acTEncTopList[layer] = NULL; 515 delete m_picYuvRec[layer] ; 516 m_picYuvRec[layer] = NULL; 517 } 518 #else 391 519 // Video I/O 392 520 m_cTVideoIOYuvInputFile.close(); … … 395 523 // Neo Decoder 396 524 m_cTEncTop.destroy(); 525 #endif 397 526 } 398 527 399 528 Void TAppEncTop::xInitLib() 400 529 { 530 #if H_MV 531 for(Int layer=0; layer<m_numberOfLayers; layer++) 532 { 533 m_acTEncTopList[layer]->init( ); 534 } 535 #else 401 536 m_cTEncTop.init(); 537 #endif 402 538 } 403 539 … … 432 568 433 569 // main encoder loop 570 #if H_MV 571 Bool allEos = false; 572 std::vector<Bool> eos ; 573 std::vector<Bool> flush ; 574 575 Int gopSize = 1; 576 Int maxGopSize = 0; 577 maxGopSize = (std::max)(maxGopSize, m_acTEncTopList[0]->getGOPSize()); 578 579 for(Int layer=0; layer < m_numberOfLayers; layer++ ) 580 { 581 eos .push_back( false ); 582 flush.push_back( false ); 583 } 584 #else 434 585 Int iNumEncoded = 0; 435 586 Bool bEos = false; 587 #endif 436 588 437 589 list<AccessUnit> outputAccessUnits; ///< list of access units to write out. is populated by the encoding process … … 440 592 pcPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth ); 441 593 594 #if H_MV 595 while ( !allEos ) 596 { 597 for(Int layer=0; layer < m_numberOfLayers; layer++ ) 598 { 599 Int frmCnt = 0; 600 while ( !eos[layer] && !(frmCnt == gopSize)) 601 { 602 // get buffers 603 xGetBuffer(pcPicYuvRec, layer); 604 605 // read input YUV file 606 m_acTVideoIOYuvInputFileList[layer]->read ( pcPicYuvOrg, m_aiPad ); 607 m_acTEncTopList [layer]->initNewPic( pcPicYuvOrg ); 608 609 // increase number of received frames 610 m_frameRcvd[layer]++; 611 612 frmCnt++; 613 614 eos[layer] = (m_frameRcvd[layer] == m_framesToBeEncoded); 615 allEos = allEos|eos[layer]; 616 617 // if end of file (which is only detected on a read failure) flush the encoder of any queued pictures 618 if (m_acTVideoIOYuvInputFileList[layer]->isEof()) 619 { 620 flush [layer] = true; 621 eos [layer] = true; 622 m_frameRcvd [layer]--; 623 m_acTEncTopList[layer]->setFramesToBeEncoded(m_frameRcvd[layer]); 624 } 625 } 626 } 627 for ( Int gopId=0; gopId < gopSize; gopId++ ) 628 { 629 for(Int layer=0; layer < m_numberOfLayers; layer++ ) 630 { 631 Int iNumEncoded = 0; 632 633 // call encoding function for one frame 634 m_acTEncTopList[layer]->encode( eos[layer], flush[layer] ? 0 : pcPicYuvOrg, *m_picYuvRec[layer], outputAccessUnits, iNumEncoded, gopId ); 635 xWriteOutput(bitstreamFile, iNumEncoded, outputAccessUnits, layer); 636 outputAccessUnits.clear(); 637 } 638 639 } 640 gopSize = maxGopSize; 641 } 642 for(Int layer=0; layer < m_numberOfLayers; layer++ ) 643 { 644 m_acTEncTopList[layer]->printSummary( m_acTEncTopList[layer]->getNumAllPicCoded() ); 645 } 646 #else 442 647 while ( !bEos ) 443 648 { … … 475 680 476 681 m_cTEncTop.printSummary(); 682 #endif 477 683 478 684 // delete original YUV buffer … … 481 687 pcPicYuvOrg = NULL; 482 688 689 #if !H_MV 483 690 // delete used buffers in encoder class 484 691 m_cTEncTop.deletePicBuffer(); 692 #endif 485 693 486 694 // delete buffers & classes … … 493 701 } 494 702 703 #if H_3D 704 TEncTop* TAppEncTop::getTEncTopView( Int viewId, Bool isDepth ) 705 { 706 TEncTop* encoder = NULL; 707 for( Int layer = 0; layer < m_acTEncTopList.size(); layer++ ) 708 { 709 if( m_acTEncTopList[layer]->getViewId() == viewId && 710 m_acTEncTopList[layer]->getIsDepth() == isDepth ) 711 { 712 encoder = m_acTEncTopList[layer]; 713 break; 714 } 715 } 716 return encoder; 717 } 718 #endif 495 719 // ==================================================================================================================== 496 720 // Protected member functions … … 503 727 . 504 728 */ 729 #if H_MV 730 Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec, UInt layer) 731 #else 505 732 Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec) 733 #endif 506 734 { 507 735 assert( m_iGOPSize > 0 ); 508 736 509 737 // org. buffer 738 #if H_MV 739 if ( m_picYuvRec[layer]->size() == (UInt)m_iGOPSize ) 740 { 741 rpcPicYuvRec = m_picYuvRec[layer]->popFront(); 742 #else 510 743 if ( m_cListPicYuvRec.size() == (UInt)m_iGOPSize ) 511 744 { 512 745 rpcPicYuvRec = m_cListPicYuvRec.popFront(); 746 #endif 513 747 514 748 } … … 520 754 521 755 } 756 #if H_MV 757 m_picYuvRec[layer]->pushBack( rpcPicYuvRec ); 758 #else 522 759 m_cListPicYuvRec.pushBack( rpcPicYuvRec ); 760 #endif 523 761 } 524 762 525 763 Void TAppEncTop::xDeleteBuffer( ) 526 764 { 765 #if H_MV 766 for(Int layer=0; layer<m_picYuvRec.size(); layer++) 767 { 768 if(m_picYuvRec[layer]) 769 { 770 TComList<TComPicYuv*>::iterator iterPicYuvRec = m_picYuvRec[layer]->begin(); 771 Int iSize = Int( m_picYuvRec[layer]->size() ); 772 #else 527 773 TComList<TComPicYuv*>::iterator iterPicYuvRec = m_cListPicYuvRec.begin(); 528 774 529 775 Int iSize = Int( m_cListPicYuvRec.size() ); 776 #endif 530 777 531 778 for ( Int i = 0; i < iSize; i++ ) … … 536 783 } 537 784 785 #if H_MV 786 } 787 } 788 #endif 538 789 } 539 790 540 791 /** \param iNumEncoded number of encoded frames 541 792 */ 793 #if H_MV 794 Void TAppEncTop::xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, std::list<AccessUnit>& accessUnits, UInt layerId) 795 #else 542 796 Void TAppEncTop::xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, const std::list<AccessUnit>& accessUnits) 797 #endif 543 798 { 544 799 Int i; 545 800 801 #if H_MV 802 if( iNumEncoded > 0 ) 803 { 804 TComList<TComPicYuv*>::iterator iterPicYuvRec = m_picYuvRec[layerId]->end(); 805 #else 546 806 TComList<TComPicYuv*>::iterator iterPicYuvRec = m_cListPicYuvRec.end(); 547 807 list<AccessUnit>::const_iterator iterBitstream = accessUnits.begin(); 808 #endif 548 809 549 810 for ( i = 0; i < iNumEncoded; i++ ) … … 555 816 { 556 817 TComPicYuv* pcPicYuvRec = *(iterPicYuvRec++); 818 #if H_MV 819 if (m_pchReconFileList[layerId]) 820 { 821 m_acTVideoIOYuvReconFileList[layerId]->write( pcPicYuvRec, m_confLeft, m_confRight, m_confTop, m_confBottom ); 822 } 823 } 824 } 825 if( ! accessUnits.empty() ) 826 { 827 list<AccessUnit>::iterator aUIter; 828 for( aUIter = accessUnits.begin(); aUIter != accessUnits.end(); aUIter++ ) 829 { 830 const vector<unsigned>& stats = writeAnnexB(bitstreamFile, *aUIter); 831 rateStatsAccum(*aUIter, stats); 832 } 833 } 834 #else 557 835 if (m_pchReconFile) 558 836 { … … 564 842 rateStatsAccum(au, stats); 565 843 } 844 #endif 566 845 } 567 846 … … 609 888 void TAppEncTop::printRateSummary() 610 889 { 890 #if H_MV 891 Double time = (Double) m_frameRcvd[0] / m_iFrameRate; 892 printf("\n"); 893 #else 611 894 Double time = (Double) m_iFrameRcvd / m_iFrameRate; 895 #endif 612 896 printf("Bytes written to file: %u (%.3f kbps)\n", m_totalBytes, 0.008 * m_totalBytes / time); 613 897 #if VERBOSE_RATE … … 616 900 } 617 901 902 #if H_MV 903 Void TAppEncTop::xSetDimensionIdAndLength( TComVPS& vps ) 904 { 905 vps.setScalabilityMask( m_scalabilityMask ); 906 for( Int dim = 0; dim < m_dimIds.size(); dim++ ) 907 { 908 vps.setDimensionIdLen( dim, m_dimensionIdLen[ dim ] ); 909 for( Int layer = 1; layer < vps.getMaxLayers(); layer++ ) 910 { 911 vps.setDimensionId( layer, dim, m_dimIds[ dim ][ layer ] ); 912 } 913 } 914 } 915 916 Void TAppEncTop::xSetDirectDependencyFlags( TComVPS& vps ) 917 { 918 for( Int layer = 0; layer < m_numberOfLayers; layer++ ) 919 { 920 if( m_GOPListMvc[layer][MAX_GOP].m_POC == -1 ) 921 { 922 continue; 923 } 924 for( Int i = 0; i < getGOPSize()+1; i++ ) 925 { 926 GOPEntry ge = ( i < getGOPSize() ) ? m_GOPListMvc[layer][i] : m_GOPListMvc[layer][MAX_GOP]; 927 for( Int j = 0; j < ge.m_numInterViewRefPics; j++ ) 928 { 929 Int interLayerRef = layer + ge.m_interViewRefs[j]; 930 vps.setDirectDependencyFlag( layer, interLayerRef, true ); 931 } 932 } 933 } 934 935 vps.checkVPSExtensionSyntax(); 936 vps.calcIvRefLayers(); 937 } 938 939 Void TAppEncTop::xSetLayerIds( TComVPS& vps ) 940 { 941 vps.setSplittingFlag ( m_splittingFlag ); 942 943 Bool nuhLayerIdPresentFlag = !( m_layerIdInNuh.size() == 1 ); 944 Int maxNuhLayerId = nuhLayerIdPresentFlag ? xGetMax( m_layerIdInNuh ) : ( m_numberOfLayers - 1 ) ; 945 946 vps.setMaxNuhLayerId( maxNuhLayerId ); 947 vps.setVpsNuhLayerIdPresentFlag( nuhLayerIdPresentFlag ); 948 949 for (Int layer = 0; layer < m_numberOfLayers; layer++ ) 950 { 951 vps.setLayerIdInNuh( layer, nuhLayerIdPresentFlag ? m_layerIdInNuh[ layer ] : layer ); 952 vps.setLayerIdInVps( vps.getLayerIdInNuh( layer ), layer ); 953 } 954 } 955 956 Int TAppEncTop::xGetMax( std::vector<Int>& vec ) 957 { 958 Int maxVec = 0; 959 for ( Int i = 0; i < vec.size(); i++) 960 maxVec = max( vec[i], maxVec ); 961 return maxVec; 962 } 963 #endif 618 964 619 965 //! \} -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncTop.h
r367 r368 59 59 private: 60 60 // class interface 61 #if H_MV 62 std::vector<TEncTop*> m_acTEncTopList ; ///< encoder class per layer 63 std::vector<TVideoIOYuv*> m_acTVideoIOYuvInputFileList; ///< input YUV file 64 std::vector<TVideoIOYuv*> m_acTVideoIOYuvReconFileList; ///< output reconstruction file 65 66 std::vector<TComList<TComPicYuv*>*> m_picYuvRec; ///< list of reconstruction YUV files 67 68 std::vector<Int> m_frameRcvd; ///< number of received frames 69 70 TComPicLists m_ivPicLists; ///< picture buffers of encoder instances 71 #else 61 72 TEncTop m_cTEncTop; ///< encoder class 62 73 TVideoIOYuv m_cTVideoIOYuvInputFile; ///< input YUV file … … 66 77 67 78 Int m_iFrameRcvd; ///< number of received frames 79 #endif 68 80 69 81 UInt m_essentialBytes; … … 77 89 78 90 /// obtain required buffers 91 #if H_MV 92 Void xGetBuffer(TComPicYuv*& rpcPicYuvRec, UInt layer); 93 #else 79 94 Void xGetBuffer(TComPicYuv*& rpcPicYuvRec); 95 #endif 80 96 81 97 /// delete allocated buffers … … 83 99 84 100 // file I/O 101 #if H_MV 102 Void xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, std::list<AccessUnit>& accessUnits, UInt layerId); ///< write bitstream to file 103 #else 85 104 Void xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, const std::list<AccessUnit>& accessUnits); ///< write bitstream to file 105 #endif 86 106 void rateStatsAccum(const AccessUnit& au, const std::vector<UInt>& stats); 87 107 void printRateSummary(); 88 108 109 #if H_MV 110 Void xSetLayerIds ( TComVPS& vps ); 111 Void xSetDimensionIdAndLength ( TComVPS& vps ); 112 Void xSetDirectDependencyFlags ( TComVPS& vps ); 113 Int xGetMax( std::vector<Int>& vec); 114 #endif 89 115 public: 90 116 TAppEncTop(); … … 92 118 93 119 Void encode (); ///< main encoding function 120 #if H_MV 121 TEncTop* getTEncTopLayer(UInt layer) { return m_acTEncTopList[layer]; } ///< return pointer to encoder class for specific layer 122 #if H_3D 123 TEncTop* getTEncTopView( Int viewId, Bool isDepth ); ///< return pointer to encoder class for specific view Id and texture or depth 124 #endif 125 #else 94 126 TEncTop& getTEncTop () { return m_cTEncTop; } ///< return encoder class pointer reference 127 #endif 95 128 };// END CLASS DEFINITION TAppEncTop 96 129 -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/encmain.cpp
r367 r368 57 57 // print information 58 58 fprintf( stdout, "\n" ); 59 #if H_MV 60 fprintf( stdout, "3D-HTM Software: Encoder Version [%s] based on HM Version [%s]", NV_VERSION, HM_VERSION ); 61 #else 59 62 fprintf( stdout, "HM software: Encoder Version [%s]", NV_VERSION ); 63 #endif 60 64 fprintf( stdout, NVM_ONOS ); 61 65 fprintf( stdout, NVM_COMPILEDBY );
Note: See TracChangeset for help on using the changeset viewer.