version
authormikey <mikey@cinecert.com>
Thu, 5 Jun 2014 16:33:46 +0000 (16:33 +0000)
committermikey <>
Thu, 5 Jun 2014 16:33:46 +0000 (16:33 +0000)
configure.ac
src/AS_DCP_internal.h
src/JP2K.cpp
src/JP2K.h
src/KLV.h
src/Makefile.am
src/asdcp-info.cpp
src/j2c-test.cpp

index a4b67c4c2194915976726ad4524bac639340b91c..af88bcfbcdec1caa691b6d7dd056b67518cfb279 100644 (file)
@@ -37,7 +37,7 @@ AC_PREREQ([2.59])
 # For example, if asdcplib version 1.0.0 were modified to accomodate changes
 # in file format, and if no changes were made to AS_DCP.h, the new version would be
 # 1.0.1. If changes were also required in AS_DCP.h, the new version would be 1.1.1.
-AC_INIT([asdcplib], [2.1.1], [asdcplib@cinecert.com])
+AC_INIT([asdcplib], [2.1.2], [asdcplib@cinecert.com])
 
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_SRCDIR([src/KM_error.h])
index 24020e536f90cc80601ec552dea0e25a1e7ccf84..a37c731764d2de0497369d9e94504e4fd2cac382 100755 (executable)
@@ -60,7 +60,6 @@ extern MXF::RIP *g_RIP;
 
 namespace ASDCP
 {
-  void default_md_object_init();
 
   //
   static std::vector<int>
@@ -597,13 +596,17 @@ namespace ASDCP
          TrackSet<TimecodeComponent> MPTCTrack =
            CreateTimecodeTrack<MaterialPackage>(m_HeaderPart, *m_MaterialPackage,
                                                 tc_edit_rate, TCFrameRate, 0, m_Dict);
+
+         MPTCTrack.Sequence->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration.get()));
+         MPTCTrack.Clip->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration.get()));
 
          TrackSet<SourceClip> MPTrack =
            CreateTrackAndSequence<MaterialPackage, SourceClip>(m_HeaderPart, *m_MaterialPackage,
                                                                TrackName, clip_edit_rate, DataDefinition,
                                                                2, m_Dict);
+         MPTrack.Sequence->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration.get()));
 
          MPTrack.Clip = new SourceClip(m_Dict);
@@ -612,6 +615,8 @@ namespace ASDCP
          MPTrack.Clip->DataDefinition = DataDefinition;
          MPTrack.Clip->SourcePackageID = SourcePackageUMID;
          MPTrack.Clip->SourceTrackID = 2;
+
+         MPTrack.Clip->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(MPTrack.Clip->Duration.get()));
 
   
@@ -630,12 +635,18 @@ namespace ASDCP
            CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
                                               tc_edit_rate, TCFrameRate,
                                               ui64_C(3600) * TCFrameRate, m_Dict);
+
+         FPTCTrack.Sequence->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration.get()));
+         FPTCTrack.Clip->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration.get()));
+
          TrackSet<SourceClip> FPTrack =
            CreateTrackAndSequence<SourcePackage, SourceClip>(m_HeaderPart, *m_FilePackage,
                                                              TrackName, clip_edit_rate, DataDefinition,
                                                              2, m_Dict);
+
+         FPTrack.Sequence->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration.get()));
 
          // Consult ST 379:2004 Sec. 6.3, "Element to track relationship" to see where "12" comes from.
@@ -649,6 +660,8 @@ namespace ASDCP
          // for now we do not allow setting this value, so all files will be 'original'
          FPTrack.Clip->SourceTrackID = 0;
          FPTrack.Clip->SourcePackageID = NilUMID;
+
+         FPTrack.Clip->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(FPTrack.Clip->Duration.get()));
 
          m_EssenceDescriptor->LinkedTrackID = FPTrack.Track->TrackID;
@@ -688,13 +701,17 @@ namespace ASDCP
          TrackSet<TimecodeComponent> MPTCTrack =
            CreateTimecodeTrack<MaterialPackage>(m_HeaderPart, *m_MaterialPackage,
                                                 tc_edit_rate, tc_frame_rate, 0, m_Dict);
