diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/AS_02_JXS.cpp | 38 | ||||
| -rwxr-xr-x | src/AS_DCP_MXF.cpp | 4 | ||||
| -rw-r--r-- | src/as-02-info.cpp | 98 |
3 files changed, 125 insertions, 15 deletions
diff --git a/src/AS_02_JXS.cpp b/src/AS_02_JXS.cpp index f8af21f..dd20c29 100644 --- a/src/AS_02_JXS.cpp +++ b/src/AS_02_JXS.cpp @@ -44,7 +44,7 @@ using Kumu::GenRandomValue; //------------------------------------------------------------------------------------------ -static std::string JXS_PACKAGE_LABEL = "File Package: SMPTE ST 422 / ST 2124 frame wrapping of JPEG XS codestreams"; +static std::string JXS_PACKAGE_LABEL = "File Package: SMPTE ST 2124 frame wrapping of JPEG XS codestreams"; static std::string PICT_DEF_LABEL = "Image Track"; //------------------------------------------------------------------------------------------ @@ -351,18 +351,24 @@ AS_02::JXS::MXFWriter::h__Writer::OpenWrite(const std::string& filename, m_IndexStrategy = IndexStrategy; m_PartitionSpace = PartitionSpace_sec; // later converted to edit units by SetSourceStream() m_HeaderSize = HeaderSize; - - if ( picture_descriptor.GetUL() != UL(m_Dict->ul(MDD_RGBAEssenceDescriptor)) - && picture_descriptor.GetUL() != UL(m_Dict->ul(MDD_CDCIEssenceDescriptor)) ) - { - DefaultLogSink().Error("Essence descriptor is not a RGBAEssenceDescriptor or CDCIEssenceDescriptor.\n"); - picture_descriptor.Dump(); - return RESULT_AS02_FORMAT; - } - - m_EssenceDescriptor = new ASDCP::MXF::GenericPictureEssenceDescriptor(m_Dict); - m_EssenceDescriptor->Copy(picture_descriptor); - + + if ( picture_descriptor.GetUL() == UL(m_Dict->ul(MDD_RGBAEssenceDescriptor))) { + ASDCP::MXF::RGBAEssenceDescriptor *essence = new ASDCP::MXF::RGBAEssenceDescriptor(m_Dict); + ASDCP::MXF::RGBAEssenceDescriptor *mine = dynamic_cast<ASDCP::MXF::RGBAEssenceDescriptor *>(&picture_descriptor); + essence->Copy(*mine); + m_EssenceDescriptor = essence; + } else if ( picture_descriptor.GetUL() == UL(m_Dict->ul(MDD_CDCIEssenceDescriptor)) ) { + ASDCP::MXF::CDCIEssenceDescriptor *essence = new ASDCP::MXF::CDCIEssenceDescriptor(m_Dict); + ASDCP::MXF::CDCIEssenceDescriptor *mine = dynamic_cast<ASDCP::MXF::CDCIEssenceDescriptor *>(&picture_descriptor); + essence->Copy(*mine); + m_EssenceDescriptor = essence; + } else { + DefaultLogSink().Error("Essence descriptor is not a RGBAEssenceDescriptor or CDCIEssenceDescriptor.\n"); + picture_descriptor.Dump(); + return RESULT_AS02_FORMAT; + } + + ASDCP::MXF::JPEGXSPictureSubDescriptor *jxs_subdesc = new ASDCP::MXF::JPEGXSPictureSubDescriptor(m_Dict); jxs_subdesc->Copy(jxs_sub_descriptor); @@ -393,14 +399,16 @@ AS_02::JXS::MXFWriter::h__Writer::SetSourceStream(const std::string& label, cons if ( KM_SUCCESS(result) ) { - UL wrapping_label = UL(m_Dict->ul(MDD_MXFGCP1FrameWrappedPictureElement)); + UL wrapping_label = UL(m_Dict->ul(MDD_MXFGCFrameWrappedProgressiveJPEGXSPictures + /*MDD_MXFGCP1FrameWrappedPictureElement*/)); CDCIEssenceDescriptor *cdci_descriptor = dynamic_cast<CDCIEssenceDescriptor*>(m_EssenceDescriptor); if ( cdci_descriptor ) { if ( cdci_descriptor->FrameLayout ) // 0 == progressive, 1 == interlace { - wrapping_label = UL(m_Dict->ul(MDD_MXFGCI1FrameWrappedPictureElement)); + wrapping_label = UL(m_Dict->ul(MDD_MXFGCFrameWrappedInterlacedJPEGXSPictures + /*MDD_MXFGCI1FrameWrappedPictureElement*/)); } } diff --git a/src/AS_DCP_MXF.cpp b/src/AS_DCP_MXF.cpp index 129edf1..643e274 100755 --- a/src/AS_DCP_MXF.cpp +++ b/src/AS_DCP_MXF.cpp @@ -248,6 +248,10 @@ ASDCP::EssenceType(const std::string& filename, EssenceType_t& type, const Kumu: { type = ESS_AS02_JPEG_2000; } + else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(JPEGXSPictureSubDescriptor))) ) + { + type = ESS_AS02_JPEG_XS; + } else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor), &md_object)) ) { assert(md_object); diff --git a/src/as-02-info.cpp b/src/as-02-info.cpp index b9b281c..a1235ac 100644 --- a/src/as-02-info.cpp +++ b/src/as-02-info.cpp @@ -40,6 +40,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <AS_DCP.h> #include <AS_02.h> #include <AS_02_IAB.h> +#include <AS_02_JXS.h> #include <JP2K.h> #include <AS_02_ACES.h> #include <ACES.h> @@ -592,6 +593,98 @@ class MyTextDescriptor : public TimedText::TimedTextDescriptor } }; +class MyJXSDescriptor +{ + RGBAEssenceDescriptor *m_RGBADescriptor; + CDCIEssenceDescriptor *m_CDCIDescriptor; + JPEGXSPictureSubDescriptor *m_JPEGXSSubDescriptor; +public: + ui64_t ContainerDuration; + ASDCP::MXF::Rational m_SampleRate; + ASDCP::MXF::Rational m_EditRate; + + public: + MyJXSDescriptor() : + m_RGBADescriptor(0), + m_CDCIDescriptor(0), + m_JPEGXSSubDescriptor(0), + ContainerDuration(0) + {} + + void FillDescriptor(AS_02::JXS::MXFReader& Reader) + { + m_CDCIDescriptor = get_descriptor_by_type<AS_02::JXS::MXFReader, CDCIEssenceDescriptor> + (Reader, DefaultCompositeDict().ul(MDD_CDCIEssenceDescriptor)); + + m_RGBADescriptor = get_descriptor_by_type<AS_02::JXS::MXFReader, RGBAEssenceDescriptor> + (Reader, DefaultCompositeDict().ul(MDD_RGBAEssenceDescriptor)); + + if ( m_RGBADescriptor != 0 ) + { + m_SampleRate = m_RGBADescriptor->SampleRate; + if ( ! m_RGBADescriptor->ContainerDuration.empty() ) + { + ContainerDuration = m_RGBADescriptor->ContainerDuration; + } + } + else if ( m_CDCIDescriptor != 0 ) + { + m_SampleRate = m_CDCIDescriptor->SampleRate; + if ( ! m_CDCIDescriptor->ContainerDuration.empty() ) + { + ContainerDuration = m_CDCIDescriptor->ContainerDuration; + } + } + else + { + DefaultLogSink().Error("Picture descriptor not found.\n"); + } + + m_JPEGXSSubDescriptor = get_descriptor_by_type<AS_02::JXS::MXFReader, JPEGXSPictureSubDescriptor> + (Reader, DefaultCompositeDict().ul(MDD_JPEGXSPictureSubDescriptor)); + + if ( m_JPEGXSSubDescriptor == 0 ) + { + DefaultLogSink().Error("JPEGXSPictureSubDescriptor not found.\n"); + } + + std::list<InterchangeObject*> ObjectList; + Reader.OP1aHeader().GetMDObjectsByType(DefaultCompositeDict().ul(MDD_Track), ObjectList); + + if ( ObjectList.empty() ) + { + DefaultLogSink().Error("MXF Metadata contains no Track Sets.\n"); + } + + m_EditRate = ((Track*)ObjectList.front())->EditRate; + } + + void MyDump(FILE* stream) { + if ( stream == 0 ) + { + stream = stderr; + } + + if ( m_CDCIDescriptor != 0 ) + { + m_CDCIDescriptor->Dump(stream); + } + else if ( m_RGBADescriptor != 0 ) + { + m_RGBADescriptor->Dump(stream); + } + else + { + return; + } + + if ( m_JPEGXSSubDescriptor != 0 ) + { + m_JPEGXSSubDescriptor->Dump(stream); + } + } +}; + struct RateInfo { UL ul; @@ -954,6 +1047,11 @@ show_file_info(CommandOptions& Options, const Kumu::IFileReaderFactory& fileRead if ( ASDCP_SUCCESS(result) && Options.showcoding_flag ) wrapper.dump_WaveAudioDescriptor(stdout); } + else if ( EssenceType == ESS_AS02_JPEG_XS ) + { + FileInfoWrapper<AS_02::JXS::MXFReader, MyJXSDescriptor> wrapper(fileReaderFactory); + result = wrapper.file_info(Options, "JPEG XS"); + } else if ( EssenceType == ESS_AS02_IAB ) { FileInfoWrapper<AS_02::IAB::MXFReader, MyIabDescriptor> wrapper(fileReaderFactory); |
