void P2_MetaHandler::SetStartTimecodeFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound ) { // Translate start timecode to the format specified by the dynamic media schema. if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "startTimecode" )) ) { P2_Clip* p2Clip = this->p2ClipManager.GetManagedClip() ; XMP_StringPtr p2NS = p2Clip->GetP2RootNode()->ns.c_str(); XML_NodePtr legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "StartTimecode" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { std::string p2StartTimecode = legacyProp->GetLeafContentValue(); legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "FrameRate" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2FrameRate = legacyProp->GetLeafContentValue(); XMP_StringPtr p2DropFrameFlag = legacyProp->GetAttrValue ( "DropFrameFlag" ); if ( p2DropFrameFlag == 0 ) p2DropFrameFlag = ""; // Make tests easier. std::string dmTimeFormat; if ( ( p2FrameRate == "50i" ) || ( p2FrameRate == "25p" ) ) { dmTimeFormat = "25Timecode"; } else if ( p2FrameRate == "23.98p" ) { dmTimeFormat = "23976Timecode"; } else if ( p2FrameRate == "50p" ) { dmTimeFormat = "50Timecode"; this->AdjustTimeCode( p2StartTimecode, false ); } else if ( ( p2FrameRate == "59.94p" ) && ( p2DropFrameFlag != 0 ) ) { if ( XMP_LitMatch ( p2DropFrameFlag, "true" ) ) { dmTimeFormat = "5994DropTimecode"; } else if ( XMP_LitMatch ( p2DropFrameFlag, "false" ) ) { dmTimeFormat = "5994NonDropTimecode"; } this->AdjustTimeCode( p2StartTimecode, false ); } else if ( (p2FrameRate == "59.94i") || (p2FrameRate == "29.97p") ) { if ( p2DropFrameFlag != 0 ) { if ( XMP_LitMatch ( p2DropFrameFlag, "false" ) ) { dmTimeFormat = "2997NonDropTimecode"; } else if ( XMP_LitMatch ( p2DropFrameFlag, "true" ) ) { // Drop frame NTSC timecode uses semicolons instead of colons as separators. std::string::iterator currCharIt = p2StartTimecode.begin(); const std::string::iterator charsEndIt = p2StartTimecode.end(); for ( ; currCharIt != charsEndIt; ++currCharIt ) { if ( *currCharIt == ':' ) *currCharIt = ';'; } dmTimeFormat = "2997DropTimecode"; } } } if ( ( ! p2StartTimecode.empty() ) && ( ! dmTimeFormat.empty() ) ) { this->xmpObj.SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeValue", p2StartTimecode, 0 ); this->xmpObj.SetStructField ( kXMP_NS_DM, "startTimecode", kXMP_NS_DM, "timeFormat", dmTimeFormat, 0 ); this->containsXMP = true; } } } } } // P2_MetaHandler::SetStartTimecodeFromLegacyXML
void P2_MetaHandler::SetVideoFrameInfoFromLegacyXML ( XML_NodePtr legacyVideoContext, bool digestFound ) { // Map the P2 Codec field to various dynamic media schema fields. if ( digestFound || (! this->xmpObj.DoesPropertyExist ( kXMP_NS_DM, "videoFrameSize" )) ) { P2_Clip* p2Clip = this->p2ClipManager.GetManagedClip() ; XMP_StringPtr p2NS = p2Clip->GetP2RootNode()->ns.c_str(); XML_NodePtr legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "Codec" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2Codec = legacyProp->GetLeafContentValue(); std::string dmPixelAspectRatio, dmVideoCompressor, dmWidth, dmHeight; if ( p2Codec == "DV25_411" ) { dmWidth = "720"; dmVideoCompressor = "DV25 4:1:1"; } else if ( p2Codec == "DV25_420" ) { dmWidth = "720"; dmVideoCompressor = "DV25 4:2:0"; } else if ( p2Codec == "DV50_422" ) { dmWidth = "720"; dmVideoCompressor = "DV50 4:2:2"; } else if ( ( p2Codec == "DV100_1080/59.94i" ) || ( p2Codec == "DV100_1080/50i" ) ) { dmVideoCompressor = "DV100"; dmHeight = "1080"; if ( p2Codec == "DV100_1080/59.94i" ) { dmWidth = "1280"; dmPixelAspectRatio = "3/2"; } else { dmWidth = "1440"; dmPixelAspectRatio = "1920/1440"; } } else if ( ( p2Codec == "DV100_720/59.94p" ) || ( p2Codec == "DV100_720/50p" ) ) { dmVideoCompressor = "DV100"; dmHeight = "720"; dmWidth = "960"; dmPixelAspectRatio = "1920/1440"; } else if ( ( p2Codec.compare ( 0, 6, "AVC-I_" ) == 0 ) ) { // This is AVC-Intra footage. The framerate and PAR depend on the "class" attribute in the P2 XML. const XMP_StringPtr codecClass = legacyProp->GetAttrValue( "Class" ); if ( codecClass != 0 ) dmVideoCompressor = "AVC-Intra"; // initializing with default value if ( XMP_LitMatch ( codecClass, "100" ) ) { dmVideoCompressor = "AVC-Intra 100"; dmPixelAspectRatio = "1/1"; if ( p2Codec.compare ( 6, 4, "1080" ) == 0 ) { dmHeight = "1080"; dmWidth = "1920"; } else if ( p2Codec.compare ( 6, 3, "720" ) == 0 ) { dmHeight = "720"; dmWidth = "1280"; } } else if ( XMP_LitMatch ( codecClass, "50" ) ) { dmVideoCompressor = "AVC-Intra 50"; dmPixelAspectRatio = "1920/1440"; if ( p2Codec.compare ( 6, 4, "1080" ) == 0 ) { dmHeight = "1080"; dmWidth = "1440"; } else if ( p2Codec.compare ( 6, 3, "720" ) == 0 ) { dmHeight = "720"; dmWidth = "960"; } } else { // Unknown codec class -- we don't have enough info to determine the // codec, PAR, or aspect ratio dmVideoCompressor = "AVC-Intra"; } } if ( dmWidth == "720" ) { // This is SD footage -- calculate the frame height and pixel aspect ratio using the legacy P2 // FrameRate and AspectRatio fields. legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "FrameRate" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2FrameRate = legacyProp->GetLeafContentValue(); legacyProp = legacyVideoContext->GetNamedElement ( p2NS, "AspectRatio" ); if ( (legacyProp != 0) && legacyProp->IsLeafContentNode() ) { const std::string p2AspectRatio = legacyProp->GetLeafContentValue(); if ( p2FrameRate == "50i" ) { // Standard Definition PAL. dmHeight = "576"; if ( p2AspectRatio == "4:3" ) { dmPixelAspectRatio = "768/702"; } else if ( p2AspectRatio == "16:9" ) { dmPixelAspectRatio = "1024/702"; } } else if ( p2FrameRate == "59.94i" ) { // Standard Definition NTSC. dmHeight = "480"; if ( p2AspectRatio == "4:3" ) { dmPixelAspectRatio = "10/11"; } else if ( p2AspectRatio == "16:9" ) { dmPixelAspectRatio = "40/33"; } } } } } if ( ! dmPixelAspectRatio.empty() ) { this->xmpObj.SetProperty ( kXMP_NS_DM, "videoPixelAspectRatio", dmPixelAspectRatio, kXMP_DeleteExisting ); this->containsXMP = true; } if ( ! dmVideoCompressor.empty() ) { this->xmpObj.SetProperty ( kXMP_NS_DM, "videoCompressor", dmVideoCompressor, kXMP_DeleteExisting ); this->containsXMP = true; } if ( ( ! dmWidth.empty() ) && ( ! dmHeight.empty() ) ) { this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "w", dmWidth, 0 ); this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "h", dmHeight, 0 ); this->xmpObj.SetStructField ( kXMP_NS_DM, "videoFrameSize", kXMP_NS_XMP_Dimensions, "unit", "pixel", 0 ); this->containsXMP = true; } } } } // P2_MetaHandler::SetVideoFrameInfoFromLegacyXML