+
+         MPTCTrack.Sequence->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration.get()));
+         MPTCTrack.Clip->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration.get()));
 
          TrackSet<DMSegment> MPTrack =
            CreateTrackAndSequence<MaterialPackage, DMSegment>(m_HeaderPart, *m_MaterialPackage,
                                                               TrackName, clip_edit_rate, DataDefinition,
                                                               2, m_Dict);
+         MPTrack.Sequence->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration.get()));
 
          MPTrack.Clip = new DMSegment(m_Dict);
@@ -703,6 +720,7 @@ namespace ASDCP
          MPTrack.Clip->DataDefinition = DataDefinition;
          //  MPTrack.Clip->SourcePackageID = SourcePackageUMID;
          //  MPTrack.Clip->SourceTrackID = 2;
+
          m_DurationUpdateList.push_back(&(MPTrack.Clip->Duration));
 
   
@@ -721,13 +739,18 @@ namespace ASDCP
            CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
                                               clip_edit_rate, tc_frame_rate,
                                               ui64_C(3600) * tc_frame_rate, m_Dict);
+
+         FPTCTrack.Sequence->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration.get()));
+         FPTCTrack.Clip->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration.get()));
 
          TrackSet<DMSegment> FPTrack =
            CreateTrackAndSequence<SourcePackage, DMSegment>(m_HeaderPart, *m_FilePackage,
                                                             TrackName, clip_edit_rate, DataDefinition,
                                                             2, m_Dict);
+
+         FPTrack.Sequence->Duration.set_has_value();
          m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration.get()));
 
          FPTrack.Clip = new DMSegment(m_Dict);
@@ -737,6 +760,7 @@ namespace ASDCP
          FPTrack.Clip->EventComment = "ST 429-5 Timed Text";
 
          m_DurationUpdateList.push_back(&(FPTrack.Clip->Duration));
+
          m_EssenceDescriptor->LinkedTrackID = FPTrack.Track->TrackID;
        }
 
index 058aaa126efcfa56ada49bfa0070113b9b0ce628..0066f222d92909ac79c08f369d54ea26818514bf 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2005-2009, John Hurst
+Copyright (c) 2005-2014, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -102,7 +102,7 @@ ASDCP::JP2K::GetNextMarker(const byte_t** buf, JP2K::Marker& Marker)
 
 //
 void
