Changeset 1356 in 3DVCSoftware for trunk/source/Lib/TLibCommon
- Timestamp:
- 27 Oct 2015, 11:33:16 (9 years ago)
- Location:
- trunk/source/Lib/TLibCommon
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/Lib/TLibCommon/CommonDef.h
r1322 r1356 173 173 #if NH_MV 174 174 static const Int MAX_NUM_LAYER_IDS = 63; 175 #if NH_MV_SEI 176 static const Int MAX_NUM_SEIS = 1000; 177 #endif 175 178 #else 176 179 static const Int MAX_NUM_LAYER_IDS = 64; … … 280 283 static const Int MAX_NUM_PICS_RPS = 16 ; 281 284 static const Int MAX_NUM_REF_LAYERS = 63 ; 285 #if NH_MV_SEI 286 static IntAry1d getRangeVec( Int rngStart, Int rngEnd ) { IntAry1d rng; for (Int i = rngStart; i<=rngEnd; i++) rng.push_back(i); return rng; }; 287 static const IntAry1d IDR_NAL_UNIT_TYPES = getRangeVec( NAL_UNIT_CODED_SLICE_IDR_W_RADL, NAL_UNIT_CODED_SLICE_IDR_N_LP ); 288 static const IntAry1d IRAP_NAL_UNIT_TYPES = getRangeVec( NAL_UNIT_CODED_SLICE_BLA_W_LP , NAL_UNIT_CODED_SLICE_CRA ); 289 290 #endif 282 291 #endif 283 292 -
trunk/source/Lib/TLibCommon/SEI.cpp
r1313 r1356 32 32 */ 33 33 34 /** \file SEI.cpp34 /** \file #SEI.cpp 35 35 \brief helper functions for SEI handling 36 36 */ … … 38 38 #include "CommonDef.h" 39 39 #include "SEI.h" 40 #if NH_MV_SEI 41 #include "TComSlice.h" 42 #endif 40 43 41 44 SEIMessages getSeisByType(SEIMessages &seiList, SEI::PayloadType seiType) … … 150 153 case SEI::CHROMA_SAMPLING_FILTER_HINT: return "Chroma sampling filter hint"; 151 154 #if NH_MV 152 case SEI::SUB_BITSTREAM_PROPERTY: return "Sub-bitstream property SEI message"; 155 case SEI::COLOUR_REMAPPING_INFO: return "Colour remapping information"; 156 case SEI::DEINTERLACED_FIELD_IDENTIFICATION: return "Deinterlaced field identification"; 157 case SEI::LAYERS_NOT_PRESENT: return "Layers not present"; 158 case SEI::INTER_LAYER_CONSTRAINED_TILE_SETS: return "Inter-layer constrained tile sets"; 159 case SEI::BSP_NESTING: return "Bitstream partition nesting"; 160 case SEI::BSP_INITIAL_ARRIVAL_TIME: return "Bitstream partition initial arrival time"; 161 case SEI::SUB_BITSTREAM_PROPERTY: return "Sub-bitstream property"; 162 case SEI::ALPHA_CHANNEL_INFO: return "Alpha channel information"; 163 case SEI::OVERLAY_INFO: return "Overlay information" ; 164 case SEI::TEMPORAL_MV_PREDICTION_CONSTRAINTS: return "Temporal motion vector prediction constraints"; 165 case SEI::FRAME_FIELD_INFO: return "Frame-field information"; 166 case SEI::THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO: return "3D reference displays information"; 167 case SEI::DEPTH_REPRESENTATION_INFO: return "Depth representation information"; 168 case SEI::MULTIVIEW_SCENE_INFO: return "Multiview scene information"; 169 case SEI::MULTIVIEW_ACQUISITION_INFO: return "Multiview acquisition information"; 170 case SEI::MULTIVIEW_VIEW_POSITION: return "Multiview view position"; 171 #if NH_3D 172 case SEI::ALTERNATIVE_DEPTH_INFO: return "Alternative depth information"; 173 #endif 153 174 #endif 154 175 default: return "Unknown"; 155 176 } 156 177 } 178 179 #if NH_MV_SEI 180 SEI::SEI() 181 { 182 m_scalNestSeiContThisSei = NULL; 183 } 184 185 SEI* SEI::getNewSEIMessage(SEI::PayloadType payloadType) 186 { 187 switch (payloadType) 188 { 189 #if NH_MV_SEI_TBD 190 ////////////////////////////////////////////////////////////////////////// 191 // TBD: Modify version 1 SEIs to use the same interfaces as Annex GFI SEI messages. 192 ////////////////////////////////////////////////////////////////////////// 193 194 case SEI::BUFFERING_PERIOD: return new SEIBufferingPeriod; 195 case SEI::PICTURE_TIMING: return new SEIPictureTiming; 196 case SEI::PAN_SCAN_RECT: return new SEIPanScanRectangle; // not currently decoded 197 case SEI::FILLER_PAYLOAD: return new SEIFillerPaylod; // not currently decoded 198 case SEI::USER_DATA_REGISTERED_ITU_T_T35: return new SEIUserDataRegistered; // not currently decoded 199 case SEI::USER_DATA_UNREGISTERED: return new SEIuserDataUnregistered; 200 case SEI::RECOVERY_POINT: return new SEIRecoveryPoint; 201 case SEI::SCENE_INFO: return new SEISceneInformation; // not currently decoded 202 case SEI::FULL_FRAME_SNAPSHOT: return new SEIPictureSnapshot; // not currently decoded 203 case SEI::PROGRESSIVE_REFINEMENT_SEGMENT_START: return new SEIProgressiveRefinementSegmentStart; // not currently decoded 204 case SEI::PROGRESSIVE_REFINEMENT_SEGMENT_END: return new SEIProgressiveRefinementSegmentEnd; // not currently decoded 205 case SEI::FILM_GRAIN_CHARACTERISTICS: return new SEIFilmGrainCharacteristics; // not currently decoded 206 case SEI::POST_FILTER_HINT: return new SEIPostFilterHint; // not currently decoded 207 case SEI::TONE_MAPPING_INFO: return new SEIToneMappingInfo; 208 case SEI::KNEE_FUNCTION_INFO: return new SEIKneeFunctionInfo; 209 case SEI::FRAME_PACKING: return new SEIFramePacking; 210 case SEI::DISPLAY_ORIENTATION: return new SEIDisplayOrientation; 211 case SEI::SOP_DESCRIPTION: return new SEISOPDescription; 212 case SEI::ACTIVE_PARAMETER_SETS: return new SEIActiveParameterSets; 213 case SEI::DECODING_UNIT_INFO: return new SEIDecodingUnitInfo; 214 case SEI::TEMPORAL_LEVEL0_INDEX: return new SEITemporalLevel0Index 215 case SEI::DECODED_PICTURE_HASH: return new SEIDecodedPictureHash; 216 case SEI::SCALABLE_NESTING: return new SEIScalableNesting; 217 case SEI::REGION_REFRESH_INFO: return new SEIRegionRefreshInfo; 218 case SEI::NO_DISPLAY: return new SEINoDisplay; 219 case SEI::TIME_CODE: return new SEITimeCode; 220 case SEI::MASTERING_DISPLAY_COLOUR_VOLUME: return new SEIMasteringDisplayColourVolume; 221 case SEI::SEGM_RECT_FRAME_PACKING: return new SEISegmentedRectFramePacking; 222 case SEI::TEMP_MOTION_CONSTRAINED_TILE_SETS: return new SEITempMotionConstrainedTileSets; 223 case SEI::CHROMA_SAMPLING_FILTER_HINT: return new SEIChromaSamplingFilterHint 224 #endif 225 #if NH_MV_SEI 226 #if NH_MV_LAYERS_NOT_PRESENT_SEI 227 case SEI::LAYERS_NOT_PRESENT : return new SEILayersNotPresent; 228 #endif 229 case SEI::INTER_LAYER_CONSTRAINED_TILE_SETS : return new SEIInterLayerConstrainedTileSets; 230 #if NH_MV_SEI_TBD 231 case SEI::BSP_NESTING : return new SEIBspNesting; 232 case SEI::BSP_INITIAL_ARRIVAL_TIME : return new SEIBspInitialArrivalTime; 233 #endif 234 case SEI::SUB_BITSTREAM_PROPERTY : return new SEISubBitstreamProperty; 235 case SEI::ALPHA_CHANNEL_INFO : return new SEIAlphaChannelInfo; 236 case SEI::OVERLAY_INFO : return new SEIOverlayInfo; 237 case SEI::TEMPORAL_MV_PREDICTION_CONSTRAINTS : return new SEITemporalMvPredictionConstraints; 238 #if NH_MV_SEI_TBD 239 case SEI::FRAME_FIELD_INFO : return new SEIFrameFieldInfo; 240 #endif 241 case SEI::THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO: return new SEIThreeDimensionalReferenceDisplaysInfo; 242 #if SEI_DRI_F0169 243 case SEI::DEPTH_REPRESENTATION_INFO : return new SEIDepthRepresentationInfo; 244 #endif 245 case SEI::MULTIVIEW_SCENE_INFO : return new SEIMultiviewSceneInfo; 246 case SEI::MULTIVIEW_ACQUISITION_INFO : return new SEIMultiviewAcquisitionInfo; 247 case SEI::MULTIVIEW_VIEW_POSITION : return new SEIMultiviewViewPosition; 248 #if NH_3D 249 case SEI::ALTERNATIVE_DEPTH_INFO : return new SEIAlternativeDepthInfo; 250 #endif 251 #endif 252 default: assert( false ); return NULL; 253 } 254 } 255 256 Void SEI::setupFromSlice ( const TComSlice* slice ) 257 { 258 xPrintCfgErrorIntro(); 259 std::cout << getSEIMessageString( payloadType() ) << "Setup by the encoder is currently not possible. Using the default SEI cfg-file." << std::endl; 260 } 261 262 SEI* SEI::getCopy() const 263 { 264 assert( 0 ); 265 return NULL; 266 } 267 268 Void SEI::setupFromCfgFile( const Char* cfgFile ) 269 { 270 assert( false ); 271 } 272 273 Bool SEI::insertSei( Int curLayerId, Int curPoc, Int curTid, Int curNaluType ) const 274 { 275 Bool insertSeiHere = true; 276 if( !m_applicableLayerIds.empty() ) 277 { 278 insertSeiHere = insertSeiHere && ( std::find( m_applicableLayerIds.begin(), m_applicableLayerIds.end(), curLayerId) != m_applicableLayerIds.end() ) ; 279 } 280 if( !m_applicablePocs .empty() ) 281 { 282 insertSeiHere = insertSeiHere && ( std::find( m_applicablePocs .begin(), m_applicablePocs .end(), curPoc ) != m_applicablePocs .end() ) ; 283 } 284 if( !m_applicableTids .empty() ) 285 { 286 insertSeiHere = insertSeiHere && ( std::find( m_applicableTids .begin(), m_applicableTids .end(), curTid ) != m_applicableTids .end() ) ; 287 } 288 if( !m_applicableVclNaluTypes.empty() ) 289 { 290 insertSeiHere = insertSeiHere && ( std::find( m_applicableVclNaluTypes.begin(), m_applicableVclNaluTypes.end(), curNaluType) != m_applicableVclNaluTypes.end() ) ; 291 } 292 return insertSeiHere; 293 } 294 295 Bool SEI::checkCfg( const TComSlice* slice ) 296 { 297 assert( false ); 298 return true; 299 } 300 301 Void SEI::xPrintCfgErrorIntro() 302 { 303 std::cout << "Error in configuration of " << getSEIMessageString( payloadType() ) << " SEI: "; 304 } 305 306 Void SEI::xCheckCfgRange( Bool& wrongConfig, Int val, Int minVal, Int maxVal, const Char* seName ) 307 { 308 if ( val < minVal || val > maxVal ) 309 { 310 xPrintCfgErrorIntro(); 311 std::cout << "The value of " << seName << "shall be in the range of " << minVal << " to " << maxVal << ", inclusive." << std::endl; 312 wrongConfig = true; 313 } 314 } 315 316 Void SEI::xAddGeneralOpts(po::Options &opts, IntAry1d defAppLayerIds, IntAry1d deftApplicablePocs, 317 IntAry1d defAppTids, IntAry1d defAppVclNaluTypes, 318 Int defSeiNaluId, Int defPositionInSeiNalu, Bool defModifyByEncoder) 319 { 320 opts.addOptions() 321 ("PayloadType" , m_payloadType , -1 , "Payload Type" ) 322 ("ApplicableLayerIds" , m_applicableLayerIds , defAppLayerIds , "LayerIds of layers to which the SEI is added. (all when empty)") 323 ("ApplicablePocs" , m_applicablePocs , deftApplicablePocs , "POCs of pictures to which the SEI is added. (all when empty)") 324 ("ApplicableTids" , m_applicableTids , defAppTids , "TIds of pictures to which the SEI is added. (all when empty)") 325 ("ApplicableVclNaluTypes" , m_applicableVclNaluTypes , defAppVclNaluTypes , "NaluUnitTypes of picture to which the SEI is added. (all when empty)") 326 ("SeiNaluId" , m_seiNaluId , defSeiNaluId , "Identifies to which NAL unit the SEI is added." ) 327 ("PositionInSeiNalu" , m_positionInSeiNalu , defPositionInSeiNalu , "Identifies the position within the NAL unit.") 328 ("ModifyByEncoder" , m_modifyByEncoder , defModifyByEncoder , "0: Use payload as specified in cfg file 1: Modify SEI by encoder"); 329 } 330 331 Void SEI::xCheckCfg( Bool& wrongConfig, Bool cond, const Char* errStr ) 332 { 333 if ( !cond ) 334 { 335 xPrintCfgErrorIntro(); 336 std::cout << errStr << std::endl; 337 wrongConfig = true; 338 } 339 } 340 341 342 #if NH_MV_LAYERS_NOT_PRESENT_SEI 343 Void SEILayersNotPresent::setupFromCfgFile(const Char* cfgFile) 344 { 345 // Set default values 346 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 347 348 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 349 // This SEI message doesn't need to be added by default to any Layer / POC / NAL Unit / T Layer. Not sure if empty is right. 350 defAppLayerIds .empty( ); 351 defAppPocs .empty( ); 352 defAppTids .empty( ); 353 defAppVclNaluTypes.empty( ); 354 355 Int defSeiNaluId = 0; 356 Int defPositionInSeiNalu = 0; 357 Bool defModifyByEncoder = false; //0: Use payload as specified in cfg file 1: Modify SEI by encoder 358 359 // Setup config file options 360 po::Options opts; 361 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 362 363 opts.addOptions() 364 ("LnpSeiActiveVpsId" , m_lnpSeiActiveVpsId , 0 , "LnpSeiActiveVpsId" ) //Why? 365 ("LayerNotPresentFlag" , m_layerNotPresentFlag , BoolAry1d(1,0) , "LayerNotPresentFlag" ) 366 ; 367 368 po::setDefaults(opts); 369 370 // Parse the cfg file 371 po::ErrorReporter err; 372 po::parseConfigFile( opts, cfgFile, err ); 373 m_lnpSeiMaxLayers = (UInt) m_layerNotPresentFlag.size(); 374 }; 375 376 Bool SEILayersNotPresent::checkCfg( const TComSlice* slice ) 377 { 378 // Check config values 379 Bool wrongConfig = false; 380 // 381 const TComVPS* vps = slice->getVPS(); 382 // // TBD: Add constraints on presence of SEI here. 383 xCheckCfg ( wrongConfig, m_lnpSeiActiveVpsId == vps->getVPSId(), "The value of lnp_sei_active_vps_id shall be equal to the value of vps_video_parameter_set_id of the active VPS for the VCL NAL units of the access unit containing the SEI message." ); 384 xCheckCfg ( wrongConfig, m_lnpSeiMaxLayers == vps->getMaxLayersMinus1(), "The number of LayerNotPresent flags shall be equal to vpsMaxLayersMinus1." ); 385 386 387 for (Int i = 0; i < vps->getMaxLayersMinus1(); i++) 388 { 389 if ( m_layerNotPresentFlag[ i ] && i < vps->getMaxLayersMinus1() ) 390 { 391 for (Int j = 0; j < vps->getNumPredictedLayers( vps->getLayerIdInNuh( j ) - 1 ); j++ ) 392 { 393 xCheckCfg ( wrongConfig, m_layerNotPresentFlag[ vps->getLayerIdInVps( vps->getIdPredictedLayer( vps->getLayerIdInNuh(i),j) )], "When layer_not_present_flag[ i ] is equal to 1 and i is less than MaxLayersMinus1, layer_not_present_flag[ LayerIdxInVps[ IdPredictedLayer[ layer_id_in_nuh[ i ] ][ j ] ] ] shall be equal to 1 for all values of j in the range of 0 to NumPredictedLayers[ layer_id_in_nuh[ i ] ] - 1, inclusive." ); 394 } 395 } 396 } 397 398 return wrongConfig; 399 }; 400 #endif 401 402 403 Void SEIInterLayerConstrainedTileSets::setupFromCfgFile(const Char* cfgFile) 404 { 405 // Set default values 406 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 407 408 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 409 defAppLayerIds .empty( ); 410 defAppPocs .push_back( 0 ); 411 defAppTids .empty( ); 412 defAppVclNaluTypes.empty( ); 413 414 Int defSeiNaluId = 0; 415 Int defPositionInSeiNalu = 0; 416 Bool defModifyByEncoder = false; 417 418 // Setup config file options 419 po::Options opts; 420 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 421 422 const Int maxNumTileInSet = 100; 423 424 opts.addOptions() 425 ("IlAllTilesExactSampleValueMatchFlag", m_ilAllTilesExactSampleValueMatchFlag, false , "IlAllTilesExactSampleValueMatchFlag") 426 ("IlOneTilePerTileSetFlag" , m_ilOneTilePerTileSetFlag , false , "IlOneTilePerTileSetFlag" ) 427 ("IlNumSetsInMessageMinus1" , m_ilNumSetsInMessageMinus1 , 0 , "IlNumSetsInMessageMinus1" ) 428 ("SkippedTileSetPresentFlag" , m_skippedTileSetPresentFlag , false , "SkippedTileSetPresentFlag" ) 429 ("IlctsId" , m_ilctsId , IntAry1d (256,0) , "IlctsId" ) 430 ("IlNumTileRectsInSetMinus1" , m_ilNumTileRectsInSetMinus1 , IntAry1d (256,0) , "IlNumTileRectsInSetMinus1" ) 431 ("IlTopLeftTileIndex_%d" , m_ilTopLeftTileIndex , IntAry1d (maxNumTileInSet,0), 256, "IlTopLeftTileIndex" ) 432 ("IlBottomRightTileIndex_%d" , m_ilBottomRightTileIndex , IntAry1d (maxNumTileInSet,0), 256, "IlBottomRightTileIndex" ) 433 ("IlcIdc" , m_ilcIdc , IntAry1d (256,0) , "IlcIdc" ) 434 ("IlExactSampleValueMatchFlag" , m_ilExactSampleValueMatchFlag , BoolAry1d(256,0) , "IlExactSampleValueMatchFlag" ) 435 ("AllTilesIlcIdc" , m_allTilesIlcIdc , 0 , "AllTilesIlcIdc" ) 436 ; 437 438 po::setDefaults(opts); 439 440 // Parse the cfg file 441 po::ErrorReporter err; 442 po::parseConfigFile( opts, cfgFile, err ); 443 }; 444 445 Bool SEIInterLayerConstrainedTileSets::checkCfg( const TComSlice* slice ) 446 { 447 // Check config values 448 Bool wrongConfig = false; 449 const TComPPS* pps = slice->getPPS(); 450 451 // Currently only the active PPS checked. 452 xCheckCfg ( wrongConfig, pps->getTilesEnabledFlag() , "The inter-layer constrained tile sets SEI message shall not be present for the layer with nuh_layer_id equal to targetLayerId when tiles_enabled_flag is equal to 0 for any PPS that is active for the pictures of the CLVS of the layer with nuh_layer_id equal to targetLayerId." ); 453 454 if ( m_ilOneTilePerTileSetFlag ) 455 { 456 xCheckCfg( wrongConfig, ( pps->getNumTileColumnsMinus1() + 1 ) * ( pps->getNumTileRowsMinus1() + 1 ) <= 256, "It is a requirement of bitstream conformance that when il_one_tile_per_tile_set_flag is equal to 1, the value of ( num_tile_columns_minus1 + 1 ) * ( num_tile_rows_minus1 + 1 ) shall be less than or equal to 256." ); 457 } 458 Int numSignificantSets = m_ilNumSetsInMessageMinus1 - m_skippedTileSetPresentFlag + 1; 459 460 for (Int i = 0 ; i < numSignificantSets; i++) 461 { 462 xCheckCfgRange( wrongConfig, m_ilctsId[i] , 0 , (1 << 30) - 1, "ilcts_id" ); 463 } 464 465 return wrongConfig; 466 }; 467 #if NH_MV_SEI_TBD 468 469 Void SEIBspNesting::setupFromSlice ( const TComSlice* slice ) 470 { 471 sei.m_seiOlsIdx = TBD ; 472 sei.m_seiPartitioningSchemeIdx = TBD ; 473 sei.m_bspIdx = TBD ; 474 while( !ByteaLigned(() ) ); 475 { 476 sei.m_bspNestingZeroBit = TBD ; 477 } 478 sei.m_numSeisInBspMinus1 = TBD ; 479 for( Int i = 0; i <= NumSeisInBspMinus1( ); i++ ) 480 { 481 SeiMessage(() ); 482 } 483 }; 484 485 Void SEIBspNesting::setupFromCfgFile(const Char* cfgFile) 486 { 487 // Set default values 488 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 489 490 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 491 defAppLayerIds .push_back( TBD ); 492 defAppPocs .push_back( TBD ); 493 defAppTids .push_back( TBD ); 494 defAppVclNaluTypes.push_back( TBD ); 495 496 Int defSeiNaluId = 0; 497 Int defPositionInSeiNalu = 0; 498 Bool defModifyByEncoder = TBD; 499 500 // Setup config file options 501 po::Options opts; 502 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 503 504 opts.addOptions() 505 ("SeiOlsIdx" , m_seiOlsIdx , 0 , "SeiOlsIdx" ) 506 ("SeiPartitioningSchemeIdx" , m_seiPartitioningSchemeIdx , 0 , "SeiPartitioningSchemeIdx" ) 507 ("BspIdx" , m_bspIdx , 0 , "BspIdx" ) 508 ("BspNestingZeroBit" , m_bspNestingZeroBit , 0 , "BspNestingZeroBit" ) 509 ("NumSeisInBspMinus1" , m_numSeisInBspMinus1 , 0 , "NumSeisInBspMinus1" ) 510 ; 511 512 po::setDefaults(opts); 513 514 // Parse the cfg file 515 po::ErrorReporter err; 516 po::parseConfigFile( opts, cfgFile, err ); 517 }; 518 519 Bool SEIBspNesting::checkCfg( const TComSlice* slice ) 520 { 521 // Check config values 522 Bool wrongConfig = false; 523 524 // TBD: Add constraints on presence of SEI here. 525 xCheckCfg ( wrongConfig, TBD , "TBD" ); 526 xCheckCfg ( wrongConfig, TBD , "TBD" ); 527 528 // TBD: Modify constraints according to the SEI semantics. 529 xCheckCfgRange( wrongConfig, m_seiOlsIdx , MINVAL , MAXVAL, "sei_ols_idx" ); 530 xCheckCfgRange( wrongConfig, m_seiPartitioningSchemeIdx , MINVAL , MAXVAL, "sei_partitioning_scheme_idx" ); 531 xCheckCfgRange( wrongConfig, m_bspIdx , MINVAL , MAXVAL, "bsp_idx" ); 532 xCheckCfgRange( wrongConfig, m_bspNestingZeroBit , MINVAL , MAXVAL, "bsp_nesting_zero_bit "); 533 xCheckCfgRange( wrongConfig, m_numSeisInBspMinus1 , MINVAL , MAXVAL, "num_seis_in_bsp_minus1" ); 534 535 return wrongConfig; 536 537 }; 538 539 Void SEIBspInitialArrivalTime::setupFromSlice ( const TComSlice* slice ) 540 { 541 psIdx = SeiPartitioningSchemeIdx(); 542 if( nalInitialArrivalDelayPresent ) 543 { 544 for( Int i = 0; i < BspSchedCnt( SeiOlsIdx(), psIdx, MaxTemporalId( 0 ) ); i++ ) 545 { 546 sei.m_nalInitialArrivalDelay[i] = TBD ; 547 } 548 } 549 if( vclInitialArrivalDelayPresent ) 550 { 551 for( Int i = 0; i < BspSchedCnt( SeiOlsIdx(), psIdx, MaxTemporalId( 0 ) ); i++ ) 552 { 553 sei.m_vclInitialArrivalDelay[i] = TBD ; 554 } 555 } 556 }; 557 558 Void SEIBspInitialArrivalTime::setupFromCfgFile(const Char* cfgFile) 559 { 560 // Set default values 561 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 562 563 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 564 defAppLayerIds .push_back( TBD ); 565 defAppPocs .push_back( TBD ); 566 defAppTids .push_back( TBD ); 567 defAppVclNaluTypes.push_back( TBD ); 568 569 Int defSeiNaluId = 0; 570 Int defPositionInSeiNalu = 0; 571 Bool defModifyByEncoder = TBD; 572 573 // Setup config file options 574 po::Options opts; 575 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 576 577 opts.addOptions() 578 ("NalInitialArrivalDelay" , m_nalInitialArrivalDelay , IntAry1d (1,0) , "NalInitialArrivalDelay" ) 579 ("VclInitialArrivalDelay" , m_vclInitialArrivalDelay , IntAry1d (1,0) , "VclInitialArrivalDelay" ) 580 ; 581 582 po::setDefaults(opts); 583 584 // Parse the cfg file 585 po::ErrorReporter err; 586 po::parseConfigFile( opts, cfgFile, err ); 587 }; 588 589 Bool SEIBspInitialArrivalTime::checkCfg( const TComSlice* slice ) 590 { 591 // Check config values 592 Bool wrongConfig = false; 593 594 // TBD: Add constraints on presence of SEI here. 595 xCheckCfg ( wrongConfig, TBD , "TBD" ); 596 xCheckCfg ( wrongConfig, TBD , "TBD" ); 597 598 // TBD: Modify constraints according to the SEI semantics. 599 xCheckCfgRange( wrongConfig, m_nalInitialArrivalDelay[i] , MINVAL , MAXVAL, "nal_initial_arrival_delay" ); 600 xCheckCfgRange( wrongConfig, m_vclInitialArrivalDelay[i] , MINVAL , MAXVAL, "vcl_initial_arrival_delay" ); 601 602 return wrongConfig; 603 604 }; 605 #endif 606 607 Void SEISubBitstreamProperty::setupFromCfgFile(const Char* cfgFile) 608 { 609 // Set default values 610 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 611 612 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 613 defAppLayerIds .push_back( 0 ); 614 defAppPocs .push_back( 0 ); 615 defAppTids .push_back( 0 ); 616 defAppVclNaluTypes = IRAP_NAL_UNIT_TYPES; 617 618 Int defSeiNaluId = 0; 619 Int defPositionInSeiNalu = 0; 620 Bool defModifyByEncoder = false; 621 622 // Setup config file options 623 po::Options opts; 624 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 625 626 opts.addOptions() 627 ("SbPropertyActiveVpsId" , m_sbPropertyActiveVpsId , 0 , "SbPropertyActiveVpsId" ) 628 ("NumAdditionalSubStreamsMinus1" , m_numAdditionalSubStreamsMinus1 , 0 , "NumAdditionalSubStreamsMinus1" ) 629 ("SubBitstreamMode" , m_subBitstreamMode , IntAry1d (1,0) , "SubBitstreamMode" ) 630 ("OlsIdxToVps" , m_olsIdxToVps , IntAry1d (1,0) , "OlsIdxToVps" ) 631 ("HighestSublayerId" , m_highestSublayerId , IntAry1d (1,0) , "HighestSublayerId" ) 632 ("AvgSbPropertyBitRate" , m_avgSbPropertyBitRate , IntAry1d (1,0) , "AvgSbPropertyBitRate" ) 633 ("MaxSbPropertyBitRate" , m_maxSbPropertyBitRate , IntAry1d (1,0) , "MaxSbPropertyBitRate" ) 634 ; 635 636 po::setDefaults(opts); 637 638 // Parse the cfg file 639 po::ErrorReporter err; 640 po::parseConfigFile( opts, cfgFile, err ); 641 }; 642 643 Bool SEISubBitstreamProperty::checkCfg( const TComSlice* slice ) 644 { 645 // Check config values 646 Bool wrongConfig = false; 647 648 // For the current encoder, the initial IRAP access unit has always POC zero. 649 xCheckCfg ( wrongConfig, slice->isIRAP() && (slice->getPOC() == 0), "When present, the sub-bitstream property SEI message shall be associated with an initial IRAP access unit and the information provided by the SEI messages applies to the bitstream corresponding to the CVS containing the associated initial IRAP access unit."); 650 651 Bool sizeNotCorrect = 652 ( ( m_numAdditionalSubStreamsMinus1 + 1 ) != m_subBitstreamMode .size() ) 653 || ( ( m_numAdditionalSubStreamsMinus1 + 1 ) != m_olsIdxToVps .size() ) 654 || ( ( m_numAdditionalSubStreamsMinus1 + 1 ) != m_highestSublayerId .size() ) 655 || ( ( m_numAdditionalSubStreamsMinus1 + 1 ) != m_avgSbPropertyBitRate.size() ) 656 || ( ( m_numAdditionalSubStreamsMinus1 + 1 ) != m_maxSbPropertyBitRate.size() ); 657 658 xCheckCfg( wrongConfig, !sizeNotCorrect, "Some parameters of some sub-bitstream not provided." ); 659 xCheckCfg( wrongConfig, slice->getVPS()->getVPSId() == m_sbPropertyActiveVpsId, "The value of sb_property_active_vps_id shall be equal to the value of vps_video_parameter_set_id of the active VPS referred to by the VCL NAL units of the associated access unit." ); 660 661 xCheckCfgRange( wrongConfig, m_numAdditionalSubStreamsMinus1 , 0 , (1 << 10) - 1 , "num_additional_sub_streams_minus1"); 662 663 if ( !sizeNotCorrect ) 664 { 665 for (Int i = 0; i <= m_numAdditionalSubStreamsMinus1; i++ ) 666 { 667 xCheckCfgRange( wrongConfig, m_subBitstreamMode[i] , 0 , 1 , "sub_bitstream_mode" ); 668 xCheckCfgRange( wrongConfig, m_olsIdxToVps[i] , 0 , slice->getVPS()->getNumOutputLayerSets()-1 , "ols_idx_to_vps" ); 669 } 670 } 671 return wrongConfig; 672 }; 673 674 Void SEISubBitstreamProperty::resizeArrays( ) 675 { 676 m_subBitstreamMode .resize( m_numAdditionalSubStreamsMinus1 + 1); 677 m_olsIdxToVps .resize( m_numAdditionalSubStreamsMinus1 + 1); 678 m_highestSublayerId .resize( m_numAdditionalSubStreamsMinus1 + 1); 679 m_avgSbPropertyBitRate.resize( m_numAdditionalSubStreamsMinus1 + 1); 680 m_maxSbPropertyBitRate.resize( m_numAdditionalSubStreamsMinus1 + 1); 681 } 682 683 Void SEIAlphaChannelInfo::setupFromCfgFile(const Char* cfgFile) 684 { 685 // Set default values 686 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 687 688 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 689 defAppLayerIds .clear(); 690 defAppPocs .push_back( 0 ); 691 defAppTids .push_back( 0 ); 692 defAppVclNaluTypes = IDR_NAL_UNIT_TYPES; 693 694 Int defSeiNaluId = 0; 695 Int defPositionInSeiNalu = 0; 696 Bool defModifyByEncoder = false; 697 698 // Setup config file options 699 po::Options opts; 700 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 701 702 opts.addOptions() 703 ("AlphaChannelCancelFlag" , m_alphaChannelCancelFlag , false , "AlphaChannelCancelFlag" ) 704 ("AlphaChannelUseIdc" , m_alphaChannelUseIdc , 0 , "AlphaChannelUseIdc" ) 705 ("AlphaChannelBitDepthMinus8" , m_alphaChannelBitDepthMinus8 , 0 , "AlphaChannelBitDepthMinus8" ) 706 ("AlphaTransparentValue" , m_alphaTransparentValue , 0 , "AlphaTransparentValue" ) 707 ("AlphaOpaqueValue" , m_alphaOpaqueValue , 255 , "AlphaOpaqueValue" ) 708 ("AlphaChannelIncrFlag" , m_alphaChannelIncrFlag , false , "AlphaChannelIncrFlag" ) 709 ("AlphaChannelClipFlag" , m_alphaChannelClipFlag , false , "AlphaChannelClipFlag" ) 710 ("AlphaChannelClipTypeFlag" , m_alphaChannelClipTypeFlag , false , "AlphaChannelClipTypeFlag" ) 711 ; 712 713 po::setDefaults(opts); 714 715 // Parse the cfg file 716 po::ErrorReporter err; 717 po::parseConfigFile( opts, cfgFile, err ); 718 719 }; 720 721 Bool SEIAlphaChannelInfo::checkCfg( const TComSlice* slice ) 722 { 723 // Check config values 724 Bool wrongConfig = false; 725 726 int maxInterpretationValue = (1 << (m_alphaChannelBitDepthMinus8+9)) - 1; 727 xCheckCfgRange( wrongConfig, m_alphaChannelCancelFlag , 0 , 1, "alpha_channel_cancel_flag" ); 728 xCheckCfgRange( wrongConfig, m_alphaChannelUseIdc , 0 , 7, "alpha_channel_use_idc"); 729 xCheckCfgRange( wrongConfig, m_alphaChannelBitDepthMinus8 , 0 , 7, "alpha_channel_bit_depth_minus8" ); 730 xCheckCfgRange( wrongConfig, m_alphaTransparentValue , 0 , maxInterpretationValue, "alpha_transparent_value" ); 731 xCheckCfgRange( wrongConfig, m_alphaOpaqueValue , 0 , maxInterpretationValue, "alpha_opaque_value" ); 732 xCheckCfgRange( wrongConfig, m_alphaChannelIncrFlag , 0 , 1, "alpha_channel_incr_flag" ); 733 xCheckCfgRange( wrongConfig, m_alphaChannelClipFlag , 0 , 1, "alpha_channel_clip_flag" ); 734 xCheckCfgRange( wrongConfig, m_alphaChannelClipTypeFlag , 0 , 1, "alpha_channel_clip_type_flag" ); 735 736 return wrongConfig; 737 738 }; 739 740 SEIOverlayInfo::SEIOverlayInfo ( ) 741 : m_numOverlaysMax(16) 742 , m_numOverlayElementsMax(256) 743 , m_numStringBytesMax(256) //incl. null termination byte 744 { }; 745 746 Void SEIOverlayInfo::setupFromCfgFile(const Char* cfgFile) 747 { 748 // Set default values 749 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 750 751 // Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 752 defAppLayerIds .clear(); 753 defAppPocs .push_back( 0 ); 754 defAppTids .push_back( 0 ); 755 defAppVclNaluTypes = IDR_NAL_UNIT_TYPES; 756 757 Int defSeiNaluId = 0; 758 Int defPositionInSeiNalu = 0; 759 Bool defModifyByEncoder = false; 760 761 // Setup config file options 762 po::Options opts; 763 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 764 765 opts.addOptions() 766 ("OverlayInfoCancelFlag" , m_overlayInfoCancelFlag , false , "OverlayInfoCancelFlag" ) 767 ("OverlayContentAuxIdMinus128" , m_overlayContentAuxIdMinus128 , 0 , "OverlayContentAuxIdMinus128" ) 768 ("OverlayLabelAuxIdMinus128" , m_overlayLabelAuxIdMinus128 , 0 , "OverlayLabelAuxIdMinus128" ) 769 ("OverlayAlphaAuxIdMinus128" , m_overlayAlphaAuxIdMinus128 , 0 , "OverlayAlphaAuxIdMinus128" ) 770 ("OverlayElementLabelValueLengthMinus8", m_overlayElementLabelValueLengthMinus8, 0 , "OverlayElementLabelValueLengthMinus8") 771 ("NumOverlaysMinus1" , m_numOverlaysMinus1 , 0 , "NumOverlaysMinus1" ) 772 ("OverlayIdx" , m_overlayIdx , IntAry1d (16,0) , "OverlayIdx" ) 773 ("LanguageOverlayPresentFlag" , m_languageOverlayPresentFlag , BoolAry1d(16,0) , "LanguageOverlayPresentFlag" ) 774 ("OverlayContentLayerId" , m_overlayContentLayerId , IntAry1d (16,0) , "OverlayContentLayerId" ) 775 ("OverlayLabelPresentFlag" , m_overlayLabelPresentFlag , BoolAry1d(16,0) , "OverlayLabelPresentFlag" ) 776 ("OverlayLabelLayerId" , m_overlayLabelLayerId , IntAry1d (16,0) , "OverlayLabelLayerId" ) 777 ("OverlayAlphaPresentFlag" , m_overlayAlphaPresentFlag , BoolAry1d(16,0) , "OverlayAlphaPresentFlag" ) 778 ("OverlayAlphaLayerId" , m_overlayAlphaLayerId , IntAry1d (16,0) , "OverlayAlphaLayerId" ) 779 ("NumOverlayElementsMinus1" , m_numOverlayElementsMinus1 , IntAry1d (16,0) , "NumOverlayElementsMinus1" ) 780 ("OverlayElementLabelMin_%d" , m_overlayElementLabelMin , IntAry1d (256,0) ,16 , "OverlayElementLabelMin" ) 781 ("OverlayElementLabelMax_%d" , m_overlayElementLabelMax , IntAry1d (256,0) ,16 , "OverlayElementLabelMax" ) 782 ("OverlayLanguage_%d" , m_overlayLanguage , std::string(""), 16 , "OverlayLanguage" ) 783 ("OverlayName_%d" , m_overlayName , std::string(""), 16 , "OverlayName" ) 784 ("OverlayElementName_%d_%d" , m_overlayElementName , std::string(""), 256 ,16 , "OverlayElementName" ) 785 ("OverlayInfoPersistenceFlag" , m_overlayInfoPersistenceFlag , false , "OverlayInfoPersistenceFlag" ) 786 ; 787 788 po::setDefaults(opts); 789 790 // Parse the cfg file 791 po::ErrorReporter err; 792 po::parseConfigFile( opts, cfgFile, err ); 793 }; 794 795 796 Bool SEIOverlayInfo::checkCfg( const TComSlice* slice ) 797 { 798 // Check config values 799 Bool wrongConfig = false; 800 801 xCheckCfgRange( wrongConfig, m_overlayInfoCancelFlag , 0 , 1, "overlay_info_cancel_flag" ); 802 xCheckCfgRange( wrongConfig, m_overlayContentAuxIdMinus128 , 0 , 31, "overlay_content_aux_id_minus128" ); 803 xCheckCfgRange( wrongConfig, m_overlayLabelAuxIdMinus128 , 0 , 31, "overlay_label_aux_id_minus128" ); 804 xCheckCfgRange( wrongConfig, m_overlayAlphaAuxIdMinus128 , 0 , 31, "overlay_alpha_aux_id_minus128" ); 805 xCheckCfgRange( wrongConfig, m_numOverlaysMinus1 , 0 , m_numOverlaysMax-1, "num_overlays_minus1" ); 806 for (Int i=0 ; i<=m_numOverlaysMinus1 ; ++i) 807 { 808 xCheckCfgRange( wrongConfig, m_overlayIdx[i] , 0 , 255, "overlay_idx" ); 809 xCheckCfgRange( wrongConfig, m_languageOverlayPresentFlag[i] , 0 , 1, "language_overlay_present_flag" ); 810 xCheckCfgRange( wrongConfig, m_overlayLabelPresentFlag[i] , 0 , 1, "overlay_label_present_flag" ); 811 xCheckCfgRange( wrongConfig, m_overlayAlphaPresentFlag[i] , 0 , 1, "overlay_alpha_present_flag" ); 812 xCheckCfgRange( wrongConfig, m_overlayContentLayerId[i] , 0 , 63, "overlay_content_layer_id" ); 813 xCheckCfgRange( wrongConfig, m_overlayLabelLayerId[i] , 0 , 63, "overlay_label_layer_id" ); 814 xCheckCfgRange( wrongConfig, m_overlayAlphaLayerId[i] , 0 , 63, "overlay_alpha_layer_id" ); 815 xCheckCfgRange( wrongConfig, m_numOverlayElementsMinus1[i] , 0 , m_numOverlayElementsMax-1, "num_overlay_elements_minus1" ); 816 for (Int j=0 ; j<=m_numOverlayElementsMinus1[i] ; ++j) 817 { 818 Int maxLabelMinMaxValue = ( 1 << ( m_overlayElementLabelValueLengthMinus8 + 8 ) )-1; 819 xCheckCfgRange( wrongConfig, m_overlayElementLabelMin[i][j] , 0 , maxLabelMinMaxValue , "overlay_element_label_min" ); 820 xCheckCfgRange( wrongConfig, m_overlayElementLabelMax[i][j] , 0 , maxLabelMinMaxValue , "overlay_element_label_max" ); 821 } 822 } 823 xCheckCfgRange( wrongConfig, m_overlayInfoPersistenceFlag , 0 , 1, "overlay_info_persistence_flag" ); 824 825 return wrongConfig; 826 827 }; 828 829 830 Void SEITemporalMvPredictionConstraints::setupFromCfgFile(const Char* cfgFile) 831 { 832 // Set default values 833 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 834 835 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 836 defAppLayerIds .clear ( ); 837 defAppPocs .push_back( 0 ); 838 defAppTids .push_back( 0 ); 839 defAppVclNaluTypes.clear ( ); 840 841 Int defSeiNaluId = 0; 842 Int defPositionInSeiNalu = 0; 843 Bool defModifyByEncoder = false; 844 845 // Setup config file options 846 po::Options opts; 847 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 848 849 opts.addOptions() 850 ("PrevPicsNotUsedFlag" , m_prevPicsNotUsedFlag , false, "PrevPicsNotUsedFlag" ) 851 ("NoIntraLayerColPicFlag", m_noIntraLayerColPicFlag, false, "NoIntraLayerColPicFlag" ) 852 ; 853 854 po::setDefaults(opts); 855 856 // Parse the cfg file 857 po::ErrorReporter err; 858 po::parseConfigFile( opts, cfgFile, err ); 859 }; 860 861 Bool SEITemporalMvPredictionConstraints::checkCfg( const TComSlice* slice ) 862 { 863 // Check config values 864 Bool wrongConfig = false; 865 866 xCheckCfg ( wrongConfig, slice->getTemporalId() == 0 , "The temporal motion vector prediction constraints SEI message may be present in an access unit with TemporalId equal to 0 and shall not be present in an access unit with TemporalId greater than 0." ); 867 868 return wrongConfig; 869 }; 870 871 #if NH_MV_SEI_TBD 872 Void SEIFrameFieldInfo::setupFromCfgFile(const Char* cfgFile) 873 { 874 // Set default values 875 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 876 877 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 878 defAppLayerIds .push_back( TBD ); 879 defAppPocs .push_back( TBD ); 880 defAppTids .push_back( TBD ); 881 defAppVclNaluTypes.push_back( TBD ); 882 883 Int defSeiNaluId = 0; 884 Int defPositionInSeiNalu = 0; 885 Bool defModifyByEncoder = false; 886 887 // Setup config file options 888 po::Options opts; 889 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 890 891 opts.addOptions() 892 ("FfinfoPicStruct" , m_ffinfoPicStruct , 0 , "FfinfoPicStruct" ) 893 ("FfinfoSourceScanType", m_ffinfoSourceScanType, 0 , "FfinfoSourceScanType") 894 ("FfinfoDuplicateFlag" , m_ffinfoDuplicateFlag , false , "FfinfoDuplicateFlag" ) 895 ; 896 897 po::setDefaults(opts); 898 899 // Parse the cfg file 900 po::ErrorReporter err; 901 po::parseConfigFile( opts, cfgFile, err ); 902 }; 903 904 905 Bool SEIFrameFieldInfo::checkCfg( const TComSlice* slice ) 906 { 907 // Check config values 908 Bool wrongConfig = false; 909 910 // TBD: Add constraints on presence of SEI here. 911 xCheckCfg ( wrongConfig, TBD , "TBD" ); 912 xCheckCfg ( wrongConfig, TBD , "TBD" ); 913 914 // TBD: Modify constraints according to the SEI semantics. 915 xCheckCfgRange( wrongConfig, m_ffinfoPicStruct , MINVAL , MAXVAL, "ffinfo_pic_struct" ); 916 xCheckCfgRange( wrongConfig, m_ffinfoSourceScanType , MINVAL , MAXVAL, "ffinfo_source_scan_type" ); 917 xCheckCfgRange( wrongConfig, m_ffinfoDuplicateFlag , MINVAL , MAXVAL, "ffinfo_duplicate_flag" ); 918 919 return wrongConfig; 920 921 }; 922 #endif 923 924 Void SEIThreeDimensionalReferenceDisplaysInfo::setupFromCfgFile(const Char* cfgFile) 925 { 926 // Set default values 927 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 928 929 // Default values for which layers, POCS, Tids or Nalu types the SEI should be sent. 930 defAppLayerIds .push_back( 0 ); 931 defAppPocs .push_back( 0 ); 932 defAppTids .push_back( 0 ); 933 defAppVclNaluTypes = IRAP_NAL_UNIT_TYPES; 934 935 Int defSeiNaluId = 0; 936 Int defPositionInSeiNalu = 0; 937 Bool defModifyByEncoder = 0; 938 939 // Setup config file options 940 po::Options opts; 941 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 942 943 opts.addOptions() 944 ("PrecRefDisplayWidth" , m_precRefDisplayWidth , 0 , "PrecRefDisplayWidth" ) 945 ("RefViewingDistanceFlag" , m_refViewingDistanceFlag , false , "RefViewingDistanceFlag" ) 946 ("PrecRefViewingDist" , m_precRefViewingDist , 0 , "PrecRefViewingDist" ) 947 ("NumRefDisplaysMinus1" , m_numRefDisplaysMinus1 , 0 , "NumRefDisplaysMinus1" ) 948 ("LeftViewId" , m_leftViewId , IntAry1d (1,0) , "LeftViewId" ) 949 ("RightViewId" , m_rightViewId , IntAry1d (1,0) , "RightViewId" ) 950 ("ExponentRefDisplayWidth" , m_exponentRefDisplayWidth , IntAry1d (1,0) , "ExponentRefDisplayWidth" ) 951 ("MantissaRefDisplayWidth" , m_mantissaRefDisplayWidth , IntAry1d (1,0) , "MantissaRefDisplayWidth" ) 952 ("ExponentRefViewingDistance" , m_exponentRefViewingDistance , IntAry1d (1,0) , "ExponentRefViewingDistance" ) 953 ("MantissaRefViewingDistance" , m_mantissaRefViewingDistance , IntAry1d (1,0) , "MantissaRefViewingDistance" ) 954 ("AdditionalShiftPresentFlag" , m_additionalShiftPresentFlag , BoolAry1d(1,0) , "AdditionalShiftPresentFlag" ) 955 ("NumSampleShiftPlus512" , m_numSampleShiftPlus512 , IntAry1d (1,0) , "NumSampleShiftPlus512" ) 956 ("ThreeDimensionalReferenceDisplaysExtensionFlag", m_threeDimensionalReferenceDisplaysExtensionFlag, false , "ThreeDimensionalReferenceDisplaysExtensionFlag") 957 ; 958 959 po::setDefaults(opts); 960 961 // Parse the cfg file 962 po::ErrorReporter err; 963 po::parseConfigFile( opts, cfgFile, err ); 964 }; 965 966 967 UInt SEIThreeDimensionalReferenceDisplaysInfo::getMantissaReferenceDisplayWidthLen( Int i ) const 968 { 969 return xGetSyntaxElementLen( m_exponentRefDisplayWidth[i], m_precRefDisplayWidth, m_mantissaRefDisplayWidth[ i ] ); 970 } 971 972 UInt SEIThreeDimensionalReferenceDisplaysInfo::getMantissaReferenceViewingDistanceLen( Int i ) const 973 { 974 return xGetSyntaxElementLen( m_exponentRefViewingDistance[i], m_precRefViewingDist, m_mantissaRefViewingDistance[ i ] ); 975 } 976 977 UInt SEIThreeDimensionalReferenceDisplaysInfo::xGetSyntaxElementLen( Int expo, Int prec, Int val ) const 978 { 979 UInt len; 980 if( expo == 0 ) 981 { 982 len = std::max(0, prec - 30 ); 983 } 984 else 985 { 986 len = std::max( 0, expo + prec - 31 ); 987 } 988 989 assert( val >= 0 ); 990 assert( val <= ( ( 1 << len )- 1) ); 991 return len; 992 } 993 994 Bool SEIThreeDimensionalReferenceDisplaysInfo::checkCfg( const TComSlice* slice ) 995 { 996 // Check config values 997 Bool wrongConfig = false; 998 999 // The 3D reference display SEI should preferably be sent along with the multiview acquisition SEI. For now the multiview acquisition SEI is restricted to POC = 0, so 3D reference displays SEI is restricted to POC = 0 as well. 1000 xCheckCfg ( wrongConfig, slice->isIRAP() && (slice->getPOC() == 0) , "The 3D reference displays SEI message currently is associated with an access unit that contains an IRAP picture." ); 1001 1002 xCheckCfgRange( wrongConfig, m_precRefDisplayWidth , 0 , 31, "prec_ref_display_width" ); 1003 xCheckCfgRange( wrongConfig, m_refViewingDistanceFlag , 0 , 1, "ref_viewing_distance_flag"); 1004 xCheckCfgRange( wrongConfig, m_precRefViewingDist , 0 , 31, "prec_ref_viewing_dist" ); 1005 xCheckCfgRange( wrongConfig, m_numRefDisplaysMinus1 , 0 , 31, "num_ref_displays_minus1" ); 1006 1007 for (Int i = 0; i <= getNumRefDisplaysMinus1(); i++ ) 1008 { 1009 xCheckCfgRange( wrongConfig, m_exponentRefDisplayWidth[i] , 0 , 62, "exponent_ref_display_width" ); 1010 xCheckCfgRange( wrongConfig, m_exponentRefViewingDistance[i] , 0 , 62, "exponent_ref_viewing_distance"); 1011 xCheckCfgRange( wrongConfig, m_additionalShiftPresentFlag[i] , 0 , 1, "additional_shift_present_flag" ); 1012 xCheckCfgRange( wrongConfig, m_numSampleShiftPlus512[i] , 0 , 1023, "num_sample_shift_plus512" ); 1013 } 1014 xCheckCfgRange( wrongConfig, m_threeDimensionalReferenceDisplaysExtensionFlag, 0 , 1, "three_dimensional_reference_displays_extension_flag"); 1015 1016 return wrongConfig; 1017 1018 }; 1019 1020 #if SEI_DRI_F0169 1021 Void SEIDepthRepresentationInfo::setupFromSlice ( const TComSlice* slice ) 1022 { 1023 1024 m_currLayerID=slice->getLayerIdInVps(); 1025 }; 1026 1027 Void SEIDepthRepresentationInfo::setupFromCfgFile(const Char* cfgFile) 1028 { 1029 // Set default values 1030 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 1031 1032 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 1033 //defAppLayerIds .push_back( TBD ); 1034 defAppPocs .push_back( 0 ); 1035 //defAppTids .push_back( TBD ); 1036 //defAppVclNaluTypes.push_back( TBD ); 1037 1038 Int defSeiNaluId = 0; 1039 Int defPositionInSeiNalu = 0; 1040 Bool defModifyByEncoder = true; 1041 1042 // Setup config file options 1043 po::Options opts; 1044 1045 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 1046 1047 opts.addOptions() 1048 ("ZNear_%d" , m_zNear , std::vector<double>(0,0) , MAX_NUM_LAYERS , "ZNear" ) 1049 ("ZFar_%d" , m_zFar , std::vector<double>(0,0) , MAX_NUM_LAYERS , "ZFar" ) 1050 ("DMin_%d" , m_dMin , std::vector<double>(0,0) , MAX_NUM_LAYERS , "DMin" ) 1051 ("DMax_%d" , m_dMax , std::vector<double>(0,0) , MAX_NUM_LAYERS , "DMax" ) 1052 ("DepthRepresentationInfoSeiPresentFlag_%d", m_depthRepresentationInfoSeiPresentFlag, BoolAry1d(1,0), MAX_NUM_LAYERS, "DepthRepresentationInfoSeiPresentFlag") 1053 ("DepthRepresentationType_%d" , m_depthRepresentationType , IntAry1d(0,0), MAX_NUM_LAYERS, "DepthRepresentationType" ) 1054 ("DisparityRefViewId_%d" , m_disparityRefViewId , IntAry1d(0,0), MAX_NUM_LAYERS, "DisparityRefViewId" ) 1055 ("DepthNonlinearRepresentationNumMinus1_%d", m_depthNonlinearRepresentationNumMinus1, IntAry1d(0,0), MAX_NUM_LAYERS, "DepthNonlinearRepresentationNumMinus1") 1056 ("DepthNonlinearRepresentationModel_%d" , m_depth_nonlinear_representation_model , IntAry1d(0,0), MAX_NUM_LAYERS, "DepthNonlinearRepresentationModel") ; 1057 1058 1059 po::setDefaults(opts); 1060 1061 // Parse the cfg file 1062 po::ErrorReporter err; 1063 po::parseConfigFile( opts, cfgFile, err ); 1064 1065 1066 for(int i=0;i<MAX_NUM_LAYERS;i++) 1067 { 1068 if (m_zNear[i].size()>0) 1069 { 1070 m_zNearFlag.push_back(true); 1071 } 1072 else 1073 { 1074 m_zNearFlag.push_back(false); 1075 } 1076 1077 if (m_zFar[i].size()>0) 1078 { 1079 m_zFarFlag.push_back(true); 1080 } 1081 else 1082 { 1083 m_zFarFlag.push_back(false); 1084 } 1085 1086 if (m_dMin[i].size()>0) 1087 { 1088 m_dMinFlag.push_back(true); 1089 } 1090 else 1091 { 1092 m_dMinFlag.push_back(false); 1093 } 1094 1095 if (m_dMax[i].size()>0) 1096 { 1097 m_dMaxFlag.push_back(true); 1098 } 1099 else 1100 { 1101 m_dMaxFlag.push_back(false); 1102 } 1103 1104 1105 if (m_depthRepresentationInfoSeiPresentFlag[i][0]) 1106 { 1107 if ( m_depthRepresentationType[i].size()<=0 ) 1108 { 1109 printf("DepthRepresentationType_%d must be present for layer %d\n",i,i ); 1110 return; 1111 } 1112 1113 if ( m_depthRepresentationType[i][0]<0 ) 1114 { 1115 printf("DepthRepresentationType_%d must be equal to or greater than 0\n",i ); 1116 return; 1117 } 1118 1119 if (m_dMinFlag[i] || m_dMaxFlag[i]) 1120 { 1121 if (m_disparityRefViewId[i].size()<=0) 1122 { 1123 printf("DisparityRefViewId_%d must be present for layer %d\n",i,i ); 1124 assert(false); 1125 return; 1126 } 1127 if (m_disparityRefViewId[i][0]<0) 1128 { 1129 printf("DisparityRefViewId_%d must be equal to or greater than 0\n",i ); 1130 assert(false); 1131 return; 1132 } 1133 } 1134 1135 if (m_depthRepresentationType[i][0]==3) 1136 { 1137 if (m_depthNonlinearRepresentationNumMinus1[i].size()<=0) 1138 { 1139 printf("DepthNonlinearRepresentationNumMinus1_%d must be present for layer %d\n",i,i ); 1140 assert(false); 1141 return; 1142 } 1143 if (m_depthNonlinearRepresentationNumMinus1[i][0]<0) 1144 { 1145 printf("DepthNonlinearRepresentationNumMinus1_%d must be equal to or greater than 0\n",i ); 1146 assert(false); 1147 return; 1148 } 1149 1150 if (m_depth_nonlinear_representation_model[i].size() != m_depthNonlinearRepresentationNumMinus1[i][0]+1) 1151 { 1152 printf("the number of values in Depth_nonlinear_representation_model must be equal to DepthNonlinearRepresentationNumMinus1+1 in layer %d\n",i ); 1153 assert(false); 1154 return; 1155 } 1156 } 1157 } 1158 } 1159 1160 assert(m_zNearFlag.size()==MAX_NUM_LAYERS); 1161 assert(m_zFarFlag.size()==MAX_NUM_LAYERS); 1162 assert(m_dMinFlag.size()==MAX_NUM_LAYERS); 1163 assert(m_dMaxFlag.size()==MAX_NUM_LAYERS); 1164 } 1165 1166 Bool SEIDepthRepresentationInfo::checkCfg( const TComSlice* slice ) 1167 { 1168 // Check config values 1169 Bool wrongConfig = false; 1170 assert(m_currLayerID>=0); 1171 1172 if (m_depthRepresentationInfoSeiPresentFlag[m_currLayerID][0]==false) 1173 { 1174 printf("DepthRepresentationInfoSeiPresentFlag_%d should be equal to 1 when ApplicableLayerIds is empty or ApplicableLayerIds contains %d\n",m_currLayerID,slice->getLayerId()); 1175 assert(false); 1176 } 1177 // TBD: Add constraints on presence of SEI here. 1178 xCheckCfg ( wrongConfig, m_depthRepresentationType[m_currLayerID][0] >=0 , "depth_representation_type must be equal to or greater than 0" ); 1179 if ( m_dMaxFlag[m_currLayerID] || m_dMinFlag[m_currLayerID]) 1180 { 1181 xCheckCfg( wrongConfig , m_disparityRefViewId[m_currLayerID][0]>=0, "disparity_ref_view_id must be equal to or greater than 0 when d_min or d_max are present"); 1182 } 1183 1184 if (m_depthRepresentationType[m_currLayerID][0]==3) 1185 { 1186 xCheckCfg(wrongConfig , m_depthNonlinearRepresentationNumMinus1[m_currLayerID][0]>=0, "depth_nonlinear_representation_num_minus1 must be greater than or equal to 0"); 1187 1188 if (m_depthNonlinearRepresentationNumMinus1[m_currLayerID][0]>=0) 1189 { 1190 xCheckCfg( wrongConfig , m_depthNonlinearRepresentationNumMinus1[m_currLayerID][0]+1 == m_depth_nonlinear_representation_model[m_currLayerID].size() ,"the number of values in depth_nonlinear_representation_model must be equal to depth_nonlinear_representation_num_minus1+1"); 1191 } 1192 1193 } 1194 1195 return wrongConfig; 1196 } 1197 #endif 1198 1199 Void SEIMultiviewSceneInfo::setupFromCfgFile(const Char* cfgFile) 1200 { 1201 // Set default values 1202 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 1203 1204 // TBD: Add default values for which layers, POCS, Tids or Nalu types the SEI should be send. 1205 defAppLayerIds .clear(); 1206 defAppPocs .clear(); 1207 defAppTids .push_back( 0 ); 1208 defAppVclNaluTypes = IRAP_NAL_UNIT_TYPES; 1209 1210 Int defSeiNaluId = 0; 1211 Int defPositionInSeiNalu = 0; 1212 Bool defModifyByEncoder = false; 1213 1214 // Setup config file options 1215 po::Options opts; 1216 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 1217 1218 opts.addOptions() 1219 ("MinDisparity" , m_minDisparity , 0 , "MinDisparity" ) 1220 ("MaxDisparityRange" , m_maxDisparityRange , 0 , "MaxDisparityRange" ) 1221 ; 1222 1223 po::setDefaults(opts); 1224 1225 // Parse the cfg file 1226 po::ErrorReporter err; 1227 po::parseConfigFile( opts, cfgFile, err ); 1228 }; 1229 1230 1231 Bool SEIMultiviewSceneInfo::checkCfg( const TComSlice* slice ) 1232 { 1233 // Check config values 1234 Bool wrongConfig = false; 1235 1236 xCheckCfg ( wrongConfig, slice->isIRAP(), "When present, the multiview scene information SEI message shall be associated with an IRAP access unit." ); 1237 1238 xCheckCfgRange( wrongConfig, m_minDisparity , -1024 , 1023, "min_disparity" ); 1239 xCheckCfgRange( wrongConfig, m_maxDisparityRange , 0 , 2047, "max_disparity_range" ); 1240 1241 return wrongConfig; 1242 1243 }; 1244 1245 Void SEIMultiviewAcquisitionInfo::setupFromCfgFile(const Char* cfgFile) 1246 { 1247 // Set default values 1248 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 1249 1250 defAppLayerIds .clear(); 1251 defAppPocs .push_back( 0 ); 1252 defAppTids .push_back( 0 ); 1253 defAppVclNaluTypes = IDR_NAL_UNIT_TYPES; 1254 1255 1256 Int defSeiNaluId = 0; 1257 Int defPositionInSeiNalu = 0; 1258 Bool defModifyByEncoder = false; 1259 1260 // Setup config file options 1261 po::Options opts; 1262 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 1263 1264 opts.addOptions() 1265 ("IntrinsicParamFlag" , m_intrinsicParamFlag , false , "IntrinsicParamFlag" ) 1266 ("ExtrinsicParamFlag" , m_extrinsicParamFlag , false , "ExtrinsicParamFlag" ) 1267 ("IntrinsicParamsEqualFlag" , m_intrinsicParamsEqualFlag , false , "IntrinsicParamsEqualFlag" ) 1268 ("PrecFocalLength" , m_precFocalLength , 0 , "PrecFocalLength" ) 1269 ("PrecPrincipalPoint" , m_precPrincipalPoint , 0 , "PrecPrincipalPoint" ) 1270 ("PrecSkewFactor" , m_precSkewFactor , 0 , "PrecSkewFactor" ) 1271 ("SignFocalLengthX" , m_signFocalLengthX , BoolAry1d(1,0) , "SignFocalLengthX" ) 1272 ("ExponentFocalLengthX" , m_exponentFocalLengthX , IntAry1d (1,0) , "ExponentFocalLengthX" ) 1273 ("MantissaFocalLengthX" , m_mantissaFocalLengthX , IntAry1d (1,0) , "MantissaFocalLengthX" ) 1274 ("SignFocalLengthY" , m_signFocalLengthY , BoolAry1d(1,0) , "SignFocalLengthY" ) 1275 ("ExponentFocalLengthY" , m_exponentFocalLengthY , IntAry1d (1,0) , "ExponentFocalLengthY" ) 1276 ("MantissaFocalLengthY" , m_mantissaFocalLengthY , IntAry1d (1,0) , "MantissaFocalLengthY" ) 1277 ("SignPrincipalPointX" , m_signPrincipalPointX , BoolAry1d(1,0) , "SignPrincipalPointX" ) 1278 ("ExponentPrincipalPointX" , m_exponentPrincipalPointX , IntAry1d (1,0) , "ExponentPrincipalPointX" ) 1279 ("MantissaPrincipalPointX" , m_mantissaPrincipalPointX , IntAry1d (1,0) , "MantissaPrincipalPointX" ) 1280 ("SignPrincipalPointY" , m_signPrincipalPointY , BoolAry1d(1,0) , "SignPrincipalPointY" ) 1281 ("ExponentPrincipalPointY" , m_exponentPrincipalPointY , IntAry1d (1,0) , "ExponentPrincipalPointY" ) 1282 ("MantissaPrincipalPointY" , m_mantissaPrincipalPointY , IntAry1d (1,0) , "MantissaPrincipalPointY" ) 1283 ("SignSkewFactor" , m_signSkewFactor , BoolAry1d(1,0) , "SignSkewFactor" ) 1284 ("ExponentSkewFactor" , m_exponentSkewFactor , IntAry1d (1,0) , "ExponentSkewFactor" ) 1285 ("MantissaSkewFactor" , m_mantissaSkewFactor , IntAry1d (1,0) , "MantissaSkewFactor" ) 1286 ("PrecRotationParam" , m_precRotationParam , 0 , "PrecRotationParam" ) 1287 ("PrecTranslationParam" , m_precTranslationParam , 0 , "PrecTranslationParam" ) 1288 ("SignR_%d_%d" , m_signR , BoolAry1d(3,0) ,MAX_NUM_LAYERS ,3 , "SignR" ) 1289 ("ExponentR_%d_%d" , m_exponentR , IntAry1d (3,0) ,MAX_NUM_LAYERS ,3 , "ExponentR" ) 1290 ("MantissaR_%d_%d" , m_mantissaR , IntAry1d (3,0) ,MAX_NUM_LAYERS ,3 , "MantissaR" ) 1291 ("SignT_%d" , m_signT , BoolAry1d(3,0) ,MAX_NUM_LAYERS , "SignT" ) 1292 ("ExponentT_%d" , m_exponentT , IntAry1d (3,0) ,MAX_NUM_LAYERS , "ExponentT" ) 1293 ("MantissaT_%d" , m_mantissaT , IntAry1d (3,0) ,MAX_NUM_LAYERS , "MantissaT" ) 1294 ; 1295 1296 po::setDefaults(opts); 1297 1298 // Parse the cfg file 1299 po::ErrorReporter err; 1300 po::parseConfigFile( opts, cfgFile, err ); 1301 }; 1302 1303 UInt SEIMultiviewAcquisitionInfo::getMantissaFocalLengthXLen( Int i ) const 1304 { 1305 return xGetSyntaxElementLen( m_exponentFocalLengthX[i], m_precFocalLength, m_mantissaFocalLengthX[ i ] ); 1306 } 1307 1308 Bool SEIMultiviewAcquisitionInfo::checkCfg( const TComSlice* slice ) 1309 { 1310 // Check config values 1311 Bool wrongConfig = false; 1312 1313 // Currently the encoder starts with POC 0 for all layers. The condition on POC 0 should be changed, when this changes. 1314 xCheckCfg ( wrongConfig, slice->isIRAP() && (slice->getPOC() == 0) , "When present, the multiview acquisition information SEI message that applies to the current layer shall be included in an access unit that contains an IRAP picture that is the first picture of a CLVS of the current layer." ); 1315 1316 xCheckCfgRange( wrongConfig, m_precFocalLength , 0, 31, "prec_focal_length" ); 1317 xCheckCfgRange( wrongConfig, m_precPrincipalPoint , 0, 31, "prec_principle_point" ); 1318 xCheckCfgRange( wrongConfig, m_precSkewFactor , 0, 31, "prec_skew_factor" ); 1319 1320 for (Int i = 0; i <= getNumViewsMinus1(); i++ ) 1321 { 1322 xCheckCfgRange( wrongConfig, m_exponentFocalLengthX [ i ], 0, 62, "exponent_focal_length_x" ); 1323 xCheckCfgRange( wrongConfig, m_exponentFocalLengthY [ i ], 0, 62, "exponent_focal_length_y" ); 1324 xCheckCfgRange( wrongConfig, m_exponentPrincipalPointX [ i ], 0, 62, "exponent_principal_point_x"); 1325 xCheckCfgRange( wrongConfig, m_exponentPrincipalPointY [ i ], 0, 62, "exponent_principal_point_y"); 1326 xCheckCfgRange( wrongConfig, m_exponentSkewFactor [ i ], 0, 62, "exponent_skew_factor" ); 1327 } 1328 1329 xCheckCfgRange( wrongConfig, m_precRotationParam , 0, 31, "prec_focal_length" ); 1330 xCheckCfgRange( wrongConfig, m_precTranslationParam , 0, 31, "prec_focal_length" ); 1331 1332 for (Int i = 0; i <= getNumViewsMinus1(); i++ ) 1333 { 1334 for (Int j = 0; j <= 2; j++) 1335 { 1336 xCheckCfgRange( wrongConfig, m_exponentT[i][j] , 0, 62, "exponent_skew_factor" ); 1337 for (Int k = 0; k <= 2; k++ ) 1338 { 1339 xCheckCfgRange( wrongConfig, m_exponentR[i][j][k], 0, 62, "exponent_principal_point_y"); 1340 } 1341 } 1342 } 1343 1344 return wrongConfig; 1345 1346 }; 1347 1348 UInt SEIMultiviewAcquisitionInfo::getMantissaFocalLengthYLen( Int i ) const 1349 { 1350 return xGetSyntaxElementLen( m_exponentFocalLengthY[i], m_precFocalLength, m_mantissaFocalLengthY[ i ] ); 1351 } 1352 1353 1354 UInt SEIMultiviewAcquisitionInfo::getMantissaPrincipalPointXLen( Int i ) const 1355 { 1356 return xGetSyntaxElementLen( m_exponentPrincipalPointX[i], m_precPrincipalPoint, m_mantissaPrincipalPointX[ i ] ); 1357 } 1358 1359 UInt SEIMultiviewAcquisitionInfo::getMantissaPrincipalPointYLen( Int i ) const 1360 { 1361 return xGetSyntaxElementLen( m_exponentPrincipalPointY[i], m_precPrincipalPoint, m_mantissaPrincipalPointY[ i ] ); 1362 } 1363 1364 UInt SEIMultiviewAcquisitionInfo::getMantissaSkewFactorLen( Int i ) const 1365 { 1366 return xGetSyntaxElementLen( m_exponentSkewFactor[ i ], m_precSkewFactor, m_mantissaSkewFactor[ i ] ); 1367 } 1368 1369 UInt SEIMultiviewAcquisitionInfo::getMantissaRLen( Int i, Int j, Int k ) const 1370 { 1371 return xGetSyntaxElementLen( m_exponentR[ i ][ j ][ k ], m_precRotationParam, m_mantissaR[ i ][ j] [ k ] ); 1372 } 1373 1374 UInt SEIMultiviewAcquisitionInfo::getMantissaTLen( Int i, Int j ) const 1375 { 1376 return xGetSyntaxElementLen( m_exponentT[ i ][ j ], m_precTranslationParam, m_mantissaT[ i ][ j ] ); 1377 } 1378 UInt SEIMultiviewAcquisitionInfo::xGetSyntaxElementLen( Int expo, Int prec, Int val ) const 1379 { 1380 UInt len; 1381 if( expo == 0 ) 1382 { 1383 len = std::max(0, prec - 30 ); 1384 } 1385 else 1386 { 1387 len = std::max( 0, expo + prec - 31 ); 1388 } 1389 1390 assert( val >= 0 ); 1391 assert( val <= ( ( 1 << len )- 1) ); 1392 return len; 1393 } 1394 1395 Void SEIMultiviewViewPosition::setupFromSlice ( const TComSlice* slice ) 1396 { 1397 const TComVPS* vps = slice->getVPS(); 1398 m_numViewsMinus1 = vps->getNumViews() - 1; 1399 m_viewPosition.resize( m_numViewsMinus1 + 1 ); 1400 for (Int i = 0; i <= m_numViewsMinus1; i++ ) 1401 { 1402 // Assuming that view ids indicate the position 1403 m_viewPosition[i] = vps->getViewIdVal( i ); 1404 } 1405 } 1406 1407 Void SEIMultiviewViewPosition::setupFromCfgFile(const Char* cfgFile) 1408 { 1409 // Set default values 1410 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 1411 1412 defAppLayerIds .push_back( 0 ); 1413 defAppPocs .push_back( 0 ); 1414 defAppTids .push_back( 0 ); 1415 defAppVclNaluTypes = IDR_NAL_UNIT_TYPES; 1416 1417 Int defSeiNaluId = 0; 1418 Int defPositionInSeiNalu = 0; 1419 Bool defModifyByEncoder = true; 1420 1421 // Setup config file options 1422 po::Options opts; 1423 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 1424 1425 opts.addOptions() 1426 ("NumViewsMinus1" , m_numViewsMinus1 , 0 , "NumViewsMinus1") 1427 ("ViewPosition" , m_viewPosition , IntAry1d (1,0) , "ViewPosition" ); 1428 ; 1429 1430 po::setDefaults(opts); 1431 1432 // Parse the cfg file 1433 po::ErrorReporter err; 1434 po::parseConfigFile( opts, cfgFile, err ); 1435 }; 1436 1437 Bool SEIMultiviewViewPosition::checkCfg( const TComSlice* slice ) 1438 { 1439 // Check config values 1440 Bool wrongConfig = false; 1441 1442 // TBD: Add constraints on presence of SEI here. 1443 xCheckCfg ( wrongConfig, slice->isIRAP() , "When present, the multiview view position SEI message shall be associated with an IRAP access unit." ); 1444 1445 // TBD: Modify constraints according to the SEI semantics. 1446 xCheckCfgRange( wrongConfig, m_numViewsMinus1 , 0 , 62, "num_views_minus1"); 1447 for(Int i = 0; i <= m_numViewsMinus1; i++) 1448 { 1449 xCheckCfgRange( wrongConfig, m_viewPosition[i] , 0 , 62, "view_position"); 1450 } 1451 1452 return wrongConfig; 1453 1454 }; 1455 1456 1457 #if NH_3D 1458 Void SEIAlternativeDepthInfo::setupFromCfgFile(const Char* cfgFile) 1459 { 1460 // Set default values 1461 IntAry1d defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes; 1462 1463 defAppLayerIds .clear(); 1464 defAppPocs .clear(); 1465 defAppTids .clear(); 1466 defAppVclNaluTypes.clear(); 1467 1468 Int defSeiNaluId = 0; 1469 Int defPositionInSeiNalu = 0; 1470 Bool defModifyByEncoder = false; 1471 1472 // Setup config file options 1473 po::Options opts; 1474 xAddGeneralOpts( opts , defAppLayerIds, defAppPocs, defAppTids, defAppVclNaluTypes, defSeiNaluId, defPositionInSeiNalu, defModifyByEncoder ); 1475 1476 opts.addOptions() 1477 ("AlternativeDepthInfoCancelFlag" , m_alternativeDepthInfoCancelFlag , false , "AlternativeDepthInfoCancelFlag" ) 1478 ("DepthType" , m_depthType , 1 , "DepthType" ) 1479 ("NumConstituentViewsGvdMinus1" , m_numConstituentViewsGvdMinus1 , 1 , "NumConstituentViewsGvdMinus1" ) 1480 ("DepthPresentGvdFlag" , m_depthPresentGvdFlag , false , "DepthPresentGvdFlag" ) 1481 ("ZGvdFlag" , m_zGvdFlag , false , "ZGvdFlag" ) 1482 ("IntrinsicParamGvdFlag" , m_intrinsicParamGvdFlag , false , "IntrinsicParamGvdFlag" ) 1483 ("RotationGvdFlag" , m_rotationGvdFlag , false , "RotationGvdFlag" ) 1484 ("TranslationGvdFlag" , m_translationGvdFlag , false , "TranslationGvdFlag" ) 1485 ("SignGvdZNearFlag_%d" , m_signGvdZNearFlag , BoolAry1d(3,0), 3 , "SignGvdZNearFlag" ) 1486 ("ExpGvdZNear_%d" , m_expGvdZNear , IntAry1d (3,0), 3 , "ExpGvdZNear" ) 1487 ("ManLenGvdZNearMinus1_%d" , m_manLenGvdZNearMinus1 , IntAry1d (3,0), 3 , "ManLenGvdZNearMinus1" ) 1488 ("ManGvdZNear_%d" , m_manGvdZNear , IntAry1d (3,0), 3 , "ManGvdZNear" ) 1489 ("SignGvdZFarFlag_%d" , m_signGvdZFarFlag , BoolAry1d(3,0), 3 , "SignGvdZFarFlag" ) 1490 ("ExpGvdZFar_%d" , m_expGvdZFar , IntAry1d (3,0), 3 , "ExpGvdZFar" ) 1491 ("ManLenGvdZFarMinus1_%d" , m_manLenGvdZFarMinus1 , IntAry1d (3,0), 3 , "ManLenGvdZFarMinus1" ) 1492 ("ManGvdZFar_%d" , m_manGvdZFar , IntAry1d (3,0), 3 , "ManGvdZFar" ) 1493 ("PrecGvdFocalLength" , m_precGvdFocalLength , 18 , "PrecGvdFocalLength" ) 1494 ("PrecGvdPrincipalPoint" , m_precGvdPrincipalPoint , 18 , "PrecGvdPrincipalPoint" ) 1495 ("PrecGvdRotationParam" , m_precGvdRotationParam , 18 , "PrecGvdRotationParam" ) 1496 ("PrecGvdTranslationParam" , m_precGvdTranslationParam , 18 , "PrecGvdTranslationParam" ) 1497 ("SignGvdFocalLengthX_%d" , m_signGvdFocalLengthX , BoolAry1d(3,0), 3 ,"SignGvdFocalLengthX" ) 1498 ("ExpGvdFocalLengthX_%d" , m_expGvdFocalLengthX , IntAry1d (3,0), 3 ,"ExpGvdFocalLengthX" ) 1499 ("ManGvdFocalLengthX_%d" , m_manGvdFocalLengthX , IntAry1d (3,0), 3 ,"ManGvdFocalLengthX" ) 1500 ("SignGvdFocalLengthY_%d" , m_signGvdFocalLengthY , BoolAry1d(3,0), 3 ,"SignGvdFocalLengthY" ) 1501 ("ExpGvdFocalLengthY_%d" , m_expGvdFocalLengthY , IntAry1d (3,0), 3 ,"ExpGvdFocalLengthY" ) 1502 ("ManGvdFocalLengthY_%d" , m_manGvdFocalLengthY , IntAry1d (3,0), 3 ,"ManGvdFocalLengthY" ) 1503 ("SignGvdPrincipalPointX_%d" , m_signGvdPrincipalPointX , BoolAry1d(3,0), 3 ,"SignGvdPrincipalPointX" ) 1504 ("ExpGvdPrincipalPointX_%d" , m_expGvdPrincipalPointX , IntAry1d (3,0), 3 ,"ExpGvdPrincipalPointX" ) 1505 ("ManGvdPrincipalPointX_%d" , m_manGvdPrincipalPointX , IntAry1d (3,0), 3 ,"ManGvdPrincipalPointX" ) 1506 ("SignGvdPrincipalPointY_%d" , m_signGvdPrincipalPointY , BoolAry1d(3,0), 3 ,"SignGvdPrincipalPointY" ) 1507 ("ExpGvdPrincipalPointY_%d" , m_expGvdPrincipalPointY , IntAry1d (3,0), 3 ,"ExpGvdPrincipalPointY" ) 1508 ("ManGvdPrincipalPointY_%d" , m_manGvdPrincipalPointY , IntAry1d (3,0), 3 ,"ManGvdPrincipalPointY" ) 1509 ("SignGvdR00_%d" , m_signGvdR00 , BoolAry1d(3,0), 3 ,"SignGvdR00" ) 1510 ("ExpGvdR00_%d" , m_expGvdR00 , IntAry1d (3,0), 3 ,"ExpGvdR00" ) 1511 ("ManGvdR00_%d" , m_manGvdR00 , IntAry1d (3,0), 3 ,"ManGvdR00" ) 1512 ("SignGvdR01_%d" , m_signGvdR01 , BoolAry1d(3,0), 3 ,"SignGvdR01" ) 1513 ("ExpGvdR01_%d" , m_expGvdR01 , IntAry1d (3,0), 3 ,"ExpGvdR01" ) 1514 ("ManGvdR01_%d" , m_manGvdR01 , IntAry1d (3,0), 3 ,"ManGvdR01" ) 1515 ("SignGvdR02_%d" , m_signGvdR02 , BoolAry1d(3,0), 3 ,"SignGvdR02" ) 1516 ("ExpGvdR02_%d" , m_expGvdR02 , IntAry1d (3,0), 3 ,"ExpGvdR02" ) 1517 ("ManGvdR02_%d" , m_manGvdR02 , IntAry1d (3,0), 3 ,"ManGvdR02" ) 1518 ("SignGvdR10_%d" , m_signGvdR10 , BoolAry1d(3,0), 3 ,"SignGvdR10" ) 1519 ("ExpGvdR10_%d" , m_expGvdR10 , IntAry1d (3,0), 3 ,"ExpGvdR10" ) 1520 ("ManGvdR10_%d" , m_manGvdR10 , IntAry1d (3,0), 3 ,"ManGvdR10" ) 1521 ("SignGvdR11_%d" , m_signGvdR11 , BoolAry1d(3,0), 3 ,"SignGvdR11" ) 1522 ("ExpGvdR11_%d" , m_expGvdR11 , IntAry1d (3,0), 3 ,"ExpGvdR11" ) 1523 ("ManGvdR11_%d" , m_manGvdR11 , IntAry1d (3,0), 3 ,"ManGvdR11" ) 1524 ("SignGvdR12_%d" , m_signGvdR12 , BoolAry1d(3,0), 3 ,"SignGvdR12" ) 1525 ("ExpGvdR12_%d" , m_expGvdR12 , IntAry1d (3,0), 3 ,"ExpGvdR12" ) 1526 ("ManGvdR12_%d" , m_manGvdR12 , IntAry1d (3,0), 3 ,"ManGvdR12" ) 1527 ("SignGvdR20_%d" , m_signGvdR20 , BoolAry1d(3,0), 3 ,"SignGvdR20" ) 1528 ("ExpGvdR20_%d" , m_expGvdR20 , IntAry1d (3,0), 3 ,"ExpGvdR20" ) 1529 ("ManGvdR20_%d" , m_manGvdR20 , IntAry1d (3,0), 3 ,"ManGvdR20" ) 1530 ("SignGvdR21_%d" , m_signGvdR21 , BoolAry1d(3,0), 3 ,"SignGvdR21" ) 1531 ("ExpGvdR21_%d" , m_expGvdR21 , IntAry1d (3,0), 3 ,"ExpGvdR21" ) 1532 ("ManGvdR21_%d" , m_manGvdR21 , IntAry1d (3,0), 3 ,"ManGvdR21" ) 1533 ("SignGvdR22_%d" , m_signGvdR22 , BoolAry1d(3,0), 3 ,"SignGvdR22" ) 1534 ("ExpGvdR22_%d" , m_expGvdR22 , IntAry1d (3,0), 3 ,"ExpGvdR22" ) 1535 ("ManGvdR22_%d" , m_manGvdR22 , IntAry1d (3,0), 3 ,"ManGvdR22" ) 1536 ("SignGvdTX_%d" , m_signGvdTX , BoolAry1d(3,0), 3 ,"SignGvdTX" ) 1537 ("ExpGvdTX_%d" , m_expGvdTX , IntAry1d (3,0), 3 ,"ExpGvdTX" ) 1538 ("ManGvdTX_%d" , m_manGvdTX , IntAry1d (3,0), 3 ,"ManGvdTX" ) 1539 ("MinOffsetXInt" , m_minOffsetXInt , 0 , "MinOffsetXInt" ) 1540 ("MinOffsetXFrac" , m_minOffsetXFrac , 0 , "MinOffsetXFrac" ) 1541 ("MaxOffsetXInt" , m_maxOffsetXInt , 0 , "MaxOffsetXInt" ) 1542 ("MaxOffsetXFrac" , m_maxOffsetXFrac , 0 , "MaxOffsetXFrac" ) 1543 ("OffsetYPresentFlag" , m_offsetYPresentFlag , false , "OffsetYPresentFlag" ) 1544 ("MinOffsetYInt" , m_minOffsetYInt , 0 , "MinOffsetYInt" ) 1545 ("MinOffsetYFrac" , m_minOffsetYFrac , 0 , "MinOffsetYFrac" ) 1546 ("MaxOffsetYInt" , m_maxOffsetYInt , 0 , "MaxOffsetYInt" ) 1547 ("MaxOffsetYFrac" , m_maxOffsetYFrac , 0 , "MaxOffsetYFrac" ) 1548 ("WarpMapSizePresentFlag" , m_warpMapSizePresentFlag , false , "WarpMapSizePresentFlag" ) 1549 ("WarpMapWidthMinus2" , m_warpMapWidthMinus2 , 0 , "WarpMapWidthMinus2" ) 1550 ("WarpMapHeightMinus2" , m_warpMapHeightMinus2 , 0 , "WarpMapHeightMinus2" ) 1551 ; 1552 1553 po::setDefaults(opts); 1554 1555 // Parse the cfg file 1556 po::ErrorReporter err; 1557 po::parseConfigFile( opts, cfgFile, err ); 1558 }; 1559 Bool SEIAlternativeDepthInfo::checkCfg( const TComSlice* slice ) 1560 { 1561 // Check config values 1562 Bool wrongConfig = false; 1563 1564 1565 xCheckCfgRange( wrongConfig, m_alternativeDepthInfoCancelFlag , 0 , 1, "alternative_depth_info_cancel_flag"); 1566 xCheckCfgRange( wrongConfig, m_depthType , 0 , 1, "depth_type" ); 1567 1568 xCheckCfgRange( wrongConfig, m_numConstituentViewsGvdMinus1 , 1 , 1, "num_constituent_views_gvd_minus1 "); // 1: 3 views only, cuurent. 1569 xCheckCfgRange( wrongConfig, m_depthPresentGvdFlag , 0 , 1, "depth_present_gvd_flag" ); 1570 xCheckCfgRange( wrongConfig, m_zGvdFlag , 0 , 1, "z_gvd_flag" ); 1571 xCheckCfgRange( wrongConfig, m_intrinsicParamGvdFlag , 0 , 1, "intrinsic_param_gvd_flag" ); 1572 xCheckCfgRange( wrongConfig, m_rotationGvdFlag , 0 , 1, "rotation_gvd_flag" ); 1573 xCheckCfgRange( wrongConfig, m_translationGvdFlag , 0 , 1, "translation_gvd_flag" ); 1574 1575 return wrongConfig; 1576 1577 }; 1578 1579 UInt SEIAlternativeDepthInfo::getManGvdFocalLengthXLen ( Int i, int j ) const 1580 { 1581 UInt rval; 1582 rval = xGetSyntaxElementLen( m_expGvdFocalLengthX[i][j], m_precGvdFocalLength, m_manGvdFocalLengthX[i][j] ); 1583 if (rval == 0) 1584 return m_precGvdFocalLength; 1585 else 1586 return rval; 1587 }; 1588 1589 UInt SEIAlternativeDepthInfo::getManGvdFocalLengthYLen ( Int i, int j ) const 1590 { 1591 UInt rval; 1592 rval = xGetSyntaxElementLen( m_expGvdFocalLengthY[i][j], m_precGvdFocalLength, m_manGvdFocalLengthY[i][j] ); 1593 if (rval == 0) 1594 return m_precGvdFocalLength; 1595 else 1596 return rval; 1597 }; 1598 1599 UInt SEIAlternativeDepthInfo::getManGvdPrincipalPointXLen ( Int i, int j ) const 1600 { 1601 UInt rval; 1602 rval = xGetSyntaxElementLen( m_expGvdPrincipalPointX[i][j], m_precGvdPrincipalPoint, m_manGvdPrincipalPointX[i][j] ); 1603 if (rval == 0) 1604 return m_precGvdPrincipalPoint; 1605 else 1606 return rval; 1607 }; 1608 1609 UInt SEIAlternativeDepthInfo::getManGvdPrincipalPointYLen ( Int i, int j ) const 1610 { 1611 UInt rval; 1612 rval = xGetSyntaxElementLen( m_expGvdPrincipalPointY[i][j], m_precGvdPrincipalPoint, m_manGvdPrincipalPointY[i][j] ); 1613 if (rval == 0) 1614 return m_precGvdPrincipalPoint; 1615 else 1616 return rval; 1617 }; 1618 1619 UInt SEIAlternativeDepthInfo::getManGvdTXLen ( Int i, int j ) const 1620 { 1621 UInt rval; 1622 rval = xGetSyntaxElementLen( m_expGvdTX[i][j], m_precGvdTranslationParam, m_manGvdTX[i][j] ); 1623 if (rval == 0) 1624 return m_precGvdTranslationParam; 1625 else 1626 return rval; 1627 }; 1628 1629 UInt SEIAlternativeDepthInfo::xGetSyntaxElementLen( Int expo, Int prec, Int val ) const 1630 { 1631 UInt len; 1632 if( expo == 0 ) 1633 { 1634 len = std::max(0, prec - 30 ); 1635 } 1636 else 1637 { 1638 len = std::max( 0, expo + prec - 31 ); 1639 } 1640 1641 assert( val >= 0 ); 1642 assert( val <= ( ( 1 << len )- 1) ); 1643 return len; 1644 } 1645 1646 #endif 1647 1648 #endif -
trunk/source/Lib/TLibCommon/SEI.h
r1313 r1356 42 42 #include "CommonDef.h" 43 43 #include "libmd5/MD5.h" 44 45 46 #if NH_MV_SEI 47 #include "TAppCommon/program_options_lite.h" 48 using namespace std; 49 namespace po = df::program_options_lite; 50 #endif 51 44 52 //! \ingroup TLibCommon 45 53 //! \{ 46 54 class TComSPS; 55 #if NH_MV_SEI 56 class TComSlice; 57 class SEIScalableNesting; 58 #endif 47 59 48 60 /** … … 84 96 CHROMA_SAMPLING_FILTER_HINT = 140, 85 97 KNEE_FUNCTION_INFO = 141 86 #if NH_MV 87 ,SUB_BITSTREAM_PROPERTY = 164 98 #if NH_MV_SEI 99 ,COLOUR_REMAPPING_INFO = 142, 100 DEINTERLACED_FIELD_IDENTIFICATION = 143, 101 LAYERS_NOT_PRESENT = 160, 102 INTER_LAYER_CONSTRAINED_TILE_SETS = 161, 103 BSP_NESTING = 162, 104 BSP_INITIAL_ARRIVAL_TIME = 163, 105 SUB_BITSTREAM_PROPERTY = 164, 106 ALPHA_CHANNEL_INFO = 165, 107 OVERLAY_INFO = 166, 108 TEMPORAL_MV_PREDICTION_CONSTRAINTS = 167, 109 FRAME_FIELD_INFO = 168, 110 THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO = 176, 111 DEPTH_REPRESENTATION_INFO = 177, 112 MULTIVIEW_SCENE_INFO = 178, 113 MULTIVIEW_ACQUISITION_INFO = 179, 114 MULTIVIEW_VIEW_POSITION = 180 115 #if NH_3D 116 ,ALTERNATIVE_DEPTH_INFO = 181 88 117 #endif 118 #endif 89 119 90 120 }; 91 121 92 SEI() {} 122 SEI(); 123 93 124 virtual ~SEI() {} 94 95 static const Char *getSEIMessageString(SEI::PayloadType payloadType); 96 125 virtual SEI* getCopy( ) const; 126 static const Char *getSEIMessageString(SEI::PayloadType payloadType ); 97 127 virtual PayloadType payloadType() const = 0; 128 129 #if NH_MV_SEI 130 static SEI* getNewSEIMessage ( SEI::PayloadType payloadType ); 131 Bool insertSei ( Int curLayerId, Int curPoc, Int curTid, Int curNaluType ) const; 132 133 134 virtual Void setupFromSlice ( const TComSlice* slice ); 135 virtual Void setupFromCfgFile ( const Char* cfgFile ); 136 virtual Bool checkCfg ( const TComSlice* slice ); 137 138 Void xPrintCfgErrorIntro(); 139 Void xCheckCfgRange ( Bool& wrongConfig, Int val, Int minVal, Int maxVal, const Char* seName ); 140 Void xCheckCfg ( Bool& wrongConfig, Bool cond, const Char* errStr ); 141 Void xAddGeneralOpts ( po::Options &opts, IntAry1d defAppLayerIds, IntAry1d defAppPocs, IntAry1d defAppTids, IntAry1d defAppVclNaluTypes, 142 Int defSeiNaluId, Int defPositionInSeiNalu, Bool defModifyByEncoder ); 143 // Filters where to insert SEI in the bitstream. 144 // When the respected vector is empty, all layersIds, POCs, Tids, and Nalu types are used. 145 IntAry1d m_applicableLayerIds; 146 IntAry1d m_applicablePocs; 147 IntAry1d m_applicableTids; 148 IntAry1d m_applicableVclNaluTypes; 149 150 Int m_payloadType; // Payload type 151 Int m_seiNaluId; // Identifies to which NAL unit the SEI is added. 152 Int m_positionInSeiNalu; // Identifies the order within the NAL unit 153 Bool m_modifyByEncoder; // Don't use the SEI cfg-file, but let let the encoder setup the NALU. 154 155 SEIScalableNesting* m_scalNestSeiContThisSei; // Pointer to scalable nesting SEI containing the SEI. When NULL, the SEI is not nested. 156 #endif 98 157 }; 99 158 … … 155 214 Bool m_noParameterSetUpdateFlag; 156 215 Int numSpsIdsMinus1; 157 std::vector<Int> activeSeqParameterSetId; 216 std::vector<Int> activeSeqParameterSetId; 158 217 }; 159 218 … … 468 527 SEIMasteringDisplayColourVolume() {} 469 528 virtual ~SEIMasteringDisplayColourVolume(){} 470 529 471 530 TComSEIMasteringDisplay values; 472 531 }; 473 532 474 533 #if NH_MV 534 #if !NH_MV_SEI 475 535 class SEISubBitstreamProperty : public SEI 476 536 { … … 490 550 }; 491 551 #endif 552 #endif 492 553 493 554 typedef std::list<SEI*> SEIMessages; … … 550 611 551 612 public: 552 Int m_mcts_id; 613 Int m_mcts_id; 553 614 Bool m_display_tile_set_flag; 554 615 Int m_num_tile_rects_in_set; //_minus1; … … 598 659 }; 599 660 661 #if NH_MV_SEI 662 #if NH_MV_LAYERS_NOT_PRESENT_SEI 663 class SEILayersNotPresent : public SEI 664 { 665 public: 666 PayloadType payloadType( ) const { return LAYERS_NOT_PRESENT; } 667 SEILayersNotPresent ( ) { }; 668 ~SEILayersNotPresent( ) { }; 669 SEI* getCopy( ) const { return new SEILayersNotPresent(*this); }; 670 671 Void setupFromCfgFile( const Char* cfgFile ); 672 Bool checkCfg ( const TComSlice* slice ); 673 674 Int m_lnpSeiActiveVpsId; 675 UInt m_lnpSeiMaxLayers; 676 BoolAry1d m_layerNotPresentFlag; 677 678 Void resizeDimI( Int sizeDimI ) 679 { 680 m_layerNotPresentFlag.resize( sizeDimI ); 681 } 682 }; 600 683 #endif 601 684 685 class SEIInterLayerConstrainedTileSets : public SEI 686 { 687 public: 688 PayloadType payloadType( ) const { return INTER_LAYER_CONSTRAINED_TILE_SETS; } 689 SEIInterLayerConstrainedTileSets ( ) { }; 690 ~SEIInterLayerConstrainedTileSets( ) { }; 691 SEI* getCopy( ) const { return new SEIInterLayerConstrainedTileSets(*this); }; 692 693 Void setupFromCfgFile( const Char* cfgFile ); 694 Bool checkCfg ( const TComSlice* slice ); 695 696 Bool m_ilAllTilesExactSampleValueMatchFlag; 697 Bool m_ilOneTilePerTileSetFlag; 698 Int m_ilNumSetsInMessageMinus1; 699 Bool m_skippedTileSetPresentFlag; 700 IntAry1d m_ilctsId; 701 IntAry1d m_ilNumTileRectsInSetMinus1; 702 IntAry2d m_ilTopLeftTileIndex; 703 IntAry2d m_ilBottomRightTileIndex; 704 IntAry1d m_ilcIdc; 705 BoolAry1d m_ilExactSampleValueMatchFlag; 706 Int m_allTilesIlcIdc; 707 708 Void resizeDimI( Int sizeDimI ) 709 { 710 m_ilctsId .resize( sizeDimI ); 711 m_ilNumTileRectsInSetMinus1 .resize( sizeDimI ); 712 m_ilTopLeftTileIndex .resize( sizeDimI ); 713 m_ilBottomRightTileIndex .resize( sizeDimI ); 714 m_ilcIdc .resize( sizeDimI ); 715 m_ilExactSampleValueMatchFlag.resize( sizeDimI ); 716 } 717 718 Void resizeDimJ( Int i, Int sizeDimJ ) 719 { 720 m_ilTopLeftTileIndex [i].resize( sizeDimJ ); 721 m_ilBottomRightTileIndex[i].resize( sizeDimJ ); 722 } 723 724 }; 725 726 #if NH_MV_TBD 727 class SEIBspNesting : public SEI 728 { 729 public: 730 PayloadType payloadType( ) const { return BSP_NESTING; } 731 SEIBspNesting ( ) { }; 732 ~SEIBspNesting( ) { }; 733 SEI* getCopy( ) const { return new SEIBspNesting(*this); }; 734 735 Void setupFromCfgFile( const Char* cfgFile ); 736 Void setupFromSlice ( const TComSlice* slice ); 737 Bool checkCfg ( const TComSlice* slice ); 738 739 Int m_seiOlsIdx; 740 Int m_seiPartitioningSchemeIdx; 741 Int m_bspIdx; 742 Int m_bspNestingZeroBit; 743 Int m_numSeisInBspMinus1; 744 }; 745 746 class SEIBspInitialArrivalTime : public SEI 747 { 748 public: 749 PayloadType payloadType( ) const { return BSP_INITIAL_ARRIVAL_TIME; } 750 SEIBspInitialArrivalTime ( ) { }; 751 ~SEIBspInitialArrivalTime( ) { }; 752 SEI* getCopy( ) const { return new SEIBspInitialArrivalTime(*this); }; 753 754 Void setupFromCfgFile( const Char* cfgFile ); 755 Void setupFromSlice ( const TComSlice* slice ); 756 Bool checkCfg ( const TComSlice* slice ); 757 758 IntAry1d m_nalInitialArrivalDelay; 759 IntAry1d m_vclInitialArrivalDelay; 760 }; 761 #endif 762 763 class SEISubBitstreamProperty : public SEI 764 { 765 public: 766 PayloadType payloadType( ) const { return SUB_BITSTREAM_PROPERTY; } 767 SEISubBitstreamProperty ( ) { }; 768 ~SEISubBitstreamProperty( ) { }; 769 SEI* getCopy( ) const { return new SEISubBitstreamProperty(*this); }; 770 771 Void setupFromCfgFile( const Char* cfgFile ); 772 Bool checkCfg ( const TComSlice* slice ); 773 Void resizeArrays ( ); 774 775 Int m_sbPropertyActiveVpsId; 776 Int m_numAdditionalSubStreamsMinus1; 777 IntAry1d m_subBitstreamMode; 778 IntAry1d m_olsIdxToVps; 779 IntAry1d m_highestSublayerId; 780 IntAry1d m_avgSbPropertyBitRate; 781 IntAry1d m_maxSbPropertyBitRate; 782 }; 783 784 class SEIAlphaChannelInfo : public SEI 785 { 786 public: 787 PayloadType payloadType( ) const { return ALPHA_CHANNEL_INFO; } 788 SEIAlphaChannelInfo ( ) { }; 789 ~SEIAlphaChannelInfo( ) { }; 790 SEI* getCopy( ) const { return new SEIAlphaChannelInfo(*this); }; 791 792 Void setupFromCfgFile( const Char* cfgFile ); 793 Bool checkCfg ( const TComSlice* slice ); 794 795 Bool m_alphaChannelCancelFlag; 796 Int m_alphaChannelUseIdc; 797 Int m_alphaChannelBitDepthMinus8; 798 Int m_alphaTransparentValue; 799 Int m_alphaOpaqueValue; 800 Bool m_alphaChannelIncrFlag; 801 Bool m_alphaChannelClipFlag; 802 Bool m_alphaChannelClipTypeFlag; 803 }; 804 805 class SEIOverlayInfo : public SEI 806 { 807 public: 808 PayloadType payloadType( ) const { return OVERLAY_INFO; } 809 SEIOverlayInfo ( ); 810 ~SEIOverlayInfo( ) { }; 811 SEI* getCopy( ) const { return new SEIOverlayInfo(*this); }; 812 813 Void setupFromCfgFile( const Char* cfgFile ); 814 Bool checkCfg ( const TComSlice* slice ); 815 816 const Int m_numOverlaysMax; 817 const Int m_numOverlayElementsMax; 818 const Int m_numStringBytesMax; //incl. null termination byte 819 820 Bool m_overlayInfoCancelFlag; 821 Int m_overlayContentAuxIdMinus128; 822 Int m_overlayLabelAuxIdMinus128; 823 Int m_overlayAlphaAuxIdMinus128; 824 Int m_overlayElementLabelValueLengthMinus8; 825 Int m_numOverlaysMinus1; 826 IntAry1d m_overlayIdx; 827 BoolAry1d m_languageOverlayPresentFlag; 828 IntAry1d m_overlayContentLayerId; 829 BoolAry1d m_overlayLabelPresentFlag; 830 IntAry1d m_overlayLabelLayerId; 831 BoolAry1d m_overlayAlphaPresentFlag; 832 IntAry1d m_overlayAlphaLayerId; 833 IntAry1d m_numOverlayElementsMinus1; 834 IntAry2d m_overlayElementLabelMin; 835 IntAry2d m_overlayElementLabelMax; 836 StringAry1d m_overlayLanguage; 837 StringAry1d m_overlayName; 838 StringAry2d m_overlayElementName; 839 Bool m_overlayInfoPersistenceFlag; 840 }; 841 842 class SEITemporalMvPredictionConstraints : public SEI 843 { 844 public: 845 PayloadType payloadType( ) const { return TEMPORAL_MV_PREDICTION_CONSTRAINTS; } 846 SEITemporalMvPredictionConstraints ( ) { }; 847 ~SEITemporalMvPredictionConstraints( ) { }; 848 SEI* getCopy( ) const { return new SEITemporalMvPredictionConstraints(*this); }; 849 850 Void setupFromCfgFile( const Char* cfgFile ); 851 Bool checkCfg ( const TComSlice* slice ); 852 853 Bool m_prevPicsNotUsedFlag; 854 Bool m_noIntraLayerColPicFlag; 855 }; 856 857 #if NH_MV_SEI_TBD 858 class SEIFrameFieldInfo : public SEI 859 { 860 public: 861 PayloadType payloadType( ) const { return FRAME_FIELD_INFO; } 862 SEIFrameFieldInfo ( ) { }; 863 ~SEIFrameFieldInfo( ) { }; 864 SEI* getCopy( ) const { return new SEIFrameFieldInfo(*this); }; 865 866 Void setupFromCfgFile( const Char* cfgFile ); 867 Void setupFromSlice ( const TComSlice* slice ); 868 Bool checkCfg ( const TComSlice* slice ); 869 870 Int m_ffinfoPicStruct; 871 Int m_ffinfoSourceScanType; 872 Bool m_ffinfoDuplicateFlag; 873 }; 874 #endif 875 876 class SEIThreeDimensionalReferenceDisplaysInfo : public SEI 877 { 878 public: 879 PayloadType payloadType( ) const { return THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO; } 880 SEIThreeDimensionalReferenceDisplaysInfo ( ) { }; 881 ~SEIThreeDimensionalReferenceDisplaysInfo( ) { }; 882 SEI* getCopy( ) const { return new SEIThreeDimensionalReferenceDisplaysInfo(*this); }; 883 884 Void setupFromCfgFile( const Char* cfgFile ); 885 Bool checkCfg ( const TComSlice* slice ); 886 887 Int getNumRefDisplaysMinus1( ) const 888 { 889 return m_numRefDisplaysMinus1; 890 } 891 892 Int m_precRefDisplayWidth; 893 Bool m_refViewingDistanceFlag; 894 Int m_precRefViewingDist; 895 Int m_numRefDisplaysMinus1; 896 IntAry1d m_leftViewId; 897 IntAry1d m_rightViewId; 898 IntAry1d m_exponentRefDisplayWidth; 899 IntAry1d m_mantissaRefDisplayWidth; 900 IntAry1d m_exponentRefViewingDistance; 901 IntAry1d m_mantissaRefViewingDistance; 902 BoolAry1d m_additionalShiftPresentFlag; 903 IntAry1d m_numSampleShiftPlus512; 904 Bool m_threeDimensionalReferenceDisplaysExtensionFlag; 905 906 Void resizeArrays( ) 907 { 908 Int numReferenceDiaplays = getNumRefDisplaysMinus1() + 1; 909 910 m_leftViewId .resize( numReferenceDiaplays ); 911 m_rightViewId .resize( numReferenceDiaplays ); 912 m_exponentRefDisplayWidth .resize( numReferenceDiaplays ); 913 m_mantissaRefDisplayWidth .resize( numReferenceDiaplays ); 914 m_exponentRefViewingDistance .resize( numReferenceDiaplays ); 915 m_mantissaRefViewingDistance .resize( numReferenceDiaplays ); 916 m_additionalShiftPresentFlag .resize( numReferenceDiaplays ); 917 m_numSampleShiftPlus512 .resize( numReferenceDiaplays ); 918 } 919 920 UInt getMantissaReferenceDisplayWidthLen ( Int i ) const ; 921 UInt getMantissaReferenceViewingDistanceLen ( Int i ) const ; 922 private: 923 UInt xGetSyntaxElementLen( Int expo, Int prec, Int val ) const; 924 }; 925 926 #if SEI_DRI_F0169 927 class SEIDepthRepresentationInfo : public SEI 928 { 929 public: 930 PayloadType payloadType( ) const { return DEPTH_REPRESENTATION_INFO; } 931 SEIDepthRepresentationInfo ( ) 932 { 933 m_currLayerID=-1; 934 }; 935 ~SEIDepthRepresentationInfo( ) { }; 936 SEI* getCopy( ) const { return new SEIDepthRepresentationInfo(*this); }; 937 938 Void setupFromCfgFile( const Char* cfgFile ); 939 Void setupFromSlice ( const TComSlice* slice ); 940 Bool checkCfg ( const TComSlice* slice ); 941 Void clear() 942 { 943 int i; 944 m_zNearFlag.clear(); 945 m_zFarFlag.clear(); 946 m_dMinFlag.clear(); 947 m_dMaxFlag.clear(); 948 949 for(i=0;i<m_zNear.size();i++) 950 m_zNear[i].clear(); 951 m_zNear.clear(); 952 953 for(i=0;i<m_zFar.size();i++) 954 m_zFar[i].clear(); 955 m_zFar.clear(); 956 957 for(i=0;i<m_dMin.size();i++) 958 m_dMin[i].clear(); 959 m_dMin.clear(); 960 961 for(i=0;i<m_dMax.size();i++) 962 m_dMax[i].clear(); 963 m_dMax.clear(); 964 965 for(i=0;i<m_depthRepresentationType.size();i++) 966 m_depthRepresentationType[i].clear(); 967 m_depthRepresentationType.clear(); 968 969 for(i=0;i<m_disparityRefViewId.size();i++) 970 m_disparityRefViewId[i].clear(); 971 m_disparityRefViewId.clear(); 972 973 for(i=0;i<m_depthNonlinearRepresentationNumMinus1.size();i++) 974 m_depthNonlinearRepresentationNumMinus1[i].clear(); 975 m_depthNonlinearRepresentationNumMinus1.clear(); 976 977 for(i=0;i<m_depth_nonlinear_representation_model.size();i++) 978 m_depth_nonlinear_representation_model[i].clear(); 979 m_depth_nonlinear_representation_model.clear(); 980 981 } 982 Int m_currLayerID; 983 BoolAry1d m_zNearFlag; 984 BoolAry1d m_zFarFlag; 985 BoolAry1d m_dMinFlag; 986 BoolAry1d m_dMaxFlag; 987 BoolAry2d m_depthRepresentationInfoSeiPresentFlag; 988 std::vector< std::vector<Double> > m_zNear,m_zFar,m_dMin,m_dMax; 989 990 IntAry2d m_depthRepresentationType; 991 IntAry2d m_disparityRefViewId; 992 IntAry2d m_depthNonlinearRepresentationNumMinus1; 993 IntAry2d m_depth_nonlinear_representation_model; 994 }; 995 #endif 996 997 class SEIMultiviewSceneInfo : public SEI 998 { 999 public: 1000 PayloadType payloadType( ) const { return MULTIVIEW_SCENE_INFO; } 1001 SEIMultiviewSceneInfo ( ) { }; 1002 ~SEIMultiviewSceneInfo( ) { }; 1003 SEI* getCopy( ) const { return new SEIMultiviewSceneInfo(*this); }; 1004 1005 Void setupFromCfgFile( const Char* cfgFile ); 1006 Bool checkCfg ( const TComSlice* slice ); 1007 1008 Int m_minDisparity; 1009 Int m_maxDisparityRange; 1010 }; 1011 1012 1013 class SEIMultiviewAcquisitionInfo : public SEI 1014 { 1015 public: 1016 PayloadType payloadType( ) const { return MULTIVIEW_ACQUISITION_INFO; } 1017 SEIMultiviewAcquisitionInfo ( ) { }; 1018 ~SEIMultiviewAcquisitionInfo( ) { }; 1019 SEI* getCopy( ) const { return new SEIMultiviewAcquisitionInfo(*this); }; 1020 1021 Void setupFromCfgFile( const Char* cfgFile ); 1022 Bool checkCfg ( const TComSlice* slice ); 1023 1024 Int getNumViewsMinus1( ) const 1025 { 1026 Int numViewsMinus1; 1027 if( m_scalNestSeiContThisSei != NULL ) 1028 { 1029 numViewsMinus1 = m_scalNestSeiContThisSei->m_nestingNumLayersMinus1; 1030 } 1031 else 1032 { 1033 numViewsMinus1 = 0; 1034 } 1035 return numViewsMinus1; 1036 } 1037 1038 Void resizeArrays( ) 1039 { 1040 Int numViews = getNumViewsMinus1() + 1; 1041 m_signFocalLengthX .resize( numViews ); 1042 m_exponentFocalLengthX .resize( numViews ); 1043 m_mantissaFocalLengthX .resize( numViews ); 1044 m_signFocalLengthY .resize( numViews ); 1045 m_exponentFocalLengthY .resize( numViews ); 1046 m_mantissaFocalLengthY .resize( numViews ); 1047 m_signPrincipalPointX .resize( numViews ); 1048 m_exponentPrincipalPointX.resize( numViews ); 1049 m_mantissaPrincipalPointX.resize( numViews ); 1050 m_signPrincipalPointY .resize( numViews ); 1051 m_exponentPrincipalPointY.resize( numViews ); 1052 m_mantissaPrincipalPointY.resize( numViews ); 1053 m_signSkewFactor .resize( numViews ); 1054 m_exponentSkewFactor .resize( numViews ); 1055 m_mantissaSkewFactor .resize( numViews ); 1056 1057 m_signR .resize( numViews ); 1058 m_exponentR .resize( numViews ); 1059 m_mantissaR .resize( numViews ); 1060 m_signT .resize( numViews ); 1061 m_exponentT .resize( numViews ); 1062 m_mantissaT .resize( numViews ); 1063 1064 for( Int i = 0; i < numViews ; i++ ) 1065 { 1066 m_signR [i].resize( 3 ); 1067 m_exponentR[i].resize( 3 ); 1068 m_mantissaR[i].resize( 3 ); 1069 m_signT [i].resize( 3 ); 1070 m_exponentT[i].resize( 3 ); 1071 m_mantissaT[i].resize( 3 ); 1072 1073 for (Int j = 0; j < 3; j++) 1074 { 1075 m_signR [i][j].resize( 3 ); 1076 m_exponentR[i][j].resize( 3 ); 1077 m_mantissaR[i][j].resize( 3 ); 1078 } 1079 } 1080 } 1081 1082 UInt getMantissaFocalLengthXLen ( Int i ) const ; 1083 UInt getMantissaFocalLengthYLen ( Int i ) const ; 1084 UInt getMantissaPrincipalPointXLen( Int i ) const ; 1085 UInt getMantissaPrincipalPointYLen( Int i ) const ; 1086 UInt getMantissaSkewFactorLen ( Int i ) const ; 1087 UInt getMantissaRLen ( Int i, Int j, Int k ) const ; 1088 UInt getMantissaTLen ( Int i, Int j ) const ; 1089 1090 Bool m_intrinsicParamFlag; 1091 Bool m_extrinsicParamFlag; 1092 Bool m_intrinsicParamsEqualFlag; 1093 Int m_precFocalLength; 1094 Int m_precPrincipalPoint; 1095 Int m_precSkewFactor; 1096 BoolAry1d m_signFocalLengthX; 1097 IntAry1d m_exponentFocalLengthX; 1098 IntAry1d m_mantissaFocalLengthX; 1099 BoolAry1d m_signFocalLengthY; 1100 IntAry1d m_exponentFocalLengthY; 1101 IntAry1d m_mantissaFocalLengthY; 1102 BoolAry1d m_signPrincipalPointX; 1103 IntAry1d m_exponentPrincipalPointX; 1104 IntAry1d m_mantissaPrincipalPointX; 1105 BoolAry1d m_signPrincipalPointY; 1106 IntAry1d m_exponentPrincipalPointY; 1107 IntAry1d m_mantissaPrincipalPointY; 1108 BoolAry1d m_signSkewFactor; 1109 IntAry1d m_exponentSkewFactor; 1110 IntAry1d m_mantissaSkewFactor; 1111 Int m_precRotationParam; 1112 Int m_precTranslationParam; 1113 BoolAry3d m_signR; 1114 IntAry3d m_exponentR; 1115 IntAry3d m_mantissaR; 1116 BoolAry2d m_signT; 1117 IntAry2d m_exponentT; 1118 IntAry2d m_mantissaT; 1119 private: 1120 UInt xGetSyntaxElementLen( Int expo, Int prec, Int val ) const; 1121 }; 1122 1123 1124 1125 class SEIMultiviewViewPosition : public SEI 1126 { 1127 public: 1128 PayloadType payloadType( ) const { return MULTIVIEW_VIEW_POSITION; } 1129 SEIMultiviewViewPosition ( ) { }; 1130 ~SEIMultiviewViewPosition( ) { }; 1131 SEI* getCopy( ) const { return new SEIMultiviewViewPosition(*this); }; 1132 1133 Void setupFromCfgFile( const Char* cfgFile ); 1134 Void setupFromSlice ( const TComSlice* slice ); 1135 Bool checkCfg ( const TComSlice* slice ); 1136 1137 Int m_numViewsMinus1; 1138 IntAry1d m_viewPosition; 1139 }; 1140 1141 #if NH_3D 1142 class SEIAlternativeDepthInfo : public SEI 1143 { 1144 public: 1145 PayloadType payloadType( ) const { return ALTERNATIVE_DEPTH_INFO; } 1146 SEIAlternativeDepthInfo ( ) { }; 1147 ~SEIAlternativeDepthInfo( ) { }; 1148 SEI* getCopy( ) const { return new SEIAlternativeDepthInfo(*this); }; 1149 1150 Void setupFromCfgFile( const Char* cfgFile ); 1151 Bool checkCfg ( const TComSlice* slice ); 1152 1153 UInt getManGvdFocalLengthXLen ( Int i, Int j ) const; 1154 UInt getManGvdFocalLengthYLen ( Int i, Int j ) const; 1155 UInt getManGvdPrincipalPointXLen ( Int i, Int j ) const; 1156 UInt getManGvdPrincipalPointYLen ( Int i, Int j ) const; 1157 //UInt getManGvdRLen ( Int i, int j ) const; 1158 UInt getManGvdTXLen ( Int i, Int j ) const; 1159 UInt xGetSyntaxElementLen ( Int expo, Int prec, Int val ) const; 1160 1161 Void resizeArrays( ) 1162 { 1163 const Int numViews = 3; // getNumConstituentViewsGvdMinus1() + 1; 1164 1165 m_signGvdZNearFlag.resize(3); 1166 m_expGvdZNear.resize(3); 1167 m_manLenGvdZNearMinus1.resize(3); 1168 m_manGvdZNear.resize(3); 1169 m_signGvdZFarFlag.resize(3); 1170 m_expGvdZFar.resize(3); 1171 m_manLenGvdZFarMinus1.resize(3); 1172 m_manGvdZFar.resize(3); 1173 1174 m_signGvdFocalLengthX.resize(3); 1175 m_expGvdFocalLengthX.resize(3); 1176 m_manGvdFocalLengthX.resize(3); 1177 m_signGvdFocalLengthY.resize(3); 1178 m_expGvdFocalLengthY.resize(3); 1179 m_manGvdFocalLengthY.resize(3); 1180 m_signGvdPrincipalPointX.resize(3); 1181 m_expGvdPrincipalPointX.resize(3); 1182 m_manGvdPrincipalPointX.resize(3); 1183 m_signGvdPrincipalPointY.resize(3); 1184 m_expGvdPrincipalPointY.resize(3); 1185 m_manGvdPrincipalPointY.resize(3); 1186 1187 m_signGvdR00.resize(3); 1188 m_expGvdR00.resize(3); 1189 m_manGvdR00.resize(3); 1190 m_signGvdR01.resize(3); 1191 m_expGvdR01.resize(3); 1192 m_manGvdR01.resize(3); 1193 m_signGvdR02.resize(3); 1194 m_expGvdR02.resize(3); 1195 m_manGvdR02.resize(3); 1196 m_signGvdR10.resize(3); 1197 m_expGvdR10.resize(3); 1198 m_manGvdR10.resize(3); 1199 m_signGvdR11.resize(3); 1200 m_expGvdR11.resize(3); 1201 m_manGvdR11.resize(3); 1202 m_signGvdR12.resize(3); 1203 m_expGvdR12.resize(3); 1204 m_manGvdR12.resize(3); 1205 m_signGvdR20.resize(3); 1206 m_expGvdR20.resize(3); 1207 m_manGvdR20.resize(3); 1208 m_signGvdR21.resize(3); 1209 m_expGvdR21.resize(3); 1210 m_manGvdR21.resize(3); 1211 m_signGvdR22.resize(3); 1212 m_expGvdR22.resize(3); 1213 m_manGvdR22.resize(3); 1214 1215 m_signGvdTX.resize(3); 1216 m_expGvdTX.resize(3); 1217 m_manGvdTX.resize(3); 1218 1219 for( Int i = 0; i < numViews; i++ ) 1220 { 1221 m_signGvdZNearFlag[i].resize(3); 1222 m_expGvdZNear[i].resize(3); 1223 m_manLenGvdZNearMinus1[i].resize(3); 1224 m_manGvdZNear[i].resize(3); 1225 m_signGvdZFarFlag[i].resize(3); 1226 m_expGvdZFar[i].resize(3); 1227 m_manLenGvdZFarMinus1[i].resize(3); 1228 m_manGvdZFar[i].resize(3); 1229 1230 m_signGvdFocalLengthX[i].resize(3); 1231 m_expGvdFocalLengthX[i].resize(3); 1232 m_manGvdFocalLengthX[i].resize(3); 1233 m_signGvdFocalLengthY[i].resize(3); 1234 m_expGvdFocalLengthY[i].resize(3); 1235 m_manGvdFocalLengthY[i].resize(3); 1236 m_signGvdPrincipalPointX[i].resize(3); 1237 m_expGvdPrincipalPointX[i].resize(3); 1238 m_manGvdPrincipalPointX[i].resize(3); 1239 m_signGvdPrincipalPointY[i].resize(3); 1240 m_expGvdPrincipalPointY[i].resize(3); 1241 m_manGvdPrincipalPointY[i].resize(3); 1242 1243 m_signGvdR00[i].resize(3); 1244 m_expGvdR00[i].resize(3); 1245 m_manGvdR00[i].resize(3); 1246 m_signGvdR01[i].resize(3); 1247 m_expGvdR01[i].resize(3); 1248 m_manGvdR01[i].resize(3); 1249 m_signGvdR02[i].resize(3); 1250 m_expGvdR02[i].resize(3); 1251 m_manGvdR02[i].resize(3); 1252 m_signGvdR10[i].resize(3); 1253 m_expGvdR10[i].resize(3); 1254 m_manGvdR10[i].resize(3); 1255 m_signGvdR11[i].resize(3); 1256 m_expGvdR11[i].resize(3); 1257 m_manGvdR11[i].resize(3); 1258 m_signGvdR12[i].resize(3); 1259 m_expGvdR12[i].resize(3); 1260 m_manGvdR12[i].resize(3); 1261 m_signGvdR20[i].resize(3); 1262 m_expGvdR20[i].resize(3); 1263 m_manGvdR20[i].resize(3); 1264 m_signGvdR21[i].resize(3); 1265 m_expGvdR21[i].resize(3); 1266 m_manGvdR21[i].resize(3); 1267 m_signGvdR22[i].resize(3); 1268 m_expGvdR22[i].resize(3); 1269 m_manGvdR22[i].resize(3); 1270 1271 m_signGvdTX[i].resize(3); 1272 m_expGvdTX[i].resize(3); 1273 m_manGvdTX[i].resize(3); 1274 } 1275 1276 } 1277 1278 Bool m_alternativeDepthInfoCancelFlag; 1279 Int m_depthType; 1280 Int m_numConstituentViewsGvdMinus1; 1281 Bool m_depthPresentGvdFlag; 1282 Bool m_zGvdFlag; 1283 Bool m_intrinsicParamGvdFlag; 1284 Bool m_rotationGvdFlag; 1285 Bool m_translationGvdFlag; 1286 BoolAry2d m_signGvdZNearFlag; 1287 IntAry2d m_expGvdZNear; 1288 IntAry2d m_manLenGvdZNearMinus1; 1289 IntAry2d m_manGvdZNear; 1290 BoolAry2d m_signGvdZFarFlag; 1291 IntAry2d m_expGvdZFar; 1292 IntAry2d m_manLenGvdZFarMinus1; 1293 IntAry2d m_manGvdZFar; 1294 Int m_precGvdFocalLength; 1295 Int m_precGvdPrincipalPoint; 1296 Int m_precGvdRotationParam; 1297 Int m_precGvdTranslationParam; 1298 BoolAry2d m_signGvdFocalLengthX; 1299 IntAry2d m_expGvdFocalLengthX; 1300 IntAry2d m_manGvdFocalLengthX; 1301 BoolAry2d m_signGvdFocalLengthY; 1302 IntAry2d m_expGvdFocalLengthY; 1303 IntAry2d m_manGvdFocalLengthY; 1304 BoolAry2d m_signGvdPrincipalPointX; 1305 IntAry2d m_expGvdPrincipalPointX; 1306 IntAry2d m_manGvdPrincipalPointX; 1307 BoolAry2d m_signGvdPrincipalPointY; 1308 IntAry2d m_expGvdPrincipalPointY; 1309 IntAry2d m_manGvdPrincipalPointY; 1310 1311 BoolAry2d m_signGvdR00; 1312 IntAry2d m_expGvdR00; 1313 IntAry2d m_manGvdR00; 1314 BoolAry2d m_signGvdR01; 1315 IntAry2d m_expGvdR01; 1316 IntAry2d m_manGvdR01; 1317 BoolAry2d m_signGvdR02; 1318 IntAry2d m_expGvdR02; 1319 IntAry2d m_manGvdR02; 1320 BoolAry2d m_signGvdR10; 1321 IntAry2d m_expGvdR10; 1322 IntAry2d m_manGvdR10; 1323 BoolAry2d m_signGvdR11; 1324 IntAry2d m_expGvdR11; 1325 IntAry2d m_manGvdR11; 1326 BoolAry2d m_signGvdR12; 1327 IntAry2d m_expGvdR12; 1328 IntAry2d m_manGvdR12; 1329 BoolAry2d m_signGvdR20; 1330 IntAry2d m_expGvdR20; 1331 IntAry2d m_manGvdR20; 1332 BoolAry2d m_signGvdR21; 1333 IntAry2d m_expGvdR21; 1334 IntAry2d m_manGvdR21; 1335 BoolAry2d m_signGvdR22; 1336 IntAry2d m_expGvdR22; 1337 IntAry2d m_manGvdR22; 1338 1339 BoolAry2d m_signGvdTX; 1340 IntAry2d m_expGvdTX; 1341 IntAry2d m_manGvdTX; 1342 1343 Int m_minOffsetXInt; 1344 Int m_minOffsetXFrac; 1345 Int m_maxOffsetXInt; 1346 Int m_maxOffsetXFrac; 1347 Bool m_offsetYPresentFlag; 1348 Int m_minOffsetYInt; 1349 Int m_minOffsetYFrac; 1350 Int m_maxOffsetYInt; 1351 Int m_maxOffsetYFrac; 1352 Bool m_warpMapSizePresentFlag; 1353 Int m_warpMapWidthMinus2; 1354 Int m_warpMapHeightMinus2; 1355 }; 1356 1357 #endif 1358 #endif 1359 1360 #endif 602 1361 //! \} -
trunk/source/Lib/TLibCommon/TComDataCU.cpp
r1321 r1356 5466 5466 } 5467 5467 5468 #if NH_3D_FIX_NBDV_COL 5469 // The picture pColCU->getSlice()->getRefPic(eColRefPicList, iColRefIdx) might not be in DPB anymore 5470 // So don't access it directly. 5471 iColRefViewIdx = pColCU->getSlice()->getVPS()->getViewOrderIdx( pColCU->getSlice()->getRefLayerId( eColRefPicList, iColRefIdx ) ); 5472 #else 5468 5473 iColRefViewIdx = pColCU->getSlice()->getRefPic(eColRefPicList, iColRefIdx)->getViewIndex(); 5474 #endif 5475 5469 5476 5470 5477 if ( iColViewIdx == iColRefViewIdx ) // temporal vector -
trunk/source/Lib/TLibCommon/TypeDef.h
r1321 r1356 43 43 //! \{ 44 44 ///////////////////////////////////////////////////////////////////////////////////////// 45 ///////////////////////////////// EXTENSION SELECTION /////////////////////////////////// 45 ///////////////////////////////// EXTENSION SELECTION /////////////////////////////////// 46 46 ///////////////////////////////////////////////////////////////////////////////////////// 47 47 /* HEVC_EXT might be defined by compiler/makefile options. 48 Linux makefiles support the following settings: 49 make -> HEVC_EXT not defined 48 Linux makefiles support the following settings: 49 make -> HEVC_EXT not defined 50 50 make HEVC_EXT=0 -> NH_MV=0 H_3D=0 --> plain HM 51 make HEVC_EXT=1 -> NH_MV=1 H_3D=0 --> MV only 52 make HEVC_EXT=2 -> NH_MV=1 H_3D=1 --> full 3D 51 make HEVC_EXT=1 -> NH_MV=1 H_3D=0 --> MV only 52 make HEVC_EXT=2 -> NH_MV=1 H_3D=1 --> full 3D 53 53 */ 54 54 #ifndef HEVC_EXT … … 56 56 #endif 57 57 #if ( HEVC_EXT < 0 )||( HEVC_EXT > 2 ) 58 #error HEVC_EXT must be in the range of 0 to 2, inclusive. 58 #error HEVC_EXT must be in the range of 0 to 2, inclusive. 59 59 #endif 60 60 #define NH_MV ( HEVC_EXT != 0) 61 61 #define NH_3D ( HEVC_EXT == 2) 62 62 ///////////////////////////////////////////////////////////////////////////////////////// 63 /////////////////////////////////// FIXES ///////////////////////////////////63 /////////////////////////////////// FIXES AND INTEGRATIONS //////////////////////// 64 64 ///////////////////////////////////////////////////////////////////////////////////////// 65 65 #if NH_MV 66 #define NH_MV_FIX_TICKET_106 1 // Identical motion check. 67 #define NH_MV_FIX_NO_REF_PICS_CHECK 1 // !!SPEC!! 68 #define NH_MV_FIX_INIT_NUM_ACTIVE_REF_LAYER_PICS 1 // Derivation of NumActiveRefLayerPIcs. !!SPEC!! 66 #define NH_MV_SEI_TBD 0 67 #define NH_MV_SEI 1 68 #define NH_MV_FIX_TICKET_106 1 // Identical motion check. 69 #define NH_MV_FIX_NO_REF_PICS_CHECK 1 // !!SPEC!! 70 #define NH_MV_FIX_INIT_NUM_ACTIVE_REF_LAYER_PICS 1 // Derivation of NumActiveRefLayerPIcs. !!SPEC!! 69 71 #define NH_MV_FIX_NUM_POC_TOTAL_CUR 1 // Derivation of NumPocTotalCur for IDR pictures. !!SPEC!! 72 #define NH_MV_LAYERS_NOT_PRESENT_SEI 1 // Layers not present SEI message JCTMV-M0043 73 #if NH_MV_SEI 74 #define SEI_DRI_F0169 1 75 #endif 70 76 #endif 71 77 #if NH_3D 72 78 #define H_3D_FIX_ARP_CHECK_NOT_IN_DPB 1 79 #define NH_3D_FIX_NBDV_COL 1 73 80 #endif 74 81 ///////////////////////////////////////////////////////////////////////////////////////// 75 /////////////////////////////////// MAJOR DEFINES /////////////////////////////////// 82 /////////////////////////////////// MAJOR DEFINES /////////////////////////////////// 76 83 ///////////////////////////////////////////////////////////////////////////////////////// 77 84 #if NH_MV … … 90 97 // LGE_ARP_CTX_F0161 JCT3V-F0161 91 98 // MTK_ARP_FLAG_CABAC_SIMP_G0061 Use 2 context for ARP flag referring to only left neighbor block in JCT3V-G0061 92 // MTK_ARP_REF_SELECTION_G0053 ARP Reference picture selection in JCT3V-G0053 99 // MTK_ARP_REF_SELECTION_G0053 ARP Reference picture selection in JCT3V-G0053 93 100 // MTK_ALIGN_SW_WD_BI_PRED_ARP_H0085 Align the SW and WD for the bi-prediction ARP PUs by disallowing non-normative fast bi-prediction for ARP PUs, JCT3V-H0085 94 // QC_I0051_ARP_SIMP 95 // SHARP_ARP_CHROMA_I0104 101 // QC_I0051_ARP_SIMP 102 // SHARP_ARP_CHROMA_I0104 96 103 // MTK_I0072_IVARP_SCALING_FIX 97 104 // SEC_ARP_VIEW_REF_CHECK_J0037 Signaling iv_res_pred_weight_idx when the current slice has both view and temporal reference picture(s), JCT3V-J0037 item1 98 105 // SEC_ARP_REM_ENC_RESTRICT_K0035 Removal of encoder restriction of ARP, JCT3V-K0035 99 106 #define NH_3D_QTLPC 1 // OL_QTLIMIT_PREDCODING_B0068 //JCT3V-B0068 100 // HHI_QTLPC_RAU_OFF_C0160 JCT3V-C0160 change 2: quadtree limitation and predictive coding switched off in random access units 107 // HHI_QTLPC_RAU_OFF_C0160 JCT3V-C0160 change 2: quadtree limitation and predictive coding switched off in random access units 101 108 // MTK_TEX_DEP_PAR_G0055 Texture-partition-dependent depth partition. JCT3V-G0055 102 #define NH_3D_VSO 1 // VSO, View synthesis optimization, includes: 109 #define NH_3D_VSO 1 // VSO, View synthesis optimization, includes: 103 110 // HHI_VSO 104 111 // HHI_VSO_LS_TABLE_M23714 enable table base Lagrange multiplier optimization … … 106 113 // LGE_WVSO_A0119 107 114 // SCU_HS_VSD_BUGFIX_IMPROV_G0163 108 #define NH_3D_NBDV 1 // Neighboring block disparity derivation 109 // QC_JCT3V-A0097 115 #define NH_3D_NBDV 1 // Neighboring block disparity derivation 116 // QC_JCT3V-A0097 110 117 // LGE_DVMCP_A0126 111 // LGE_DVMCP_MEM_REDUCTION_B0135 118 // LGE_DVMCP_MEM_REDUCTION_B0135 112 119 // QC_SIMPLE_NBDV_B0047 113 120 // FIX_LGE_DVMCP_B0133 114 121 // QC_NBDV_LDB_FIX_C0055 115 122 // MTK_SAIT_TEMPORAL_FIRST_ORDER_C0141_C0097 116 // MTK_SIMPLIFY_DVTC_C0135 123 // MTK_SIMPLIFY_DVTC_C0135 117 124 // QC_CU_NBDV_D0181 118 125 // SEC_DEFAULT_DV_D0112 … … 154 161 // NTT_VSP_DC_BUGFIX_E0208 bugfix for sub-PU based DC in VSP, JCT3V-E0208 155 162 // NTT_VSP_COMMON_E0207_E0208 common part of JCT3V-E0207 and JCT3V-E0208 156 // MTK_F0109_LG_F0120_VSP_BLOCK MTK_LG_SIMPLIFY_VSP_BLOCK_PARTITION_F0109_F0120 163 // MTK_F0109_LG_F0120_VSP_BLOCK MTK_LG_SIMPLIFY_VSP_BLOCK_PARTITION_F0109_F0120 157 164 // SHARP_VSP_BLOCK_IN_AMP_F0102 VSP partitioning for AMP 158 165 // MTK_VSP_SIMPLIFICATION_F0111 1. Inherited VSP also use NBDV of current CU, 2. VSP cannot be inherited from above LCU rowss 159 // LGE_SHARP_VSP_INHERIT_F0104 166 // LGE_SHARP_VSP_INHERIT_F0104 160 167 // NTT_STORE_SPDV_VSP_G0148 Storing Sub-PU based DV for VSP 161 168 // Restricted bi-prediction for VSP … … 164 171 #define NH_3D_MLC 1 165 172 #define NH_3D_IV_MERGE 1 // Inter-view motion merge candidate 166 // HHI_INTER_VIEW_MOTION_PRED 173 // HHI_INTER_VIEW_MOTION_PRED 167 174 // SAIT_IMPROV_MOTION_PRED_M24829, improved inter-view motion vector prediction 168 175 // QC_MRG_CANS_B0048 , JCT3V-B0048, B0086, B0069 169 176 // OL_DISMV_POS_B0069 , different pos for disparity MV candidate, B0069 170 177 // MTK_INTERVIEW_MERGE_A0049 , second part 171 // QC_AMVP_MRG_UNIFY_IVCAN_C0051 172 // QC_INRIA_MTK_MRG_E0126 178 // QC_AMVP_MRG_UNIFY_IVCAN_C0051 179 // QC_INRIA_MTK_MRG_E0126 173 180 // ETRIKHU_MERGE_REUSE_F0093 QC_DEPTH_IV_MRG_F0125, JCT3V-F0125: Depth oriented Inter-view MV candidate 174 181 // MTK_NBDV_IVREF_FIX_G0067 , Disable IvMC, VSP when IVREF is not available, JCT3V-G0067 … … 187 194 // TEXTURE MERGING CANDIDATE , JCT3V-C0137 188 195 // EC_MPI_ENABLING_MERGE_F0150, MPI flag in VPS and enabling in Merge mode 189 #define NH_3D_TMVP 1 // QC_TMVP_C0047 196 #define NH_3D_TMVP 1 // QC_TMVP_C0047 190 197 // Sony_M23639 191 198 // H_3D_TMVP_SCALING_FIX_K0053 1 // QC/CY for K0053 … … 207 214 // QC_DIM_DELTADC_UNIFY_F0132 Unify delta DC coding in depth intra modes 208 215 // LGE_SIMP_DIM_NOT_PRESENT_FLAG_CODING_H0119_H0135 Use only one context for CABAC of dim_not_present_flag 209 // QC_SIMP_DELTADC_CODING_H0131 Simplify detaDC entropy coding 216 // QC_SIMP_DELTADC_CODING_H0131 Simplify detaDC entropy coding 210 217 // MTK_DMM_SIMP_CODE_H0092 Remove CABAC context for DMM1 mode coding 211 218 // MTK_DELTA_DC_FLAG_ONE_CONTEXT_H0084_H0100_H0113 Use only one context for CABAC of delta_dc_flag as in JCTVC-H0084, JCTVC-H0100 and JCTVC-H0113 212 219 // HS_DMM_SIGNALLING_I0120 213 // SHARP_DMM1_I0110 LUT size reduction for DMM1 proposed in JCT3V-I0110 220 // SHARP_DMM1_I0110 LUT size reduction for DMM1 proposed in JCT3V-I0110 214 221 // MTK_DMM_SIM_J0035 215 // SHARP_DMM_CLEAN_K0042 1 // Generate DMM pattern with rotation 222 // SHARP_DMM_CLEAN_K0042 1 // Generate DMM pattern with rotation 216 223 #define NH_3D_DLT 1 // Depth Lookup Table 217 224 // HHI_DELTADC_DLT_D0035 218 225 // LGE_PRED_RES_CODING_DLT_DOMAIN_F0159 JCT3V-F0159 219 // SEC_NO_RESI_DLT_H0105 220 // MTK_DLT_CODING_FIX_H0091 226 // SEC_NO_RESI_DLT_H0105 227 // MTK_DLT_CODING_FIX_H0091 221 228 // H_3D_DELTA_DLT 222 229 // RWTH_DLT_CLIP_I0057 223 // SHARP_DLT_SIMP_J0029 DLT(DepthValue2Idx[]) table derivation cleanup 230 // SHARP_DLT_SIMP_J0029 DLT(DepthValue2Idx[]) table derivation cleanup 224 231 #define NH_3D_SDC_INTRA 1 // Segment-wise DC Coding method for INTRA 225 #define NH_3D_SDC_INTER 1 // Segment-wise DC Coding method for INTER 232 #define NH_3D_SDC_INTER 1 // Segment-wise DC Coding method for INTER 226 233 // RWTH_SDC_DLT_B0036 227 234 // INTEL_SDC64_D0193 … … 249 256 // MPI_SUBPU_DEFAULT_MV_H0077_H0099_H0111_H0133 250 257 #define NH_3D_DBBP 1 // DBBP: Depth-based Block Partitioning and Merging 251 // MTK_DBBP_AMP_REM_H0072 252 // RWTH_DBBP_NO_SPU_H0057 253 // SEC_DBBP_FILTERING_H0104 254 // MTK_DBBP_SIGNALING_H0094 255 // H_3D_FIX_DBBP_IVMP Fix . Enable IVMP is always disabled, when DBBP is enabled. The original intention is to disable Sub-PU IVMP when DBBP is enabled, not to disable IVMP itself. 258 // MTK_DBBP_AMP_REM_H0072 259 // RWTH_DBBP_NO_SPU_H0057 260 // SEC_DBBP_FILTERING_H0104 261 // MTK_DBBP_SIGNALING_H0094 262 // H_3D_FIX_DBBP_IVMP Fix . Enable IVMP is always disabled, when DBBP is enabled. The original intention is to disable Sub-PU IVMP when DBBP is enabled, not to disable IVMP itself. 256 263 // SEC_DBBP_EXPLICIT_SIG_I0077 Remove the partition derivation and signal dbbp_flag only when the partition mode is 2NxN/Nx2N, JCT3V-I0077 257 264 // Disallow DBBP in 8x8 CU, JCT3V-I0078 … … 261 268 // RWTH_DBBP_NO_SATD_K0028 262 269 // HS_DBBP_CLEAN_K0048 263 #define NH_3D_DIS 1 // Depth intra skip 270 #define NH_3D_DIS 1 // Depth intra skip 264 271 // SEC_DEPTH_INTRA_SKIP_MODE_K0033 Depth intra skip mode 265 272 #define H_3D_FCO 0 // Flexible coding order for 3D … … 272 279 // HHI_VPS_3D_EXTENSION_I3_J0107 273 280 // HHI_INTER_COMP_PRED_K0052 274 // HHI_RES_PRED_K0052 275 // HHI_CAM_PARA_K0052 276 // H_3D_DIRECT_DEP_TYPE 281 // HHI_RES_PRED_K0052 282 // HHI_CAM_PARA_K0052 283 // H_3D_DIRECT_DEP_TYPE 277 284 // Rate Control 278 285 #define KWU_FIX_URQ 0 … … 281 288 #endif // NH_3D 282 289 ///////////////////////////////////////////////////////////////////////////////////////// 283 /////////////////////////////////// DERIVED DEFINES /////////////////////////////////// 290 /////////////////////////////////// DERIVED DEFINES /////////////////////////////////// 284 291 ///////////////////////////////////////////////////////////////////////////////////////// 285 292 #if NH_3D … … 288 295 #endif 289 296 ///// ***** VIEW SYNTHESIS OPTIMIZAION ********* 290 #if NH_3D_VSO 297 #if NH_3D_VSO 291 298 #define H_3D_VSO_DIST_INT 1 // Allow negative synthesized view distortion change 292 #define H_3D_VSO_COLOR_PLANES 1 // Compute VSO distortion on color planes 299 #define H_3D_VSO_COLOR_PLANES 1 // Compute VSO distortion on color planes 293 300 #define H_3D_VSO_EARLY_SKIP 1 // LGE_VSO_EARLY_SKIP_A0093, A0093 modification 4 294 301 #define H_3D_VSO_RM_ASSERTIONS 0 // Output VSO assertions … … 332 339 /////////////////////////////////// MV_HEVC HLS ////////////////////////////// 333 340 ///////////////////////////////////////////////////////////////////////////////// 334 // TBD: Check if integration is necessary. 341 // TBD: Check if integration is necessary. 335 342 #define H_MV_HLS_PTL_LIMITS 0 336 343 ///////////////////////////////////////////////////////////////////////////////////////// … … 485 492 typedef UInt Distortion; ///< distortion measurement 486 493 #endif 487 #if NH_MV 494 #if NH_MV 495 typedef std::vector< std::string > StringAry1d; 496 typedef std::vector< StringAry1d > StringAry2d; 488 497 typedef std::vector< Int > IntAry1d; 489 typedef std::vector< IntAry1d > IntAry2d; 490 typedef std::vector< IntAry2d > IntAry3d; 491 typedef std::vector< IntAry3d > IntAry4d; 492 typedef std::vector< IntAry4d > IntAry5d; 498 typedef std::vector< IntAry1d > IntAry2d; 499 typedef std::vector< IntAry2d > IntAry3d; 500 typedef std::vector< IntAry3d > IntAry4d; 501 typedef std::vector< IntAry4d > IntAry5d; 493 502 typedef std::vector< Bool > BoolAry1d; 494 typedef std::vector< BoolAry1d > BoolAry2d; 495 typedef std::vector< BoolAry2d > BoolAry3d; 496 typedef std::vector< BoolAry3d > BoolAry4d; 497 typedef std::vector< BoolAry4d > BoolAry5d; 503 typedef std::vector< BoolAry1d > BoolAry2d; 504 typedef std::vector< BoolAry2d > BoolAry3d; 505 typedef std::vector< BoolAry3d > BoolAry4d; 506 typedef std::vector< BoolAry4d > BoolAry5d; 498 507 #endif 499 508 #if NH_3D_VSO … … 504 513 #if H_3D_VSO_DIST_INT 505 514 typedef Int64 Dist; ///< RDO distortion 506 typedef Int64 Dist64; 515 typedef Int64 Dist64; 507 516 #define RDO_DIST_MIN MIN_INT 508 517 #define RDO_DIST_MAX MAX_INT 509 518 #else 510 519 typedef UInt Dist; ///< RDO distortion 511 typedef UInt64 Dist; 520 typedef UInt64 Dist; 512 521 #define RDO_DIST_MIN 0 513 522 #define RDO_DIST_MAX MAX_UINT … … 797 806 ANNEX_G, 798 807 ANNEX_H, 799 ANNEX_I 808 ANNEX_I 800 809 }; 801 810 #endif … … 813 822 ,MULTIVIEWMAIN = 6, 814 823 #if NH_3D 815 MAIN3D = 8, 824 MAIN3D = 8, 816 825 #endif 817 826 #endif … … 941 950 enum ScalabilityType 942 951 { 943 DEPTH_ID = 0, 952 DEPTH_ID = 0, 944 953 VIEW_ORDER_INDEX = 1, 945 954 DEPENDENCY_ID = 2,
Note: See TracChangeset for help on using the changeset viewer.