broken build, adding write
authorjhurst <jhurst@cinecert.com>
Fri, 6 Jan 2006 08:17:23 +0000 (08:17 +0000)
committerjhurst <>
Fri, 6 Jan 2006 08:17:23 +0000 (08:17 +0000)
FileIO.h
README
src/AS_DCP_AES.cpp
src/AS_DCP_MPEG2.cpp
src/AS_DCP_internal.h
src/asdcp-test.cpp
src/h__Writer.cpp

index a833803d7565b2bf7ae2e1e917ed296e19c4e10b..159d0a38a5e3c9de0a8ab5ffee6c3f091c2d79a5 100755 (executable)
--- a/FileIO.h
+++ b/FileIO.h
@@ -121,7 +121,7 @@ namespace ASDCP {
       // platforms that support it. For each call to Writev(const byte_t*, ui32_t, ui32_t*),
       // the given buffer is added to an internal iovec struct. All items on the list
       // are written to disk by a call to Writev();
-      Result_t Writev(const byte_t*, ui32_t);                       // queue buffer for "gather" write
+      Result_t Writev(const byte_t*, ui32_t);                       // queue buffer for write
       Result_t Writev(ui32_t* = 0);                                 // write all queued buffers
 
       // if you call this while there are unwritten items on the iovec list,
diff --git a/README b/README
index 9646440b813d8cbac350537c488e8221c8a4cfab..6b248f041e98ddad5db62204484e5424d5a61786 100755 (executable)
--- a/README
+++ b/README
@@ -83,11 +83,6 @@ drwxr-xr-x   56 jhurst   None         0 Feb  2 16:35 openssl
 I have tested this build on win32, Linux and Darwin platforms.
 Others may work as well.
 
-If you do not want to use or do not have OpenSSL, invoke
-make with ASDCP_WITHOUT_OPENSSL defined:
-  make ASDCP_WITHOUT_OPENSSL=1
-
 
 Build Versions
 
@@ -118,6 +113,10 @@ examples. More detailed documentation will be written RSN.
 
 
 Change History
+2006.01.04 - full read-write
+ o Removed ASDCP_WITHOUT_OPENSSL compile-time option.
+
+
 2005.00.00 - A New Hope
  o The temporary mxf-lite has been removed. MXF files are now 
    managed via the objects in KLV.h, MXFTypes.h MXF.h and
index 3d3656653c82f89be794723247529b97bbc63393..e21dba10bd2b963c07266acf5b051adf17a32e4b 100755 (executable)
@@ -37,7 +37,6 @@ using namespace ASDCP;
 const int KEY_SIZE_BITS = 128;
 
 
-#ifndef ASDCP_WITHOUT_OPENSSL
 #include <openssl/aes.h>
 #include <openssl/sha.h>
 #include <openssl/err.h>
@@ -50,16 +49,9 @@ print_ssl_error()
   DefaultLogSink().Error("OpenSSL: %s\n", ERR_error_string(errval, err_buf));
 }
 
-#endif
-
-
 //------------------------------------------------------------------------------------------
 
-#ifdef ASDCP_WITHOUT_OPENSSL
-class ASDCP::AESEncContext::h__AESContext
-#else
 class ASDCP::AESEncContext::h__AESContext : public AES_KEY
-#endif
 {
 public:
   byte_t m_IVec[CBC_BLOCK_SIZE];
@@ -79,7 +71,6 @@ ASDCP::AESEncContext::InitKey(const byte_t* key)
   if ( m_Context )
     return RESULT_INIT;
 
-#ifndef ASDCP_WITHOUT_OPENSSL
   m_Context = new h__AESContext;
 
   if ( AES_set_encrypt_key(key, KEY_SIZE_BITS, m_Context) )
@@ -89,9 +80,6 @@ ASDCP::AESEncContext::InitKey(const byte_t* key)
     }
 
   return RESULT_OK;
-#else // ASDCP_WITHOUT_OPENSSL
-  return RESULT_FAIL;
-#endif // ASDCP_WITHOUT_OPENSSL
 }
 
 
@@ -106,12 +94,8 @@ ASDCP::AESEncContext::SetIVec(const byte_t* i_vec)
   if ( ! m_Context )
     return  RESULT_INIT;
 
-#ifndef ASDCP_WITHOUT_OPENSSL
   memcpy(m_Context->m_IVec, i_vec, CBC_BLOCK_SIZE);
   return RESULT_OK;
-#else // ASDCP_WITHOUT_OPENSSL
-  return RESULT_FAIL;
-#endif // ASDCP_WITHOUT_OPENSSL
 }
 
 
@@ -125,12 +109,8 @@ ASDCP::AESEncContext::GetIVec(byte_t* i_vec) const
   if ( ! m_Context )
     return  RESULT_INIT;
 
-#ifndef ASDCP_WITHOUT_OPENSSL
   memcpy(i_vec, m_Context->m_IVec, CBC_BLOCK_SIZE);
   return RESULT_OK;
-#else // ASDCP_WITHOUT_OPENSSL
-  return RESULT_FAIL;
-#endif // ASDCP_WITHOUT_OPENSSL
 }
 
 
