release!
authorjhurst <jhurst@cinecert.com>
Mon, 15 Nov 2010 17:04:13 +0000 (17:04 +0000)
committerjhurst <>
Mon, 15 Nov 2010 17:04:13 +0000 (17:04 +0000)
16 files changed:
README
configure.ac
src/AS_DCP_JP2K.cpp
src/AS_DCP_MPEG2.cpp
src/AS_DCP_PCM.cpp
src/KLV.cpp
src/KLV.h
src/KM_xml.cpp
src/MDD.cpp
src/Makefile.am
src/Metadata.cpp
src/Metadata.h
src/TimedText_Parser.cpp
src/asdcp-test.cpp
src/h__Writer.cpp
src/klvwalk.cpp

diff --git a/README b/README
index 5476fbabbb1096a385f7ca3513b929865795647d..7876ec5744717132594d4bf84d44109848c69386 100755 (executable)
--- a/README
+++ b/README
@@ -112,6 +112,17 @@ utilities all respond to -h.
 
 Change History
 
+2010.11.15 - bug fixes, enhancements x1.7.40
+ o Fixed bug in long KLV packet support (Thanks to Jim R.).
+ o Fixed AvgBps in PCM files, *again*. Sorry for the crazy.
+ o More fixes and changes in support of 25, 30, 50, 60 fps.
+   (Thanks to Hans K. for the TC rate bug).
+ o Updated KLVFill UL version element to 0x02.
+ o Type change to support Xerces-C 3.x. (Thanks to Matt S.).
+ o Some internal API changes to KLV types. Does not affect
+   operation.
+ o Added NetworkLocator type to MXF metadata types.
+ o Added file offset display to klvwalk.
 
 
 2010.09.09 -  bug fixes, enhancements, v1.7.39
index 0d068fab42160abbf230070005565cbd0132cf3e..1ca0adbd28feb56496948c7c439cd9304347b987 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], [1.7.39], [asdcplib@cinecert.com])
+AC_INIT([asdcplib], [1.7.40], [asdcplib@cinecert.com])
 
 AC_CONFIG_AUX_DIR([build-aux])
 AC_CONFIG_SRCDIR([src/KM_error.h])
index 58bc0c93f49d342dfb0a8d7c46bff1be8edd5eba..811ece6eb6a3984bc4cbb35477aae7387172c5d9 100755 (executable)
@@ -842,9 +842,13 @@ lh__Writer::SetSourceStream(const PictureDescriptor& PDesc, const std::string& l
     }
 
   if ( ASDCP_SUCCESS(result) )
+    {
+      ui32_t TCFrameRate = ( m_PDesc.EditRate == EditRate_23_98  ) ? 24 : m_PDesc.EditRate.Numerator;
+
       result = WriteMXFHeader(label, UL(m_Dict->ul(MDD_JPEG_2000Wrapping)),
                              PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
-                             LocalEditRate, 24 /* TCFrameRate */);
+                             LocalEditRate, TCFrameRate);
+    }
 
   return result;
 }
index 58013499c81304e06c4289961b19f90243428bdc..5bd998c6f43261dfe50f237311074ac8fea4ce57 100755 (executable)
@@ -469,9 +469,13 @@ ASDCP::MPEG2::MXFWriter::h__Writer::SetSourceStream(const VideoDescriptor& VDesc
     }
 
   if ( ASDCP_SUCCESS(result) )
+    {
+      ui32_t TCFrameRate = ( m_VDesc.EditRate == EditRate_23_98  ) ? 24 : m_VDesc.EditRate.Numerator;
+
       result = WriteMXFHeader(MPEG_PACKAGE_LABEL, UL(m_Dict->ul(MDD_MPEG2_VESWrapping)), 
                              PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
-                             m_VDesc.EditRate, 24 /* TCFrameRate */);
+                             m_VDesc.EditRate, TCFrameRate);
+    }
 
   return result;
 }
index 4639c932d540bf33e5c15a6a76a582e37ad28dce..635c176ad120aab618c32362b9b3ed34acbd495d 100755 (executable)
@@ -450,7 +450,6 @@ ASDCP::PCM::MXFWriter::h__Writer::SetSourceStream(const AudioDescriptor& ADesc)
 
   assert(m_Dict);
   m_ADesc = ADesc;
-  ui32_t TCFrameRate = ( ADesc.EditRate == EditRate_23_98  ) ? 24 : m_ADesc.EditRate.Numerator;
 
   Result_t result = PCM_ADesc_to_MD(m_ADesc, (WaveAudioDescriptor*)m_EssenceDescriptor);
   
