diff options
| author | Wolfgang Ruppel <imftool@t-online.de> | 2019-02-22 20:31:07 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-22 20:31:07 +0100 |
| commit | 9d5360955e77f4cd1028e028d4d748dd84151933 (patch) | |
| tree | f7e99f6587825108142dbb9cd0519af0072e29f3 | |
| parent | c22d49a2d1bc4ee13c36484b22de2032015c7830 (diff) | |
| parent | 08e954ce809d49e2e7e886154000077b7fd78196 (diff) | |
Merge pull request #1 from cinecert/master
2.10.32 pre-release
| -rwxr-xr-x | CHANGES (renamed from README) | 153 | ||||
| -rwxr-xr-x | README.md | 113 | ||||
| -rw-r--r-- | src/KM_xml.cpp | 22 | ||||
| -rwxr-xr-x | src/Metadata.cpp | 37 | ||||
| -rwxr-xr-x | src/Metadata.h | 6 |
5 files changed, 147 insertions, 184 deletions
@@ -1,157 +1,7 @@ -$Id$ - -The asdcplib library is a set of objects that offer -simplified access to files conforming to the sound and -picture track file formats developed by the SMPTE Working -Group DC28.20 (now TC 21DC). - -Recently, support has also been added for SMPTE draft ST -2067-5 "IMF Essence Component", AKA "AS-02". This code was -donated by Fraunhofer IIS. It carries additional copyright -information which should be listed whenever you link the -AS-02 elements of the library. Please look at the top of -the AS-02 files to see this copyright information. - -AS-02 support is carried in separate object modules, so -unless you #include <AS_02.h> and link libas-02.so you are -still using plain old asdcp. - -This work was originally funded by Digital Cinema Initiatives, -LLC (DCI). Subsequent efforts have been funded by Deluxe -Laboratories, Doremi Labs, CineCert LLC, Avica Technology -and others. - -**The asdcplib project was originally housed on SourceForge. -The project has moved to http://www.cinecert.com/asdcplib/ - -The project formerly depended upon the mxflib project. Because -of its focus on covering the whole of the MXF specifications, -mxflib is considerably larger and more complex that what I -require for this application. For this reason I have created -a dedicated MXF implementation that is now part of this -library. Special thanks to Matt Beard and Oliver Morgan for -their great work and support. - -Thanks also to the members of the SMPTE DC28.20 packaging -ad-hoc group and the members of the MXF Interop Initiative -for their encouragement and support. Special thanks to -Jim Whittlesey and Howard Lukk at DCI for proposing and -supporting this project. - - -Design Notes - -This library is intended (but of course not limited) for -use by developers of commercial D-Cinema products (and now -IMF!). It is designed to be easily integrated into a wide -variety of development environments. Commercial users are -strongly urged to use static linking (at least where you use -this library) to prevent malicious in-field replacement of -critical system modules. This recommendation should be -considered wherever Open Source or Free software is being -used in conjunction with critical security parameters, such -as cryptographic keys. - -The author strives mightily to provide an API that is completely -independent of operating system and other library dependencies, -and which allows selective replacement of some modules for -local needs. Specifically, the essence parsers and OpenSSL -crypto functions can be replaced by linking to alternative -implementations of the ASDCP:: objects which provide those -services. - -AS_DCP.h contains the entire AS-DCP API. You do not need to -read any of the other files, except maybe asdcp-test.cpp which -contains detailed usage examples of each of the API's services. -The KM_* files may be of interest for general development -support, but may be ignored if all you want is simple AS-DCP -support. - -Likewise, draft 2067-5 "IMF Essence Component" (AS-02) support -is entirely contained in AS-02.h - - -Build Instructions - -On more-or-less POSIX systems (OS X, Linux, and BSD), GNU make and -autotools are required to build asdcplib. The same configure script -will also build this package on Windows machines with Cygwin and -MinGW installed. For those Windows users who would prefer to build -this natively, an "nmake" build file and instructions can be found -in the win32 subdirectory. - -OpenSSL is also required, any recent version should be fine. See -http://www.openssl.org/ for more information and download instructions. - -Optional support for writing Timed Text Track Files is supported by -either Xerces-C or Expat. See http://xerces.apache.org/xerces-c/ or -http://expat.sourceforge.net/ for source and build instructions. - -To configure and build, type './configure' followed by 'make'. There -are several test targets on the POSIX side, but you need to assemble -a set of test files to use them. AS-02 support can be enabled with - --enable-as-02. - -I have tested this build on win32, Linux, OpenBSD, and Darwin -platforms. Others may work as well. - - - - -Utilities - -asdcp-test - Writes, reads and verifies AS-DCP (MXF) track files. - -asdcp-wrap - Writes AS-DCP (MXF) track files. - -asdcp-unwrap - Extracts essence from AS-DCP (MXF) track files. - -asdcp-info - Displays information about AS-DCP (MXF) track files. - -asdcp-util - Calculates digests and generates random numbers and UUIDs. - -as-02-wrap - Writes AS-02 Essence Component files. - -as-02-unwrap - Extracts essence from AS-02 Essence Component files. - -kmfilegen - Writes and verifies large files using a platform- -independent format. Use it to test issues related to large files. - -kmuuidgen, kmrandgen - generate UUID values and random numbers. - -wavesplit - Splits a WAVE file into two or more output files. Used - to untangle incorrectly-paired DCDM sound files. - -blackwave - Write a WAVE file of zeros. - -pinkwave - Write a WAVE file of SMPTE ST 2095 pink noise. - -j2c-test - Displays information about JP2K codestreams. - -Experimental feature: Prototype for High Dynamic Range is a wrapper -for the IMF application that allows JPEG-2000 codestreams to be paired -with opaque blobs of metadata. AS-02 support must be enabled to -build this feature, so --enable-as-02 must be enabled if ---enable-phdr is to be used. The following executable programs will be -built: - -phdr-wrap - Writes AS-02 PHDR Essence Component files. - -phdr-unwrap - Extracts essence from AS-02 PHDR Essence Component files. - - -Documentation - -The API documentation is mostly in AS_DCP.h. and AS_02.h Read those -files for a detailed description of the library's capabilities. Read -asdcp-*.cpp and as-02-*.cpp files for library usage examples. The -command-line utilities all respond to -h. - - Change History -2019-02-12 - 2.10.32 -- bug fixes +2019-02-22 - 2.10.32 -- bug fixes o Fixed parsing of as-02-wrap -tfr (ACES) option value o Fixed ISXD bugs: o Incorrect UTF_8_Text_DataEssenceCoding UL @@ -161,6 +11,7 @@ Change History o Added wide-char support for filenames on Win32, allows UTF-8 characters in calls to Kumu::File*::Open*(). The macro KM_WIN32_UTF8 must be defined to enable this feature. + o CMake fixed to extract version form configure.ac 2018-10-15 - 2.10.31 diff --git a/README.md b/README.md new file mode 100755 index 0000000..eb411af --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ + +# AS-DCP Lib + +## Introduction + +The asdcplib library is an API and command-line tool set that offers +access to files conforming to the sound and picture track file formats +developed by the SMPTE Working Group DC28.20 (now TC 21DC). + +Support has since been added for SMPTE ST 2067-5 "IMF Essence +Component", AKA "AS-02", which was published and is maintained by +SMPTE TC 35 PM. The initial draft of this code was donated by +Fraunhofer IIS and was created by Robert Scheler and Heiko Sparenberg. +It carries additional copyright information which should be listed +whenever you link the AS-02 elements of the library. Please look at +the top of the AS-02 files to see this copyright information. + +Support for ST 20XX OpenEXR was developed and contributed by Bjoern +Stresing, Patrick Bichiou and Wolfgang Ruppel, supported by AMPAS. +It carries additional copyright information which should be listed +whenever you link the AS-02 elements of the library. Please look at +the top of the AS-02 files to see this copyright information. + +AS-02 support is carried in separate object modules, so unless you +`#include <AS_02.h>` and link `libas-02.so` you are still using plain old +asdcp. + + +## Documentation + +This library is intended (but of course not limited) for use by +developers of commercial D-Cinema and IMF products and for commercial +mastering toolchains. The documentation is terse and sparse. + +The API documentation is mostly in AS_DCP.h. and AS_02.h Read those +files for a detailed description of the library's capabilities. Read +asdcp-*.cpp and as-02-*.cpp files for library usage examples. The +command-line utilities all respond to -h. + +Also, of course, the various SMPTE and ISO standards that underly all +of this work should be well understood if you want to tinker with +anything, or, in some cases, understand what properties are required +in a particular supported use case (e.g., selecting audio channel labels.) + + +## CLI Programs + +### Standard Utilities + +`asdcp-test` - DEPRECATED Writes, reads and verifies AS-DCP (MXF) track files. + +`asdcp-wrap` - Writes AS-DCP (MXF) track files. + +`asdcp-unwrap` - Extracts essence from AS-DCP (MXF) track files. + +`asdcp-info` - Displays information about AS-DCP (MXF) track files. + +`asdcp-util` - Calculates digests and generates random numbers and UUIDs. + +`as-02-wrap` - Writes AS-02 Essence Component files. + +`as-02-unwrap` - Extracts essence from AS-02 Essence Component files. + +`kmfilegen` - Writes and verifies large files using a platform-independent format. Use it to test issues related to large files. + +`kmuuidgen`, `kmrandgen` - generate UUID values and random numbers. + +`wavesplit` - Splits a WAVE file into two or more output files. Used to untangle incorrectly-paired DCDM sound files. + +`blackwave` - Write a WAVE file of zeros. + +`pinkwave` - Write a WAVE file of SMPTE ST 2095 pink noise. + +`j2c-test` - Displays information about JP2K codestreams. + +### PHDR + +An experimental feature, Prototype for High Dynamic Range is a wrapper +for the IMF application that allows JPEG-2000 codestreams to be paired +with opaque blobs of metadata. AS-02 support must be enabled to +build this feature, so --enable-as-02 must be enabled if +--enable-phdr is to be used. The following executable programs will be +built: + +`phdr-wrap` - Writes AS-02 PHDR Essence Component files. + +`phdr-unwrap` - Extracts essence from AS-02 PHDR Essence Component files. + + +## Historical Notes + +This work was originally funded by Digital Cinema Initiatives, LLC +(DCI). Subsequent efforts have been funded by Deluxe Laboratories, +Doremi Labs, CineCert LLC, Avica Technology and others. + +The asdcplib project was originally exchanged by FTP. The project was +on [SourceForge](https://sourceforge.net/projects/asdcplib) between +2005 and 2008, when it moved to a release-only distribution via +[CineCert](https://www.cinecert.com/asdcplib/download). As of late +February 2019, its new home is on [github](https://github.com/cinecert/asdcplib). + +In the eraliest days, the project depended upon the +[mxflib](http://sourceforge.net/projects/mxflib) project. Because of +its focus on covering the whole of the MXF specifications, mxflib is +considerably larger and more complex that what was required for the +AS-DCP application. For this reason I developed a dedicated MXF +implementation. Special thanks to Matt Beard and Oliver Morgan for +their great work and support. + +Thanks also to the members of the SMPTE DC28.20 packaging ad-hoc group +and the members of the MXF Interop Initiative for their encouragement +and support. Special thanks to Jim Whittlesey and Howard Lukk at DCI +for proposing and supporting this project. diff --git a/src/KM_xml.cpp b/src/KM_xml.cpp index e7250af..68839a1 100644 --- a/src/KM_xml.cpp +++ b/src/KM_xml.cpp @@ -612,9 +612,6 @@ Kumu::XMLElement::ParseFirstFromString(const char* document, ui32_t doc_len) if ( ! XML_Parse(Parser, document, doc_len, 1) ) { - DefaultLogSink().Error("XML Parse error on line %d: %s\n", - XML_GetCurrentLineNumber(Parser), - XML_ErrorString(XML_GetErrorCode(Parser))); XML_ParserFree(Parser); return false; } @@ -1025,28 +1022,15 @@ Kumu::XMLElement::ParseFirstFromString(const char* document, ui32_t doc_len) ++errorCount; } } - catch (const XMLException& e) - { - char* message = XMLString::transcode(e.getMessage()); - DefaultLogSink().Error("Parser error: %s\n", message); - XMLString::release(&message); - errorCount++; - } - catch (const SAXParseException& e) - { - char* message = XMLString::transcode(e.getMessage()); - DefaultLogSink().Error("Parser error: %s at line %d\n", message, e.getLineNumber()); - XMLString::release(&message); - errorCount++; - } catch (...) { - DefaultLogSink().Error("Unexpected XML parser error\n"); errorCount++; } if ( errorCount == 0 ) - m_NamespaceOwner = (void*)docHandler->TakeNamespaceMap(); + { + m_NamespaceOwner = (void*)docHandler->TakeNamespaceMap(); + } delete parser; delete docHandler; diff --git a/src/Metadata.cpp b/src/Metadata.cpp index 8147e31..b21dc23 100755 --- a/src/Metadata.cpp +++ b/src/Metadata.cpp @@ -2538,7 +2538,7 @@ MPEG2VideoDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -DMSegment::DMSegment(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), EventStartPosition(0), Duration(0) +DMSegment::DMSegment(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) { assert(m_Dict); m_UL = m_Dict->ul(MDD_DMSegment); @@ -2559,9 +2559,18 @@ DMSegment::InitFromTLVSet(TLVReader& TLVSet) assert(m_Dict); Result_t result = InterchangeObject::InitFromTLVSet(TLVSet); if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(DMSegment, DataDefinition)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi64(OBJ_READ_ARGS(DMSegment, EventStartPosition)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi64(OBJ_READ_ARGS(DMSegment, Duration)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(DMSegment, EventComment)); + if ( ASDCP_SUCCESS(result) ) { + result = TLVSet.ReadUi64(OBJ_READ_ARGS_OPT(DMSegment, Duration)); + Duration.set_has_value( result == RESULT_OK ); + } + if ( ASDCP_SUCCESS(result) ) { + result = TLVSet.ReadUi64(OBJ_READ_ARGS_OPT(DMSegment, EventStartPosition)); + EventStartPosition.set_has_value( result == RESULT_OK ); + } + if ( ASDCP_SUCCESS(result) ) { + result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(DMSegment, EventComment)); + EventComment.set_has_value( result == RESULT_OK ); + } if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(DMSegment, DMFramework)); return result; } @@ -2573,9 +2582,9 @@ DMSegment::WriteToTLVSet(TLVWriter& TLVSet) assert(m_Dict); Result_t result = InterchangeObject::WriteToTLVSet(TLVSet); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(DMSegment, DataDefinition)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS(DMSegment, EventStartPosition)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS(DMSegment, Duration)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(DMSegment, EventComment)); + if ( ASDCP_SUCCESS(result) && ! Duration.empty() ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS_OPT(DMSegment, Duration)); + if ( ASDCP_SUCCESS(result) && ! EventStartPosition.empty() ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS_OPT(DMSegment, EventStartPosition)); + if ( ASDCP_SUCCESS(result) && ! EventComment.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(DMSegment, EventComment)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(DMSegment, DMFramework)); return result; } @@ -2586,8 +2595,8 @@ DMSegment::Copy(const DMSegment& rhs) { InterchangeObject::Copy(rhs); DataDefinition = rhs.DataDefinition; - EventStartPosition = rhs.EventStartPosition; Duration = rhs.Duration; + EventStartPosition = rhs.EventStartPosition; EventComment = rhs.EventComment; DMFramework = rhs.DMFramework; } @@ -2604,9 +2613,15 @@ DMSegment::Dump(FILE* stream) InterchangeObject::Dump(stream); fprintf(stream, " %22s = %s\n", "DataDefinition", DataDefinition.EncodeString(identbuf, IdentBufferLen)); - fprintf(stream, " %22s = %s\n", "EventStartPosition", i64sz(EventStartPosition, identbuf)); - fprintf(stream, " %22s = %s\n", "Duration", i64sz(Duration, identbuf)); - fprintf(stream, " %22s = %s\n", "EventComment", EventComment.EncodeString(identbuf, IdentBufferLen)); + if ( ! Duration.empty() ) { + fprintf(stream, " %22s = %s\n", "Duration", i64sz(Duration.get(), identbuf)); + } + if ( ! EventStartPosition.empty() ) { + fprintf(stream, " %22s = %s\n", "EventStartPosition", i64sz(EventStartPosition.get(), identbuf)); + } + if ( ! EventComment.empty() ) { + fprintf(stream, " %22s = %s\n", "EventComment", EventComment.get().EncodeString(identbuf, IdentBufferLen)); + } fprintf(stream, " %22s = %s\n", "DMFramework", DMFramework.EncodeString(identbuf, IdentBufferLen)); } diff --git a/src/Metadata.h b/src/Metadata.h index ebdb288..b2466ef 100755 --- a/src/Metadata.h +++ b/src/Metadata.h @@ -658,9 +658,9 @@ namespace ASDCP public: const Dictionary*& m_Dict; UL DataDefinition; - ui64_t EventStartPosition; - ui64_t Duration; - UTF16String EventComment; + optional_property<ui64_t > Duration; + optional_property<ui64_t > EventStartPosition; + optional_property<UTF16String > EventComment; UUID DMFramework; DMSegment(const Dictionary*& d); |
