summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2006-01-06 08:17:23 +0000
committerjhurst <>2006-01-06 08:17:23 +0000
commite73ef2046cf4f6beb730be071022aaedb3b44bba (patch)
treea60dd194a13275efdd8748eb46cd6ca06aa3af95 /src
parent6e23666cb6184999efc74577cfb1b524181ba5df (diff)
broken build, adding write
Diffstat (limited to 'src')
-rwxr-xr-xsrc/AS_DCP_AES.cpp50
-rwxr-xr-xsrc/AS_DCP_MPEG2.cpp25
-rwxr-xr-xsrc/AS_DCP_internal.h140
-rwxr-xr-xsrc/asdcp-test.cpp63
-rwxr-xr-xsrc/h__Writer.cpp60
5 files changed, 139 insertions, 199 deletions
diff --git a/src/AS_DCP_AES.cpp b/src/AS_DCP_AES.cpp
index 3d36566..e21dba1 100755
--- a/src/AS_DCP_AES.cpp
+++ b/src/AS_DCP_AES.cpp
@@ -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
}
};
diff --git a/src/AS_DCP_MPEG2.cpp b/src/AS_DCP_MPEG2.cpp
index 103cd44..51fd802 100755
--- a/src/AS_DCP_MPEG2.cpp
+++ b/src/AS_DCP_MPEG2.cpp
@@ -65,6 +65,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
diff --git a/src/AS_DCP_internal.h b/src/AS_DCP_internal.h
index 473a4ab..c903698 100755
--- a/src/AS_DCP_internal.h
+++ b/src/AS_DCP_internal.h
@@ -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
diff --git a/src/asdcp-test.cpp b/src/asdcp-test.cpp
index 1dfc33f..92dfd39 100755
--- a/src/asdcp-test.cpp
+++ b/src/asdcp-test.cpp
@@ -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 )
diff --git a/src/h__Writer.cpp b/src/h__Writer.cpp
index 411f63e..7af5710 100755
--- a/src/h__Writer.cpp
+++ b/src/h__Writer.cpp
@@ -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;
}