ASDCP::Result_t ASDCP::ATMOS::MXFReader::h__Reader::OpenRead(const std::string& filename) { Result_t result = DCData::h__Reader::OpenRead(filename); if( ASDCP_SUCCESS(result) ) { if (NULL == m_EssenceSubDescriptor) { InterchangeObject* iObj = NULL; result = m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(DolbyAtmosSubDescriptor), &iObj); m_EssenceSubDescriptor = static_cast<MXF::DolbyAtmosSubDescriptor*>(iObj); if ( iObj == 0 ) { DefaultLogSink().Error("DolbyAtmosSubDescriptor object not found.\n"); return RESULT_FORMAT; } } if ( ASDCP_SUCCESS(result) ) { result = MD_to_Atmos_ADesc(m_ADesc); } } return result; }
ASDCP::Result_t ASDCP::EssenceType(const char* filename, EssenceType_t& type) { const Dictionary* m_Dict = &DefaultCompositeDict(); assert(m_Dict); ASDCP_TEST_NULL_STR(filename); Kumu::FileReader Reader; OPAtomHeader TestHeader(m_Dict); Result_t result = Reader.OpenRead(filename); if ( ASDCP_SUCCESS(result) ) result = TestHeader.InitFromFile(Reader); // test UL and OP if ( ASDCP_SUCCESS(result) ) { type = ESS_UNKNOWN; if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(RGBAEssenceDescriptor))) ) { if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(StereoscopicPictureSubDescriptor))) ) type = ESS_JPEG_2000_S; else type = ESS_JPEG_2000; } else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor))) ) type = ESS_PCM_24b_48k; else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(MPEG2VideoDescriptor))) ) type = ESS_MPEG2_VES; else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(TimedTextDescriptor))) ) type = ESS_TIMED_TEXT; else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(DCDataDescriptor))) ) { if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(DolbyAtmosSubDescriptor))) ) type = ESS_DCDATA_DOLBY_ATMOS; else type = ESS_DCDATA_UNKNOWN; } } return result; }
ASDCP::Result_t ASDCP::EssenceType(const std::string& filename, EssenceType_t& type) { const Dictionary* m_Dict = &DefaultCompositeDict(); InterchangeObject* md_object = 0; assert(m_Dict); Kumu::FileReader Reader; OP1aHeader TestHeader(m_Dict); Result_t result = Reader.OpenRead(filename); if ( ASDCP_SUCCESS(result) ) result = TestHeader.InitFromFile(Reader); // test UL and OP if ( ASDCP_SUCCESS(result) ) { type = ESS_UNKNOWN; if ( TestHeader.OperationalPattern == UL(m_Dict->ul(MDD_OPAtom)) || TestHeader.OperationalPattern == UL(m_Dict->ul(MDD_MXFInterop_OPAtom)) ) { if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(JPEG2000PictureSubDescriptor))) ) { if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(StereoscopicPictureSubDescriptor))) ) { type = ESS_JPEG_2000_S; } else { type = ESS_JPEG_2000; } } else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor), &md_object)) ) { assert(md_object); if ( static_cast<ASDCP::MXF::WaveAudioDescriptor*>(md_object)->AudioSamplingRate == SampleRate_96k ) { type = ESS_PCM_24b_96k; } else { type = ESS_PCM_24b_48k; } } else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(MPEG2VideoDescriptor))) ) { type = ESS_MPEG2_VES; } else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(TimedTextDescriptor))) ) { type = ESS_TIMED_TEXT; } else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(DCDataDescriptor))) ) { if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(DolbyAtmosSubDescriptor))) ) { type = ESS_DCDATA_DOLBY_ATMOS; } else { type = ESS_DCDATA_UNKNOWN; } } } else if ( TestHeader.OperationalPattern == UL(m_Dict->ul(MDD_OP1a)) ) { if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(JPEG2000PictureSubDescriptor))) ) { type = ESS_AS02_JPEG_2000; } else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor), &md_object)) ) { assert(md_object); if ( static_cast<ASDCP::MXF::WaveAudioDescriptor*>(md_object)->AudioSamplingRate == SampleRate_96k ) { type = ESS_AS02_PCM_24b_96k; } else { type = ESS_AS02_PCM_24b_48k; } } else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(TimedTextDescriptor))) ) { type = ESS_AS02_TIMED_TEXT; } } else { DefaultLogSink().Error("Unsupported MXF Operational Pattern.\n"); return RESULT_FORMAT; } } return result; }
ASDCP::Result_t ASDCP::PCM::MXFReader::h__Reader::OpenRead(const std::string& filename) { Result_t result = OpenMXFRead(filename); if( ASDCP_SUCCESS(result) ) { InterchangeObject* Object = 0 ; if ( ASDCP_SUCCESS(m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor), &Object)) ) { if ( Object == 0 ) { DefaultLogSink().Error("WaveAudioDescriptor object not found.\n"); return RESULT_FORMAT; } result = MD_to_PCM_ADesc((MXF::WaveAudioDescriptor*)Object, m_ADesc); } } if ( m_ADesc.ContainerDuration == 0 ) { DefaultLogSink().Error("ContainerDuration unset.\n"); return RESULT_FORMAT; } // check for sample/frame rate sanity if ( ASDCP_SUCCESS(result) && m_ADesc.EditRate != EditRate_24 && m_ADesc.EditRate != EditRate_25 && m_ADesc.EditRate != EditRate_30 && m_ADesc.EditRate != EditRate_48 && m_ADesc.EditRate != EditRate_50 && m_ADesc.EditRate != EditRate_60 && m_ADesc.EditRate != EditRate_96 && m_ADesc.EditRate != EditRate_100 && m_ADesc.EditRate != EditRate_120 && m_ADesc.EditRate != EditRate_16 && m_ADesc.EditRate != EditRate_18 && m_ADesc.EditRate != EditRate_20 && m_ADesc.EditRate != EditRate_22 && m_ADesc.EditRate != EditRate_23_98 ) { DefaultLogSink().Error("PCM file EditRate is not a supported value: %d/%d\n", // lu m_ADesc.EditRate.Numerator, m_ADesc.EditRate.Denominator); // oh, they gave us the audio sampling rate instead, assume 24/1 if ( m_ADesc.EditRate == SampleRate_48k || m_ADesc.EditRate == SampleRate_96k ) { DefaultLogSink().Warn("adjusting EditRate to 24/1\n"); m_ADesc.EditRate = EditRate_24; } else { DefaultLogSink().Error("PCM EditRate not in expected value range.\n"); // or we just drop the hammer return RESULT_FORMAT; } } // TODO: test file for sane CBR index BytesPerEditUnit return result; }