summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2016-12-01 20:12:38 +0000
committerjhurst <>2016-12-01 20:12:38 +0000
commitc87b3d28b21c927561606cc65a25b47aebc69355 (patch)
treecc54031828cc2f244291ed49ea0c21efcb9416d5 /src
parent8fd602770d89acb171dbd878d8737ead85aa35d3 (diff)
o Cleared up MXFGCP1FrameWrappedPictureElement / MXFGCP1FrameWrappedPictureElement
ambiguity. PHDR continues to use MXFGCP1FrameWrappedPictureElement. MXFGCI1FrameWrappedPictureElement is supported for interlace. o Added prototype PIDM dynamic metadata wrapping, config with --enable-phdr
Diffstat (limited to 'src')
-rw-r--r--src/AS_02.h87
-rw-r--r--src/AS_02_JP2K.cpp13
-rw-r--r--src/AS_02_PHDR.cpp2
-rw-r--r--src/AS_02_PHDR.h90
-rwxr-xr-xsrc/AS_DCP_JP2K.cpp2
-rwxr-xr-xsrc/AS_DCP_MXF.cpp2
-rw-r--r--src/CMakeLists.txt342
-rw-r--r--src/MDD.cpp18
-rwxr-xr-xsrc/MDD.h15
-rwxr-xr-xsrc/MXFTypes.h6
-rw-r--r--src/Makefile.am6
-rwxr-xr-xsrc/Metadata.cpp34
-rwxr-xr-xsrc/Metadata.h17
-rwxr-xr-xsrc/as-02-unwrap.cpp117
-rwxr-xr-xsrc/as-02-wrap.cpp187
-rwxr-xr-xsrc/phdr-unwrap.cpp119
-rwxr-xr-xsrc/phdr-wrap.cpp201
17 files changed, 650 insertions, 608 deletions
diff --git a/src/AS_02.h b/src/AS_02.h
index 5d621a7..e4f761f 100644
--- a/src/AS_02.h
+++ b/src/AS_02.h
@@ -489,93 +489,6 @@ namespace AS_02
} // namespace TimedText
- namespace AuxData
- {
- //
- class MXFWriter
- {
- class h__Writer;
- ASDCP::mem_ptr<h__Writer> m_Writer;
- ASDCP_NO_COPY_CONSTRUCT(MXFWriter);
-
- public:
- MXFWriter();
- virtual ~MXFWriter();
-
- // Warning: direct manipulation of MXF structures can interfere
- // with the normal operation of the wrapper. Caveat emptor!
- virtual ASDCP::MXF::OP1aHeader& OP1aHeader();
- virtual ASDCP::MXF::RIP& RIP();
-
- // Open the file for writing. The file must not exist. Returns error if
- // the operation cannot be completed or if nonsensical data is discovered
- // in the essence descriptor.
- Result_t OpenWrite(const std::string& filename, const ASDCP::WriterInfo&,
- const ASDCP::UL& data_essence_coding,
- const ASDCP::Rational& edit_rate, const ui32_t& header_size = 16384,
- const IndexStrategy_t& strategy = IS_FOLLOW, const ui32_t& partition_space = 10);
-
- // Writes a frame of essence to the MXF file. If the optional AESEncContext
- // argument is present, the essence is encrypted prior to writing.
- // Fails if the file is not open, is finalized, or an operating system
- // error occurs.
- Result_t WriteFrame(const ASDCP::FrameBuffer&, ASDCP::AESEncContext* = 0, ASDCP::HMACContext* = 0);
-
- // Closes the MXF file, writing the index and revised header. No global metadata block is written.
- Result_t Finalize();
-
- // Closes the MXF file, writing the global metadata block and then final index and revised header.
- Result_t Finalize(const ASDCP::FrameBuffer& global_metadata);
- };
-
- //
- class MXFReader
- {
- class h__Reader;
- ASDCP::mem_ptr<h__Reader> m_Reader;
- ASDCP_NO_COPY_CONSTRUCT(MXFReader);
-
- public:
- MXFReader();
- virtual ~MXFReader();
-
- // Warning: direct manipulation of MXF structures can interfere
- // with the normal operation of the wrapper. Caveat emptor!
- virtual ASDCP::MXF::OP1aHeader& OP1aHeader();
- virtual AS_02::MXF::AS02IndexReader& AS02IndexReader();
- virtual ASDCP::MXF::RIP& RIP();
-
- // Open the file for reading. The file must exist. Returns error if the
- // operation cannot be completed.
- Result_t OpenRead(const std::string& filename) const;
-
- // Open the file for reading. The file must exist. Returns error if the
- // operation cannot be completed. If global metadata is available it will
- // be placed into the buffer object passed as the second argument.
- Result_t OpenRead(const std::string& filename, ASDCP::FrameBuffer& global_metadata) const;
-
- // Returns RESULT_INIT if the file is not open.
- Result_t Close() const;
-
- // Fill a WriterInfo struct with the values from the file's header.
- // Returns RESULT_INIT if the file is not open.
- Result_t FillWriterInfo(ASDCP::WriterInfo&) const;
-
- // Reads a frame of essence from the MXF file. If the optional AESEncContext
- // argument is present, the essence is decrypted after reading. If the MXF
- // file is encrypted and the AESDecContext argument is NULL, the frame buffer
- // will contain the ciphertext frame data. If the HMACContext argument is
- // not NULL, the HMAC will be calculated (if the file supports it).
- // Returns RESULT_INIT if the file is not open, failure if the frame number is
- // out of range, or if optional decrypt or HAMC operations fail.
- Result_t ReadFrame(ui32_t frame_number, ASDCP::FrameBuffer&, ASDCP::AESDecContext* = 0, ASDCP::HMACContext* = 0) const;
-
- // Print debugging information to stream
- void DumpHeaderMetadata(FILE* = 0) const;
- void DumpIndex(FILE* = 0) const;
- };
-
- }
} // namespace AS_02
diff --git a/src/AS_02_JP2K.cpp b/src/AS_02_JP2K.cpp
index b553da3..ffb40a9 100644
--- a/src/AS_02_JP2K.cpp
+++ b/src/AS_02_JP2K.cpp
@@ -350,7 +350,18 @@ AS_02::JP2K::MXFWriter::h__Writer::SetSourceStream(const std::string& label, con
if ( KM_SUCCESS(result) )
{
- result = WriteAS02Header(label, UL(m_Dict->ul(MDD_JPEG_2000WrappingFrame)),
+ UL wrapping_label = UL(m_Dict->ul(MDD_MXFGCP1FrameWrappedPictureElement));
+
+ CDCIEssenceDescriptor *cdci_descriptor = dynamic_cast<CDCIEssenceDescriptor*>(m_EssenceDescriptor);
+ if ( cdci_descriptor )
+ {
+ if ( cdci_descriptor->FrameLayout ) // 0 == progressive, 1 == interlace
+ {
+ wrapping_label = UL(m_Dict->ul(MDD_MXFGCI1FrameWrappedPictureElement));
+ }
+ }
+
+ result = WriteAS02Header(label, wrapping_label,
PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
edit_rate, derive_timecode_rate_from_edit_rate(edit_rate));
diff --git a/src/AS_02_PHDR.cpp b/src/AS_02_PHDR.cpp
index 1ecd888..9322b31 100644
--- a/src/AS_02_PHDR.cpp
+++ b/src/AS_02_PHDR.cpp
@@ -530,7 +530,7 @@ AS_02::PHDR::MXFWriter::h__Writer::SetSourceStream(const std::string& label, con
if ( KM_SUCCESS(result) )
{
- result = WritePHDRHeader(label, UL(m_Dict->ul(MDD_JPEG_2000WrappingFrame)),
+ result = WritePHDRHeader(label, UL(m_Dict->ul(MDD_MXFGCFUFrameWrappedPictureElement)),
PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
edit_rate, derive_timecode_rate_from_edit_rate(edit_rate));
diff --git a/src/AS_02_PHDR.h b/src/AS_02_PHDR.h
index 1328de1..5609ea5 100644
--- a/src/AS_02_PHDR.h
+++ b/src/AS_02_PHDR.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2015, John Hurst
+Copyright (c) 2011-2016, John Hurst
All rights reserved.
@@ -182,6 +182,94 @@ namespace AS_02
} // end namespace PHDR
+ namespace PIDM
+ {
+ //
+ class MXFWriter
+ {
+ class h__Writer;
+ ASDCP::mem_ptr<h__Writer> m_Writer;
+ ASDCP_NO_COPY_CONSTRUCT(MXFWriter);
+
+ public:
+ MXFWriter();
+ virtual ~MXFWriter();
+
+ // Warning: direct manipulation of MXF structures can interfere
+ // with the normal operation of the wrapper. Caveat emptor!
+ virtual ASDCP::MXF::OP1aHeader& OP1aHeader();
+ virtual ASDCP::MXF::RIP& RIP();
+
+ // Open the file for writing. The file must not exist. Returns error if
+ // the operation cannot be completed or if nonsensical data is discovered
+ // in the essence descriptor.
+ Result_t OpenWrite(const std::string& filename, const ASDCP::WriterInfo&,
+ const ASDCP::UL& data_essence_coding,
+ const ASDCP::Rational& edit_rate, const ui32_t& header_size = 16384,
+ const IndexStrategy_t& strategy = IS_FOLLOW, const ui32_t& partition_space = 10);
+
+ // Writes a frame of essence to the MXF file. If the optional AESEncContext
+ // argument is present, the essence is encrypted prior to writing.
+ // Fails if the file is not open, is finalized, or an operating system
+ // error occurs.
+ Result_t WriteFrame(const ASDCP::FrameBuffer&, ASDCP::AESEncContext* = 0, ASDCP::HMACContext* = 0);
+
+ // Closes the MXF file, writing the index and revised header. No global metadata block is written.
+ Result_t Finalize();
+
+ // Closes the MXF file, writing the global metadata block and then final index and revised header.
+ Result_t Finalize(const ASDCP::FrameBuffer& global_metadata);
+ };
+
+ //
+ class MXFReader
+ {
+ class h__Reader;
+ ASDCP::mem_ptr<h__Reader> m_Reader;
+ ASDCP_NO_COPY_CONSTRUCT(MXFReader);
+
+ public:
+ MXFReader();
+ virtual ~MXFReader();
+
+ // Warning: direct manipulation of MXF structures can interfere
+ // with the normal operation of the wrapper. Caveat emptor!
+ virtual ASDCP::MXF::OP1aHeader& OP1aHeader();
+ virtual AS_02::MXF::AS02IndexReader& AS02IndexReader();
+ virtual ASDCP::MXF::RIP& RIP();
+
+ // Open the file for reading. The file must exist. Returns error if the
+ // operation cannot be completed.
+ Result_t OpenRead(const std::string& filename) const;
+
+ // Open the file for reading. The file must exist. Returns error if the
+ // operation cannot be completed. If global metadata is available it will
+ // be placed into the buffer object passed as the second argument.
+ Result_t OpenRead(const std::string& filename, ASDCP::FrameBuffer& global_metadata) const;
+
+ // Returns RESULT_INIT if the file is not open.
+ Result_t Close() const;
+
+ // Fill a WriterInfo struct with the values from the file's header.
+ // Returns RESULT_INIT if the file is not open.
+ Result_t FillWriterInfo(ASDCP::WriterInfo&) const;
+
+ // Reads a frame of essence from the MXF file. If the optional AESEncContext
+ // argument is present, the essence is decrypted after reading. If the MXF
+ // file is encrypted and the AESDecContext argument is NULL, the frame buffer
+ // will contain the ciphertext frame data. If the HMACContext argument is
+ // not NULL, the HMAC will be calculated (if the file supports it).
+ // Returns RESULT_INIT if the file is not open, failure if the frame number is
+ // out of range, or if optional decrypt or HAMC operations fail.
+ Result_t ReadFrame(ui32_t frame_number, ASDCP::FrameBuffer&, ASDCP::AESDecContext* = 0, ASDCP::HMACContext* = 0) const;
+
+ // Print debugging information to stream
+ void DumpHeaderMetadata(FILE* = 0) const;
+ void DumpIndex(FILE* = 0) const;
+ };
+
+ }
+
} // end namespace AS_02
#endif // _AS_02_PHDR_H_
diff --git a/src/AS_DCP_JP2K.cpp b/src/AS_DCP_JP2K.cpp
index 937231f..25d452f 100755
--- a/src/AS_DCP_JP2K.cpp
+++ b/src/AS_DCP_JP2K.cpp
@@ -1039,7 +1039,7 @@ lh__Writer::SetSourceStream(const PictureDescriptor& PDesc, const std::string& l
if ( ASDCP_SUCCESS(result) )
{
- result = WriteASDCPHeader(label, UL(m_Dict->ul(MDD_JPEG_2000WrappingFrame)),
+ result = WriteASDCPHeader(label, UL(m_Dict->ul(MDD_MXFGCFUFrameWrappedPictureElement)),
PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
LocalEditRate, derive_timecode_rate_from_edit_rate(m_PDesc.EditRate));
}
diff --git a/src/AS_DCP_MXF.cpp b/src/AS_DCP_MXF.cpp
index f7f9db3..a7282df 100755
--- a/src/AS_DCP_MXF.cpp
+++ b/src/AS_DCP_MXF.cpp
@@ -248,7 +248,7 @@ ASDCP::EssenceType(const std::string& filename, EssenceType_t& type)
{
type = ESS_AS02_TIMED_TEXT;
}
- else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(IMFDynamicMetadataDescriptor))) )
+ else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(PIMFDynamicMetadataDescriptor))) )
{
type = ESS_DCDATA_UNKNOWN;
}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 614485e..816d5b5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,171 +1,171 @@
-find_library(OpenSSLLib_PATH NAMES libeay32 crypto PATHS "${PROJECT_SOURCE_DIR}/../openssl" "${PROJECT_SOURCE_DIR}/../lib/openssl" "$ENV{CMAKE_HINT}/openssl" ENV CMAKE_HINT PATH_SUFFIXES "lib" "openssl" "lib/openssl")
-find_path(OpenSSLLib_include_DIR NAMES openssl/rand.h PATHS "${PROJECT_SOURCE_DIR}/../openssl" "${PROJECT_SOURCE_DIR}/../lib/openssl" "$ENV{CMAKE_HINT}/openssl" ENV CMAKE_HINT PATH_SUFFIXES "include" "inc32")
-find_library(XercescppLib_PATH NAMES xerces-c xerces-c_3 PATHS "${PROJECT_SOURCE_DIR}/../xercescpp" "${PROJECT_SOURCE_DIR}/../lib/xercescpp" "$ENV{CMAKE_HINT}/xercescpp" ENV CMAKE_HINT PATH_SUFFIXES "lib")
-find_library(XercescppLib_Debug_PATH NAMES xerces-c xerces-c_3D PATHS "${PROJECT_SOURCE_DIR}/../xercescpp" "${PROJECT_SOURCE_DIR}/../lib/xercescpp" "$ENV{CMAKE_HINT}/xercescpp" ENV CMAKE_HINT PATH_SUFFIXES "lib")
-find_path(XercescppLib_include_DIR NAMES xercesc/dom/DOM.hpp PATHS "${PROJECT_SOURCE_DIR}/../xercescpp" "${PROJECT_SOURCE_DIR}/../lib/xercescpp" "$ENV{CMAKE_HINT}/xercescpp" ENV CMAKE_HINT PATH_SUFFIXES "include")
-set(UseRandomUUID OFF CACHE BOOL "")
-
-# This lib. doesn't export from dll with __declspec(dllexport). So this lib. must be built statically on Windows.
-if(NOT WIN32)
- set(BUILD_SHARED_LIBS true CACHE BOOL "Build shared or static libs?" FORCE)
-endif(NOT WIN32)
-
-# ----------libkumu----------
-# source
-set(kumu_src KM_fileio.cpp KM_log.cpp KM_prng.cpp KM_util.cpp KM_xml.cpp KM_tai.cpp)
-
-# header
-set(kumu_src ${kumu_src} KM_fileio.h KM_log.h KM_prng.h KM_util.h KM_xml.h KM_tai.h KM_error.h KM_memio.h KM_mutex.h KM_platform.h)
-
-# ----------libasdcp----------
-# source
-set(asdcp_src MPEG2_Parser.cpp MPEG.cpp JP2K_Codestream_Parser.cpp JP2K_Sequence_Parser.cpp JP2K.cpp PCM_Parser.cpp Wav.cpp
- TimedText_Parser.cpp KLV.cpp Dict.cpp MXFTypes.cpp MXF.cpp Index.cpp Metadata.cpp AS_DCP.cpp AS_DCP_MXF.cpp AS_DCP_AES.cpp
- h__Reader.cpp h__Writer.cpp AS_DCP_MPEG2.cpp AS_DCP_JP2K.cpp AS_DCP_PCM.cpp AS_DCP_TimedText.cpp PCMParserList.cpp MDD.cpp
- AS_DCP_ATMOS.cpp AS_DCP_DCData.cpp DCData_ByteStream_Parser.cpp DCData_Sequence_Parser.cpp AtmosSyncChannel_Generator.cpp
- AtmosSyncChannel_Mixer.cpp PCMDataProviders.cpp SyncEncoder.c CRC16.c UUIDInformation.c
-)
-
-# header for deployment (install target)
-set(asdcp_deploy_header AS_DCP.h PCMParserList.h AS_DCP_internal.h KM_error.h KM_fileio.h KM_util.h KM_memio.h KM_tai.h KM_platform.h KM_log.h KM_mutex.h)
-
-# header
-set(asdcp_src ${asdcp_src} Wav.h WavFileWriter.h MXF.h Metadata.h JP2K.h AS_DCP.h AS_DCP_internal.h KLV.h MPEG.h MXFTypes.h MDD.h
- PCMParserList.h S12MTimecode.h AtmosSyncChannel_Generator.h AtmosSyncChannel_Mixer.h PCMDataProviders.h
- SyncEncoder.h SyncCommon.h CRC16.h UUIDInformation.h
-)
-
-# ----------as02----------
-# source
-set(as02_src h__02_Reader.cpp h__02_Writer.cpp AS_02_JP2K.cpp AS_02_PCM.cpp ST2052_TextParser.cpp AS_02_TimedText.cpp)
-
-# header for deployment (install target)
-set(as02_deploy_header AS_02.h Metadata.h MXF.h MXFTypes.h KLV.h MDD.h)
-
-# header
-set(as02_src ${as02_src} AS_02.h AS_02_internal.h)
-
-
-include_directories("${PROJECT_SOURCE_DIR}/src" "${OpenSSLLib_include_DIR}" "${XercescppLib_include_DIR}")
-
-add_definitions(/DPACKAGE_VERSION=\"${VERSION_STRING}\" /DHAVE_XERCES_C=1)
-if(WIN32)
- add_definitions(/DKM_WIN32 /D_CONSOLE /DASDCP_PLATFORM=\"win32\" /D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_WARNINGS)
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
-elseif(UNIX)
- add_definitions(/DASDCP_PLATFORM=\"unix\")
-endif(WIN32)
-
-if(UseRandomUUID)
- add_definitions(/DCONFIG_RANDOM_UUID=1)
-endif(UseRandomUUID)
-
-set(CMAKE_DEBUG_POSTFIX _d) # Append "_d" if debug lib.
-
-add_library(libkumu ${kumu_src})
-target_link_libraries(libkumu general "${OpenSSLLib_PATH}" debug "${XercescppLib_Debug_PATH}" optimized "${XercescppLib_PATH}")
-set_target_properties(libkumu PROPERTIES PREFIX "" VERSION ${VERSION_STRING} SOVERSION ${VERSION_MAJOR})
-
-add_library(libasdcp ${asdcp_src})
-target_link_libraries(libasdcp general libkumu)
-set_target_properties(libasdcp PROPERTIES PREFIX "" VERSION ${VERSION_STRING} SOVERSION ${VERSION_MAJOR})
-
-add_library(libas02 ${as02_src})
-target_link_libraries(libas02 general libasdcp)
-set_target_properties(libas02 PROPERTIES PREFIX "" VERSION ${VERSION_STRING} SOVERSION ${VERSION_MAJOR})
-
-add_executable(blackwave "blackwave.cpp")
-target_link_libraries(blackwave general libasdcp)
-if(WIN32)
- target_link_libraries(blackwave general Advapi32.lib)
-endif(WIN32)
-
-add_executable(wavesplit "wavesplit.cpp")
-target_link_libraries(wavesplit general libasdcp)
-if(WIN32)
- target_link_libraries(wavesplit general Advapi32.lib)
-endif(WIN32)
-
-add_executable(kmuuidgen "kmuuidgen.cpp")
-target_link_libraries(kmuuidgen general libkumu)
-if(WIN32)
- target_link_libraries(kmuuidgen general Advapi32.lib)
-endif(WIN32)
-
-add_executable(kmrandgen "kmrandgen.cpp")
-target_link_libraries(kmrandgen general libkumu)
-if(WIN32)
- target_link_libraries(kmrandgen general Advapi32.lib)
-endif(WIN32)
-
-add_executable(kmfilegen "kmfilegen.cpp")
-target_link_libraries(kmfilegen general libkumu)
-if(WIN32)
- target_link_libraries(kmfilegen general Advapi32.lib)
-endif(WIN32)
-
-add_executable(klvwalk "klvwalk.cpp")
-target_link_libraries(klvwalk general libasdcp)
-if(WIN32)
- target_link_libraries(klvwalk general Advapi32.lib)
-endif(WIN32)
-
-add_executable(asdcp-test "asdcp-test.cpp")
-target_link_libraries(asdcp-test general libasdcp)
-if(WIN32)
- target_link_libraries(asdcp-test general Advapi32.lib)
-endif(WIN32)
-
-add_executable(asdcp-wrap "asdcp-wrap.cpp")
-target_link_libraries(asdcp-wrap general libasdcp)
-if(WIN32)
- target_link_libraries(asdcp-wrap general Advapi32.lib)
-endif(WIN32)
-
-add_executable(asdcp-unwrap "asdcp-unwrap.cpp")
-target_link_libraries(asdcp-unwrap general libasdcp)
-if(WIN32)
- target_link_libraries(asdcp-unwrap general Advapi32.lib)
-endif(WIN32)
-
-add_executable(asdcp-info "asdcp-info.cpp")
-target_link_libraries(asdcp-info general libasdcp)
-if(WIN32)
- target_link_libraries(asdcp-info general Advapi32.lib)
-endif(WIN32)
-
-add_executable(asdcp-util "asdcp-util.cpp")
-target_link_libraries(asdcp-util general libasdcp)
-if(WIN32)
- target_link_libraries(asdcp-util general Advapi32.lib)
-endif(WIN32)
-
-add_executable(j2c-test "j2c-test.cpp")
-target_link_libraries(j2c-test general libasdcp)
-if(WIN32)
- target_link_libraries(j2c-test general Advapi32.lib)
-endif(WIN32)
-
-add_executable(as-02-wrap "as-02-wrap.cpp")
-target_link_libraries(as-02-wrap general libas02)
-if(WIN32)
- target_link_libraries(as-02-wrap general Advapi32.lib)
-endif(WIN32)
-
-add_executable(as-02-unwrap "as-02-unwrap.cpp")
-target_link_libraries(as-02-unwrap general libas02)
-if(WIN32)
- target_link_libraries(as-02-unwrap general Advapi32.lib)
-endif(WIN32)
-
-add_executable(as-02-info "as-02-info.cpp")
-target_link_libraries(as-02-info general libas02)
-if(WIN32)
- target_link_libraries(as-02-info general Advapi32.lib)
-endif(WIN32)
-
-# add the install target
-install(TARGETS libkumu libasdcp libas02 EXPORT asdcplibtargets RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib INCLUDES DESTINATION "${OpenSSLLib_include_DIR}" "${XercescppLib_include_DIR}")
-install(TARGETS blackwave wavesplit kmuuidgen kmrandgen kmfilegen klvwalk asdcp-test asdcp-wrap asdcp-unwrap asdcp-info asdcp-util j2c-test as-02-wrap as-02-unwrap as-02-info RUNTIME DESTINATION bin)
-install(FILES ${as02_deploy_header} ${asdcp_deploy_header} DESTINATION include)
-install(EXPORT asdcplibtargets DESTINATION targets)
+find_library(OpenSSLLib_PATH NAMES libeay32 crypto PATHS "${PROJECT_SOURCE_DIR}/../openssl" "${PROJECT_SOURCE_DIR}/../lib/openssl" "$ENV{CMAKE_HINT}/openssl" ENV CMAKE_HINT PATH_SUFFIXES "lib" "openssl" "lib/openssl")
+find_path(OpenSSLLib_include_DIR NAMES openssl/rand.h PATHS "${PROJECT_SOURCE_DIR}/../openssl" "${PROJECT_SOURCE_DIR}/../lib/openssl" "$ENV{CMAKE_HINT}/openssl" ENV CMAKE_HINT PATH_SUFFIXES "include" "inc32")
+find_library(XercescppLib_PATH NAMES xerces-c xerces-c_3 PATHS "${PROJECT_SOURCE_DIR}/../xercescpp" "${PROJECT_SOURCE_DIR}/../lib/xercescpp" "$ENV{CMAKE_HINT}/xercescpp" ENV CMAKE_HINT PATH_SUFFIXES "lib")
+find_library(XercescppLib_Debug_PATH NAMES xerces-c xerces-c_3D PATHS "${PROJECT_SOURCE_DIR}/../xercescpp" "${PROJECT_SOURCE_DIR}/../lib/xercescpp" "$ENV{CMAKE_HINT}/xercescpp" ENV CMAKE_HINT PATH_SUFFIXES "lib")
+find_path(XercescppLib_include_DIR NAMES xercesc/dom/DOM.hpp PATHS "${PROJECT_SOURCE_DIR}/../xercescpp" "${PROJECT_SOURCE_DIR}/../lib/xercescpp" "$ENV{CMAKE_HINT}/xercescpp" ENV CMAKE_HINT PATH_SUFFIXES "include")
+set(UseRandomUUID OFF CACHE BOOL "")
+
+# This lib. doesn't export from dll with __declspec(dllexport). So this lib. must be built statically on Windows.
+if(NOT WIN32)
+ set(BUILD_SHARED_LIBS true CACHE BOOL "Build shared or static libs?" FORCE)
+endif(NOT WIN32)
+
+# ----------libkumu----------
+# source
+set(kumu_src KM_fileio.cpp KM_log.cpp KM_prng.cpp KM_util.cpp KM_xml.cpp KM_tai.cpp)
+
+# header
+set(kumu_src ${kumu_src} KM_fileio.h KM_log.h KM_prng.h KM_util.h KM_xml.h KM_tai.h KM_error.h KM_memio.h KM_mutex.h KM_platform.h dirent_win.h)
+
+# ----------libasdcp----------
+# source
+set(asdcp_src MPEG2_Parser.cpp MPEG.cpp JP2K_Codestream_Parser.cpp JP2K_Sequence_Parser.cpp JP2K.cpp PCM_Parser.cpp Wav.cpp
+ TimedText_Parser.cpp KLV.cpp Dict.cpp MXFTypes.cpp MXF.cpp Index.cpp Metadata.cpp AS_DCP.cpp AS_DCP_MXF.cpp AS_DCP_AES.cpp
+ h__Reader.cpp h__Writer.cpp AS_DCP_MPEG2.cpp AS_DCP_JP2K.cpp AS_DCP_PCM.cpp AS_DCP_TimedText.cpp PCMParserList.cpp MDD.cpp
+ AS_DCP_ATMOS.cpp AS_DCP_DCData.cpp DCData_ByteStream_Parser.cpp DCData_Sequence_Parser.cpp AtmosSyncChannel_Generator.cpp
+ AtmosSyncChannel_Mixer.cpp PCMDataProviders.cpp SyncEncoder.c CRC16.c UUIDInformation.c
+)
+
+# header for deployment (install target)
+set(asdcp_deploy_header AS_DCP.h PCMParserList.h AS_DCP_internal.h KM_error.h KM_fileio.h KM_util.h KM_memio.h KM_tai.h KM_platform.h KM_log.h KM_mutex.h)
+
+# header
+set(asdcp_src ${asdcp_src} Wav.h WavFileWriter.h MXF.h Metadata.h JP2K.h AS_DCP.h AS_DCP_internal.h KLV.h MPEG.h MXFTypes.h MDD.h
+ PCMParserList.h S12MTimecode.h AtmosSyncChannel_Generator.h AtmosSyncChannel_Mixer.h PCMDataProviders.h
+ SyncEncoder.h SyncCommon.h CRC16.h UUIDInformation.h
+)
+
+# ----------as02----------
+# source
+set(as02_src h__02_Reader.cpp h__02_Writer.cpp AS_02_JP2K.cpp AS_02_PCM.cpp ST2052_TextParser.cpp AS_02_TimedText.cpp)
+
+# header for deployment (install target)
+set(as02_deploy_header AS_02.h Metadata.h MXF.h MXFTypes.h KLV.h MDD.h)
+
+# header
+set(as02_src ${as02_src} AS_02.h AS_02_internal.h)
+
+
+include_directories("${PROJECT_SOURCE_DIR}/src" "${OpenSSLLib_include_DIR}" "${XercescppLib_include_DIR}")
+
+add_definitions(/DPACKAGE_VERSION=\"${VERSION_STRING}\" /DHAVE_XERCES_C=1)
+if(WIN32)
+ add_definitions(/DKM_WIN32 /D_CONSOLE /DASDCP_PLATFORM=\"win32\" /D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_WARNINGS)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
+elseif(UNIX)
+ add_definitions(/DASDCP_PLATFORM=\"unix\")
+endif(WIN32)
+
+if(UseRandomUUID)
+ add_definitions(/DCONFIG_RANDOM_UUID=1)
+endif(UseRandomUUID)
+
+set(CMAKE_DEBUG_POSTFIX _d) # Append "_d" if debug lib.
+
+add_library(libkumu ${kumu_src})
+target_link_libraries(libkumu general "${OpenSSLLib_PATH}" debug "${XercescppLib_Debug_PATH}" optimized "${XercescppLib_PATH}")
+set_target_properties(libkumu PROPERTIES PREFIX "" VERSION ${VERSION_STRING} SOVERSION ${VERSION_MAJOR})
+
+add_library(libasdcp ${asdcp_src})
+target_link_libraries(libasdcp general libkumu)
+set_target_properties(libasdcp PROPERTIES PREFIX "" VERSION ${VERSION_STRING} SOVERSION ${VERSION_MAJOR})
+
+add_library(libas02 ${as02_src})
+target_link_libraries(libas02 general libasdcp)
+set_target_properties(libas02 PROPERTIES PREFIX "" VERSION ${VERSION_STRING} SOVERSION ${VERSION_MAJOR})
+
+add_executable(blackwave "blackwave.cpp")
+target_link_libraries(blackwave general libasdcp)
+if(WIN32)
+ target_link_libraries(blackwave general Advapi32.lib)
+endif(WIN32)
+
+add_executable(wavesplit "wavesplit.cpp")
+target_link_libraries(wavesplit general libasdcp)
+if(WIN32)
+ target_link_libraries(wavesplit general Advapi32.lib)
+endif(WIN32)
+
+add_executable(kmuuidgen "kmuuidgen.cpp")
+target_link_libraries(kmuuidgen general libkumu)
+if(WIN32)
+ target_link_libraries(kmuuidgen general Advapi32.lib)
+endif(WIN32)
+
+add_executable(kmrandgen "kmrandgen.cpp")
+target_link_libraries(kmrandgen general libkumu)
+if(WIN32)
+ target_link_libraries(kmrandgen general Advapi32.lib)
+endif(WIN32)
+
+add_executable(kmfilegen "kmfilegen.cpp")
+target_link_libraries(kmfilegen general libkumu)
+if(WIN32)
+ target_link_libraries(kmfilegen general Advapi32.lib)
+endif(WIN32)
+
+add_executable(klvwalk "klvwalk.cpp")
+target_link_libraries(klvwalk general libasdcp)
+if(WIN32)
+ target_link_libraries(klvwalk general Advapi32.lib)
+endif(WIN32)
+
+add_executable(asdcp-test "asdcp-test.cpp")
+target_link_libraries(asdcp-test general libasdcp)
+if(WIN32)
+ target_link_libraries(asdcp-test general Advapi32.lib)
+endif(WIN32)
+
+add_executable(asdcp-wrap "asdcp-wrap.cpp")
+target_link_libraries(asdcp-wrap general libasdcp)
+if(WIN32)
+ target_link_libraries(asdcp-wrap general Advapi32.lib)
+endif(WIN32)
+
+add_executable(asdcp-unwrap "asdcp-unwrap.cpp")
+target_link_libraries(asdcp-unwrap general libasdcp)
+if(WIN32)
+ target_link_libraries(asdcp-unwrap general Advapi32.lib)
+endif(WIN32)
+
+add_executable(asdcp-info "asdcp-info.cpp")
+target_link_libraries(asdcp-info general libasdcp)
+if(WIN32)
+ target_link_libraries(asdcp-info general Advapi32.lib)
+endif(WIN32)
+
+add_executable(asdcp-util "asdcp-util.cpp")
+target_link_libraries(asdcp-util general libasdcp)
+if(WIN32)
+ target_link_libraries(asdcp-util general Advapi32.lib)
+endif(WIN32)
+
+add_executable(j2c-test "j2c-test.cpp")
+target_link_libraries(j2c-test general libasdcp)
+if(WIN32)
+ target_link_libraries(j2c-test general Advapi32.lib)
+endif(WIN32)
+
+add_executable(as-02-wrap "as-02-wrap.cpp")
+target_link_libraries(as-02-wrap general libas02)
+if(WIN32)
+ target_link_libraries(as-02-wrap general Advapi32.lib)
+endif(WIN32)
+
+add_executable(as-02-unwrap "as-02-unwrap.cpp")
+target_link_libraries(as-02-unwrap general libas02)
+if(WIN32)
+ target_link_libraries(as-02-unwrap general Advapi32.lib)
+endif(WIN32)
+
+add_executable(as-02-info "as-02-info.cpp")
+target_link_libraries(as-02-info general libas02)
+if(WIN32)
+ target_link_libraries(as-02-info general Advapi32.lib)
+endif(WIN32)
+
+# add the install target
+install(TARGETS libkumu libasdcp libas02 EXPORT asdcplibtargets RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib INCLUDES DESTINATION "${OpenSSLLib_include_DIR}" "${XercescppLib_include_DIR}")
+install(TARGETS blackwave wavesplit kmuuidgen kmrandgen kmfilegen klvwalk asdcp-test asdcp-wrap asdcp-unwrap asdcp-info asdcp-util j2c-test as-02-wrap as-02-unwrap as-02-info RUNTIME DESTINATION bin)
+install(FILES ${as02_deploy_header} ${asdcp_deploy_header} DESTINATION include)
+install(EXPORT asdcplibtargets DESTINATION targets)
diff --git a/src/MDD.cpp b/src/MDD.cpp
index d8f3be7..380d8f4 100644
--- a/src/MDD.cpp
+++ b/src/MDD.cpp
@@ -70,7 +70,7 @@ static const ASDCP::MDDEntry s_MDD_Table[] = {
{0}, false, "MPEG2_VESWrappingFrame" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x07, // 11
0x0d, 0x01, 0x03, 0x01, 0x02, 0x0c, 0x01, 0x00 },
- {0}, false, "JPEG_2000WrappingFrame" },
+ {0}, false, "MXFGCFUFrameWrappedPictureElement" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x02, 0x01, 0x01, // 12
0x0d, 0x01, 0x03, 0x01, 0x15, 0x01, 0x08, 0x00 },
{0}, false, "JPEG2000Essence" },
@@ -1226,16 +1226,24 @@ static const ASDCP::MDDEntry s_MDD_Table[] = {
// protype for generic aux data (IMF)
{ { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x05, // 392
0x0e, 0x09, 0x06, 0x07, 0x01, 0x01, 0x10, 0x00 },
- {0}, false, "IMFDynamicMetadataWrappingFrame" },
+ {0}, false, "PIMFDynamicMetadataWrappingFrame" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x02, 0x01, 0x05, // 393
0x0e, 0x09, 0x06, 0x07, 0x01, 0x01, 0x11, 0x00 },
- {0}, false, "IMFDynamicMetadataEssence" },
+ {0}, false, "PIMFDynamicMetadataEssence" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x02, 0x53, 0x01, 0x05, // 394
0x0e, 0x09, 0x06, 0x07, 0x01, 0x01, 0x12, 0x00 },
- {0}, false, "IMFDynamicMetadataDescriptor" },
+ {0}, false, "PIMFDynamicMetadataDescriptor" },
{ { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, // 395
0x0e, 0x09, 0x06, 0x07, 0x01, 0x01, 0x13, 0x00 },
- {0}, false, "IMFDynamicMetadataDescriptor_GlobalPayloadSID" },
+ {0}, false, "PIMFDynamicMetadataDescriptor_GlobalPayloadSID" },
+
+ //
+ { { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x0d, // 396
+ 0x0d, 0x01, 0x03, 0x01, 0x02, 0x0c, 0x03, 0x00 },
+ {0}, false, "MXFGCI1FrameWrappedPictureElement" },
+ { { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x0d, // 397
+ 0x0d, 0x01, 0x03, 0x01, 0x02, 0x0c, 0x06, 0x00 },
+ {0}, false, "MXFGCP1FrameWrappedPictureElement" },
{ {0}, {0}, false, 0 }
};
diff --git a/src/MDD.h b/src/MDD.h
index 7240ba2..123be96 100755
--- a/src/MDD.h
+++ b/src/MDD.h
@@ -46,7 +46,7 @@ namespace ASDCP {
MDD_DescriptiveMetaDataDef, // 8
MDD_WAVWrappingFrame, // 9
MDD_MPEG2_VESWrappingFrame, // 10
- MDD_JPEG_2000WrappingFrame, // 11
+ MDD_MXFGCFUFrameWrappedPictureElement, // 11
MDD_JPEG2000Essence, // 12
MDD_MPEG2Essence, // 13
MDD_MXFInterop_CryptEssence, // 14
@@ -419,7 +419,6 @@ namespace ASDCP {
MDD_PrivateDCDataWrappingFrame, // 381
MDD_PrivateDCDataEssence, // 382
MDD_PrivateDCDataDescriptor, // 383
-
MDD_MCALabelSubDescriptor_MCATitle, // 384
MDD_MCALabelSubDescriptor_MCATitleVersion, // 385
MDD_MCALabelSubDescriptor_MCATitleSubVersion, // 386
@@ -428,11 +427,15 @@ namespace ASDCP {
MDD_MCALabelSubDescriptor_MCAPartitionNumber, // 389
MDD_MCALabelSubDescriptor_MCAAudioContentKind, // 390
MDD_MCALabelSubDescriptor_MCAAudioElementKind, // 391
+ MDD_PIMFDynamicMetadataWrappingFrame, // 392
+ MDD_PIMFDynamicMetadataEssence, // 393
+ MDD_PIMFDynamicMetadataDescriptor, // 394
+ MDD_PIMFDynamicMetadataDescriptor_GlobalPayloadSID, // 395
+
+ //
+ MDD_MXFGCI1FrameWrappedPictureElement, // 396
+ MDD_MXFGCP1FrameWrappedPictureElement, // 397
- MDD_IMFDynamicMetadataWrappingFrame, // 392
- MDD_IMFDynamicMetadataEssence, // 393
- MDD_IMFDynamicMetadataDescriptor, // 394
- MDD_IMFDynamicMetadataDescriptor_GlobalPayloadSID, // 395
MDD_Max
}; // enum MDD_t
diff --git a/src/MXFTypes.h b/src/MXFTypes.h
index 48dbf3f..c212110 100755
--- a/src/MXFTypes.h
+++ b/src/MXFTypes.h
@@ -387,9 +387,9 @@ namespace ASDCP
inline virtual bool Unarchive(Kumu::MemIOReader* Reader) {
ui32_t n;
if ( ! Reader->ReadUi32BE(&n) ) return false;
- if ( n != 4 ) return false;
- if ( ! Reader->ReadUi32BE(&n) ) return false;
if ( n != 2 ) return false;
+ if ( ! Reader->ReadUi32BE(&n) ) return false;
+ if ( n != 4 ) return false;
if ( ! Reader->ReadUi32BE((ui32_t*)&First) ) return false;
if ( ! Reader->ReadUi32BE((ui32_t*)&Second) ) return false;
return true;
@@ -399,8 +399,8 @@ namespace ASDCP
inline virtual ui32_t ArchiveLength() const { return sizeof(ui32_t)*4; }
inline virtual bool Archive(Kumu::MemIOWriter* Writer) const {
- if ( ! Writer->WriteUi32BE(4UL) ) return false;
if ( ! Writer->WriteUi32BE(2UL) ) return false;
+ if ( ! Writer->WriteUi32BE(4UL) ) return false;
if ( ! Writer->WriteUi32BE((ui32_t)First) ) return false;
if ( ! Writer->WriteUi32BE((ui32_t)Second) ) return false;
return true;
diff --git a/src/Makefile.am b/src/Makefile.am
index 5b7158f..be4c81c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -143,7 +143,6 @@ libas02_la_SOURCES = \
h__02_Writer.cpp \
AS_02_JP2K.cpp \
AS_02_PCM.cpp \
- AS_02_AUX_DATA.cpp \
ST2052_TextParser.cpp \
AS_02_TimedText.cpp
@@ -158,7 +157,8 @@ if USE_PHDR
libphdr_la_SOURCES = \
AS_02_PHDR.h \
PHDR_Sequence_Parser.cpp \
- AS_02_PHDR.cpp
+ AS_02_PHDR.cpp \
+ AS_02_PIDM.cpp
libphdr_la_LDFLAGS = -release @VERSION@
libphdr_la_LIBADD = libasdcp.la libkumu.la
@@ -338,7 +338,7 @@ TESTS_ENVIRONMENT = BUILD_DIR="." TEST_FILES=../tests TEST_FILE_PREFIX=DCPd1-M1
JP2K_PREFIX=MM_2k_XYZ_
# files to include in the distribution that automake doesn't automatically include
-EXTRA_DIST = fips-186-test-harness.pl $(TESTS) ../README.cmake ../CMakeLists.txt CMakeLists.txt
+EXTRA_DIST = fips-186-test-harness.pl $(TESTS) ../README.cmake ../CMakeLists.txt CMakeLists.txt dirent_win.h
if !FREEDIST
if DEV_HEADERS
EXTRA_DIST += $(nodist_libasdcp_la_SOURCES) $(nodist_tt_xform_SOURCES)
diff --git a/src/Metadata.cpp b/src/Metadata.cpp
index 8662cfd..eed362b 100755
--- a/src/Metadata.cpp
+++ b/src/Metadata.cpp
@@ -78,7 +78,7 @@ static InterchangeObject* DCDataDescriptor_Factory(const Dictionary*& Dict) { re
static InterchangeObject* PrivateDCDataDescriptor_Factory(const Dictionary*& Dict) { return new PrivateDCDataDescriptor(Dict); }
static InterchangeObject* DolbyAtmosSubDescriptor_Factory(const Dictionary*& Dict) { return new DolbyAtmosSubDescriptor(Dict); }
static InterchangeObject* PHDRMetadataTrackSubDescriptor_Factory(const Dictionary*& Dict) { return new PHDRMetadataTrackSubDescriptor(Dict); }
-static InterchangeObject* IMFDynamicMetadataDescriptor_Factory(const Dictionary*& Dict) { return new IMFDynamicMetadataDescriptor(Dict); }
+static InterchangeObject* PIMFDynamicMetadataDescriptor_Factory(const Dictionary*& Dict) { return new PIMFDynamicMetadataDescriptor(Dict); }
void
@@ -123,7 +123,7 @@ ASDCP::MXF::Metadata_InitTypes(const Dictionary*& Dict)
SetObjectFactory(Dict->ul(MDD_PrivateDCDataDescriptor), PrivateDCDataDescriptor_Factory);
SetObjectFactory(Dict->ul(MDD_DolbyAtmosSubDescriptor), DolbyAtmosSubDescriptor_Factory);
SetObjectFactory(Dict->ul(MDD_PHDRMetadataTrackSubDescriptor), PHDRMetadataTrackSubDescriptor_Factory);
- SetObjectFactory(Dict->ul(MDD_IMFDynamicMetadataDescriptor), IMFDynamicMetadataDescriptor_Factory);
+ SetObjectFactory(Dict->ul(MDD_PIMFDynamicMetadataDescriptor), PIMFDynamicMetadataDescriptor_Factory);
}
//------------------------------------------------------------------------------------------
@@ -1947,6 +1947,7 @@ RGBAEssenceDescriptor::InitFromTLVSet(TLVReader& TLVSet)
result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(RGBAEssenceDescriptor, ScanningDirection));
ScanningDirection.set_has_value( result == RESULT_OK );
}
+ if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(RGBAEssenceDescriptor, PixelLayout));
return result;
}
@@ -1961,6 +1962,7 @@ RGBAEssenceDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
if ( ASDCP_SUCCESS(result) && ! AlphaMinRef.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(RGBAEssenceDescriptor, AlphaMinRef));
if ( ASDCP_SUCCESS(result) && ! AlphaMaxRef.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(RGBAEssenceDescriptor, AlphaMaxRef));
if ( ASDCP_SUCCESS(result) && ! ScanningDirection.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(RGBAEssenceDescriptor, ScanningDirection));
+ if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(RGBAEssenceDescriptor, PixelLayout));
return result;
}
@@ -1974,6 +1976,7 @@ RGBAEssenceDescriptor::Copy(const RGBAEssenceDescriptor& rhs)
AlphaMinRef = rhs.AlphaMinRef;
AlphaMaxRef = rhs.AlphaMaxRef;
ScanningDirection = rhs.ScanningDirection;
+ PixelLayout = rhs.PixelLayout;
}
//
@@ -2002,6 +2005,7 @@ RGBAEssenceDescriptor::Dump(FILE* stream)
if ( ! ScanningDirection.empty() ) {
fprintf(stream, " %22s = %d\n", "ScanningDirection", ScanningDirection.get());
}
+ fprintf(stream, " %22s = %s\n", "PixelLayout", PixelLayout.EncodeString(identbuf, IdentBufferLen));
}
//
@@ -3931,47 +3935,47 @@ PHDRMetadataTrackSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
}
//------------------------------------------------------------------------------------------
-// IMFDynamicMetadataDescriptor
+// PIMFDynamicMetadataDescriptor
//
-IMFDynamicMetadataDescriptor::IMFDynamicMetadataDescriptor(const Dictionary*& d) : GenericDataEssenceDescriptor(d), m_Dict(d), GlobalPayloadSID(0)
+PIMFDynamicMetadataDescriptor::PIMFDynamicMetadataDescriptor(const Dictionary*& d) : GenericDataEssenceDescriptor(d), m_Dict(d), GlobalPayloadSID(0)
{
assert(m_Dict);
- m_UL = m_Dict->ul(MDD_IMFDynamicMetadataDescriptor);
+ m_UL = m_Dict->ul(MDD_PIMFDynamicMetadataDescriptor);
}
-IMFDynamicMetadataDescriptor::IMFDynamicMetadataDescriptor(const IMFDynamicMetadataDescriptor& rhs) : GenericDataEssenceDescriptor(rhs.m_Dict), m_Dict(rhs.m_Dict)
+PIMFDynamicMetadataDescriptor::PIMFDynamicMetadataDescriptor(const PIMFDynamicMetadataDescriptor& rhs) : GenericDataEssenceDescriptor(rhs.m_Dict), m_Dict(rhs.m_Dict)
{
assert(m_Dict);
- m_UL = m_Dict->ul(MDD_IMFDynamicMetadataDescriptor);
+ m_UL = m_Dict->ul(MDD_PIMFDynamicMetadataDescriptor);
Copy(rhs);
}
//
ASDCP::Result_t
-IMFDynamicMetadataDescriptor::InitFromTLVSet(TLVReader& TLVSet)
+PIMFDynamicMetadataDescriptor::InitFromTLVSet(TLVReader& TLVSet)
{
assert(m_Dict);
Result_t result = GenericDataEssenceDescriptor::InitFromTLVSet(TLVSet);
- if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(IMFDynamicMetadataDescriptor, GlobalPayloadSID));
+ if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(PIMFDynamicMetadataDescriptor, GlobalPayloadSID));
return result;
}
//
ASDCP::Result_t
-IMFDynamicMetadataDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
+PIMFDynamicMetadataDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
{
assert(m_Dict);
Result_t result = GenericDataEssenceDescriptor::WriteToTLVSet(TLVSet);
- if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(IMFDynamicMetadataDescriptor, GlobalPayloadSID));
+ if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(PIMFDynamicMetadataDescriptor, GlobalPayloadSID));
return result;
}
//
void
-IMFDynamicMetadataDescriptor::Copy(const IMFDynamicMetadataDescriptor& rhs)
+PIMFDynamicMetadataDescriptor::Copy(const PIMFDynamicMetadataDescriptor& rhs)
{
GenericDataEssenceDescriptor::Copy(rhs);
GlobalPayloadSID = rhs.GlobalPayloadSID;
@@ -3979,7 +3983,7 @@ IMFDynamicMetadataDescriptor::Copy(const IMFDynamicMetadataDescriptor& rhs)
//
void
-IMFDynamicMetadataDescriptor::Dump(FILE* stream)
+PIMFDynamicMetadataDescriptor::Dump(FILE* stream)
{
char identbuf[IdentBufferLen];
*identbuf = 0;
@@ -3993,14 +3997,14 @@ IMFDynamicMetadataDescriptor::Dump(FILE* stream)
//
ASDCP::Result_t
-IMFDynamicMetadataDescriptor::InitFromBuffer(const byte_t* p, ui32_t l)
+PIMFDynamicMetadataDescriptor::InitFromBuffer(const byte_t* p, ui32_t l)
{
return InterchangeObject::InitFromBuffer(p, l);
}
//
ASDCP::Result_t
-IMFDynamicMetadataDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
+PIMFDynamicMetadataDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
{
return InterchangeObject::WriteToBuffer(Buffer);
}
diff --git a/src/Metadata.h b/src/Metadata.h
index e5133e8..dafd727 100755
--- a/src/Metadata.h
+++ b/src/Metadata.h
@@ -530,6 +530,7 @@ namespace ASDCP
optional_property<ui32_t > AlphaMinRef;
optional_property<ui32_t > AlphaMaxRef;
optional_property<ui8_t > ScanningDirection;
+ RGBALayout PixelLayout;
RGBAEssenceDescriptor(const Dictionary*& d);
RGBAEssenceDescriptor(const RGBAEssenceDescriptor& rhs);
@@ -1064,21 +1065,21 @@ namespace ASDCP
};
//
- class IMFDynamicMetadataDescriptor : public GenericDataEssenceDescriptor
+ class PIMFDynamicMetadataDescriptor : public GenericDataEssenceDescriptor
{
- IMFDynamicMetadataDescriptor();
+ PIMFDynamicMetadataDescriptor();
public:
const Dictionary*& m_Dict;
ui32_t GlobalPayloadSID;
- IMFDynamicMetadataDescriptor(const Dictionary*& d);
- IMFDynamicMetadataDescriptor(const IMFDynamicMetadataDescriptor& rhs);
- virtual ~IMFDynamicMetadataDescriptor() {}
+ PIMFDynamicMetadataDescriptor(const Dictionary*& d);
+ PIMFDynamicMetadataDescriptor(const PIMFDynamicMetadataDescriptor& rhs);
+ virtual ~PIMFDynamicMetadataDescriptor() {}
- const IMFDynamicMetadataDescriptor& operator=(const IMFDynamicMetadataDescriptor& rhs) { Copy(rhs); return *this; }
- virtual void Copy(const IMFDynamicMetadataDescriptor& rhs);
- virtual const char* HasName() { return "IMFDynamicMetadataDescriptor"; }
+ const PIMFDynamicMetadataDescriptor& operator=(const PIMFDynamicMetadataDescriptor& rhs) { Copy(rhs); return *this; }
+ virtual void Copy(const PIMFDynamicMetadataDescriptor& rhs);
+ virtual const char* HasName() { return "PIMFDynamicMetadataDescriptor"; }
virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
virtual Result_t WriteToTLVSet(TLVWriter& TLVSet);
virtual void Dump(FILE* = 0);
diff --git a/src/as-02-unwrap.cpp b/src/as-02-unwrap.cpp
index 3c100b9..190204a 100755
--- a/src/as-02-unwrap.cpp
+++ b/src/as-02-unwrap.cpp
@@ -97,9 +97,7 @@ Options:\n\
-b <buffer-size> - Specify size in bytes of picture frame buffer\n\
Defaults to 4,194,304 (4MB)\n\
-d <duration> - Number of frames to process, default all\n\
- -e <extension> - Extension to use for aux data files. default \"bin\"\n\
-f <start-frame> - Starting frame number, default 0\n\
- -g <filename> - Extract global metadata to the named file.\n\
-h | -help - Show help\n\
-k <key-string> - Use key for ciphertext operations\n\
-m - verify HMAC values when reading\n\
@@ -147,7 +145,7 @@ public:
PCM::ChannelFormat_t channel_fmt; // audio channel arrangement
const char* input_filename;
const char* extension;
- std::string global_metadata_filename, prefix_buffer;
+ std::string prefix_buffer;
//
CommandOptions(int argc, const char** argv) :
@@ -156,7 +154,7 @@ public:
version_flag(false), help_flag(false), number_width(6),
start_frame(0), duration(0xffffffff), duration_flag(false), j2c_pedantic(true),
picture_rate(24), fb_size(FRAME_BUFFER_SIZE), file_prefix(0),
- input_filename(0), extension("bin")
+ input_filename(0)
{
memset(key_value, 0, KeyLen);
memset(key_id_value, 0, UUIDlen);
@@ -204,11 +202,6 @@ public:
start_frame = Kumu::xabs(strtol(argv[i], 0, 10));
break;
- case 'g':
- TEST_EXTRA_ARG(i, 'g');
- global_metadata_filename = argv[i];
- break;
-
case 'h': help_flag = true; break;
case 'm': read_hmac = true; break;
@@ -673,108 +666,6 @@ read_timed_text_file(CommandOptions& Options)
return result;
}
-// Read one or more plaintext DCData bytestreams from a plaintext ASDCP file
-// Read one or more plaintext DCData bytestreams from a ciphertext ASDCP file
-// Read one or more ciphertext DCData byestreams from a ciphertext ASDCP file
-//
-Result_t
-read_aux_data_file(CommandOptions& Options)
-{
- AESDecContext* Context = 0;
- HMACContext* HMAC = 0;
- AS_02::AuxData::MXFReader Reader;
- DCData::FrameBuffer FrameBuffer(Options.fb_size);
- ui32_t frame_count = 0;
-
- ASDCP::FrameBuffer global_metadata;
- Result_t result = Reader.OpenRead(Options.input_filename, global_metadata);
-
- if ( ASDCP_SUCCESS(result)
- && global_metadata.Size()
- && ! Options.global_metadata_filename.empty() )
- {
- ui32_t write_count = 0;
- Kumu::FileWriter Writer;
-
- result = Writer.OpenWrite(Options.global_metadata_filename);
-
- if ( ASDCP_SUCCESS(result) )
- {
- result = Writer.Write(global_metadata.RoData(), global_metadata.Size(), &write_count);
- }
-
- if ( ASDCP_SUCCESS(result) && global_metadata.Size() != write_count)
- {
- return RESULT_WRITEFAIL;
- }
- }
-
- if ( ASDCP_SUCCESS(result) )
- {
- frame_count = Reader.AS02IndexReader().GetDuration();
-
- if ( Options.verbose_flag )
- {
- fprintf(stderr, "Frame Buffer size: %u\n", Options.fb_size);
- }
- }
-
- if ( ASDCP_SUCCESS(result) && Options.key_flag )
- {
- Context = new AESDecContext;
- result = Context->InitKey(Options.key_value);
-
- if ( ASDCP_SUCCESS(result) && Options.read_hmac )
- {
- WriterInfo Info;
- Reader.FillWriterInfo(Info);
-
- if ( Info.UsesHMAC )
- {
- HMAC = new HMACContext;
- result = HMAC->InitKey(Options.key_value, Info.LabelSetType);
- }
- else
- {
- fputs("File does not contain HMAC values, ignoring -m option.\n", stderr);
- }
- }
- }
-
- ui32_t last_frame = Options.start_frame + ( Options.duration ? Options.duration : frame_count);
- if ( last_frame > frame_count )
- last_frame = frame_count;
-
- char name_format[64];
- snprintf(name_format, 64, "%%s%%0%du.%s", Options.number_width, Options.extension);
-
- for ( ui32_t i = Options.start_frame; ASDCP_SUCCESS(result) && i < last_frame; i++ )
- {
- result = Reader.ReadFrame(i, FrameBuffer, Context, HMAC);
-
- if ( ASDCP_SUCCESS(result) )
- {
- if ( ! Options.no_write_flag )
- {
- Kumu::FileWriter OutFile;
- char filename[256];
- ui32_t write_count;
- snprintf(filename, 256, name_format, Options.file_prefix, i);
- result = OutFile.OpenWrite(filename);
-
- if ( ASDCP_SUCCESS(result) )
- result = OutFile.Write(FrameBuffer.Data(), FrameBuffer.Size(), &write_count);
- }
-
- if ( Options.verbose_flag )
- FrameBuffer.Dump(stderr, Options.fb_dump_size);
- }
- }
-
- return result;
-}
-
-
//
int
main(int argc, const char** argv)
@@ -817,10 +708,6 @@ main(int argc, const char** argv)
result = read_timed_text_file(Options);
break;
- case ESS_DCDATA_UNKNOWN:
- result = read_aux_data_file(Options);
- break;
-
default:
fprintf(stderr, "%s: Unknown file type, not AS-02 essence.\n", Options.input_filename);
return 5;
diff --git a/src/as-02-wrap.cpp b/src/as-02-wrap.cpp
index 794f2be..98ff21e 100755
--- a/src/as-02-wrap.cpp
+++ b/src/as-02-wrap.cpp
@@ -141,7 +141,6 @@ Options:\n\
-e - Encrypt JP2K headers (default)\n\
-E - Do not encrypt JP2K headers\n\
-F (0|1) - Set field dominance for interlaced image (default: 0)\n\
- -g <filename> - Write global metadata from the named file.\n\
-i - Indicates input essence is interlaced fields (forces -Y)\n\
-j <key-id-str> - Write key ID instead of creating a random value\n\
-k <key-string> - Use key for ciphertext operations\n\
@@ -158,7 +157,6 @@ Options:\n\
-t <min> - Set RGB component minimum code value (default: 0)\n\
-T <max> - Set RGB component maximum code value (default: 1023)\n\
-u - Print UL catalog to stderr\n\
- -U <UL> - Set DataEssenceCoding UL value in an Aux Data file\n\
-v - Verbose, prints informative messages to stderr\n\
-W - Read input file only, do not write source file\n\
-x <int> - Horizontal subsampling degree (default: 2)\n\
@@ -203,7 +201,6 @@ public:
bool key_id_flag; // true if a key ID was given
byte_t key_id_value[UUIDlen];// value of given key ID (when key_id_flag is true)
byte_t asset_id_value[UUIDlen];// value of asset ID (when asset_id_flag is true)
- std::string global_metadata_filename, out_file; //
bool show_ul_values_flag; /// if true, dump the UL table before going tp work.
Kumu::PathList_t filenames; // list of filenames to be processed
@@ -230,8 +227,8 @@ public:
ui32_t partition_space; //Shim parameter partition_spacing
//
- UL aux_data_coding;
MXF::LineMapPair line_map;
+ std::string out_file; //
//
bool set_video_line_map(const std::string& arg)
@@ -375,11 +372,6 @@ public:
}
break;
- case 'g':
- TEST_EXTRA_ARG(i, 'g');
- global_metadata_filename = argv[i];
- break;
-
case 'h': help_flag = true; break;
case 'i':
@@ -474,15 +466,6 @@ public:
case 'u': show_ul_values_flag = true; break;
- case 'U':
- TEST_EXTRA_ARG(i, 'U');
- if ( ! aux_data_coding.DecodeHex(argv[i]) )
- {
- fprintf(stderr, "Error decoding UL value: %s\n", argv[i]);
- return;
- }
- break;
-
case 'V': version_flag = true; break;
case 'v': verbose_flag = true; break;
case 'W': no_write_flag = true; break;
@@ -1009,162 +992,6 @@ write_timed_text_file(CommandOptions& Options)
}
-// Write one or more plaintext Aux Data bytestreams to a plaintext AS-02 file
-// Write one or more plaintext Aux Data bytestreams to a ciphertext AS-02 file
-//
-Result_t
-write_aux_data_file(CommandOptions& Options)
-{
- AESEncContext* Context = 0;
- HMACContext* HMAC = 0;
- AS_02::AuxData::MXFWriter Writer;
- DCData::FrameBuffer FrameBuffer(Options.fb_size);
- DCData::SequenceParser Parser;
- byte_t IV_buf[CBC_BLOCK_SIZE];
- Kumu::FortunaRNG RNG;
-
- if ( ! Options.global_metadata_filename.empty() )
- {
- if ( ! Kumu::PathIsFile(Options.global_metadata_filename) )
- {
- fprintf(stderr, "No such file or filename: \"%s\".\n", Options.global_metadata_filename.c_str());
- return RESULT_PARAM;
- }
- }
-
- // set up essence parser
- Result_t result = Parser.OpenRead(Options.filenames.front());
-
- // set up MXF writer
- if ( ASDCP_SUCCESS(result) )
- {
-
- if ( Options.verbose_flag )
- {
- fprintf(stderr, "Aux Data\n");
- fprintf(stderr, "Frame Buffer size: %u\n", Options.fb_size);
- }
- }
-
- if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
- {
- WriterInfo Info = s_MyInfo; // fill in your favorite identifiers here
- if ( Options.asset_id_flag )
- memcpy(Info.AssetUUID, Options.asset_id_value, UUIDlen);
- else
- Kumu::GenRandomUUID(Info.AssetUUID);
-
- Info.LabelSetType = LS_MXF_SMPTE;
-
- // configure encryption
- if( Options.key_flag )
- {
- Kumu::GenRandomUUID(Info.ContextID);
- Info.EncryptedEssence = true;
-
- if ( Options.key_id_flag )
- {
- memcpy(Info.CryptographicKeyID, Options.key_id_value, UUIDlen);
- }
- else
- {
- create_random_uuid(Info.CryptographicKeyID);
- }
-
- Context = new AESEncContext;
- result = Context->InitKey(Options.key_value);
-
- if ( ASDCP_SUCCESS(result) )
- result = Context->SetIVec(RNG.FillRandom(IV_buf, CBC_BLOCK_SIZE));
-
- if ( ASDCP_SUCCESS(result) && Options.write_hmac )
- {
- Info.UsesHMAC = true;
- HMAC = new HMACContext;
- result = HMAC->InitKey(Options.key_value, Info.LabelSetType);
- }
- }
-
- if ( ASDCP_SUCCESS(result) )
- {
- result = Writer.OpenWrite(Options.out_file, Info, Options.aux_data_coding, Options.edit_rate);
- }
- }
-
- if ( ASDCP_SUCCESS(result) )
- {
- ui32_t duration = 0;
- result = Parser.Reset();
-
- while ( ASDCP_SUCCESS(result) && duration++ < Options.duration )
- {
- result = Parser.ReadFrame(FrameBuffer);
-
- if ( ASDCP_SUCCESS(result) )
- {
- if ( Options.verbose_flag )
- FrameBuffer.Dump(stderr, Options.fb_dump_size);
-
- if ( Options.encrypt_header_flag )
- FrameBuffer.PlaintextOffset(0);
- }
-
- if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
- {
- result = Writer.WriteFrame(FrameBuffer, Context, HMAC);
-
- // 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));
- }
- }
-
- if ( result == RESULT_ENDOFFILE )
- result = RESULT_OK;
- }
-
- if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
- {
- if ( Options.global_metadata_filename.empty() )
- {
- result = Writer.Finalize();
- }
- else
- {
- ASDCP::FrameBuffer global_metadata;
- ui32_t file_size = Kumu::FileSize(Options.global_metadata_filename);
- result = global_metadata.Capacity(file_size);
-
- if ( ASDCP_SUCCESS(result) )
- {
- ui32_t read_count = 0;
- Kumu::FileReader Reader;
-
- result = Reader.OpenRead(Options.global_metadata_filename);
-
- if ( ASDCP_SUCCESS(result) )
- result = Reader.Read(global_metadata.Data(), file_size, &read_count);
-
- if ( ASDCP_SUCCESS(result) )
- {
- if ( file_size != read_count)
- return RESULT_READFAIL;
-
- global_metadata.Size(read_count);
- }
- }
-
- result = Writer.Finalize(global_metadata);
- }
- }
-
- return result;
-}
-
-
//
int
main(int argc, const char** argv)
@@ -1216,18 +1043,6 @@ main(int argc, const char** argv)
result = write_timed_text_file(Options);
break;
- case ESS_DCDATA_UNKNOWN:
- if ( ! Options.aux_data_coding.HasValue() )
- {
- fprintf(stderr, "Option \"-U <UL>\" is required for Aux Data essence.\n");
- return 3;
- }
- else
- {
- result = write_aux_data_file(Options);
- }
- break;
-
default:
fprintf(stderr, "%s: Unknown file type, not AS-02-compatible essence.\n",
Options.filenames.front().c_str());
diff --git a/src/phdr-unwrap.cpp b/src/phdr-unwrap.cpp
index c6669e9..cb0e177 100755
--- a/src/phdr-unwrap.cpp
+++ b/src/phdr-unwrap.cpp
@@ -84,7 +84,9 @@ Options:\n\
-b <buffer-size> - Specify size in bytes of picture frame buffer\n\
Defaults to 4,194,304 (4MB)\n\
-d <duration> - Number of frames to process, default all\n\
+ -e <extension> - Extension to use for aux data files. default \"bin\"\n\
-f <start-frame> - Starting frame number, default 0\n\
+ -g <filename> - Extract global metadata to the named file.\n\
-h | -help - Show help\n\
-k <key-string> - Use key for ciphertext operations\n\
-m - verify HMAC values when reading\n\
@@ -123,7 +125,8 @@ public:
byte_t key_value[KeyLen]; // value of given encryption key (when key_flag is true)
byte_t key_id_value[UUIDlen];// value of given key ID (when key_id_flag is true)
const char* input_filename;
- std::string prefix_buffer;
+ const char* extension;
+ std::string global_metadata_filename, prefix_buffer;
//
CommandOptions(int argc, const char** argv) :
@@ -132,7 +135,7 @@ public:
version_flag(false), help_flag(false), number_width(6),
start_frame(0), duration(0xffffffff), duration_flag(false),
fb_size(FRAME_BUFFER_SIZE), file_prefix(0),
- input_filename(0)
+ input_filename(0), extension("bin")
{
memset(key_value, 0, KeyLen);
memset(key_id_value, 0, UUIDlen);
@@ -172,6 +175,11 @@ public:
start_frame = Kumu::xabs(strtol(argv[i], 0, 10));
break;
+ case 'g':
+ TEST_EXTRA_ARG(i, 'g');
+ global_metadata_filename = argv[i];
+ break;
+
case 'h': help_flag = true; break;
case 'm': read_hmac = true; break;
@@ -381,6 +389,109 @@ read_JP2K_file(CommandOptions& Options)
return result;
}
+
+// Read one or more plaintext DCData bytestreams from a plaintext ASDCP file
+// Read one or more plaintext DCData bytestreams from a ciphertext ASDCP file
+// Read one or more ciphertext DCData byestreams from a ciphertext ASDCP file
+//
+Result_t
+read_aux_data_file(CommandOptions& Options)
+{
+ AESDecContext* Context = 0;
+ HMACContext* HMAC = 0;
+ AS_02::PIDM::MXFReader Reader;
+ DCData::FrameBuffer FrameBuffer(Options.fb_size);
+ ui32_t frame_count = 0;
+
+ ASDCP::FrameBuffer global_metadata;
+ Result_t result = Reader.OpenRead(Options.input_filename, global_metadata);
+
+ if ( ASDCP_SUCCESS(result)
+ && global_metadata.Size()
+ && ! Options.global_metadata_filename.empty() )
+ {
+ ui32_t write_count = 0;
+ Kumu::FileWriter Writer;
+
+ result = Writer.OpenWrite(Options.global_metadata_filename);
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ result = Writer.Write(global_metadata.RoData(), global_metadata.Size(), &write_count);
+ }
+
+ if ( ASDCP_SUCCESS(result) && global_metadata.Size() != write_count)
+ {
+ return RESULT_WRITEFAIL;
+ }
+ }
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ frame_count = Reader.AS02IndexReader().GetDuration();
+
+ if ( Options.verbose_flag )
+ {
+ fprintf(stderr, "Frame Buffer size: %u\n", Options.fb_size);
+ }
+ }
+
+ if ( ASDCP_SUCCESS(result) && Options.key_flag )
+ {
+ Context = new AESDecContext;
+ result = Context->InitKey(Options.key_value);
+
+ if ( ASDCP_SUCCESS(result) && Options.read_hmac )
+ {
+ WriterInfo Info;
+ Reader.FillWriterInfo(Info);
+
+ if ( Info.UsesHMAC )
+ {
+ HMAC = new HMACContext;
+ result = HMAC->InitKey(Options.key_value, Info.LabelSetType);
+ }
+ else
+ {
+ fputs("File does not contain HMAC values, ignoring -m option.\n", stderr);
+ }
+ }
+ }
+
+ ui32_t last_frame = Options.start_frame + ( Options.duration ? Options.duration : frame_count);
+ if ( last_frame > frame_count )
+ last_frame = frame_count;
+
+ char name_format[64];
+ snprintf(name_format, 64, "%%s%%0%du.%s", Options.number_width, Options.extension);
+
+ for ( ui32_t i = Options.start_frame; ASDCP_SUCCESS(result) && i < last_frame; i++ )
+ {
+ result = Reader.ReadFrame(i, FrameBuffer, Context, HMAC);
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ if ( ! Options.no_write_flag )
+ {
+ Kumu::FileWriter OutFile;
+ char filename[256];
+ ui32_t write_count;
+ snprintf(filename, 256, name_format, Options.file_prefix, i);
+ result = OutFile.OpenWrite(filename);
+
+ if ( ASDCP_SUCCESS(result) )
+ result = OutFile.Write(FrameBuffer.Data(), FrameBuffer.Size(), &write_count);
+ }
+
+ if ( Options.verbose_flag )
+ FrameBuffer.Dump(stderr, Options.fb_dump_size);
+ }
+ }
+
+ return result;
+}
+
+
//
int
main(int argc, const char** argv)
@@ -414,6 +525,10 @@ main(int argc, const char** argv)
result = read_JP2K_file(Options);
break;
+ case ESS_DCDATA_UNKNOWN:
+ result = read_aux_data_file(Options);
+ break;
+
default:
fprintf(stderr, "%s: Unknown file type, not P-HDR essence.\n", Options.input_filename);
return 5;
diff --git a/src/phdr-wrap.cpp b/src/phdr-wrap.cpp
index 32f9b23..b62131a 100755
--- a/src/phdr-wrap.cpp
+++ b/src/phdr-wrap.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2011-2014, John Hurst
+Copyright (c) 2011-2016, John Hurst
All rights reserved.
@@ -86,6 +86,15 @@ public:
}
//
+static void
+create_random_uuid(byte_t* uuidbuf)
+{
+ Kumu::UUID tmp_id;
+ GenRandomValue(tmp_id);
+ memcpy(uuidbuf, tmp_id.Value(), tmp_id.Size());
+}
+
+//
void
banner(FILE* stream = stdout)
{
@@ -126,6 +135,7 @@ Options:\n\
-e - Encrypt JP2K headers (default)\n\
-E - Do not encrypt JP2K headers\n\
-F (0|1) - Set field dominance for interlaced image (default: 0)\n\
+ -g <filename> - Write global metadata from the named PIDM file.\n\
-i - Indicates input essence is interlaced fields (forces -Y)\n\
-j <key-id-str> - Write key ID instead of creating a random value\n\
-k <key-string> - Use key for ciphertext operations\n\
@@ -139,6 +149,7 @@ Options:\n\
-t <min> - Set RGB component minimum code value (default: 0)\n\
-T <max> - Set RGB component maximum code value (default: 1023)\n\
-u - Print UL catalog to stderr\n\
+ -U <UL> - Set DataEssenceCoding UL value in an Aux Data file\n\
-v - Verbose, prints informative messages to stderr\n\
-W - Read input file only, do not write source file\n\
-x <int> - Horizontal subsampling degree (default: 2)\n\
@@ -197,7 +208,9 @@ public:
AS_02::IndexStrategy_t index_strategy; //Shim parameter index_strategy_frame/clip
ui32_t partition_space; //Shim parameter partition_spacing
- std::string PHDR_master_metadata; //
+ std::string PHDR_master_metadata;
+ UL aux_data_coding;
+ std::string global_metadata_filename;
//
CommandOptions(int argc, const char** argv) :
@@ -285,6 +298,11 @@ public:
}
break;
+ case 'g':
+ TEST_EXTRA_ARG(i, 'g');
+ global_metadata_filename = argv[i];
+ break;
+
case 'h': help_flag = true; break;
case 'i':
@@ -371,6 +389,16 @@ public:
break;
case 'u': show_ul_values_flag = true; break;
+
+ case 'U':
+ TEST_EXTRA_ARG(i, 'U');
+ if ( ! aux_data_coding.DecodeHex(argv[i]) )
+ {
+ fprintf(stderr, "Error decoding UL value: %s\n", argv[i]);
+ return;
+ }
+ break;
+
case 'V': version_flag = true; break;
case 'v': verbose_flag = true; break;
case 'W': no_write_flag = true; break;
@@ -603,6 +631,163 @@ write_JP2K_file(CommandOptions& Options)
return result;
}
+
+
+// Write one or more plaintext Aux Data bytestreams to a plaintext AS-02 file
+// Write one or more plaintext Aux Data bytestreams to a ciphertext AS-02 file
+//
+Result_t
+write_aux_data_file(CommandOptions& Options)
+{
+ AESEncContext* Context = 0;
+ HMACContext* HMAC = 0;
+ AS_02::PIDM::MXFWriter Writer;
+ DCData::FrameBuffer FrameBuffer(Options.fb_size);
+ DCData::SequenceParser Parser;
+ byte_t IV_buf[CBC_BLOCK_SIZE];
+ Kumu::FortunaRNG RNG;
+
+ if ( ! Options.global_metadata_filename.empty() )
+ {
+ if ( ! Kumu::PathIsFile(Options.global_metadata_filename) )
+ {
+ fprintf(stderr, "No such file or filename: \"%s\".\n", Options.global_metadata_filename.c_str());
+ return RESULT_PARAM;
+ }
+ }
+
+ // set up essence parser
+ Result_t result = Parser.OpenRead(Options.filenames.front());
+
+ // set up MXF writer
+ if ( ASDCP_SUCCESS(result) )
+ {
+
+ if ( Options.verbose_flag )
+ {
+ fprintf(stderr, "Aux Data\n");
+ fprintf(stderr, "Frame Buffer size: %u\n", Options.fb_size);
+ }
+ }
+
+ if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
+ {
+ WriterInfo Info = s_MyInfo; // fill in your favorite identifiers here
+ if ( Options.asset_id_flag )
+ memcpy(Info.AssetUUID, Options.asset_id_value, UUIDlen);
+ else
+ Kumu::GenRandomUUID(Info.AssetUUID);
+
+ Info.LabelSetType = LS_MXF_SMPTE;
+
+ // configure encryption
+ if( Options.key_flag )
+ {
+ Kumu::GenRandomUUID(Info.ContextID);
+ Info.EncryptedEssence = true;
+
+ if ( Options.key_id_flag )
+ {
+ memcpy(Info.CryptographicKeyID, Options.key_id_value, UUIDlen);
+ }
+ else
+ {
+ create_random_uuid(Info.CryptographicKeyID);
+ }
+
+ Context = new AESEncContext;
+ result = Context->InitKey(Options.key_value);
+
+ if ( ASDCP_SUCCESS(result) )
+ result = Context->SetIVec(RNG.FillRandom(IV_buf, CBC_BLOCK_SIZE));
+
+ if ( ASDCP_SUCCESS(result) && Options.write_hmac )
+ {
+ Info.UsesHMAC = true;
+ HMAC = new HMACContext;
+ result = HMAC->InitKey(Options.key_value, Info.LabelSetType);
+ }
+ }
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ result = Writer.OpenWrite(Options.out_file, Info, Options.aux_data_coding, Options.edit_rate);
+ }
+ }
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ ui32_t duration = 0;
+ result = Parser.Reset();
+
+ while ( ASDCP_SUCCESS(result) && duration++ < Options.duration )
+ {
+ result = Parser.ReadFrame(FrameBuffer);
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ if ( Options.verbose_flag )
+ FrameBuffer.Dump(stderr, Options.fb_dump_size);
+
+ if ( Options.encrypt_header_flag )
+ FrameBuffer.PlaintextOffset(0);
+ }
+
+ if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
+ {
+ result = Writer.WriteFrame(FrameBuffer, Context, HMAC);
+
+ // 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));
+ }
+ }
+
+ if ( result == RESULT_ENDOFFILE )
+ result = RESULT_OK;
+ }
+
+ if ( ASDCP_SUCCESS(result) && ! Options.no_write_flag )
+ {
+ if ( Options.global_metadata_filename.empty() )
+ {
+ result = Writer.Finalize();
+ }
+ else
+ {
+ ASDCP::FrameBuffer global_metadata;
+ ui32_t file_size = Kumu::FileSize(Options.global_metadata_filename);
+ result = global_metadata.Capacity(file_size);
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ ui32_t read_count = 0;
+ Kumu::FileReader Reader;
+
+ result = Reader.OpenRead(Options.global_metadata_filename);
+
+ if ( ASDCP_SUCCESS(result) )
+ result = Reader.Read(global_metadata.Data(), file_size, &read_count);
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ if ( file_size != read_count)
+ return RESULT_READFAIL;
+
+ global_metadata.Size(read_count);
+ }
+ }
+
+ result = Writer.Finalize(global_metadata);
+ }
+ }
+
+ return result;
+}
+
//
int
main(int argc, const char** argv)
@@ -645,6 +830,18 @@ main(int argc, const char** argv)
result = write_JP2K_file(Options);
break;
+ case ESS_DCDATA_UNKNOWN:
+ if ( ! Options.aux_data_coding.HasValue() )
+ {
+ fprintf(stderr, "Option \"-U <UL>\" is required for Aux Data essence.\n");
+ return 3;
+ }
+ else
+ {
+ result = write_aux_data_file(Options);
+ }
+ break;
+
default:
fprintf(stderr, "%s: Unknown file type, not P-HDR-compatible essence.\n",
Options.filenames.front().c_str());