@@ -462,9 +461,13 @@ ASDCP::PCM::MXFWriter::h__Writer::SetSourceStream(const AudioDescriptor& ADesc)
     }
 
   if ( ASDCP_SUCCESS(result) )
+    {
+      ui32_t TCFrameRate = ( m_ADesc.EditRate == EditRate_23_98  ) ? 24 : m_ADesc.EditRate.Numerator;
+      
       result = WriteMXFHeader(PCM_PACKAGE_LABEL, UL(m_Dict->ul(MDD_WAVWrapping)),
                              SOUND_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_SoundDataDef)),
                              m_ADesc.EditRate, TCFrameRate, calc_CBR_frame_size(m_Info, m_ADesc));
+    }
 
   return result;
 }
index a91d32bf9bb900630fcb1730f2b0af94fadad79a..40fb442bce7071db432413c94eb20d296829e4dc 100755 (executable)
@@ -55,6 +55,12 @@ ASDCP::KLVPacket::InitFromBuffer(const byte_t* buf, ui32_t buf_len, const UL& la
   return result;
 }
 
+//
+ASDCP::UL
+ASDCP::KLVPacket::GetUL() {
+  return UL(m_KeyStart);
+}
+
 //
 ASDCP::Result_t
 ASDCP::KLVPacket::InitFromBuffer(const byte_t* buf, ui32_t buf_len)
index 68d5a3cf7b5c36a98e9c427b7f3f37f1927f6711..a79ea91fc6a474edb6ca8ebdf444b7366346c34b 100755 (executable)
--- a/src/KLV.h
+++ b/src/KLV.h
@@ -150,7 +150,7 @@ inline const char* ui64sz(ui64_t i, char* buf)
       Dictionary();
       ~Dictionary();
 
-      bool operator==(const Dictionary& rhs) const { return this == &rhs; }
+      //      bool operator==(const Dictionary& rhs) const { return this == &rhs; }
 
       void Init();
       bool AddEntry(const MDDEntry& Entry, ui32_t index);
@@ -201,6 +201,15 @@ inline const char* ui64sz(ui64_t i, char* buf)
        return m_KLLength + m_ValueLength;
       }
 
+      ui32_t   ValueLength() {
+       return m_ValueLength;
+      }
+
+      ui32_t   KLLength() {
+       return m_KLLength;
+      }
+
+      virtual UL       GetUL();
       virtual bool     HasUL(const byte_t*);
       virtual Result_t InitFromBuffer(const byte_t*, ui32_t);
       virtual Result_t InitFromBuffer(const byte_t*, ui32_t, const UL& label);