@@ -147,7 +127,6 @@ ASDCP::AESEncContext::EncryptBlock(const byte_t* pt_buf, byte_t* ct_buf, ui32_t
   if ( m_Context.empty() )
     return  RESULT_INIT;
 
-#ifndef ASDCP_WITHOUT_OPENSSL
   h__AESContext* Ctx = m_Context;
   byte_t tmp_buf[CBC_BLOCK_SIZE];
   const byte_t* in_p = pt_buf;
@@ -168,19 +147,12 @@ ASDCP::AESEncContext::EncryptBlock(const byte_t* pt_buf, byte_t* ct_buf, ui32_t
     }
 
   return RESULT_OK;
-#else // ASDCP_WITHOUT_OPENSSL
-  return RESULT_FAIL;
-#endif // ASDCP_WITHOUT_OPENSSL
 }
 
 
 //------------------------------------------------------------------------------------------
 
-#ifdef ASDCP_WITHOUT_OPENSSL
-class ASDCP::AESDecContext::h__AESContext
-#else
 class ASDCP::AESDecContext::h__AESContext : public AES_KEY
-#endif
 {
 public:
   byte_t m_IVec[CBC_BLOCK_SIZE];
@@ -200,7 +172,6 @@ ASDCP::AESDecContext::InitKey(const byte_t* key)
   if ( m_Context )
     return  RESULT_INIT;
 
-#ifndef ASDCP_WITHOUT_OPENSSL
   m_Context = new h__AESContext;
 
   if ( AES_set_decrypt_key(key, KEY_SIZE_BITS, m_Context) )
@@ -210,9 +181,6 @@ ASDCP::AESDecContext::InitKey(const byte_t* key)
     }
 
   return RESULT_OK;
-#else // ASDCP_WITHOUT_OPENSSL
-  return RESULT_FAIL;
-#endif // ASDCP_WITHOUT_OPENSSL
 }
 
 // Initializes 16 byte CBC Initialization Vector. This operation may be performed
@@ -226,12 +194,8 @@ ASDCP::AESDecContext::SetIVec(const byte_t* i_vec)
   if ( ! m_Context )
     return  RESULT_INIT;
 
-#ifndef ASDCP_WITHOUT_OPENSSL
   memcpy(m_Context->m_IVec, i_vec, CBC_BLOCK_SIZE);
   return RESULT_OK;
-#else // ASDCP_WITHOUT_OPENSSL
-  return RESULT_FAIL;
-#endif // ASDCP_WITHOUT_OPENSSL
 }
 
 // Decrypt a 16 byte block of data.
@@ -247,7 +211,6 @@ ASDCP::AESDecContext::DecryptBlock(const byte_t* ct_buf, byte_t* pt_buf, ui32_t
   if ( m_Context.empty() )
     return  RESULT_INIT;
 
-#ifndef ASDCP_WITHOUT_OPENSSL
   register h__AESContext* Ctx = m_Context;
 
   const byte_t* in_p = ct_buf;
@@ -268,9 +231,6 @@ ASDCP::AESDecContext::DecryptBlock(const byte_t* ct_buf, byte_t* pt_buf, ui32_t
     }
 
   return RESULT_OK;
-#else // ASDCP_WITHOUT_OPENSSL
-  return RESULT_FAIL;
-#endif // ASDCP_WITHOUT_OPENSSL
 }
 
 //------------------------------------------------------------------------------------------
