version bump
[asdcplib.git] / src / AS_DCP_internal.h
index 4a00ba02896f2d68b71cf4f75b2616d59c88e931..d55d337182764d40d922642fee24e373a3b73c9a 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2006, John Hurst
+Copyright (c) 2004-2009, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -86,16 +86,35 @@ namespace ASDCP
   //
 
   Result_t MD_to_WriterInfo(MXF::Identification*, WriterInfo&);
-  Result_t MD_to_CryptoInfo(MXF::CryptographicContext*, WriterInfo&);
+  Result_t MD_to_CryptoInfo(MXF::CryptographicContext*, WriterInfo&, const Dictionary&);
   Result_t EncryptFrameBuffer(const ASDCP::FrameBuffer&, ASDCP::FrameBuffer&, AESEncContext*);
   Result_t DecryptFrameBuffer(const ASDCP::FrameBuffer&, ASDCP::FrameBuffer&, AESDecContext*);
 
+  //
+ class KLReader : public ASDCP::KLVPacket
+    {
+      ASDCP_NO_COPY_CONSTRUCT(KLReader);
+      byte_t m_KeyBuf[SMPTE_UL_LENGTH*2];
+
+    public:
+      KLReader() {}
+      ~KLReader() {}
+
+      inline const byte_t* Key() { return m_KeyBuf; }
+      inline const ui64_t  Length() { return m_ValueLength; }
+      inline const ui64_t  KLLength() { return m_KLLength; }
+      
+      Result_t ReadKLFromFile(Kumu::FileReader& Reader);
+    };
+
   //
   class h__Reader
     {
       ASDCP_NO_COPY_CONSTRUCT(h__Reader);
+      h__Reader();
 
     public:
+      const Dictionary*  m_Dict;
       Kumu::FileReader   m_File;
       OPAtomHeader       m_HeaderPart;
       Partition          m_BodyPart;
@@ -103,15 +122,21 @@ namespace ASDCP
       ui64_t             m_EssenceStart;
       WriterInfo         m_Info;
       ASDCP::FrameBuffer m_CtFrameBuf;
-      fpos_t             m_LastPosition;
+      Kumu::fpos_t       m_LastPosition;
 
-      h__Reader();
+      h__Reader(const Dictionary&);
       virtual ~h__Reader();
 
       Result_t InitInfo();
       Result_t OpenMXFRead(const char* filename);
       Result_t InitMXFIndex();
-      Result_t ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
+
+      // positions file before reading
+      Result_t ReadEKLVFrame(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
+                            const byte_t* EssenceUL, AESDecContext* Ctx, HMACContext* HMAC);
+
+      // reads from current position
+      Result_t ReadEKLVPacket(ui32_t FrameNum, ui32_t SequenceNum, ASDCP::FrameBuffer& FrameBuf,
                              const byte_t* EssenceUL, AESDecContext* Ctx, HMACContext* HMAC);
       void     Close();
     };
@@ -152,12 +177,16 @@ namespace ASDCP
       inline Result_t Goto_FINAL()   { Goto_body(ST_RUNNING, ST_FINAL); }
     };
 
+  typedef std::list<ui64_t*> DurationElementList_t;
+
   //
   class h__Writer
     {
       ASDCP_NO_COPY_CONSTRUCT(h__Writer);
+      h__Writer();
 
     public:
+      const Dictionary*  m_Dict;
       Kumu::FileWriter   m_File;
       ui32_t             m_HeaderSize;
       OPAtomHeader       m_HeaderPart;
@@ -166,28 +195,32 @@ namespace ASDCP
       ui64_t             m_EssenceStart;
 
       MaterialPackage*   m_MaterialPackage;
-      Sequence*          m_MPTCSequence;
-      TimecodeComponent* m_MPTimecode;
-      Sequence*          m_MPClSequence;
-      SourceClip*        m_MPClip;                     //! Material Package SourceClip for each essence stream 
-
       SourcePackage*     m_FilePackage;
-      Sequence*          m_FPTCSequence;
-      TimecodeComponent* m_FPTimecode;
-      Sequence*          m_FPClSequence;
-      SourceClip*        m_FPClip;                     //! File Package SourceClip for each essence stream 
 
       FileDescriptor*    m_EssenceDescriptor;
+      std::list<InterchangeObject*> m_EssenceSubDescriptorList;
 
       ui32_t             m_FramesWritten;
       ui64_t             m_StreamOffset;
       ASDCP::FrameBuffer m_CtFrameBuf;
       h__WriterState     m_State;
       WriterInfo         m_Info;
+      DurationElementList_t m_DurationUpdateList;
 
-      h__Writer();
+      h__Writer(const Dictionary&);
       virtual ~h__Writer();
 
+      void InitHeader();
+      void AddSourceClip(const MXF::Rational& EditRate, ui32_t TCFrameRate,
+                        const std::string& TrackName, const UL& DataDefinition,
+                        const std::string& PackageLabel);
+      void AddDMSegment(const MXF::Rational& EditRate, ui32_t TCFrameRate,
+                        const std::string& TrackName, const UL& DataDefinition,
+                       const std::string& PackageLabel);
+      void AddEssenceDescriptor(const UL& WrappingUL);
+      Result_t CreateBodyPart(const MXF::Rational& EditRate, ui32_t BytesPerEditUnit = 0);
+
+      // all the above for a single source clip
       Result_t WriteMXFHeader(const std::string& PackageLabel, const UL& WrappingUL,
                              const std::string& TrackName, const UL& DataDefinition,
                              const MXF::Rational& EditRate,