Enabled JPEG XS in as-02-info.
authorThomas Richter <thomas.richter@iis.fraunhofer.de>
Thu, 3 Feb 2022 09:57:36 +0000 (10:57 +0100)
committerThomas Richter <thomas.richter@iis.fraunhofer.de>
Thu, 3 Feb 2022 09:57:36 +0000 (10:57 +0100)
src/AS_02_JXS.cpp
src/AS_DCP_MXF.cpp
src/as-02-info.cpp

index ded65eebee2bd7bd1f1965f3fab23bdb7f353cb0..103436ee6cf57bed47717f7399f263edf4923d28 100644 (file)
@@ -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";
 
 //------------------------------------------------------------------------------------------
index 129edf1bc545cfb0d4dddf889188d776139c3388..643e27463497a47b70bf41729c70e462b368c981 100755 (executable)
@@ -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);
index b9b281c27b444f838c2959caf22958b166f71182..a1235acfd106cee1bbeeece48a1317dfc34801e2 100644 (file)
@@ -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);