@@ -284,9 +244,7 @@ static byte_t opad[KeyLen] = { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
 
 class HMACContext::h__HMACContext
 {
-#ifndef ASDCP_WITHOUT_OPENSSL
   SHA_CTX m_SHA;
-#endif // ASDCP_WITHOUT_OPENSSL
   byte_t m_key[KeyLen];
   ASDCP_NO_COPY_CONSTRUCT(h__HMACContext);
 
@@ -302,7 +260,6 @@ public:
   {
     static byte_t key_nonce[KeyLen] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 
                                        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
-#ifndef ASDCP_WITHOUT_OPENSSL
     byte_t sha_buf[SHA_DIGEST_LENGTH];
 
     // 7.10: MICKey = trunc( SHA1 ( key, key_nonce ) )
@@ -314,13 +271,11 @@ public:
     memcpy(m_key, sha_buf, KeyLen);
 
     Reset();
-#endif // ASDCP_WITHOUT_OPENSSL
   }
 
   void
   Reset()
   {
-#ifndef ASDCP_WITHOUT_OPENSSL
     byte_t xor_buf[KeyLen];
     memset(sha_value, 0, HMAC_SIZE);
     m_Final = false;
@@ -332,25 +287,21 @@ public:
       xor_buf[i] = m_key[i] ^ ipad[i];
 
     SHA1_Update(&m_SHA, xor_buf, KeyLen);
-#endif // ASDCP_WITHOUT_OPENSSL
   }
 
   //
   void
   Update(const byte_t* buf, ui32_t buf_len)
   {
-#ifndef ASDCP_WITHOUT_OPENSSL
     // H(K XOR opad, H(K XOR ipad, text))
     //                             ^^^^
     SHA1_Update(&m_SHA, buf, buf_len);
-#endif // ASDCP_WITHOUT_OPENSSL
   }
 
   //
   void
   Finalize()
   {
-#ifndef ASDCP_WITHOUT_OPENSSL
     // H(K XOR opad, H(K XOR ipad, text))
     // ^^^^^^^^^^^^^^^
     SHA1_Final(sha_value, &m_SHA);
@@ -368,7 +319,6 @@ public:
 
     SHA1_Final(sha_value, &SHA);
     m_Final = true;
-#endif // ASDCP_WITHOUT_OPENSSL
   }
 };
 
index 103cd44938a7279844ea774d063cd0e9c514265b..51fd80222df6de183f612f6197c292a8f1691ff8 100755 (executable)
@@ -64,6 +64,14 @@ ASDCP::MD_to_MPEG2_VDesc(MXF::MPEG2VideoDescriptor* VDescObj, MPEG2::VideoDescri
 }
 
 
+//
+ASDCP::Result_t
+ASDCP::MPEG2_VDesc_to_MD(MPEG2::VideoDescriptor&, MXF::MPEG2VideoDescriptor*)
+{
+  return RESULT_OK;
+}
+
+
 //
 void
 ASDCP::MPEG2::VideoDescriptorDump(const VideoDescriptor& VDesc, FILE* stream)
@@ -350,8 +358,6 @@ ASDCP::MPEG2::MXFReader::DumpIndex(FILE* stream) const
 
 
 //------------------------------------------------------------------------------------------
-#if 0
-
 
 //
 class ASDCP::MPEG2::MXFWriter::h__Writer : public ASDCP::h__Writer
@@ -380,13 +386,11 @@ ASDCP::MPEG2::MXFWriter::h__Writer::OpenWrite(const char* filename, ui32_t Heade
   if ( ! m_State.Test_BEGIN() )
     return RESULT_STATE;
 
-  m_File = new MXFFile;
-
-  Result_t result = m_File->OpenWrite(filename);
+  Result_t result = m_File.OpenWrite(filename);
 
   if ( ASDCP_SUCCESS(result) )
     {
-      m_EssenceDescriptor = new MDObject("MPEG2VideoDescriptor");
+      //      m_EssenceDescriptor = new MDObject("MPEG2VideoDescriptor");
       result = m_State.Goto_INIT();
     }
 
@@ -401,7 +405,7 @@ ASDCP::MPEG2::MXFWriter::h__Writer::SetSourceStream(const VideoDescriptor& VDesc
     return RESULT_STATE;
 
   m_VDesc = VDesc;
-  Result_t result = MPEG2_VDesc_to_MD(m_VDesc, *m_EssenceDescriptor);
+  Result_t result = RESULT_OK; // MPEG2_VDesc_to_MD(m_VDesc, *m_EssenceDescriptor);
 
   if ( ASDCP_SUCCESS(result) )
     result = WriteMXFHeader(ESS_MPEG2_VES, m_VDesc.EditRate, 24 /* TCFrameRate */);
@@ -454,9 +458,11 @@ ASDCP::MPEG2::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESE
     }
 
   // update the index manager
+#if 0
   m_IndexMan->OfferEditUnit(0, m_FramesWritten, m_GOPOffset, Flags);
   m_IndexMan->OfferTemporalOffset(m_FramesWritten, m_GOPOffset - FrameBuf.TemporalOffset());
   m_IndexMan->OfferOffset(0, m_FramesWritten, ThisOffset);
+#endif
 
   m_FramesWritten++;
   m_GOPOffset++;
@@ -473,9 +479,6 @@ ASDCP::MPEG2::MXFWriter::h__Writer::Finalize()
   if ( ! m_State.Test_RUNNING() )
     return RESULT_STATE;
 
-  if ( ! m_File )
-    return RESULT_INIT;
-
   m_State.Goto_FINAL();
 
   return WriteMXFFooter(ESS_MPEG2_VES);
@@ -540,7 +543,7 @@ ASDCP::MPEG2::MXFWriter::Finalize()
 
   return m_Writer->Finalize();
 }
-#endif
+
 
 //
 // end AS_DCP_MPEG2.cpp
index 473a4ab835cd98e23c32326f6cbfe989e592a0bd..c903698025abe7c16e970f35b6d267fdee6a025e 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2005, John Hurst
+Copyright (c) 2004-2006, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -164,25 +164,15 @@ namespace ASDCP
   //------------------------------------------------------------------------------------------
   //
 
-  //  MDObject* GetMDObjectByPath(MDObject&, const std::string);
-  //  MDObject* GetMDObjectByType(MDObject&, const std::string);
-  //  void DumpMDObject(MDObject&, std::string = " ", FILE* = 0);
-  //  void DumpHeader(Partition&, FILE* = 0);
-  //  void DumpIndexTable(IndexTablePtr, ui64_t = 0, FILE* = 0);
-  //  Result_t init_mxf_types();
   Result_t MD_to_MPEG2_VDesc(MXF::MPEG2VideoDescriptor*, MPEG2::VideoDescriptor&);
   Result_t MD_to_JP2K_PDesc(MXF::RGBAEssenceDescriptor*, JP2K::PictureDescriptor&);
   Result_t MD_to_PCM_ADesc(MXF::WaveAudioDescriptor*, PCM::AudioDescriptor&);
   Result_t MD_to_WriterInfo(MXF::Identification*, WriterInfo&);
   Result_t MD_to_CryptoInfo(MXF::CryptographicContext*, WriterInfo&);
-
-#if 0
-  Result_t MPEG2_VDesc_to_MD(MPEG2::VideoDescriptor&, MDObject&);
-  Result_t JP2K_PDesc_to_MD(JP2K::PictureDescriptor&, MDObject&);
-  Result_t PCM_ADesc_to_MD(PCM::AudioDescriptor&, MDObject&);
-  void AddDMScrypt(PackagePtr, WriterInfo&, const byte_t*);
-#endif
-
+  Result_t MPEG2_VDesc_to_MD(MPEG2::VideoDescriptor&, MXF::MPEG2VideoDescriptor*);
+  Result_t JP2K_PDesc_to_MD(JP2K::PictureDescriptor&, MXF::RGBAEssenceDescriptor*);
+  Result_t PCM_ADesc_to_MD(PCM::AudioDescriptor&, MXF::WaveAudioDescriptor*);
+  //  void AddDMScrypt(PackagePtr, WriterInfo&, const byte_t*);
   Result_t EncryptFrameBuffer(const ASDCP::FrameBuffer&, ASDCP::FrameBuffer&, AESEncContext*);
   Result_t DecryptFrameBuffer(const ASDCP::FrameBuffer&, ASDCP::FrameBuffer&, AESDecContext*);
 
@@ -212,9 +202,7 @@ namespace ASDCP
 
       h__Reader();
       virtual ~h__Reader();
-      //
-      //      MDObject* GetMDObjectByType(const std::string ObjName);
-      //      MDObject* GetMDObjectByPath(const std::string ObjPath);
+
       Result_t InitInfo(WriterInfo& Info);
       Result_t OpenMXFRead(const char* filename);
       Result_t InitMXFIndex();
@@ -223,6 +211,93 @@ namespace ASDCP
       void     Close();
     };
 
