Add another OpenReadFrame method for JP2K::CodestreamParser.
authorCarl Hetherington <cth@carlh.net>
Thu, 14 Jan 2016 20:03:15 +0000 (20:03 +0000)
committerCarl Hetherington <cth@carlh.net>
Thu, 14 Jan 2016 23:02:44 +0000 (23:02 +0000)
src/AS_DCP.h
src/JP2K_Codestream_Parser.cpp

index 9e9702fcd56b5eeca50461a64a03f7ba517f09e5..138badd96bda5b317040d9224f2dcbef5df534d0 100755 (executable)
@@ -204,7 +204,7 @@ namespace ASDCP {
   enum EssenceType_t {
     ESS_UNKNOWN,              // the file is not a supported AS-DCP of AS-02 essence container
 
-    // 
+    //
     ESS_MPEG2_VES,            // the file contains an MPEG-2 video elementary stream
 
     // d-cinema essence types
@@ -1142,6 +1142,8 @@ namespace ASDCP {
          // encrypted headers.
          Result_t OpenReadFrame(const std::string& filename, FrameBuffer&) const;
 
+         Result_t OpenReadFrame(const unsigned char * data, unsigned int size, FrameBuffer&) const;
+
          // Fill a PictureDescriptor struct with the values from the file's codestream.
          // Returns RESULT_INIT if the file is not open.
          Result_t FillPictureDescriptor(PictureDescriptor&) const;
index 2f2d319ffef0b8c3765e4e392262e5793ecac8f8..d904e6bb74432a05c82786e35d9ed93724a0526e 100755 (executable)
@@ -90,6 +90,26 @@ public:
 
     return result;
   }
+
+  Result_t OpenReadFrame(const unsigned char * data, unsigned int size, FrameBuffer& FB)
+  {
+    if ( FB.Capacity() < size )
+      {
+        DefaultLogSink().Error("FrameBuf.Capacity: %u frame length: %u\n", FB.Capacity(), (ui32_t) size);
+        return RESULT_SMALLBUF;
+      }
+
+    memcpy (FB.Data(), data, size);
+    FB.Size(size);
+
+    byte_t start_of_data = 0; // out param
+    const Result_t result = ParseMetadataIntoDesc(FB, m_PDesc, &start_of_data);
+
+    if ( ASDCP_SUCCESS(result) )
+      FB.PlaintextOffset(start_of_data);
+
+    return result;
+  }
 };
 
 ASDCP::Result_t
@@ -142,7 +162,7 @@ ASDCP::JP2K::ParseMetadataIntoDesc(const FrameBuffer& FB, PictureDescriptor& PDe
                DefaultLogSink().Error("Unexpected number of components: %u\n", PDesc.Csize);
                return RESULT_RAW_FORMAT;
              }
-           
+
            for ( i = 0; i < PDesc.Csize; i++ )
              SIZ_.ReadComponent(i, PDesc.ImageComponents[i]);
          }
@@ -156,7 +176,7 @@ ASDCP::JP2K::ParseMetadataIntoDesc(const FrameBuffer& FB, PictureDescriptor& PDe
              DefaultLogSink().Error("Unexpectedly large CodingStyle data: %u\n", NextMarker.m_DataSize);
              return RESULT_RAW_FORMAT;
            }
-         
+
          memcpy(&PDesc.CodingStyleDefault, NextMarker.m_Data, NextMarker.m_DataSize);
          break;
 
@@ -168,7 +188,7 @@ ASDCP::JP2K::ParseMetadataIntoDesc(const FrameBuffer& FB, PictureDescriptor& PDe
              DefaultLogSink().Error("No quantization signaled. QCD size=%s.\n", NextMarker.m_DataSize);
              return RESULT_RAW_FORMAT;
            }
-         
+
          if ( NextMarker.m_DataSize > MaxDefaults )
            {
              DefaultLogSink().Error("Quantization Default length exceeds maximum %d\n", NextMarker.m_DataSize);
@@ -206,6 +226,15 @@ ASDCP::JP2K::CodestreamParser::OpenReadFrame(const std::string& filename, FrameB
   return m_Parser->OpenReadFrame(filename, FB);
 }
 
+// Opens the stream for reading, parses enough data to provide a complete
+// set of stream metadata for the MXFWriter below.
+ASDCP::Result_t
+ASDCP::JP2K::CodestreamParser::OpenReadFrame(const unsigned char* data, unsigned int size, FrameBuffer& FB) const
+{
+  const_cast<ASDCP::JP2K::CodestreamParser*>(this)->m_Parser = new h__CodestreamParser;
+  return m_Parser->OpenReadFrame(data, size, FB);
+}
+
 //
 ASDCP::Result_t
 ASDCP::JP2K::CodestreamParser::FillPictureDescriptor(PictureDescriptor& PDesc) const