index a33d45ce6db15f52a4f089328d320e2aa1244ced..44442d291c13b7209e54034e9d6a0ef0c22813ad 100644 (file)
@@ -660,7 +660,11 @@ Kumu::XercesString_to_UTF_8(const XMLCh* in_str, std::string& out_str)
     {
       while ( str_len > 0 )
        {
-         ui32_t read_count = 0;
+#if XERCES_VERSION_MAJOR < 3
+         ui32_t read_count = 0;
+#else
+         XMLSize_t read_count = 0;
+#endif
          ui32_t write_count = sg_coder->transcodeTo(in_str + read_total, str_len,
                                                     (XMLByte*)sg_coder_buf, sg_coder_buf_len,
                                                     read_count, XMLTranscoder::UnRep_Throw);
@@ -699,7 +703,11 @@ Kumu::UTF_8_to_XercesString(const char* in_str, Kumu::XercesString& out_str)
     {
       while ( str_len > 0 )
        {
-         ui32_t read_count = 0;
+#if XERCES_VERSION_MAJOR < 3
+         ui32_t read_count = 0;
+#else
+         XMLSize_t read_count = 0;
+#endif
          ui32_t write_count = sg_coder->transcodeFrom((const XMLByte*)(in_str + read_total), str_len,
                                                       (XMLCh*)sg_coder_buf, sg_coder_buf_len / sizeof(XMLCh),
                                                       read_count, sg_coder_counts);
index aabd4c90bf133b3f211cc900f643de51b77cede8..aa53e35fb1d968c5e7c398b24b99f9121965ee11 100644 (file)
@@ -98,7 +98,7 @@ static const ASDCP::MDDEntry s_MDD_Table[] = {
   { { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x07, // 20
       0x02, 0x09, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00 },
       {0}, false, "MICAlgorithm_HMAC_SHA1" },
-  { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, // 21
+  { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 21
       0x03, 0x01, 0x02, 0x10, 0x01, 0x00, 0x00, 0x00 },
       {0}, false, "KLVFill" },
   { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, // 22
index 85cb2a613bae112310c03af14fe3f117a64e4edc..72ff91642f37d0e67f35a2c9f8c4504564800cd1 100644 (file)
@@ -83,7 +83,7 @@ libasdcp_la_CPPFLAGS = -DASDCP_PLATFORM=\"@host@\"
 
 # Python extension
 if PYTHON_USE
-lib_LTLIBRARIES += libpyasdcp.la
+lib_LTLIBRARIES += libpyasdcp.la libnapali.la
 
 nodist_libpyasdcp_la_SOURCES = \
        kumu_python.cpp kumu_python.h \
@@ -92,16 +92,21 @@ nodist_libpyasdcp_la_SOURCES = \
        asdcp_python_misc.cpp asdcp_python_writerinfo.h \
        asdcp_wrappers.h asdcp_python_mxf.cpp asdcp_python_mxf_text.cpp
 
-# asdcp_python_reader.cpp asdcp_python_writer.cpp
+nodist_libnapali_la_SOURCES = \
+       napali_python.cpp napali_python.h
 
 libpyasdcp_la_CPPFLAGS = @PYTHON_CPPFLAGS@
 libpyasdcp_la_LDFLAGS = @PYTHON_LSPEC@  -release @VERSION@
 libpyasdcp_la_LIBADD = libkumu.la libasdcp.la
 
+libnapali_la_CPPFLAGS = @PYTHON_CPPFLAGS@
+libnapali_la_LDFLAGS = @PYTHON_LSPEC@  -release @VERSION@
+libnapali_la_LIBADD = libkumu.la libasdcp.la
+
 pyexecdir = @PYTHON_EXECDIR@
 pyexec_includedir = $(PYTHON_PREFIX)/include/python$(PYTHON_SHORTVERSION)
-nodist_pyexec_include_HEADERS = kumu_python.h asdcp_python.h asdcp_wrappers.h
-pyexec_LTLIBRARIES = kumu.la asdcp.la
+nodist_pyexec_include_HEADERS = kumu_python.h asdcp_python.h napali_python.h asdcp_wrappers.h
+pyexec_LTLIBRARIES = kumu.la asdcp.la napali.la
 
 nodist_kumu_la_SOURCES = pykumu.cpp kumu_python.h
 kumu_la_CPPFLAGS = @PYTHON_CPPFLAGS@
@@ -112,6 +117,11 @@ nodist_asdcp_la_SOURCES = pyasdcp.cpp kumu_python.h asdcp_python.h asdcp_wrapper
 asdcp_la_CPPFLAGS = @PYTHON_CPPFLAGS@
 asdcp_la_LDFLAGS = @PYTHON_LSPEC@ -avoid-version -module
 asdcp_la_LIBADD = libpyasdcp.la
+
+nodist_napali_la_SOURCES = pynapali.cpp kumu_python.h napali_python.h
+napali_la_CPPFLAGS = @PYTHON_CPPFLAGS@
+napali_la_LDFLAGS = @PYTHON_LSPEC@ -avoid-version -module
+napali_la_LIBADD = libnapali.la libpyasdcp.la
 endif
 
 # list of programs to be built and installed
index fccf5a676aeb3d68d0aeef080c2055377bc3daba..aeedbde87cde8bc1dc2ffb7b694558eda1e4a5b6 100755 (executable)
@@ -68,6 +68,7 @@ static InterchangeObject* GenericDataEssenceDescriptor_Factory(const Dictionary*
 static InterchangeObject* TimedTextDescriptor_Factory(const Dictionary*& Dict) { return new TimedTextDescriptor(Dict); }
 static InterchangeObject* TimedTextResourceSubDescriptor_Factory(const Dictionary*& Dict) { return new TimedTextResourceSubDescriptor(Dict); }
 static InterchangeObject* StereoscopicPictureSubDescriptor_Factory(const Dictionary*& Dict) { return new StereoscopicPictureSubDescriptor(Dict); }
+static InterchangeObject* NetworkLocator_Factory(const Dictionary*& Dict) { return new NetworkLocator(Dict); }
 
 
 void
@@ -102,6 +103,7 @@ ASDCP::MXF::Metadata_InitTypes(const Dictionary*& Dict)
   SetObjectFactory(Dict->ul(MDD_TimedTextDescriptor), TimedTextDescriptor_Factory);
   SetObjectFactory(Dict->ul(MDD_TimedTextResourceSubDescriptor), TimedTextResourceSubDescriptor_Factory);
   SetObjectFactory(Dict->ul(MDD_StereoscopicPictureSubDescriptor), StereoscopicPictureSubDescriptor_Factory);
+  SetObjectFactory(Dict->ul(MDD_NetworkLocator), NetworkLocator_Factory);
 }
 
 //------------------------------------------------------------------------------------------
@@ -1849,6 +1851,61 @@ StereoscopicPictureSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
   return InterchangeObject::WriteToBuffer(Buffer);
 }
 
+//------------------------------------------------------------------------------------------
+// NetworkLocator
+
+//
+ASDCP::Result_t
+NetworkLocator::InitFromTLVSet(TLVReader& TLVSet)
+{
+  assert(m_Dict);
+  Result_t result = InterchangeObject::InitFromTLVSet(TLVSet);
+  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(NetworkLocator, URLString));
+  return result;
+}
+
+//
+ASDCP::Result_t
+NetworkLocator::WriteToTLVSet(TLVWriter& TLVSet)
+{
+  assert(m_Dict);
+  Result_t result = InterchangeObject::WriteToTLVSet(TLVSet);
+  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(NetworkLocator, URLString));
+  return result;
+}
+
+//
+void
+NetworkLocator::Dump(FILE* stream)
+{
+  char identbuf[IdentBufferLen];
+  *identbuf = 0;
+
+  if ( stream == 0 )
+    stream = stderr;
+
+  InterchangeObject::Dump(stream);
+  fprintf(stream, "  %22s = %s\n",  "URLString", URLString.EncodeString(identbuf, IdentBufferLen));
+}
+
+//
+ASDCP::Result_t
+NetworkLocator::InitFromBuffer(const byte_t* p, ui32_t l)
+{
+  assert(m_Dict);
+  m_Typeinfo = &(m_Dict->Type(MDD_NetworkLocator));
+  return InterchangeObject::InitFromBuffer(p, l);
+}
+
+//
+ASDCP::Result_t
+NetworkLocator::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
+{
+  assert(m_Dict);
+  m_Typeinfo = &(m_Dict->Type(MDD_NetworkLocator));
+  return InterchangeObject::WriteToBuffer(Buffer);
+}
+
 //
 // end Metadata.cpp
 //
index 4c83034c1a68275407ce2c95d4c998407c8df90f..891d155119a0735cae026f3a62b98815b439d229 100755 (executable)
@@ -683,6 +683,26 @@ namespace ASDCP
          virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
        };
 
+      //
+      class NetworkLocator : public InterchangeObject
+       {
+         ASDCP_NO_COPY_CONSTRUCT(NetworkLocator);
+         NetworkLocator();
+
+       public:
+         const Dictionary*& m_Dict;
+          UTF16String URLString;
+
+  NetworkLocator(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {}
+         virtual ~NetworkLocator() {}
+          virtual const char* HasName() { return "NetworkLocator"; }
+          virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
+          virtual Result_t WriteToTLVSet(TLVWriter& TLVSet);
+         virtual void     Dump(FILE* = 0);
+         virtual Result_t InitFromBuffer(const byte_t* p, ui32_t l);
+         virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
+       };
+
     } // namespace MXF
 } // namespace ASDCP
 
index 397fd517aeef8ab4cf1d571bdde99d9de3d48e5e..191a3535d5198d66e1f14b8931c1eee8cc74ea44 100644 (file)
@@ -233,9 +233,16 @@ ASDCP::TimedText::DCSubtitleParser::h__SubtitleParser::OpenRead()
 
   m_TDesc.EditRate = decode_rational(EditRate->GetBody().c_str());
 
-  if ( m_TDesc.EditRate != EditRate_24 && m_TDesc.EditRate != EditRate_48 )
+  if ( m_TDesc.EditRate != EditRate_23_98
+       && m_TDesc.EditRate != EditRate_24
+       && m_TDesc.EditRate != EditRate_25
+       && m_TDesc.EditRate != EditRate_30
+       && m_TDesc.EditRate != EditRate_48
+       && m_TDesc.EditRate != EditRate_50
+       && m_TDesc.EditRate != EditRate_60 )
     {
-      DefaultLogSink(). Error("EditRate must be 24/1 or 48/1\n");
+      DefaultLogSink(). Error("Unexpected EditRate: %d/%d\n",
+                             m_TDesc.EditRate.Numerator, m_TDesc.EditRate.Denominator);
       return RESULT_FORMAT;
     }
 
@@ -296,11 +303,11 @@ ASDCP::TimedText::DCSubtitleParser::h__SubtitleParser::OpenRead()
       return RESULT_FORMAT;
     }
 