+
+  // state machine for mxf writer
+  enum WriterState_t {
+    ST_BEGIN,   // waiting for Open()
+    ST_INIT,    // waiting for SetSourceStream()
+    ST_READY,   // ready to write frames
+    ST_RUNNING, // one or more frames written
+    ST_FINAL,   // index written, file closed
+  };
+
+  // implementation of h__WriterState class Goto_* methods
+#define Goto_body(s1,s2) if ( m_State != (s1) ) \
+                           return RESULT_STATE; \
+                         m_State = (s2); \
+                         return RESULT_OK
+  //
+  class h__WriterState
+    {
+      ASDCP_NO_COPY_CONSTRUCT(h__WriterState);
+
+    public:
+      WriterState_t m_State;
+      h__WriterState() : m_State(ST_BEGIN) {}
+      ~h__WriterState() {}
+
+      inline bool     Test_BEGIN()   { return m_State == ST_BEGIN; }
+      inline bool     Test_INIT()    { return m_State == ST_INIT; }
+      inline bool     Test_READY()   { return m_State == ST_READY;}
+      inline bool     Test_RUNNING() { return m_State == ST_RUNNING; }
+      inline bool     Test_FINAL()   { return m_State == ST_FINAL; }
+      inline Result_t Goto_INIT()    { Goto_body(ST_BEGIN,   ST_INIT); }
+      inline Result_t Goto_READY()   { Goto_body(ST_INIT,    ST_READY); }
+      inline Result_t Goto_RUNNING() { Goto_body(ST_READY,   ST_RUNNING); }
+      inline Result_t Goto_FINAL()   { Goto_body(ST_RUNNING, ST_FINAL); }
+    };
+
+  //
+  class h__Writer
+    {
+      ASDCP_NO_COPY_CONSTRUCT(h__Writer);
+
+    public:
+      FileWriter         m_File;
+      OPAtomHeader       m_HeaderPart;
+      Partition          m_BodyPart;
+      OPAtomIndexFooter  m_FooterPart;
+
+#if 0
+      ui64_t             m_EssenceStart;
+      WriterInfo         m_Info;
+      ASDCP::FrameBuffer m_CtFrameBuf;
+
+      mem_ptr<MXFFile> m_File;
+      mem_ptr<Metadata>     m_Metadata;
+      mem_ptr<Package>      m_FilePackage;
+      mem_ptr<Partition>    m_HeaderPart;
+      mem_ptr<MDObject>     m_EssenceDescriptor;
+      mem_ptr<Package>      m_MaterialPackage;
+      mem_ptr<Track>        m_MPTrack;                 //! Material Package track for each essence stream
+      mem_ptr<Track>        m_FPTrack;                 //! File Package track for each essence stream
+      mem_ptr<TimecodeComponent> m_MPTimecode;
+      mem_ptr<TimecodeComponent> m_FPTimecode;
+      mem_ptr<IndexManager> m_IndexMan;
+      SourceClip*           m_MPClip;                  //! Material Package SourceClip for each essence stream 
+      SourceClip*           m_FPClip;                  //! File Package SourceClip for each essence stream 
+#endif
+
+      i32_t                 m_EssenceID;               //! Essence stream ID for each essence stream
+      ui32_t                m_FramesWritten;
+      ui64_t                m_StreamOffset;
+      ASDCP::FrameBuffer    m_CtFrameBuf;
+      h__WriterState        m_State;
+      WriterInfo            m_Info;
+      FrameBuffer           m_CryptFrameBuf;
+
+      h__Writer();
+      virtual ~h__Writer();
+
+      Result_t WriteMXFHeader(EssenceType_t EssenceType, Rational& EditRate,
+                             ui32_t TCFrameRate, ui32_t BytesPerEditUnit = 0);
+      Result_t WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf,
+                              const byte_t* EssenceUL, AESEncContext* Ctx, HMACContext* HMAC);
+      Result_t WriteMXFFooter(EssenceType_t EssenceType);
+
+   };
+
+
   // helper class for calculating Integrity Packs, used by WriteEKLVPacket() below.
   //
   class IntegrityPack
