Changeset 367 in 3DVCSoftware for branches/HTM-DEV-0.1-dev/source/App/TAppEncoder
- Timestamp:
- 3 May 2013, 17:09:57 (12 years ago)
- Location:
- branches/HTM-DEV-0.1-dev/source/App/TAppEncoder
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncCfg.cpp
r366 r367 64 64 65 65 TAppEncCfg::TAppEncCfg() 66 #if H_MV67 : m_pchBitstreamFile()68 #else69 66 : m_pchInputFile() 70 67 , m_pchBitstreamFile() 71 68 , m_pchReconFile() 72 #endif73 69 , m_pchdQPFile() 74 70 , m_pColumnWidth() … … 76 72 , m_scalingListFile() 77 73 { 78 #if !H_MV79 74 m_aidQP = NULL; 80 #endif81 75 #if J0149_TONE_MAPPING_SEI 82 76 m_startOfCodedInterval = NULL; … … 88 82 TAppEncCfg::~TAppEncCfg() 89 83 { 90 #if H_MV91 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 #else105 84 if ( m_aidQP ) 106 85 { 107 86 delete[] m_aidQP; 108 87 } 109 #endif110 88 #if J0149_TONE_MAPPING_SEI 111 89 if ( m_startOfCodedInterval ) … … 125 103 } 126 104 #endif 127 #if !H_MV128 105 free(m_pchInputFile); 129 #endif130 106 free(m_pchBitstreamFile); 131 #if H_MV132 for(Int i = 0; i< m_pchReconFileList.size(); i++ )133 {134 if ( m_pchReconFileList[i] != NULL )135 free (m_pchReconFileList[i]);136 }137 #else138 107 free(m_pchReconFile); 139 #endif140 108 free(m_pchdQPFile); 141 109 free(m_pColumnWidth); 142 110 free(m_pRowHeight); 143 111 free(m_scalingListFile); 144 #if H_MV145 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 #endif154 112 } 155 113 … … 203 161 } 204 162 #endif 205 #if H_MV206 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 #endif220 163 return in; 221 164 } … … 229 172 {"main10", Profile::MAIN10}, 230 173 {"main-still-picture", Profile::MAINSTILLPICTURE}, 231 #if H_MV232 {"main-stereo", Profile::MAINSTEREO},233 {"main-multiview", Profile::MAINMULTIVIEW},234 #if H_3D235 {"main-3d" , Profile::MAIN3D},236 #endif237 #endif238 174 }; 239 175 … … 317 253 Bool do_help = false; 318 254 319 #if !H_MV320 255 string cfg_InputFile; 321 #endif322 256 string cfg_BitstreamFile; 323 #if !H_MV324 257 string cfg_ReconFile; 325 #endif326 #if H_MV327 vector<Int> cfg_dimensionLength;328 #if H_3D329 cfg_dimensionLength.push_back( 2 ); // depth330 cfg_dimensionLength.push_back( 32 ); // texture331 #else332 cfg_dimensionLength.push_back( 64 );333 #endif334 #endif335 258 string cfg_dQPFile; 336 259 string cfg_ColumnWidth; … … 356 279 357 280 // File, I/O and source parameters 358 #if H_MV359 ("InputFile_%d,i_%d", m_pchInputFileList, (char *) 0 , MAX_NUM_LAYER_IDS , "original Yuv input file name %d")360 #else361 281 ("InputFile,i", cfg_InputFile, string(""), "Original YUV input file name") 362 #endif363 282 ("BitstreamFile,b", cfg_BitstreamFile, string(""), "Bitstream output file name") 364 #if H_MV365 ("ReconFile_%d,o_%d", m_pchReconFileList, (char *) 0 , MAX_NUM_LAYER_IDS , "reconstructed Yuv output file name %d")366 #else367 283 ("ReconFile,o", cfg_ReconFile, string(""), "Reconstructed YUV output file name") 368 #endif369 #if H_MV370 ("NumberOfLayers", m_numberOfLayers , 1, "Number of layers")371 #if !H_3D372 ("ScalabilityMask", m_scalabilityMask , 1 , "Scalability Mask")373 #else374 ("ScalabilityMask", m_scalabilityMask , 3 , "Scalability Mask, 1: Texture 3: Texture + Depth ")375 #endif376 ("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_3D379 ("DepthFlag", m_depthFlag , std::vector<Int>(1,0), "Depth Flag")380 #endif381 ("LayerIdInNuh", m_layerIdInNuh , std::vector<Int>(1,0), "LayerId in Nuh")382 ("SplittingFlag", m_splittingFlag , false , "Splitting Flag")383 #endif384 284 ("SourceWidth,-wdt", m_iSourceWidth, 0, "Source picture width") 385 285 ("SourceHeight,-hgt", m_iSourceHeight, 0, "Source picture height") … … 453 353 454 354 /* Quantization parameters */ 455 #if H_MV456 ("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 #else458 355 ("QP,q", m_fQP, 30.0, "Qp value, if value is float, QP is switched once during encoding") 459 #endif460 356 ("DeltaQpRD,-dqr",m_uiDeltaQpRD, 0u, "max dQp offset for slice") 461 357 ("MaxDeltaQP,d", m_iMaxDeltaQP, 0, "max dQp offset for block") … … 481 377 482 378 // Deblocking filter parameters 483 #if H_MV484 ("LoopFilterDisable", m_bLoopFilterDisable, std::vector<Bool>(1,false), "Disable Loop Filter per Layer" )485 #else486 379 ("LoopFilterDisable", m_bLoopFilterDisable, false ) 487 #endif488 380 ("LoopFilterOffsetInPPS", m_loopFilterOffsetInPPS, false ) 489 381 ("LoopFilterBetaOffset_div2", m_loopFilterBetaOffsetDiv2, 0 ) … … 498 390 ("TransformSkip", m_useTransformSkip, false, "Intra transform skipping") 499 391 ("TransformSkipFast", m_useTransformSkipFast, false, "Fast intra transform skipping") 500 #if H_MV501 ("SAO", m_bUseSAO, std::vector<Bool>(1,true), "Enable Sample Adaptive Offset per Layer")502 #else503 392 ("SAO", m_bUseSAO, true, "Enable Sample Adaptive Offset") 504 #endif505 393 ("MaxNumOffsetsPerPic", m_maxNumOffsetsPerPic, 2048, "Max number of SAO offset per picture (Default: 2048)") 506 394 ("SAOLcuBoundary", m_saoLcuBoundary, false, "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas") … … 684 572 ; 685 573 686 #if H_MV687 // parse coding structure688 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 else701 {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 #else715 574 for(Int i=1; i<MAX_GOP+1; i++) { 716 575 std::ostringstream cOSS; … … 718 577 opts.addOptions()(cOSS.str(), m_GOPList[i-1], GOPEntry()); 719 578 } 720 #endif721 579 po::setDefaults(opts); 722 580 const list<const Char*>& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv); … … 738 596 */ 739 597 /* convert std::string to c string for compatability */ 740 #if !H_MV741 598 m_pchInputFile = cfg_InputFile.empty() ? NULL : strdup(cfg_InputFile.c_str()); 742 #endif743 599 m_pchBitstreamFile = cfg_BitstreamFile.empty() ? NULL : strdup(cfg_BitstreamFile.c_str()); 744 #if !H_MV745 600 m_pchReconFile = cfg_ReconFile.empty() ? NULL : strdup(cfg_ReconFile.c_str()); 746 #endif747 601 m_pchdQPFile = cfg_dQPFile.empty() ? NULL : strdup(cfg_dQPFile.c_str()); 748 602 … … 804 658 m_pRowHeight = NULL; 805 659 } 806 #if H_MV807 free ( pColumnWidth );808 free ( pRowHeight );809 #endif810 660 #if SIGNAL_BITRATE_PICRATE_IN_VPS 811 661 readBoolString(cfg_bitRateInfoPresentFlag, m_bitRatePicRateMaxTLayers, m_bitRateInfoPresentFlag, "bit rate info. present flag" ); … … 887 737 888 738 // allocate slice-based dQP values 889 #if H_MV890 xResizeVector( m_viewId );891 #if H_3D892 xResizeVector( m_depthFlag );893 #endif894 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 values903 // if QP is not integer, sequence is split into two sections having QP and QP+1904 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 #else921 739 m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ]; 922 740 ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) ); … … 935 753 } 936 754 } 937 #endif938 755 939 756 // reading external dQP description from file … … 943 760 if ( fpt ) 944 761 { 945 #if H_MV946 for( Int layer = 0; layer < m_numberOfLayers; layer++ )947 {948 #endif949 762 Int iValue; 950 763 Int iPOC = 0; … … 952 765 { 953 766 if ( fscanf(fpt, "%d", &iValue ) == EOF ) break; 954 #if H_MV955 m_aidQP[layer][ iPOC ] = iValue;956 iPOC++;957 }958 #else959 767 m_aidQP[ iPOC ] = iValue; 960 768 iPOC++; 961 #endif962 769 } 963 770 fclose(fpt); … … 1125 932 xConfirmPara( m_iFrameRate <= 0, "Frame rate must be more than 1" ); 1126 933 xConfirmPara( m_framesToBeEncoded <= 0, "Total Number Of Frames encoded must be more than 0" ); 1127 #if H_MV1128 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_3D1135 xConfirmPara( m_scalabilityMask != 1 && m_scalabilityMask != 3, "Scalability Mask must be equal to 1 or 3. ");1136 #else1137 xConfirmPara( m_scalabilityMask != 1 , "Scalability Mask must be equal to 1. ");1138 #endif1139 1140 m_dimIds.push_back( m_viewId );1141 #if H_3D1142 if ( m_scalabilityMask & ( 1 << DEPTH_ID ) )1143 m_dimIds.push_back( m_depthFlag );1144 #endif1145 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 #endif1196 934 xConfirmPara( m_iGOPSize < 1 , "GOP Size must be greater or equal to 1" ); 1197 935 xConfirmPara( m_iGOPSize > 1 && m_iGOPSize % 2, "GOP Size must be a multiple of 2, if GOP Size is greater than 1" ); 1198 936 xConfirmPara( (m_iIntraPeriod > 0 && m_iIntraPeriod < m_iGOPSize) || m_iIntraPeriod == 0, "Intra period must be more than GOP size, or -1 , not 0" ); 1199 937 xConfirmPara( m_iDecodingRefreshType < 0 || m_iDecodingRefreshType > 2, "Decoding Refresh Type must be equal to 0, 1 or 2" ); 1200 #if H_MV1201 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 #else1206 938 xConfirmPara( m_iQP < -6 * (m_internalBitDepthY - 8) || m_iQP > 51, "QP exceeds supported range (-QpBDOffsety to 51)" ); 1207 #endif1208 939 xConfirmPara( m_loopFilterBetaOffsetDiv2 < -13 || m_loopFilterBetaOffsetDiv2 > 13, "Loop Filter Beta Offset div. 2 exceeds supported range (-13 to 13)"); 1209 940 xConfirmPara( m_loopFilterTcOffsetDiv2 < -13 || m_loopFilterTcOffsetDiv2 > 13, "Loop Filter Tc Offset div. 2 exceeds supported range (-13 to 13)"); … … 1249 980 1250 981 #if ADAPTIVE_QP_SELECTION 1251 #if H_MV1252 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 #else1257 982 xConfirmPara( m_bUseAdaptQpSelect == true && m_iQP < 0, "AdaptiveQpSelection must be disabled when QP < 0."); 1258 #endif1259 983 xConfirmPara( m_bUseAdaptQpSelect == true && (m_cbQpOffset !=0 || m_crQpOffset != 0 ), "AdaptiveQpSelection must be disabled when ChromaQpOffset is not equal to 0."); 1260 984 #endif … … 1310 1034 } 1311 1035 1312 #if H_MV1313 // validate that POC of same frame is identical across multiple layers1314 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 refs1332 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 refs1344 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 view1371 {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 else1425 {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 structure1449 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 #endif1459 1036 /* if this is an intra-only sequence, ie IntraPeriod=1, don't verify the GOP structure 1460 1037 * This permits the ability to omit a GOP structure specification */ … … 1490 1067 } 1491 1068 1492 #if H_MV1493 if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable[layer]) )1494 #else1495 1069 if ( (m_iIntraPeriod != 1) && !m_loopFilterOffsetInPPS && m_DeblockingFilterControlPresent && (!m_bLoopFilterDisable) ) 1496 #endif1497 1070 { 1498 1071 for(Int i=0; i<m_iGOPSize; i++) … … 1510 1083 if(m_GOPList[curGOP].m_POC<0) 1511 1084 { 1512 #if H_MV1513 printf("\nError: found fewer Reference Picture Sets than GOPSize for layer %d\n", layer );1514 #else1515 1085 printf("\nError: found fewer Reference Picture Sets than GOPSize\n"); 1516 #endif1517 1086 errorGOP=true; 1518 1087 } … … 1551 1120 if(!found) 1552 1121 { 1553 #if H_MV1554 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 #else1556 1122 printf("\nError: ref pic %d is not available for GOP frame %d\n",m_GOPList[curGOP].m_referencePics[i],curGOP+1); 1557 #endif1558 1123 errorGOP=true; 1559 1124 } … … 1932 1497 } 1933 1498 #endif 1934 #if H_MV1935 }1936 }1937 #endif1938 1499 1939 1500 #undef xConfirmPara … … 1971 1532 { 1972 1533 printf("\n"); 1973 #if H_MV1974 for( Int layer = 0; layer < m_numberOfLayers; layer++)1975 {1976 printf("Input File %i : %s\n", layer, m_pchInputFileList[layer]);1977 }1978 #else1979 1534 printf("Input File : %s\n", m_pchInputFile ); 1980 #endif1981 1535 printf("Bitstream File : %s\n", m_pchBitstreamFile ); 1982 #if H_MV1983 for( Int layer = 0; layer < m_numberOfLayers; layer++)1984 {1985 printf("Reconstruction File %i : %s\n", layer, m_pchReconFileList[layer]);1986 }1987 #else1988 1536 printf("Reconstruction File : %s\n", m_pchReconFile ); 1989 #endif1990 #if H_MV1991 xPrintParaVector( "ViewId", m_viewId );1992 #endif1993 #if H_3D1994 xPrintParaVector( "DepthFlag", m_depthFlag );1995 #endif1996 #if H_MV1997 xPrintParaVector( "QP" , m_fQP );1998 xPrintParaVector( "LoopFilterDisable", m_bLoopFilterDisable );1999 xPrintParaVector( "SAO" , m_bUseSAO );2000 #endif2001 1537 printf("Real Format : %dx%d %dHz\n", m_iSourceWidth - m_confLeft - m_confRight, m_iSourceHeight - m_confTop - m_confBottom, m_iFrameRate ); 2002 1538 printf("Internal Format : %dx%d %dHz\n", m_iSourceWidth, m_iSourceHeight, m_iFrameRate ); … … 2010 1546 printf("Intra period : %d\n", m_iIntraPeriod ); 2011 1547 printf("Decoding refresh type : %d\n", m_iDecodingRefreshType ); 2012 #if !H_MV2013 1548 printf("QP : %5.2f\n", m_fQP ); 2014 #endif2015 1549 printf("Max dQP signaling depth : %d\n", m_iMaxCuDQPDepth); 2016 1550 … … 2077 1611 } 2078 1612 printf("CIP:%d ", m_bUseConstrainedIntraPred); 2079 #if !H_MV2080 1613 printf("SAO:%d ", (m_bUseSAO)?(1):(0)); 2081 #endif2082 1614 printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0); 2083 1615 printf("SAOLcuBasedOptimization:%d ", (m_saoLcuBasedOptimization)?(1):(0)); -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncCfg.h
r363 r367 55 55 protected: 56 56 // file I/O 57 #if H_MV58 std::vector<char*> m_pchInputFileList; ///< source file names59 #else60 57 Char* m_pchInputFile; ///< source file name 61 #endif62 58 Char* m_pchBitstreamFile; ///< output bitstream file 63 #if H_MV64 std::vector<char*> m_pchReconFileList; ///< output reconstruction file names65 Int m_numberOfLayers; ///< number of Layers to Encode66 #else67 59 Char* m_pchReconFile; ///< output reconstruction file 68 #endif69 60 // VPS specification 70 #if H_MV71 std::vector< std::vector<Int> > m_dimIds; ///< dimension ids ( pointers to m_viewId and m_depthFlag72 std::vector<Int> m_viewId; ///< view id73 #if H_3D74 std::vector<Int> m_depthFlag; ///< depth flag75 #endif76 std::vector<Int> m_layerIdInNuh; ///< layer Id in Nuh for each layer77 Bool m_splittingFlag; ///< Splitting Flag78 Int m_scalabilityMask; ///< Mask indicating scalabilities, 1: texture; 3: texture + depth79 std::vector<Int> m_dimensionIdLen; ///< Length of scalability dimension s80 #endif81 61 Double m_adLambdaModifier[ MAX_TLAYER ]; ///< Lambda modifier array for each temporal layer 82 62 // source specification … … 108 88 Int m_iDecodingRefreshType; ///< random access type 109 89 Int m_iGOPSize; ///< GOP size of hierarchical structure 110 #if H_MV111 Int m_extraRPSsMvc[MAX_NUM_LAYERS]; ///< extra RPSs added to handle CRA for each layer112 std::vector< GOPEntry* > m_GOPListMvc; ///< the coding structure entries from the config file for each layer113 Int m_numReorderPicsMvc[MAX_NUM_LAYERS][MAX_TLAYER]; ///< total number of reorder pictures for each layer114 Int m_maxDecPicBufferingMvc[MAX_NUM_LAYERS][MAX_TLAYER]; ///< total number of reference pictures needed for decoding for each layer115 #else116 90 Int m_extraRPSs; ///< extra RPSs added to handle CRA 117 91 GOPEntry m_GOPList[MAX_GOP]; ///< the coding structure entries from the config file … … 122 96 Int m_maxDecPicBuffering[MAX_TLAYER]; ///< total number of reference pictures needed for decoding 123 97 #endif 124 #endif125 98 #if !L0034_COMBINED_LIST_CLEANUP 126 99 Bool m_bUseLComb; ///< flag for using combined reference list for uni-prediction in B-slices (JCTVC-D421) … … 130 103 Bool m_enableAMP; 131 104 // coding quality 132 #if H_MV133 std::vector<Double> m_fQP; ///< QP value of key-picture (floating point) for each layer134 std::vector<Int> m_iQP; ///< QP value of key-picture (integer) for each layer135 #else136 105 Double m_fQP; ///< QP value of key-picture (floating point) 137 106 Int m_iQP; ///< QP value of key-picture (integer) 138 #endif139 107 Char* m_pchdQPFile; ///< QP offset for each slice (initialized from external file) 140 #if H_MV141 std::vector<Int*> m_aidQP; ///< array of slice QP values for each layer142 #else143 108 Int* m_aidQP; ///< array of slice QP values 144 #endif145 109 Int m_iMaxDeltaQP; ///< max. |delta QP| 146 110 UInt m_uiDeltaQpRD; ///< dQP range for multi-pass slice QP optimization … … 157 121 Int m_iQPAdaptationRange; ///< dQP range by QP adaptation 158 122 159 #if H_MV160 Int m_maxTempLayerMvc[MAX_NUM_LAYER_IDS]; ///< Max temporal layer for each layer161 #else162 123 Int m_maxTempLayer; ///< Max temporal layer 163 #endif164 124 165 125 // coding unit (CU) definition … … 188 148 // coding tool (lossless) 189 149 Bool m_useLossless; ///< flag for using lossless coding 190 #if H_MV191 std::vector<Bool> m_bUseSAO;192 #else193 150 Bool m_bUseSAO; 194 #endif195 151 Int m_maxNumOffsetsPerPic; ///< SAO maximun number of offset per picture 196 152 Bool m_saoLcuBoundary; ///< SAO parameter estimation using non-deblocked pixels for LCU bottom and right boundary areas 197 153 Bool m_saoLcuBasedOptimization; ///< SAO LCU-based optimization 198 154 // coding tools (loop filter) 199 #if H_MV200 std::vector<Bool> m_bLoopFilterDisable; ///< flag for using deblocking filter for each layer201 #else202 155 Bool m_bLoopFilterDisable; ///< flag for using deblocking filter 203 #endif204 156 Bool m_loopFilterOffsetInPPS; ///< offset for deblocking filter in 0 = slice header, 1 = PPS 205 157 Int m_loopFilterBetaOffsetDiv2; ///< beta offset for deblocking filter … … 372 324 Void xPrintParameter (); ///< print configuration values 373 325 Void xPrintUsage (); ///< print usage 374 #if H_MV375 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 #endif415 326 #if SIGNAL_BITRATE_PICRATE_IN_VPS 416 327 Int m_bitRatePicRateMaxTLayers; ///< Indicates max. number of sub-layers for which bit rate is signalled. … … 422 333 Int* m_constantPicRateIdc; ///< Indicates constant picture rate idc for various sub-layers 423 334 #endif 424 #if H_MV425 Int getGOPSize() { return m_iGOPSize; }426 #endif427 335 public: 428 336 TAppEncCfg(); -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncTop.cpp
r366 r367 57 57 TAppEncTop::TAppEncTop() 58 58 { 59 #if !H_MV60 59 m_iFrameRcvd = 0; 61 #endif62 60 m_totalBytes = 0; 63 61 m_essentialBytes = 0; … … 72 70 TComVPS vps; 73 71 74 #if H_MV75 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 #else101 72 vps.setMaxTLayers ( m_maxTempLayer ); 102 73 if (m_maxTempLayer == 1) … … 110 81 vps.setMaxDecPicBuffering ( m_maxDecPicBuffering[i], i ); 111 82 } 112 #endif113 #if H_MV114 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_3D133 m_cTEncTop.setIsDepth ( vps.getDepthId ( layer ) != 0 );134 #endif135 m_cTEncTop.setIvPicLists ( &m_ivPicLists );136 #endif137 83 m_cTEncTop.setVPS(&vps); 138 84 … … 157 103 m_cTEncTop.setDecodingRefreshType ( m_iDecodingRefreshType ); 158 104 m_cTEncTop.setGOPSize ( m_iGOPSize ); 159 #if H_MV160 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 #else168 105 m_cTEncTop.setGopList ( m_GOPList ); 169 106 m_cTEncTop.setExtraRPSs ( m_extraRPSs ); … … 173 110 m_cTEncTop.setMaxDecPicBuffering ( m_maxDecPicBuffering[i], i ); 174 111 } 175 #endif176 112 for( UInt uiLoop = 0; uiLoop < MAX_TLAYER; ++uiLoop ) 177 113 { 178 114 m_cTEncTop.setLambdaModifier( uiLoop, m_adLambdaModifier[ uiLoop ] ); 179 115 } 180 #if H_MV181 m_cTEncTop.setQP ( m_iQP[layer] );182 #else183 116 m_cTEncTop.setQP ( m_iQP ); 184 #endif185 117 186 118 m_cTEncTop.setPad ( m_aiPad ); 187 119 188 #if H_MV189 m_cTEncTop.setMaxTempLayer ( m_maxTempLayerMvc[layer] );190 #else191 120 m_cTEncTop.setMaxTempLayer ( m_maxTempLayer ); 192 #endif193 121 m_cTEncTop.setUseAMP( m_enableAMP ); 194 122 … … 196 124 197 125 //====== Loop/Deblock Filter ======== 198 #if H_MV199 m_cTEncTop.setLoopFilterDisable ( m_bLoopFilterDisable[layer]);200 #else201 126 m_cTEncTop.setLoopFilterDisable ( m_bLoopFilterDisable ); 202 #endif203 127 m_cTEncTop.setLoopFilterOffsetInPPS ( m_loopFilterOffsetInPPS ); 204 128 m_cTEncTop.setLoopFilterBetaOffset ( m_loopFilterBetaOffsetDiv2 ); … … 227 151 Int lowestQP; 228 152 lowestQP = - 6*(g_bitDepthY - 8); // XXX: check 229 #if H_MV230 if ((m_iMaxDeltaQP == 0 ) && (m_iQP[layer] == lowestQP) && (m_useLossless == true))231 #else232 153 if ((m_iMaxDeltaQP == 0 ) && (m_iQP == lowestQP) && (m_useLossless == true)) 233 #endif234 154 { 235 155 m_bUseAdaptiveQP = false; … … 247 167 m_cTEncTop.setUseLComb ( m_bUseLComb ); 248 168 #endif 249 #if H_MV250 m_cTEncTop.setdQPs ( m_aidQP[layer] );251 #else252 169 m_cTEncTop.setdQPs ( m_aidQP ); 253 #endif254 170 m_cTEncTop.setUseRDOQ ( m_useRDOQ ); 255 171 m_cTEncTop.setUseRDOQTS ( m_useRDOQTS ); … … 308 224 } 309 225 m_cTEncTop.setLFCrossSliceBoundaryFlag( m_bLFCrossSliceBoundaryFlag ); 310 #if H_MV311 m_cTEncTop.setUseSAO ( m_bUseSAO[layer] );312 #else313 226 m_cTEncTop.setUseSAO ( m_bUseSAO ); 314 #endif315 227 m_cTEncTop.setMaxNumOffsetsPerPic (m_maxNumOffsetsPerPic); 316 228 … … 460 372 } 461 373 #endif 462 #if H_MV463 }464 #endif465 374 } 466 375 467 376 Void TAppEncTop::xCreateLib() 468 377 { 469 #if H_MV470 // initialize global variables471 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 mode476 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 mode481 }482 m_acTEncTopList[layer]->create();483 }484 #else485 378 // Video I/O 486 379 m_cTVideoIOYuvInputFile.open( m_pchInputFile, false, m_inputBitDepthY, m_inputBitDepthC, m_internalBitDepthY, m_internalBitDepthC ); // read mode … … 492 385 // Neo Decoder 493 386 m_cTEncTop.create(); 494 #endif495 387 } 496 388 497 389 Void TAppEncTop::xDestroyLib() 498 390 { 499 #if H_MV500 // destroy ROM501 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 #else519 391 // Video I/O 520 392 m_cTVideoIOYuvInputFile.close(); … … 523 395 // Neo Decoder 524 396 m_cTEncTop.destroy(); 525 #endif526 397 } 527 398 528 399 Void TAppEncTop::xInitLib() 529 400 { 530 #if H_MV531 for(Int layer=0; layer<m_numberOfLayers; layer++)532 {533 m_acTEncTopList[layer]->init( );534 }535 #else536 401 m_cTEncTop.init(); 537 #endif538 402 } 539 403 … … 568 432 569 433 // main encoder loop 570 #if H_MV571 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 #else585 434 Int iNumEncoded = 0; 586 435 Bool bEos = false; 587 #endif588 436 589 437 list<AccessUnit> outputAccessUnits; ///< list of access units to write out. is populated by the encoding process … … 592 440 pcPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth ); 593 441 594 #if H_MV595 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 buffers603 xGetBuffer(pcPicYuvRec, layer);604 605 // read input YUV file606 m_acTVideoIOYuvInputFileList[layer]->read ( pcPicYuvOrg, m_aiPad );607 m_acTEncTopList [layer]->initNewPic( pcPicYuvOrg );608 609 // increase number of received frames610 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 pictures618 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 frame634 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 #else647 442 while ( !bEos ) 648 443 { … … 680 475 681 476 m_cTEncTop.printSummary(); 682 #endif683 477 684 478 // delete original YUV buffer … … 687 481 pcPicYuvOrg = NULL; 688 482 689 #if !H_MV690 483 // delete used buffers in encoder class 691 484 m_cTEncTop.deletePicBuffer(); 692 #endif693 485 694 486 // delete buffers & classes … … 701 493 } 702 494 703 #if H_3D704 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 #endif719 495 // ==================================================================================================================== 720 496 // Protected member functions … … 727 503 . 728 504 */ 729 #if H_MV730 Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec, UInt layer)731 #else732 505 Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec) 733 #endif734 506 { 735 507 assert( m_iGOPSize > 0 ); 736 508 737 509 // org. buffer 738 #if H_MV739 if ( m_picYuvRec[layer]->size() == (UInt)m_iGOPSize )740 {741 rpcPicYuvRec = m_picYuvRec[layer]->popFront();742 #else743 510 if ( m_cListPicYuvRec.size() == (UInt)m_iGOPSize ) 744 511 { 745 512 rpcPicYuvRec = m_cListPicYuvRec.popFront(); 746 #endif747 513 748 514 } … … 754 520 755 521 } 756 #if H_MV757 m_picYuvRec[layer]->pushBack( rpcPicYuvRec );758 #else759 522 m_cListPicYuvRec.pushBack( rpcPicYuvRec ); 760 #endif761 523 } 762 524 763 525 Void TAppEncTop::xDeleteBuffer( ) 764 526 { 765 #if H_MV766 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 #else773 527 TComList<TComPicYuv*>::iterator iterPicYuvRec = m_cListPicYuvRec.begin(); 774 528 775 529 Int iSize = Int( m_cListPicYuvRec.size() ); 776 #endif777 530 778 531 for ( Int i = 0; i < iSize; i++ ) … … 783 536 } 784 537 785 #if H_MV786 }787 }788 #endif789 538 } 790 539 791 540 /** \param iNumEncoded number of encoded frames 792 541 */ 793 #if H_MV794 Void TAppEncTop::xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, std::list<AccessUnit>& accessUnits, UInt layerId)795 #else796 542 Void TAppEncTop::xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, const std::list<AccessUnit>& accessUnits) 797 #endif798 543 { 799 544 Int i; 800 545 801 #if H_MV802 if( iNumEncoded > 0 )803 {804 TComList<TComPicYuv*>::iterator iterPicYuvRec = m_picYuvRec[layerId]->end();805 #else806 546 TComList<TComPicYuv*>::iterator iterPicYuvRec = m_cListPicYuvRec.end(); 807 547 list<AccessUnit>::const_iterator iterBitstream = accessUnits.begin(); 808 #endif809 548 810 549 for ( i = 0; i < iNumEncoded; i++ ) … … 816 555 { 817 556 TComPicYuv* pcPicYuvRec = *(iterPicYuvRec++); 818 #if H_MV819 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 #else835 557 if (m_pchReconFile) 836 558 { … … 842 564 rateStatsAccum(au, stats); 843 565 } 844 #endif845 566 } 846 567 … … 888 609 void TAppEncTop::printRateSummary() 889 610 { 890 #if H_MV891 Double time = (Double) m_frameRcvd[0] / m_iFrameRate;892 printf("\n");893 #else894 611 Double time = (Double) m_iFrameRcvd / m_iFrameRate; 895 #endif896 612 printf("Bytes written to file: %u (%.3f kbps)\n", m_totalBytes, 0.008 * m_totalBytes / time); 897 613 #if VERBOSE_RATE … … 900 616 } 901 617 902 #if H_MV903 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 #endif964 618 965 619 //! \} -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/TAppEncTop.h
r364 r367 59 59 private: 60 60 // class interface 61 #if H_MV62 std::vector<TEncTop*> m_acTEncTopList ; ///< encoder class per layer63 std::vector<TVideoIOYuv*> m_acTVideoIOYuvInputFileList; ///< input YUV file64 std::vector<TVideoIOYuv*> m_acTVideoIOYuvReconFileList; ///< output reconstruction file65 66 std::vector<TComList<TComPicYuv*>*> m_picYuvRec; ///< list of reconstruction YUV files67 68 std::vector<Int> m_frameRcvd; ///< number of received frames69 70 TComPicLists m_ivPicLists; ///< picture buffers of encoder instances71 #else72 61 TEncTop m_cTEncTop; ///< encoder class 73 62 TVideoIOYuv m_cTVideoIOYuvInputFile; ///< input YUV file … … 77 66 78 67 Int m_iFrameRcvd; ///< number of received frames 79 #endif80 68 81 69 UInt m_essentialBytes; … … 89 77 90 78 /// obtain required buffers 91 #if H_MV92 Void xGetBuffer(TComPicYuv*& rpcPicYuvRec, UInt layer);93 #else94 79 Void xGetBuffer(TComPicYuv*& rpcPicYuvRec); 95 #endif96 80 97 81 /// delete allocated buffers … … 99 83 100 84 // file I/O 101 #if H_MV102 Void xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, std::list<AccessUnit>& accessUnits, UInt layerId); ///< write bitstream to file103 #else104 85 Void xWriteOutput(std::ostream& bitstreamFile, Int iNumEncoded, const std::list<AccessUnit>& accessUnits); ///< write bitstream to file 105 #endif106 86 void rateStatsAccum(const AccessUnit& au, const std::vector<UInt>& stats); 107 87 void printRateSummary(); 108 88 109 #if H_MV110 Void xSetLayerIds ( TComVPS& vps );111 Void xSetDimensionIdAndLength ( TComVPS& vps );112 Void xSetDirectDependencyFlags ( TComVPS& vps );113 Int xGetMax( std::vector<Int>& vec);114 #endif115 89 public: 116 90 TAppEncTop(); … … 118 92 119 93 Void encode (); ///< main encoding function 120 #if H_MV121 TEncTop* getTEncTopLayer(UInt layer) { return m_acTEncTopList[layer]; } ///< return pointer to encoder class for specific layer122 #if H_3D123 TEncTop* getTEncTopView( Int viewId, Bool isDepth ); ///< return pointer to encoder class for specific view Id and texture or depth124 #endif125 #else126 94 TEncTop& getTEncTop () { return m_cTEncTop; } ///< return encoder class pointer reference 127 #endif128 95 };// END CLASS DEFINITION TAppEncTop 129 96 -
branches/HTM-DEV-0.1-dev/source/App/TAppEncoder/encmain.cpp
r364 r367 57 57 // print information 58 58 fprintf( stdout, "\n" ); 59 #if H_MV60 fprintf( stdout, "3D-HTM Software: Encoder Version [%s] based on HM Version [%s]", NV_VERSION, HM_VERSION );61 #else62 59 fprintf( stdout, "HM software: Encoder Version [%s]", NV_VERSION ); 63 #endif64 60 fprintf( stdout, NVM_ONOS ); 65 61 fprintf( stdout, NVM_COMPILEDBY );
Note: See TracChangeset for help on using the changeset viewer.