-  // assumes 24/1 or 48/1 as constrained above
-  assert(m_TDesc.EditRate.Denominator == 1);
+  // assumes edit rate is constrained above
+  ui32_t TCFrameRate = ( m_TDesc.EditRate == EditRate_23_98  ) ? 24 : m_TDesc.EditRate.Numerator;
 
   S12MTimecode beginTC;
-  beginTC.SetFPS(m_TDesc.EditRate.Numerator);
+  beginTC.SetFPS(TCFrameRate);
   XMLElement* StartTime = m_Root.GetChildWithName("StartTime");
 
   if ( StartTime != 0 )
@@ -308,7 +315,7 @@ ASDCP::TimedText::DCSubtitleParser::h__SubtitleParser::OpenRead()
 
   for ( ei = InstanceList.begin(); ei != InstanceList.end(); ei++ )
     {
-      S12MTimecode tmpTC((*ei)->GetAttrWithName("TimeOut"), m_TDesc.EditRate.Numerator);
+      S12MTimecode tmpTC((*ei)->GetAttrWithName("TimeOut"), TCFrameRate);
       if ( end_count < tmpTC.GetFrames() )
        end_count = tmpTC.GetFrames();
     }
index 8b72ebc80adb50df455734147de65c4f46ba5d3d..d57192231d646cc76ad27c43d0f6d23a929b8544 100755 (executable)
@@ -176,7 +176,7 @@ Read/Write Options:\n\
                       is no label (valid for Interop only).\n\
   -L                - Write SMPTE UL values instead of MXF Interop\n\
   -p <rate>         - fps of picture when wrapping PCM or JP2K:\n\