@@ -258,35 +333,6 @@ namespace ASDCP
       inline const ui64_t  Length() { return m_Length; }
       inline const ui64_t  KLLength() { return m_BERLength + klv_key_size; }
       Result_t ReadKLFromFile(ASDCP::FileReader& Reader);
-#if 0
-      //
-        {
-          ui32_t read_count;
-          m_HeaderLength = klv_key_size + klv_length_size;
-          Result_t result = Reader.Read(m_Key, m_HeaderLength, &read_count);
-          assert(read_count == m_HeaderLength);
-
-          if ( ASDCP_SUCCESS(result) )
-            {
-              m_BERLength = BER_length(m_Key + klv_key_size);
-          
-              if ( m_BERLength != klv_length_size )
-                {
-                 ASDCP::DefaultLogSink().Error("Found packet with BER length %lu; being less efficient...\n",
-                                                m_BERLength);
-                  // TODO: recover the correct BER value
-                  // and reposition the file pointer
-                  assert(0);
-                }
-
-              if ( ! read_BER(m_Key + klv_key_size, &m_Length) )
-                return RESULT_FAIL;
-            }
-
-          return result;
-        }
-#endif
-
     };
 
 } // namespace ASDCP
index 1dfc33f781434bdd49096b23c8fcc0386753349b..92dfd39b3698a6fe20f3783ac59050a46ec85c82 100755 (executable)
@@ -269,24 +269,8 @@ public:
              case 'V': version_flag = true; break;
              case 'h': help_flag = true; break;
              case 'v': verbose_flag = true; break;
-             case 'g':
-#ifdef ASDCP_WITHOUT_OPENSSL
-               fputs("Program compiled without encryption support.\n", stderr);
-               return;
-#else
-               genkey_flag = true;
-#endif
-               break;
-
-             case 'u':
-#ifdef ASDCP_WITHOUT_OPENSSL
-               fputs("Program compiled without encryption support.\n", stderr);
-               return;
-#else
-               genid_flag = true;
-#endif
-               break;
-
+             case 'g': genkey_flag = true; break;
+             case 'u': genid_flag = true; break;
              case 'e': encrypt_header_flag = true; break;
              case 'E': encrypt_header_flag = false; break;
              case 'M': write_hmac = false; break;
@@ -305,10 +289,6 @@ public:
                break;
 
              case 'k': key_flag = true;
-#ifdef ASDCP_WITHOUT_OPENSSL
-               fputs("Program compiled without encryption support.\n", stderr);
-               return;
-#else
                TEST_EXTRA_ARG(i, 'k');
                {
                  ui32_t length;
@@ -320,14 +300,9 @@ public:
                      return;
                    }
                }
-#endif
                break;
 
              case 'j': key_id_flag = true;
-#ifdef ASDCP_WITHOUT_OPENSSL
-               fputs("Program compiled without encryption support.\n", stderr);
-               return;
-#else
                TEST_EXTRA_ARG(i, 'j');
                {
                  ui32_t length;
@@ -339,7 +314,6 @@ public:
                      return;
                    }
                }
-#endif
                break;
 
              case 'f':
@@ -410,7 +384,7 @@ public:
 
 //------------------------------------------------------------------------------------------
 // MPEG2 essence
-#if 0
+
 // Write a plaintext MPEG2 Video Elementary Stream to a plaintext ASDCP file
 // Write a plaintext MPEG2 Video Elementary Stream to a ciphertext ASDCP file
 //
@@ -423,11 +397,8 @@ write_MPEG2_file(CommandOptions& Options)
   MPEG2::Parser      Parser;
   MPEG2::MXFWriter   Writer;
   MPEG2::VideoDescriptor VDesc;
-
-#ifndef ASDCP_WITHOUT_OPENSSL
   byte_t             IV_buf[CBC_BLOCK_SIZE];
   FortunaRNG         RNG;
-#endif
 
   // set up essence parser
   Result_t result = Parser.OpenRead(Options.filenames[0]);
@@ -449,7 +420,6 @@ write_MPEG2_file(CommandOptions& Options)
   if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
     {
       WriterInfo Info = s_MyInfo;  // fill in your favorite identifiers here
-#ifndef ASDCP_WITHOUT_OPENSSL
       GenRandomUUID(RNG, Info.AssetUUID);
 
       // configure encryption
@@ -476,7 +446,6 @@ write_MPEG2_file(CommandOptions& Options)
              result = HMAC->InitKey(Options.key_value);
            }
        }
-#endif // ASDCP_WITHOUT_OPENSSL
 
       if ( ASDCP_SUCCESS(result) )
        result = Writer.OpenWrite(Options.out_file, Info, VDesc);