-ASDCP::JP2K::Accessor::SIZ::ReadComponent(ui32_t index, ASDCP::JP2K::ImageComponent_t& IC)
+ASDCP::JP2K::Accessor::SIZ::ReadComponent(const ui32_t index, ASDCP::JP2K::ImageComponent_t& IC) const
 {
   assert ( index < Csize() );
   const byte_t* p = m_MarkerData + 36 + (index * 3);
@@ -113,7 +113,7 @@ ASDCP::JP2K::Accessor::SIZ::ReadComponent(ui32_t index, ASDCP::JP2K::ImageCompon
 
 //
 void
-ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream)
+ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream) const
 {
   if ( stream == 0 )
     stream = stderr;
@@ -146,7 +146,7 @@ ASDCP::JP2K::Accessor::SIZ::Dump(FILE* stream)
 
 //
 void
-ASDCP::JP2K::Accessor::COD::Dump(FILE* stream)
+ASDCP::JP2K::Accessor::COD::Dump(FILE* stream) const
 {
   if ( stream == 0 )
     stream = stderr;
@@ -179,21 +179,46 @@ ASDCP::JP2K::Accessor::COD::Dump(FILE* stream)
   fprintf(stream, " Transformation: %s\n", transformations_str);
 }
 
+//
+const char*
+ASDCP::JP2K::Accessor::GetQuantizationTypeString(const Accessor::QuantizationType_t t)
+{
+  switch ( t )
+    {
+    case QT_NONE: return "none";
+    case QT_DERIVED: return "scalar derived";
+    case QT_EXP: return "scalar expounded";
+    }
+
+  return "**UNKNOWN**";
+}
+
+//
+void
+ASDCP::JP2K::Accessor::QCD::Dump(FILE* stream) const
+{
+  if ( stream == 0 )
+    stream = stderr;
+
+  fprintf(stream, "QCD: \n");
+  fprintf(stream, "QuantizationType: %s\n", GetQuantizationTypeString(QuantizationType()));
+  fprintf(stream, "       GuardBits: %d\n", GuardBits());
+  fprintf(stream, "           SPqcd:\n", GuardBits());
+  Kumu::hexdump(m_MarkerData, m_DataSize, stream);
+}
+
 //
 void
-ASDCP::JP2K::Accessor::COM::Dump(FILE* stream)
+ASDCP::JP2K::Accessor::COM::Dump(FILE* stream) const
 {
   if ( stream == 0 )
     stream = stderr;
 
   if ( IsText() )
     {
-      char* t_str = (char*)malloc(CommentSize() + 1);
-      assert( t_str != 0 );
-      ui32_t cs = CommentSize();
-      memcpy(t_str, CommentData(), cs);
-      t_str[cs] = 0;
-      fprintf(stream, "COM:%s\n", t_str);
+      std::string tmp_str;
+      tmp_str.assign((char*)CommentData(), CommentSize());
+      fprintf(stream, "COM:%s\n", tmp_str.c_str());
     }
   else
     {
index fb100496f1094816afc618a3af0959576cfbe7d9..b043dfc8de36eca354bb80941cb162a84b042b66 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2005-2009, John Hurst
+Copyright (c) 2005-2014, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -113,18 +113,18 @@ namespace JP2K
 
          ~SIZ() {}
 
-         inline ui16_t Rsize()   { return KM_i16_BE(*(ui16_t*)m_MarkerData); }
-         inline ui32_t Xsize()   { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 2)); }
-         inline ui32_t Ysize()   { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 6)); }
-         inline ui32_t XOsize()  { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 10)); }
-         inline ui32_t YOsize()  { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 14)); }
-         inline ui32_t XTsize()  { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 18)); }
-         inline ui32_t YTsize()  { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 22)); }
-         inline ui32_t XTOsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 26)); }
-         inline ui32_t YTOsize() { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 30)); }
-         inline ui16_t Csize()   { return KM_i16_BE(*(ui16_t*)(m_MarkerData + 34)); }
-         void ReadComponent(ui32_t index, ImageComponent_t& IC);
-         void Dump(FILE* stream = 0);
+         inline ui16_t Rsize()   const { return KM_i16_BE(*(ui16_t*)m_MarkerData); }
+         inline ui32_t Xsize()   const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 2)); }
+         inline ui32_t Ysize()   const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 6)); }
+         inline ui32_t XOsize()  const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 10)); }
+         inline ui32_t YOsize()  const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 14)); }
+         inline ui32_t XTsize()  const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 18)); }
+         inline ui32_t YTsize()  const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 22)); }
+         inline ui32_t XTOsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 26)); }
+         inline ui32_t YTOsize() const { return KM_i32_BE(*(ui32_t*)(m_MarkerData + 30)); }
+         inline ui16_t Csize()   const { return KM_i16_BE(*(ui16_t*)(m_MarkerData + 34)); }
+         void ReadComponent(const ui32_t index, ImageComponent_t& IC) const;
+         void Dump(FILE* stream = 0) const;
        };
 
       const int SGcodOFST = 1;
@@ -147,15 +147,50 @@ namespace JP2K
 
          ~COD() {}
          