-                      Use one of [23|24|48], 24 is default\n\
+                      Use one of [23|24|25|30|48|50|60], 24 is default\n\
   -R                - Repeat the first frame over the entire file (picture\n\
                       essence only, requires -c, -d)\n\
   -S                - Split Wave essence to stereo WAV files during extract.\n\
@@ -286,6 +286,7 @@ public:
   Rational PictureRate()
   {
     if ( picture_rate == 23 ) return EditRate_23_98;
+    if ( picture_rate == 24 ) return EditRate_24;
     if ( picture_rate == 25 ) return EditRate_25;
     if ( picture_rate == 30 ) return EditRate_30;
     if ( picture_rate == 48 ) return EditRate_48;
@@ -298,6 +299,7 @@ public:
   const char* szPictureRate()
   {
     if ( picture_rate == 23 ) return "23.976";
+    if ( picture_rate == 24 ) return "24";
     if ( picture_rate == 25 ) return "25";
     if ( picture_rate == 30 ) return "30";
     if ( picture_rate == 48 ) return "48";
@@ -1356,6 +1358,7 @@ read_PCM_file(CommandOptions& Options)
       if ( ADesc.EditRate != EditRate_23_98
           && ADesc.EditRate != EditRate_24
           && ADesc.EditRate != EditRate_25
+          && ADesc.EditRate != EditRate_30
           && ADesc.EditRate != EditRate_48
           && ADesc.EditRate != EditRate_50
           && ADesc.EditRate != EditRate_60 )
index 2882e33b2525c6931b935247496b7aac886a52da..db263bb5be59c8e4ed12dd4506e8a7ce27650747 100755 (executable)
@@ -548,6 +548,9 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte
            {
              BER_length = Kumu::get_BER_length_for_value(ETLength);
 
+             // the packet is longer by the difference in expected vs. actual BER length
+             ETLength += BER_length - MXF_BER_LENGTH;
+
              if ( BER_length == 0 )
                result = RESULT_KLV_CODING;
            }
index 671506047f95e0d9b37a74222b822c20168a9172..92e7a3fbc5fd6877e301e85b6c6061bc032cb7d6 100755 (executable)
@@ -245,7 +245,8 @@ main(int argc, const char** argv)
        {
          Kumu::FileReader Reader;
          KLVFilePacket KP;
-         
+         ui64_t pos = 0;
+
          result = Reader.OpenRead((*fi).c_str());
          
          if ( ASDCP_SUCCESS(result) )
@@ -253,7 +254,9 @@ main(int argc, const char** argv)
          
          while ( ASDCP_SUCCESS(result) )
            {
+             fprintf(stdout, "@0x%08qx: ", pos);
              KP.Dump(stdout, DefaultCompositeDict(), true);
+             pos = Reader.Tell();
              result = KP.InitFromFile(Reader);
            }