@@ -508,14 +477,12 @@ write_MPEG2_file(CommandOptions& Options)
            {
              result = Writer.WriteFrame(FrameBuffer, Context, HMAC);
 
-#ifndef ASDCP_WITHOUT_OPENSSL
              // The Writer class will forward the last block of ciphertext
              // to the encryption context for use as the IV for the next
              // frame. If you want to use non-sequitur IV values, un-comment
              // the following  line of code.
              // if ( ASDCP_SUCCESS(result) && Options.key_flag )
              //   Context->SetIVec(RNG.FillRandom(IV_buf, CBC_BLOCK_SIZE));
-#endif
            }
        }
 
@@ -528,7 +495,6 @@ write_MPEG2_file(CommandOptions& Options)
 
   return result;
 }
-#endif
 
 // Read a plaintext MPEG2 Video Elementary Stream from a plaintext ASDCP file
 // Read a plaintext MPEG2 Video Elementary Stream from a ciphertext ASDCP file
@@ -658,7 +624,6 @@ gop_start_test(CommandOptions& Options)
   return result;
 }
 
-#if 0
 //------------------------------------------------------------------------------------------
 // JPEG 2000 essence
 
@@ -674,11 +639,8 @@ write_JP2K_file(CommandOptions& Options)
   JP2K::FrameBuffer       FrameBuffer(Options.fb_size);
   JP2K::PictureDescriptor PDesc;
   JP2K::SequenceParser    Parser;
-
-#ifndef ASDCP_WITHOUT_OPENSSL
   byte_t           IV_buf[CBC_BLOCK_SIZE];
   FortunaRNG       RNG;
-#endif
 
   // set up essence parser
   Result_t result = Parser.OpenRead(Options.filenames[0]);
@@ -701,7 +663,6 @@ write_JP2K_file(CommandOptions& Options)
   if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
     {
       WriterInfo Info = s_MyInfo;  // fill in your favorite identifiers here
-#ifndef ASDCP_WITHOUT_OPENSSL
       GenRandomUUID(RNG, Info.AssetUUID);
 
       // configure encryption
@@ -728,7 +689,6 @@ write_JP2K_file(CommandOptions& Options)
              result = HMAC->InitKey(Options.key_value);
            }
        }
-#endif // ASDCP_WITHOUT_OPENSSL
 
       if ( ASDCP_SUCCESS(result) )
        result = Writer.OpenWrite(Options.out_file, Info, PDesc);
@@ -758,14 +718,13 @@ write_JP2K_file(CommandOptions& Options)
          if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
            {
              result = Writer.WriteFrame(FrameBuffer, Context, HMAC);
-#ifndef ASDCP_WITHOUT_OPENSSL
+
              // The Writer class will forward the last block of ciphertext
              // to the encryption context for use as the IV for the next
              // frame. If you want to use non-sequitur IV values, un-comment
              // the following  line of code.
              // if ( ASDCP_SUCCESS(result) && Options.key_flag )
              //   Context->SetIVec(RNG.FillRandom(IV_buf, CBC_BLOCK_SIZE));
-#endif
            }
        }
 
@@ -778,7 +737,6 @@ write_JP2K_file(CommandOptions& Options)
 
   return result;
 }
-#endif
 
 // Read one or more plaintext JPEG 2000 codestreams from a plaintext ASDCP file
 // Read one or more plaintext JPEG 2000 codestreams from a ciphertext ASDCP file
@@ -858,7 +816,6 @@ read_JP2K_file(CommandOptions& Options)
   return result;
 }
 
-#if 0
 //------------------------------------------------------------------------------------------
 // PCM essence
 
@@ -876,11 +833,8 @@ write_PCM_file(CommandOptions& Options)
   PCM::FrameBuffer FrameBuffer;
   PCM::AudioDescriptor ADesc;
   Rational         PictureRate = Options.PictureRate();
-
-#ifndef ASDCP_WITHOUT_OPENSSL
   byte_t           IV_buf[CBC_BLOCK_SIZE];
   FortunaRNG       RNG;
-#endif
 
   // set up essence parser
   Result_t result = Parser.OpenRead(Options.file_count, Options.filenames, PictureRate);
@@ -906,7 +860,6 @@ write_PCM_file(CommandOptions& Options)
   if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
     {
       WriterInfo Info = s_MyInfo;  // fill in your favorite identifiers here
-#ifndef ASDCP_WITHOUT_OPENSSL
       GenRandomUUID(RNG, Info.AssetUUID);
 
       // configure encryption
@@ -933,7 +886,6 @@ write_PCM_file(CommandOptions& Options)
              result = HMAC->InitKey(Options.key_value);
            }
        }
-#endif // ASDCP_WITHOUT_OPENSSL
 
       if ( ASDCP_SUCCESS(result) )
        result = Writer.OpenWrite(Options.out_file, Info, ADesc);
@@ -965,14 +917,12 @@ write_PCM_file(CommandOptions& Options)
                {
                  result = Writer.WriteFrame(FrameBuffer, Context, HMAC);
 
-#ifndef ASDCP_WITHOUT_OPENSSL
                  // The Writer class will forward the last block of ciphertext
                  // to the encryption context for use as the IV for the next
                  // frame. If you want to use non-sequitur IV values, un-comment
                  // the following  line of code.
                  // if ( ASDCP_SUCCESS(result) && Options.key_flag )
                  //   Context->SetIVec(RNG.FillRandom(IV_buf, CBC_BLOCK_SIZE));
-#endif
                }
            }
        }