-         inline ui8_t  ProgOrder()        { return *(m_MarkerData + SGcodOFST ); }
-         inline ui16_t Layers()           { return KM_i16_BE(*(ui16_t*)(m_MarkerData + SGcodOFST + 1));}
-         inline ui8_t  DecompLevels()     { return *(m_MarkerData + SPcodOFST); }
-         inline ui8_t  CodeBlockWidth()   { return *(m_MarkerData + SPcodOFST + 1) + 2; }
-         inline ui8_t  CodeBlockHeight()  { return *(m_MarkerData + SPcodOFST + 2) + 2; }
-         inline ui8_t  CodeBlockStyle()   { return *(m_MarkerData + SPcodOFST + 3); }
-         inline ui8_t  Transformation()   { return *(m_MarkerData + SPcodOFST + 4); }
-
-         void Dump(FILE* stream = 0);
+         inline ui8_t  ProgOrder()        const { return *(m_MarkerData + SGcodOFST ); }
+         inline ui16_t Layers()           const { return KM_i16_BE(*(ui16_t*)(m_MarkerData + SGcodOFST + 1));}
+         inline ui8_t  DecompLevels()     const { return *(m_MarkerData + SPcodOFST); }
+         inline ui8_t  CodeBlockWidth()   const { return *(m_MarkerData + SPcodOFST + 1) + 2; }
+         inline ui8_t  CodeBlockHeight()  const { return *(m_MarkerData + SPcodOFST + 2) + 2; }
+         inline ui8_t  CodeBlockStyle()   const { return *(m_MarkerData + SPcodOFST + 3); }
+         inline ui8_t  Transformation()   const { return *(m_MarkerData + SPcodOFST + 4); }
+
+         void Dump(FILE* stream = 0) const;
+       };
+
+      const int SqcdOFST = 1;
+      const int SPqcdOFST = 2;
+
+      enum QuantizationType_t
+      {
+       QT_NONE,
+       QT_DERIVED,
+       QT_EXP
+      };
+
+      const char* GetQuantizationTypeString(const QuantizationType_t m);
+
+      // Quantization default
+      class QCD
+        {
+         const byte_t* m_MarkerData;
+         ui32_t m_DataSize;
+
+         KM_NO_COPY_CONSTRUCT(QCD);
+         QCD();
+
+       public:
+         QCD(const Marker& M)
+           {
+             assert(M.m_Type == MRK_QCD);
+             m_MarkerData = M.m_Data + 2;
+             m_DataSize = M.m_DataSize - 2;
+           }
+
+         ~QCD() {}
+         inline QuantizationType_t QuantizationType() const { return static_cast<QuantizationType_t>(*(m_MarkerData + SqcdOFST) & 0x03); }
+         inline ui8_t  GuardBits() const { return (*(m_MarkerData + SqcdOFST) & 0xe0) >> 5; }
+         void Dump(FILE* stream = 0) const;
        };
 
       // a comment
@@ -179,10 +214,10 @@ namespace JP2K
 
          ~COM() {}
          
-         inline bool IsText() { return m_IsText; }
-         inline const byte_t* CommentData() { return m_MarkerData; }
-         inline ui32_t CommentSize() { return m_DataSize; }
-         void Dump(FILE* stream = 0);
+         inline bool IsText() const { return m_IsText; }
+         inline const byte_t* CommentData() const { return m_MarkerData; }
+         inline ui32_t CommentSize() const { return m_DataSize; }
+         void Dump(FILE* stream = 0) const;
        };
     } // namespace Accessor
 } // namespace JP2K
index 15e3dbc0de9753ca168675ccd5c7e33fb15d118e..878390508b98779b45ef15f6a2a1f3c62d0d7d22 100755 (executable)
--- a/src/KLV.h
+++ b/src/KLV.h
@@ -146,16 +146,15 @@ inline const char* ui64sz(ui64_t i, char* buf)
       std::map<ASDCP::UL, ui32_t>   m_md_lookup;
       std::map<std::string, ui32_t> m_md_sym_lookup;
       std::map<ui32_t, ASDCP::UL>   m_md_rev_lookup;
-      MDDEntry m_MDD_Table[(ui32_t)ASDCP::MDD_Max];
 
       ASDCP_NO_COPY_CONSTRUCT(Dictionary);
 
     public:
+      MDDEntry m_MDD_Table[(ui32_t)ASDCP::MDD_Max];
+
       Dictionary();
       ~Dictionary();
 
-      //      bool operator==(const Dictionary& rhs) const { return this == &rhs; }
-
       void Init();
       bool AddEntry(const MDDEntry& Entry, ui32_t index);
       bool DeleteEntry(ui32_t index);
@@ -176,6 +175,7 @@ inline const char* ui64sz(ui64_t i, char* buf)
   const Dictionary& DefaultInteropDict();
   const Dictionary& DefaultCompositeDict();
 
+  void default_md_object_init();
 
   //
   class IPrimerLookup
index 99bf92b9eaeb5470da7036d005c250f34ad152ed..c2de8091dff081b5f7afdcbe3a33f64241fceb37 100644 (file)
@@ -39,6 +39,8 @@ if ENABLE_RANDOM_UUID
 AM_CPPFLAGS += -DCONFIG_RANDOM_UUID
 endif
 
