diff options
| author | jhurst <jhurst@cinecert.com> | 2016-12-01 20:12:38 +0000 |
|---|---|---|
| committer | jhurst <> | 2016-12-01 20:12:38 +0000 |
| commit | c87b3d28b21c927561606cc65a25b47aebc69355 (patch) | |
| tree | cc54031828cc2f244291ed49ea0c21efcb9416d5 /src | |
| parent | 8fd602770d89acb171dbd878d8737ead85aa35d3 (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.h | 87 | ||||
| -rw-r--r-- | src/AS_02_JP2K.cpp | 13 | ||||
| -rw-r--r-- | src/AS_02_PHDR.cpp | 2 | ||||
| -rw-r--r-- | src/AS_02_PHDR.h | 90 | ||||
| -rwxr-xr-x | src/AS_DCP_JP2K.cpp | 2 | ||||
| -rwxr-xr-x | src/AS_DCP_MXF.cpp | 2 | ||||
| -rw-r--r-- | src/CMakeLists.txt | 342 | ||||
| -rw-r--r-- | src/MDD.cpp | 18 | ||||
| -rwxr-xr-x | src/MDD.h | 15 | ||||
| -rwxr-xr-x | src/MXFTypes.h | 6 | ||||
| -rw-r--r-- | src/Makefile.am | 6 | ||||
| -rwxr-xr-x | src/Metadata.cpp | 34 | ||||
| -rwxr-xr-x | src/Metadata.h | 17 | ||||
| -rwxr-xr-x | src/as-02-unwrap.cpp | 117 | ||||
| -rwxr-xr-x | src/as-02-wrap.cpp | 187 | ||||
| -rwxr-xr-x | src/phdr-unwrap.cpp | 119 | ||||
| -rwxr-xr-x | src/phdr-wrap.cpp | 201 |
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 } }; @@ -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()); |