@@ -986,7 +936,6 @@ write_PCM_file(CommandOptions& Options)
 
   return result;
 }
-#endif
 
 // Read one or more plaintext PCM audio streams from a plaintext ASDCP file
 // Read one or more plaintext PCM audio streams from a ciphertext ASDCP file
@@ -1253,7 +1202,6 @@ main(int argc, const char** argv)
     {
       result = gop_start_test(Options);
     }
-#ifndef ASDCP_WITHOUT_OPENSSL
   else if ( Options.genkey_flag )
     {
       FortunaRNG RNG;
@@ -1273,7 +1221,6 @@ main(int argc, const char** argv)
       bin2hex(bin_buf, KeyLen, str_buf, 40);
       printf("%s\n", hyphenate_UUID(str_buf, 40));
     }
-#endif // ASDCP_WITHOUT_OPENSSL
   else if ( Options.extract_flag )
     {
       EssenceType_t EssenceType;
@@ -1307,7 +1254,6 @@ main(int argc, const char** argv)
     {
       fprintf(stderr, "ATTENTION! This version of asdcplib does not support writing MXF files.\n");
 
-#if 0
       if ( Options.do_repeat && ! Options.duration_flag )
        {
          fputs("Option -R requires -d <duration>\n", stderr);
@@ -1341,7 +1287,6 @@ main(int argc, const char** argv)
              return 5;
            }
        }
-#endif
     }
 
   if ( result != RESULT_OK )
index 411f63e9f35f66d9c55cf69ebf311c04ce51913e..7af5710292ef6bec949fff82b2c8664b8523a4d2 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2005, John Hurst
+Copyright (c) 2004-2006, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -32,15 +32,16 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "AS_DCP_internal.h"
 #include "MemIO.h"
 #include "Timecode.h"
+#include "KLV.h"
+#include "MDD.h"
 #include <assert.h>
 
-using namespace mxflib;
 using namespace ASDCP;
+using namespace ASDCP::MXF;
 
 
 ASDCP::h__Writer::h__Writer() : m_FramesWritten(0), m_StreamOffset(0)
 {
-  init_mxf_types();
 }
 
 ASDCP::h__Writer::~h__Writer()
@@ -52,6 +53,7 @@ Result_t
 ASDCP::h__Writer::WriteMXFHeader(EssenceType_t EssenceType, ASDCP::Rational& EditRate,
                          ui32_t TCFrameRate, ui32_t BytesPerEditUnit)
 {
+#if 0
   // write the stream metadata
   m_Metadata = new Metadata();
   assert(m_Metadata);
@@ -73,18 +75,10 @@ ASDCP::h__Writer::WriteMXFHeader(EssenceType_t EssenceType, ASDCP::Rational& Edi
   UMID PackageUMID;
   PackageUMID.MakeUMID(0x0d); // mixed type
 
-#if ASDCP_USE_MXFLIB
-  mxflib::Rational EditRate_;
-  EditRate_.Numerator = EditRate.Numerator;
-  EditRate_.Denominator = EditRate.Denominator;
-#else
-#define EditRate_ EditRate
-#endif
-
   m_MaterialPackage = m_Metadata->AddMaterialPackage("AS-DCP Material Package", PackageUMID);
   m_Metadata->SetPrimaryPackage(m_MaterialPackage);    // This will be overwritten for OP-Atom
   
-  TrackPtr MPTimecodeTrack = m_MaterialPackage->AddTimecodeTrack(EditRate_);
+  TrackPtr MPTimecodeTrack = m_MaterialPackage->AddTimecodeTrack(EditRate);
   m_MPTimecode = MPTimecodeTrack->AddTimecodeComponent(TCFrameRate, 0, 0);
 
   TrackPtr FPTimecodeTrack = 0;
@@ -97,29 +91,29 @@ ASDCP::h__Writer::WriteMXFHeader(EssenceType_t EssenceType, ASDCP::Rational& Edi
     case ESS_MPEG2_VES:
       PackageUMID.MakeUMID(0x0f, assetUUID);
       m_FilePackage = m_Metadata->AddFilePackage(1, MPEG_PACKAGE_LABEL, PackageUMID);
-      m_MPTrack = m_MaterialPackage->AddPictureTrack(EditRate_);
-      m_FPTrack = m_FilePackage->AddPictureTrack(0, EditRate_);
+      m_MPTrack = m_MaterialPackage->AddPictureTrack(EditRate);
+      m_FPTrack = m_FilePackage->AddPictureTrack(0, EditRate);
       break;
          
     case ESS_JPEG_2000:
       PackageUMID.MakeUMID(0x0f, assetUUID);
       m_FilePackage = m_Metadata->AddFilePackage(1, JP2K_PACKAGE_LABEL, PackageUMID);
-      m_MPTrack = m_MaterialPackage->AddPictureTrack(EditRate_);
-      m_FPTrack = m_FilePackage->AddPictureTrack(0, EditRate_);
+      m_MPTrack = m_MaterialPackage->AddPictureTrack(EditRate);
+      m_FPTrack = m_FilePackage->AddPictureTrack(0, EditRate);
       break;
          
     case ESS_PCM_24b_48k:
       PackageUMID.MakeUMID(0x0f, assetUUID);
       m_FilePackage = m_Metadata->AddFilePackage(1, PCM_PACKAGE_LABEL, PackageUMID);
-      m_MPTrack = m_MaterialPackage->AddSoundTrack(EditRate_);
-      m_FPTrack = m_FilePackage->AddSoundTrack(0, EditRate_);
+      m_MPTrack = m_MaterialPackage->AddSoundTrack(EditRate);
+      m_FPTrack = m_FilePackage->AddSoundTrack(0, EditRate);
       break;
 
     default: return RESULT_RAW_ESS;
     }
 
   // Add an essence element
-  FPTimecodeTrack = m_FilePackage->AddTimecodeTrack(EditRate_);
+  FPTimecodeTrack = m_FilePackage->AddTimecodeTrack(EditRate);
   m_FPTimecode = FPTimecodeTrack->AddTimecodeComponent(TCFrameRate, 0/* NDF */,
                                                       tc_to_frames(TCFrameRate, 1, 0, 0, 0) );
   
@@ -243,7 +237,8 @@ ASDCP::h__Writer::WriteMXFHeader(EssenceType_t EssenceType, ASDCP::Rational& Edi
 
   m_IndexMan->SetBodySID(1);
   m_IndexMan->SetIndexSID(129);
-  m_IndexMan->SetEditRate(EditRate_);
+  m_IndexMan->SetEditRate(EditRate);
+#endif
 
   return RESULT_OK;
 }
@@ -306,14 +301,14 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte
          Overhead.WriteUi64BE(FrameBuf.Size());                         // write SourceLength
          Overhead.WriteBER(m_CtFrameBuf.Size(), klv_length_size);       // write ESV length
 
-         result = m_File->Writev(Overhead.Data(), Overhead.Size());
+         result = m_File.Writev(Overhead.Data(), Overhead.Size());
        }
 
       if ( ASDCP_SUCCESS(result) )
        {
          m_StreamOffset += Overhead.Size();
          // write encrypted source value
-         result = m_File->Writev((byte_t*)m_CtFrameBuf.RoData(), m_CtFrameBuf.Size());
+         result = m_File.Writev((byte_t*)m_CtFrameBuf.RoData(), m_CtFrameBuf.Size());
        }
 
       if ( ASDCP_SUCCESS(result) )
@@ -335,7 +330,7 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte
            }
 
          // write HMAC