+AM_CPPFLAGS += -g
+
 # list of all the header files that should be installed
 include_HEADERS = \
        KM_error.h \
@@ -71,8 +73,6 @@ include_HEADERS += \
        SyncEncoder.h \
        UUIDInformation.h
 
-
-nodist_include_HEADERS = TimedText_Transform.h
 endif
 
 if USE_AS_02
@@ -118,10 +118,6 @@ libasdcp_la_SOURCES = MPEG2_Parser.cpp MPEG.cpp JP2K_Codestream_Parser.cpp \
        UUIDInformation.c UUIDInformation.h
 
 
-if DEV_HEADERS
-nodist_libasdcp_la_SOURCES += TimedText_Transform.h TimedText_Transform.cpp
-endif
-
 libasdcp_la_LDFLAGS = -release @VERSION@
 # additional libraries to link against for a library
 libasdcp_la_LIBADD = libkumu.la
index cc8f13961efd495a0388750c5c3120a4493dc1de..448ef421522660533563b39b5f4d243fade54b2b 100755 (executable)
@@ -35,6 +35,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include <KM_fileio.h>
 #include <AS_DCP.h>
+#include <AS_02.h>
 #include <MXF.h>
 #include <Metadata.h>
 
@@ -630,6 +631,13 @@ show_file_info(CommandOptions& Options)
       FileInfoWrapper<ASDCP::ATMOS::MXFReader, MyAtmosDescriptor> wrapper;
       result = wrapper.file_info(Options, "Dolby ATMOS");
     }
+  else if ( EssenceType == ESS_AS02_PCM_24b_48k
+           || EssenceType == ESS_AS02_PCM_24b_96k
+           || EssenceType == ESS_AS02_JPEG_2000
+           || EssenceType == ESS_AS02_TIMED_TEXT )
+    {
+      fprintf(stderr, "File is AS-02. Inspection in not supported by this command.\n");
+    }
   else
     {
       fprintf(stderr, "File is not AS-DCP: %s\n", Options.filenames.front().c_str());
index 9f57c99b1662a71af9bbef9ade9773e6633222dc..311ea64777f28d5f6780f84b24b95d085bfcabc7 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2005-2010, John Hurst
+Copyright (c) 2005-2014, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -167,6 +167,7 @@ main(int argc, const char** argv)
   Marker        MyMarker;
   CodestreamParser Parser;
   std::list<std::string>::iterator i;
+  bool has_soc = false;
 
   Result_t result = FB.Capacity(1024*1024*4);
   
@@ -181,6 +182,28 @@ main(int argc, const char** argv)
 
          while ( p < end_p && ASDCP_SUCCESS(GetNextMarker(&p, MyMarker)) )
            {
+             if ( MyMarker.m_Type == MRK_SOC )
+               {
+                 if ( has_soc )
+                   {
+                     fprintf(stderr, "Duplicate SOC detected.\n");
+                     result = RESULT_FAIL;
+                     break;
+                   }
+                 else
+                   {
+                     has_soc = true;
+                     continue;
+                   }
+
+                 if  ( ! has_soc )
+                   {
+                     fprintf(stderr, "Markers detected before SOC.\n");
+                     result = RESULT_FAIL;
+                     break;
+                   }
+               }
+
              if ( Options.verbose_flag )
                {
                  MyMarker.Dump(stdout);
@@ -208,7 +231,31 @@ main(int argc, const char** argv)
                  Accessor::COM COM_(MyMarker);
                  COM_.Dump(stdout);
                }
+             else if ( MyMarker.m_Type == MRK_QCD )
+               {
+                 Accessor::QCD QCD_(MyMarker);
+                 QCD_.Dump(stdout);
+               }
+             else
+               {
+                 fprintf(stderr, "Unprocessed marker - %s\n", GetMarkerString(MyMarker.m_Type));
+               }
+           }
+
+         /*
+         while ( p < end_p )
+           {
+             if ( *p == 0xff )
+               {
+                 fprintf(stdout, "0x%02x 0x%02x 0x%02x\n", *(p+1), *(p+2), *(p+3));
+                 p += 4;
+               }
+             else
+               {
+                 ++p;
+               }
            }
+         */
        }
     }