-         result = m_File->Writev(HMACOverhead.Data(), HMACOverhead.Size());
+         result = m_File.Writev(HMACOverhead.Data(), HMACOverhead.Size());
          m_StreamOffset += HMACOverhead.Size();
        }
     }
@@ -343,17 +338,17 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte
     {
       Overhead.WriteRaw((byte_t*)EssenceUL, klv_key_size);
       Overhead.WriteBER(FrameBuf.Size(), klv_length_size);
-      result = m_File->Writev(Overhead.Data(), Overhead.Size());
+      result = m_File.Writev(Overhead.Data(), Overhead.Size());
  
       if ( ASDCP_SUCCESS(result) )
-       result = m_File->Writev((byte_t*)FrameBuf.RoData(), FrameBuf.Size());
+       result = m_File.Writev((byte_t*)FrameBuf.RoData(), FrameBuf.Size());
 
       if ( ASDCP_SUCCESS(result) )
        m_StreamOffset += Overhead.Size() + FrameBuf.Size();
     }
 
   if ( ASDCP_SUCCESS(result) )
-    result = m_File->Writev();
+    result = m_File.Writev();
 
   return result;
 }
@@ -364,6 +359,7 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte
 Result_t
 ASDCP::h__Writer::WriteMXFFooter(EssenceType_t EssenceType)
 {
+#if 0
   // write the index
   DataChunk IndexChunk;
   ui32_t IndexSID = 0;
@@ -429,10 +425,10 @@ ASDCP::h__Writer::WriteMXFFooter(EssenceType_t EssenceType)
   m_HeaderPart->UpdateMetadata(m_Metadata);
 
   // Actually write the footer
-  m_File->WritePartitionWithIndex(*m_HeaderPart, &IndexChunk, false);
+  m_File.WritePartitionWithIndex(*m_HeaderPart, &IndexChunk, false);
 
   // Add a RIP
-  m_File->WriteRIP();
+  m_File.WriteRIP();
 
   //
   // ** Update the header ** 
@@ -441,15 +437,15 @@ ASDCP::h__Writer::WriteMXFFooter(EssenceType_t EssenceType)
   // For OP-Atom re-write the entire header
   //
   ASDCP::fpos_t FooterPos = m_HeaderPart->GetUint64("FooterPartition");
-  m_File->Seek(0);
+  m_File.Seek(0);
 
   m_HeaderPart->ChangeType("ClosedCompleteHeader");
   m_HeaderPart->SetUint64("FooterPartition", FooterPos);
   m_HeaderPart->SetUint64("BodySID", 1);
 
-  m_File->ReWritePartition(*m_HeaderPart);
-  m_File->Close();
-  
+  m_File.ReWritePartition(*m_HeaderPart);
+  m_File.Close();
+#endif
   return RESULT_OK;
 }