From 1dfee29db933f05601e632b5a61ddecaf66d21aa Mon Sep 17 00:00:00 2001 From: Thomas Richter Date: Fri, 21 May 2021 17:17:15 +0200 Subject: Added the JXS functionality again into the core library. --- src/JXS_Codestream_Parser.cpp | 251 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 src/JXS_Codestream_Parser.cpp (limited to 'src/JXS_Codestream_Parser.cpp') diff --git a/src/JXS_Codestream_Parser.cpp b/src/JXS_Codestream_Parser.cpp new file mode 100644 index 0000000..c27dd45 --- /dev/null +++ b/src/JXS_Codestream_Parser.cpp @@ -0,0 +1,251 @@ +/* +Copyright (c) 2004-2013, John Hurst +Copyright (c) 2020, Thomas Richter Fraunhofer IIS, +Copyright (c) 2020, Christian Minuth Fraunhofer IIS, +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/*! \file JXS_Codestream_Parser.cpp + \version $Id$ + \brief AS-DCP library, JPEG XS codestream essence reader implementation +*/ + +#include +#include +#include +#include +#include +using Kumu::DefaultLogSink; + +//------------------------------------------------------------------------------------------ + +class ASDCP::JXS::CodestreamParser::h__CodestreamParser +{ + ASDCP_NO_COPY_CONSTRUCT(h__CodestreamParser); + +public: + PictureDescriptor m_PDesc; + Kumu::FileReader m_File; + + h__CodestreamParser() + { + memset(&m_PDesc, 0, sizeof(m_PDesc)); + m_PDesc.EditRate = Rational(24, 1); + m_PDesc.SampleRate = m_PDesc.EditRate; + } + + ~h__CodestreamParser() {} + + Result_t OpenReadFrame(const std::string& filename, FrameBuffer& FB) + { + m_File.Close(); + Result_t result = m_File.OpenRead(filename); + + if (ASDCP_SUCCESS(result)) + { + Kumu::fsize_t file_size = m_File.Size(); + + if (FB.Capacity() < file_size) + { + DefaultLogSink().Error("FrameBuf.Capacity: %u frame length: %u\n", FB.Capacity(), (ui32_t)file_size); + return RESULT_SMALLBUF; + } + } + + ui32_t read_count; + + if (ASDCP_SUCCESS(result)) + result = m_File.Read(FB.Data(), FB.Capacity(), &read_count); + + if (ASDCP_SUCCESS(result)) + FB.Size(read_count); + + if (ASDCP_SUCCESS(result)) + { + byte_t start_of_data = 0; // out param + result = ParseMetadataIntoDesc(FB, m_PDesc, &start_of_data); + + if (ASDCP_SUCCESS(result)) + FB.PlaintextOffset(start_of_data); + } + + return result; + } +}; + +ASDCP::Result_t +ASDCP::JXS::ParseMetadataIntoDesc(const FrameBuffer& FB, PictureDescriptor& PDesc, byte_t* start_of_data) +{ + Result_t result = RESULT_OK; + Marker NextMarker; + ui32_t i; + const byte_t* p = FB.RoData(); + const byte_t* end_p = p + FB.Size(); + + /* initialize optional items */ + bool pih = false; + bool havesoc = false; + + while (p < end_p && ASDCP_SUCCESS(result)) + { + result = GetNextMarker(&p, NextMarker); + + if (ASDCP_FAILURE(result)) + { + result = RESULT_RAW_ESS; + break; + } + + switch (NextMarker.m_Type) + { + case MRK_SOC: + { + // This is the SOC symbol. + if (havesoc) + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: found a duplicate SOC marker"); + havesoc = true; + } + break; + case MRK_EOC: + { + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: found an EOC before any actual picture data"); + } + break; + + case MRK_PIH: + { + // This is the real picture header. + + if (!havesoc) + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: the SOC marker is missing at the start of the frame"); + if (pih) { + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: found a duplicate picture header"); + } + else { + ui32_t size; + ui8_t flags; + // + + Accessor::PIH PIH_(NextMarker); + pih = true; + size = PIH_.LpihSize(); + + if (size != 28 - 2) + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: the jpeg xs picture header has an unsupported size"); + + // size of the bitstream: ignore, just store away. + size = PIH_.LcodSize(); + // Profile and level + PDesc.Ppih = PIH_.Ppih(); + PDesc.Plev = PIH_.Plev(); + // Width and Height + PDesc.AspectRatio = Rational(PIH_.Wf(), PIH_.Hf()); + PDesc.StoredWidth = PIH_.Wf(); + PDesc.StoredHeight = PIH_.Hf(); + PDesc.Wf = PIH_.Wf(); + PDesc.Hf = PIH_.Hf(); + PDesc.Cw = PIH_.Cw(); + PDesc.Hsl = PIH_.Hsl(); + if (PIH_.Hsl() < 1 || PIH_.Hsl() > 0xffff) // This includes the EOF check + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: unsupported slice height specified, must be > 0 and < 65536"); + // Number of compoennts. + PDesc.Nc = PIH_.Nc(); + if (PDesc.Nc != 3) + { + DefaultLogSink().Error("Unexpected number of components: %u\n", PDesc.Nc); + return RESULT_RAW_FORMAT; + } + // A lot of settings that must be fixed right now. + if (PIH_.Ng() != 4) + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: the number of coefficients per coding group must be 4"); + if (PIH_.Ss() != 8) + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: the number of coding groups per significance group must be 8"); + // + if (PIH_.Nlx() == 0) + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: number of horizontal decomposition levels is out of range, must be >0"); + if (PIH_.Nly() > MaxVerticalLevels) + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: number of vertical decomposition levels is out of range, must be <2"); + } + } + break; + case MRK_CDT: + { + if(pih) { + Accessor::CDT CDT_(NextMarker); + int i, count = NextMarker.m_DataSize >> 1; + + for (i = 0; i < count && i < PDesc.Nc; i++) { + PDesc.ImageComponents[i].Bc = CDT_.Bc(i); + PDesc.ImageComponents[i].Sx = CDT_.Sx(i); + PDesc.ImageComponents[i].Sy = CDT_.Sy(i); + } + } + else { + DefaultLogSink().Error("JXS::ParseMetadataIntoDesc: found a component table marker upfront the picture header"); + } + } + break; + case MRK_SLH: /* slice header: the entropy coded data starts here */ + if (start_of_data != 0) + *start_of_data = p - FB.RoData(); + + p = end_p; + break; + } +} + return result; +} +//------------------------------------------------------------------------------------------ + +ASDCP::JXS::CodestreamParser::CodestreamParser() +{ +} + +ASDCP::JXS::CodestreamParser::~CodestreamParser() +{ +} + +// Opens the stream for reading, parses enough data to provide a complete +// set of stream metadata for the MXFWriter below. +ASDCP::Result_t +ASDCP::JXS::CodestreamParser::OpenReadFrame(const std::string& filename, FrameBuffer& FB) const +{ + const_cast(this)->m_Parser = new h__CodestreamParser; + return m_Parser->OpenReadFrame(filename, FB); +} + +// +ASDCP::Result_t +ASDCP::JXS::CodestreamParser::FillPictureDescriptor(PictureDescriptor& PDesc) const +{ + if (m_Parser.empty()) + return RESULT_INIT; + + PDesc = m_Parser->m_PDesc; + return RESULT_OK; +} + +// +// end JXS_Codestream_Parser.cpp +// -- cgit v1.2.3 From 483cc7f388df0353b970f80ac8774667815a8b16 Mon Sep 17 00:00:00 2001 From: Thomas Richter Date: Wed, 26 May 2021 12:51:06 +0200 Subject: Added JXS specific header files to separate JXS functionality out. Updated autoconf to switch JXS support for ADCP on or off. --- configure.ac | 8 + src/AS_02.h | 85 ----------- src/AS_02_JXS.cpp | 3 +- src/AS_02_JXS.h | 145 ++++++++++++++++++ src/AS_02_internal.h | 1 + src/AS_DCP.h | 223 ---------------------------- src/AS_DCP_JXS.cpp | 1 + src/AS_DCP_JXS.h | 333 ++++++++++++++++++++++++++++++++++++++++++ src/AS_DCP_internal.h | 9 -- src/CMakeLists.txt | 8 +- src/JXS_Codestream_Parser.cpp | 1 + src/JXS_Sequence_Parser.cpp | 3 +- src/Makefile.am | 14 +- 13 files changed, 507 insertions(+), 327 deletions(-) create mode 100644 src/AS_02_JXS.h create mode 100644 src/AS_DCP_JXS.h (limited to 'src/JXS_Codestream_Parser.cpp') diff --git a/configure.ac b/configure.ac index af3edf2..01c213c 100644 --- a/configure.ac +++ b/configure.ac @@ -102,6 +102,14 @@ AC_ARG_ENABLE([as-02], *) AC_MSG_ERROR([bad value ${enableval} for --enable-as-02]) ;; esac],[as_02_use=false]) AM_CONDITIONAL([USE_AS_02], [test x$as_02_use = xtrue]) +AC_ARG_ENABLE([asdcp-jxs], + [ --enable-asdcp-jxs enable support wrapping JPEG XS files], + [case "${enableval}" in + yes) asdcp_jxs_use=true ;; + no) asdcp_jxs_use=false ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-asdcp-jxs]) ;; + esac],[asdcp_jxs_use=false]) + AM_CONDITIONAL([USE_ASDCP_JXS], [test x$asdcp_jxs_use = xtrue]) AC_ARG_ENABLE([phdr], [ --enable-phdr enable support for Prototype for High Dyamic Range in AS-02], [case "${enableval}" in diff --git a/src/AS_02.h b/src/AS_02.h index 55d7e8b..2fc7f5a 100644 --- a/src/AS_02.h +++ b/src/AS_02.h @@ -231,91 +231,6 @@ namespace AS_02 }; } //namespace JP2K - - namespace JXS - { - // - class MXFWriter - { - class h__Writer; - ASDCP::mem_ptr 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&, - ASDCP::MXF::FileDescriptor* essence_descriptor, - ASDCP::MXF::InterchangeObject_list_t& essence_sub_descriptor_list, - 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::JXS::FrameBuffer&, ASDCP::AESEncContext* = 0, ASDCP::HMACContext* = 0); - - // Closes the MXF file, writing the index and revised header. - Result_t Finalize(); - }; - - // - class MXFReader - { - class h__Reader; - ASDCP::mem_ptr 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; - - // 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; - - // Compute the necessary frame buffer size in bytes for CBR - // codestreamss. - Result_t CalcFrameBufferSize(ui64_t &size) 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::JXS::FrameBuffer&, ASDCP::AESDecContext* = 0, ASDCP::HMACContext* = 0) const; - - // Print debugging information to stream - void DumpHeaderMetadata(FILE* = 0) const; - void DumpIndex(FILE* = 0) const; - }; - - } //namespace JXS //--------------------------------------------------------------------------------- // diff --git a/src/AS_02_JXS.cpp b/src/AS_02_JXS.cpp index b862f26..eb43b32 100644 --- a/src/AS_02_JXS.cpp +++ b/src/AS_02_JXS.cpp @@ -1,7 +1,7 @@ /* Copyright (c) 2011-2018, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, +Copyright (c) 2020-2021, Thomas Richter, Fraunhofer IIS John Hurst -Copyright (c) 2020, Thomas Richter, Fraunhofer IIS All rights reserved. @@ -33,6 +33,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AS_02_internal.h" +#include "AS_DCP_JXS.h" #include #include diff --git a/src/AS_02_JXS.h b/src/AS_02_JXS.h new file mode 100644 index 0000000..1fef4f1 --- /dev/null +++ b/src/AS_02_JXS.h @@ -0,0 +1,145 @@ +/* +Copyright (c) 2011-2018, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, +Copyright (c) 2020-2021, Thomas Richter Fraunhofer IIS, +John Hurst + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/*! \file AS_02.h + \version $Id$ + \brief AS-02 library, public interface + +This module implements the JPEG XS specific wrapping of IMF + + o Write essence to a plaintext or ciphertext AS-02 file: + JPEG XS codestreams + + o Read essence from a plaintext or ciphertext AS-02 file: + JPEG XS codestreams + + o Read header metadata from an AS-02 file + +NOTE: ciphertext support for clip-wrapped PCM is not yet complete. +*/ + +#ifndef _AS_02_JXS_H_ +#define _AS_02_JXS_H_ + +#include "Metadata.h" +#include "AS_02.h" +#include "AS_DCP_JXS.h" + +namespace AS_02 +{ + using Kumu::Result_t; + + namespace JXS + { + // + class MXFWriter + { + class h__Writer; + ASDCP::mem_ptr 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&, + ASDCP::MXF::FileDescriptor* essence_descriptor, + ASDCP::MXF::InterchangeObject_list_t& essence_sub_descriptor_list, + 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::JXS::FrameBuffer&, ASDCP::AESEncContext* = 0, ASDCP::HMACContext* = 0); + + // Closes the MXF file, writing the index and revised header. + Result_t Finalize(); + }; + + // + class MXFReader + { + class h__Reader; + ASDCP::mem_ptr 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; + + // 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; + + // Compute the necessary frame buffer size in bytes for CBR + // codestreamss. + Result_t CalcFrameBufferSize(ui64_t &size) 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::JXS::FrameBuffer&, ASDCP::AESDecContext* = 0, ASDCP::HMACContext* = 0) const; + + // Print debugging information to stream + void DumpHeaderMetadata(FILE* = 0) const; + void DumpIndex(FILE* = 0) const; + }; + + } //namespace JXS +} + +/// +#endif diff --git a/src/AS_02_internal.h b/src/AS_02_internal.h index 6236ee6..ba7c33d 100644 --- a/src/AS_02_internal.h +++ b/src/AS_02_internal.h @@ -37,6 +37,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "KM_log.h" #include "AS_DCP_internal.h" #include "AS_02.h" +#include "AS_02_JXS.h" using Kumu::DefaultLogSink; diff --git a/src/AS_DCP.h b/src/AS_DCP.h index c16ea57..9ca8679 100755 --- a/src/AS_DCP.h +++ b/src/AS_DCP.h @@ -1454,229 +1454,6 @@ namespace ASDCP { }; } // namespace JP2K - //--------------------------------------------------------------------------------- - // - namespace JXS - { - const ui32_t MaxComponents = 4; // ISO 21122-1 Annex A.2 up to 8 components - const ui32_t MaxHorizontalLevels = 15; - const ui32_t MaxVerticalLevels = 2; - -#pragma pack(1) - struct ImageComponent_t // Essentially, a lookalike of the CDT marker, just with less bit-packing - { - ui8_t Bc; // Bitdepth (literal, not -1) - ui8_t Sx; - ui8_t Sy; // Subsampling factors, horizontal and vertically. Bit-packed in the marker. - }; -#pragma pack() - - struct PictureDescriptor - { - Rational EditRate; - ui32_t ContainerDuration; - Rational SampleRate; - ui32_t StoredWidth; - ui32_t StoredHeight; - Rational AspectRatio; - ui16_t Ppih; // Profile, copy from the PIH marker - ui16_t Plev; // Level and sublevel, copy from the PIH marker - ui16_t Wf; // Frame width, copy from the PIH marker - ui16_t Hf; // Frame height, copy from the PIH marker - ui16_t Hsl; // slice height, copy from the PIH marker - ui16_t Cw; // column width, or 0 for no columns, copy from the PIH marker - ui8_t Nc; // number of components, copy from the PIH marker - ui32_t MaximumBitRate; // bit rate in MB/sec, or 0 if not known - ui8_t Primaries; // Color primaries as defined by CICP - ui8_t TransferCurve; // Transfer curve as defined by CICP - ui8_t Matrix; // Transform matrix, as defined by CICP - bool fullRange; // If true, no head and toe region - ImageComponent_t ImageComponents[MaxComponents]; // These are copies from the CDT (component table) - }; - // Print debugging information to std::ostream - std::ostream& operator << (std::ostream& strm, const PictureDescriptor& pdesc); - // Print debugging information to stream (stderr default) - void PictureDescriptorDump(const PictureDescriptor&, FILE* = 0); - - // - class FrameBuffer : public ASDCP::FrameBuffer - { - public: - FrameBuffer() {} - FrameBuffer(ui32_t size) { Capacity(size); } - virtual ~FrameBuffer() {} - - // Print debugging information to stream (stderr default) - void Dump(FILE* = 0, ui32_t dump_bytes = 0) const; - }; - - - // An object which opens and reads a JPEG XS codestream file. The file is expected - // to contain exactly one complete frame of picture essence as an unwrapped (raw) - // ISO/IEC 21122 codestream. - class CodestreamParser - { - class h__CodestreamParser; - mem_ptr m_Parser; - ASDCP_NO_COPY_CONSTRUCT(CodestreamParser); - - public: - CodestreamParser(); - virtual ~CodestreamParser(); - - // Opens a file for reading, parses enough data to provide a complete - // set of stream metadata for the MXFWriter below. - // The frame buffer's PlaintextOffset parameter will be set to the first - // byte of the data segment. Set this value to zero if you want - // encrypted headers. - Result_t OpenReadFrame(const std::string& filename, FrameBuffer&) const; - - // Fill a PictureDescriptor struct with the values from the file's codestream. - // Returns RESULT_INIT if the file is not open. - Result_t FillPictureDescriptor(PictureDescriptor&) const; - }; - - // Parses the data in the frame buffer to fill in the picture descriptor. Copies - // the offset of the image data into start_of_data. Returns error if the parser fails. - Result_t ParseMetadataIntoDesc(const FrameBuffer&, PictureDescriptor&, byte_t* start_of_data = 0); - - // An object which reads a sequence of files containing JPEG XS pictures. - class SequenceParser - { - class h__SequenceParser; - mem_ptr m_Parser; - ASDCP_NO_COPY_CONSTRUCT(SequenceParser); - - public: - SequenceParser(); - virtual ~SequenceParser(); - - // Opens a directory for reading. The directory is expected to contain one or - // more files, each containing the codestream for exactly one picture. The - // files must be named such that the frames are in temporal order when sorted - // alphabetically by filename. The parser will automatically parse enough data - // from the first file to provide a complete set of stream metadata for the - // MXFWriter below. If the "pedantic" parameter is given and is true, the - // parser will check the metadata for each codestream and fail if a - // mismatch is detected. - Result_t OpenRead(const std::string& filename) const; - - // Opens a file sequence for reading. The sequence is expected to contain one or - // more filenames, each naming a file containing the codestream for exactly one - // picture. The parser will automatically parse enough data - // from the first file to provide a complete set of stream metadata for the - // MXFWriter below. If the "pedantic" parameter is given and is true, the - // parser will check the metadata for each codestream and fail if a - // mismatch is detected. - Result_t OpenRead(const std::list& file_list) const; - - // Fill a PictureDescriptor struct with the values from the first file's codestream. - // Returns RESULT_INIT if the directory is not open. - Result_t FillPictureDescriptor(PictureDescriptor&) const; - - // Rewind the directory to the beginning. - Result_t Reset() const; - - // Reads the next sequential frame in the directory and places it in the - // frame buffer. Fails if the buffer is too small or the direcdtory - // contains no more files. - // The frame buffer's PlaintextOffset parameter will be set to the first - // byte of the data segment. Set this value to zero if you want - // encrypted headers. - Result_t ReadFrame(FrameBuffer&) const; - }; - - - // - class MXFWriter - { - class h__Writer; - mem_ptr 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 MXF::OP1aHeader& OP1aHeader(); - virtual MXF::OPAtomIndexFooter& OPAtomIndexFooter(); - virtual 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 WriterInfo&, - const PictureDescriptor&, ui32_t HeaderSize = 16384); - - // 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 FrameBuffer&, AESEncContext* = 0, HMACContext* = 0); - - // Closes the MXF file, writing the index and revised header. - Result_t Finalize(); - }; - - // - class MXFReader - { - class h__Reader; - mem_ptr 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 MXF::OP1aHeader& OP1aHeader(); - virtual MXF::OPAtomIndexFooter& OPAtomIndexFooter(); - virtual 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; - - // Returns RESULT_INIT if the file is not open. - Result_t Close() const; - - // Fill an AudioDescriptor struct with the values from the file's header. - // Returns RESULT_INIT if the file is not open. - Result_t FillPictureDescriptor(PictureDescriptor&) 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(WriterInfo&) const; - - // Compute the necessary frame buffer size in bytes for CBR - // codestreamss. - Result_t CalcFrameBufferSize(ui64_t &size) 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, FrameBuffer&, AESDecContext* = 0, HMACContext* = 0) const; - - // Using the index table read from the footer partition, lookup the frame number - // and return the offset into the file at which to read that frame of essence. - // Returns RESULT_INIT if the file is not open, and RESULT_FRAME if the frame number is - // out of range. - Result_t LocateFrame(ui32_t FrameNum, Kumu::fpos_t& streamOffset, i8_t& temporalOffset, i8_t& keyFrameOffset) const; - - // Print debugging information to stream - void DumpHeaderMetadata(FILE* = 0) const; - void DumpIndex(FILE* = 0) const; - }; - } - //--------------------------------------------------------------------------------- // namespace TimedText diff --git a/src/AS_DCP_JXS.cpp b/src/AS_DCP_JXS.cpp index c69394a..3dbbedc 100644 --- a/src/AS_DCP_JXS.cpp +++ b/src/AS_DCP_JXS.cpp @@ -31,6 +31,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AS_DCP_internal.h" +#include "AS_DCP_JXS.h" #include #include #include diff --git a/src/AS_DCP_JXS.h b/src/AS_DCP_JXS.h new file mode 100644 index 0000000..dcd98e0 --- /dev/null +++ b/src/AS_DCP_JXS.h @@ -0,0 +1,333 @@ +/* +Copyright (c) 2003-2018, John Hurst, +Copyright (c) 2020-2021, Christian Minuth, Thomas Richter Fraunhofer IIS, +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/*! \file AS_DCP.h + \version $Id$ + \brief AS-DCP library, public interface + +The asdcplib library is a set of file access objects that offer simplified +access to files conforming to the standards published by the SMPTE +D-Cinema Technology Committee 21DC. The file format, labeled AS-DCP, +is described in a series of documents which includes but may not +be be limited to: + + o SMPTE ST 429-2:2011 DCP Operational Constraints + o SMPTE ST 429-3:2006 Sound and Picture Track File + o SMPTE ST 429-4:2006 MXF JPEG 2000 Application + o SMPTE ST 429-5:2009 Timed Text Track File + o SMPTE ST 429-6:2006 MXF Track File Essence Encryption + o SMPTE ST 429-10:2008 Stereoscopic Picture Track File + o SMPTE ST 429-14:2008 Aux Data Track File + o SMPTE ST 330:2004 - UMID + o SMPTE ST 336:2001 - KLV + o SMPTE ST 377:2004 - MXF (old version, required) + o SMPTE ST 377-1:2011 - MXF + o SMPTE ST 377-4:2012 - MXF Multichannel Audio Labeling Framework + o SMPTE ST 390:2011 - MXF OP-Atom + o SMPTE ST 379-1:2009 - MXF Generic Container (GC) + o SMPTE ST 381-1:2005 - MPEG2 picture in GC + o SMPTE ST 422:2006 - JPEG 2000 picture in GC + o SMPTE ST 382:2007 - WAV/PCM sound in GC + o IETF RFC 2104 - HMAC/SHA1 + o NIST FIPS 197 - AES (Rijndael) (via OpenSSL) + + o MXF Interop Track File Specification + o MXF Interop Track File Essence Encryption Specification + o MXF Interop Operational Constraints Specification + - Note: the MXF Interop documents are not formally published. + Contact the asdcplib support address to get copies. + +The following use cases are supported by the library: + + o Write essence to a plaintext or ciphertext AS-DCP file: + o Read essence from a plaintext or ciphertext AS-DCP file: + JPEG XS codestreams + + o Read header metadata from an AS-DCP file + +This project depends upon the following libraries: + - OpenSSL http://www.openssl.org/ + - Expat http://expat.sourceforge.net/ or + Xerces-C http://xerces.apache.org/xerces-c/ + An XML library is not needed if you don't need support for SMPTE ST 429-5:2009. +*/ + +#ifndef _AS_DCP_JXS_H_ +#define _AS_DCP_JXS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "AS_DCP.h" +#include "Metadata.h" + +//-------------------------------------------------------------------------------- +// All library components are defined in the namespace ASDCP +// +namespace ASDCP { + // + //--------------------------------------------------------------------------------- + // + namespace JXS + { + const ui32_t MaxComponents = 4; // ISO 21122-1 Annex A.2 up to 8 components + const ui32_t MaxHorizontalLevels = 15; + const ui32_t MaxVerticalLevels = 2; + +#pragma pack(1) + struct ImageComponent_t // Essentially, a lookalike of the CDT marker, just with less bit-packing + { + ui8_t Bc; // Bitdepth (literal, not -1) + ui8_t Sx; + ui8_t Sy; // Subsampling factors, horizontal and vertically. Bit-packed in the marker. + }; +#pragma pack() + + struct PictureDescriptor + { + Rational EditRate; + ui32_t ContainerDuration; + Rational SampleRate; + ui32_t StoredWidth; + ui32_t StoredHeight; + Rational AspectRatio; + ui16_t Ppih; // Profile, copy from the PIH marker + ui16_t Plev; // Level and sublevel, copy from the PIH marker + ui16_t Wf; // Frame width, copy from the PIH marker + ui16_t Hf; // Frame height, copy from the PIH marker + ui16_t Hsl; // slice height, copy from the PIH marker + ui16_t Cw; // column width, or 0 for no columns, copy from the PIH marker + ui8_t Nc; // number of components, copy from the PIH marker + ui32_t MaximumBitRate; // bit rate in MB/sec, or 0 if not known + ui8_t Primaries; // Color primaries as defined by CICP + ui8_t TransferCurve; // Transfer curve as defined by CICP + ui8_t Matrix; // Transform matrix, as defined by CICP + bool fullRange; // If true, no head and toe region + ImageComponent_t ImageComponents[MaxComponents]; // These are copies from the CDT (component table) + }; + // Print debugging information to std::ostream + std::ostream& operator << (std::ostream& strm, const PictureDescriptor& pdesc); + // Print debugging information to stream (stderr default) + void PictureDescriptorDump(const PictureDescriptor&, FILE* = 0); + + // + class FrameBuffer : public ASDCP::FrameBuffer + { + public: + FrameBuffer() {} + FrameBuffer(ui32_t size) { Capacity(size); } + virtual ~FrameBuffer() {} + + // Print debugging information to stream (stderr default) + void Dump(FILE* = 0, ui32_t dump_bytes = 0) const; + }; + + + // An object which opens and reads a JPEG XS codestream file. The file is expected + // to contain exactly one complete frame of picture essence as an unwrapped (raw) + // ISO/IEC 21122 codestream. + class CodestreamParser + { + class h__CodestreamParser; + mem_ptr m_Parser; + ASDCP_NO_COPY_CONSTRUCT(CodestreamParser); + + public: + CodestreamParser(); + virtual ~CodestreamParser(); + + // Opens a file for reading, parses enough data to provide a complete + // set of stream metadata for the MXFWriter below. + // The frame buffer's PlaintextOffset parameter will be set to the first + // byte of the data segment. Set this value to zero if you want + // encrypted headers. + Result_t OpenReadFrame(const std::string& filename, FrameBuffer&) const; + + // Fill a PictureDescriptor struct with the values from the file's codestream. + // Returns RESULT_INIT if the file is not open. + Result_t FillPictureDescriptor(PictureDescriptor&) const; + }; + + // Parses the data in the frame buffer to fill in the picture descriptor. Copies + // the offset of the image data into start_of_data. Returns error if the parser fails. + Result_t ParseMetadataIntoDesc(const FrameBuffer&, PictureDescriptor&, byte_t* start_of_data = 0); + + // An object which reads a sequence of files containing JPEG XS pictures. + class SequenceParser + { + class h__SequenceParser; + mem_ptr m_Parser; + ASDCP_NO_COPY_CONSTRUCT(SequenceParser); + + public: + SequenceParser(); + virtual ~SequenceParser(); + + // Opens a directory for reading. The directory is expected to contain one or + // more files, each containing the codestream for exactly one picture. The + // files must be named such that the frames are in temporal order when sorted + // alphabetically by filename. The parser will automatically parse enough data + // from the first file to provide a complete set of stream metadata for the + // MXFWriter below. If the "pedantic" parameter is given and is true, the + // parser will check the metadata for each codestream and fail if a + // mismatch is detected. + Result_t OpenRead(const std::string& filename) const; + + // Opens a file sequence for reading. The sequence is expected to contain one or + // more filenames, each naming a file containing the codestream for exactly one + // picture. The parser will automatically parse enough data + // from the first file to provide a complete set of stream metadata for the + // MXFWriter below. If the "pedantic" parameter is given and is true, the + // parser will check the metadata for each codestream and fail if a + // mismatch is detected. + Result_t OpenRead(const std::list& file_list) const; + + // Fill a PictureDescriptor struct with the values from the first file's codestream. + // Returns RESULT_INIT if the directory is not open. + Result_t FillPictureDescriptor(PictureDescriptor&) const; + + // Rewind the directory to the beginning. + Result_t Reset() const; + + // Reads the next sequential frame in the directory and places it in the + // frame buffer. Fails if the buffer is too small or the direcdtory + // contains no more files. + // The frame buffer's PlaintextOffset parameter will be set to the first + // byte of the data segment. Set this value to zero if you want + // encrypted headers. + Result_t ReadFrame(FrameBuffer&) const; + }; + + + // + class MXFWriter + { + class h__Writer; + mem_ptr 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 MXF::OP1aHeader& OP1aHeader(); + virtual MXF::OPAtomIndexFooter& OPAtomIndexFooter(); + virtual 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 WriterInfo&, + const PictureDescriptor&, ui32_t HeaderSize = 16384); + + // 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 FrameBuffer&, AESEncContext* = 0, HMACContext* = 0); + + // Closes the MXF file, writing the index and revised header. + Result_t Finalize(); + }; + + // + class MXFReader + { + class h__Reader; + mem_ptr 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 MXF::OP1aHeader& OP1aHeader(); + virtual MXF::OPAtomIndexFooter& OPAtomIndexFooter(); + virtual 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; + + // Returns RESULT_INIT if the file is not open. + Result_t Close() const; + + // Fill an AudioDescriptor struct with the values from the file's header. + // Returns RESULT_INIT if the file is not open. + Result_t FillPictureDescriptor(PictureDescriptor&) 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(WriterInfo&) const; + + // Compute the necessary frame buffer size in bytes for CBR + // codestreamss. + Result_t CalcFrameBufferSize(ui64_t &size) 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, FrameBuffer&, AESDecContext* = 0, HMACContext* = 0) const; + + // Using the index table read from the footer partition, lookup the frame number + // and return the offset into the file at which to read that frame of essence. + // Returns RESULT_INIT if the file is not open, and RESULT_FRAME if the frame number is + // out of range. + Result_t LocateFrame(ui32_t FrameNum, Kumu::fpos_t& streamOffset, i8_t& temporalOffset, i8_t& keyFrameOffset) const; + + // Print debugging information to stream + void DumpHeaderMetadata(FILE* = 0) const; + void DumpIndex(FILE* = 0) const; + }; + } + Result_t MD_to_JXS_PDesc(const ASDCP::MXF::GenericPictureEssenceDescriptor& EssenceDescriptor, + const ASDCP::MXF::JPEGXSPictureSubDescriptor& EssenceSubDescriptor, + const ASDCP::Rational& EditRate, const ASDCP::Rational& SampleRate, + ASDCP::JXS::PictureDescriptor& PDesc); + + Result_t JXS_PDesc_to_MD(const JXS::PictureDescriptor& PDesc, + const ASDCP::Dictionary& dict, + ASDCP::MXF::GenericPictureEssenceDescriptor& EssenceDescriptor, + ASDCP::MXF::JPEGXSPictureSubDescriptor& EssenceSubDescriptor); +}; + +/// +#endif diff --git a/src/AS_DCP_internal.h b/src/AS_DCP_internal.h index d09fa6d..5626058 100755 --- a/src/AS_DCP_internal.h +++ b/src/AS_DCP_internal.h @@ -162,15 +162,6 @@ namespace ASDCP ASDCP::MXF::GenericPictureEssenceDescriptor& EssenceDescriptor, ASDCP::MXF::JPEG2000PictureSubDescriptor& EssenceSubDescriptor); - Result_t MD_to_JXS_PDesc(const ASDCP::MXF::GenericPictureEssenceDescriptor& EssenceDescriptor, - const ASDCP::MXF::JPEGXSPictureSubDescriptor& EssenceSubDescriptor, - const ASDCP::Rational& EditRate, const ASDCP::Rational& SampleRate, - ASDCP::JXS::PictureDescriptor& PDesc); - - Result_t JXS_PDesc_to_MD(const JXS::PictureDescriptor& PDesc, - const ASDCP::Dictionary& dict, - ASDCP::MXF::GenericPictureEssenceDescriptor& EssenceDescriptor, - ASDCP::MXF::JPEGXSPictureSubDescriptor& EssenceSubDescriptor); Result_t PCM_ADesc_to_MD(PCM::AudioDescriptor& ADesc, ASDCP::MXF::WaveAudioDescriptor* ADescObj); Result_t MD_to_PCM_ADesc(ASDCP::MXF::WaveAudioDescriptor* ADescObj, PCM::AudioDescriptor& ADesc); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 50d0b64..fe576a4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -63,11 +63,11 @@ if (HAVE_OPENSSL) endif() # 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 dirent_win.h) +set(asdcp_deploy_header AS_DCP.h AS_DCP_JXS.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 dirent_win.h) # header set(asdcp_src ${asdcp_src} Wav.h WavFileWriter.h MXF.h Metadata.h JP2K.h -JXS.h AS_DCP.h AS_DCP_internal.h KLV.h MPEG.h MXFTypes.h MDD.h +JXS.h AS_DCP.h AS_DCP_JXS.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 dirent_win.h ) @@ -78,10 +78,10 @@ set(as02_src h__02_Reader.cpp h__02_Writer.cpp AS_02_ISXD.cpp AS_02_JP2K.cpp AS_02_JXS.cpp AS_02_PCM.cpp ST2052_TextParser.cpp AS_02_TimedText.cpp AS_02_ACES.cpp ACES_Codestream_Parser.cpp ACES_Sequence_Parser.cpp ACES.cpp AS_02_IAB.cpp ST2052_TextParser.cpp) # header for deployment (install target) -set(as02_deploy_header AS_02.h Metadata.h MXF.h MXFTypes.h KLV.h MDD.h AS_02_ACES.h ACES.h AS_02_IAB.h AS_02_internal.h) +set(as02_deploy_header AS_02.h AS_02_JXS.h Metadata.h MXF.h MXFTypes.h KLV.h MDD.h AS_02_ACES.h ACES.h AS_02_IAB.h AS_02_internal.h) # header -set(as02_src ${as02_src} AS_02.h AS_02_internal.h AS_02_ACES.h ACES.h AS_02_IAB.h) +set(as02_src ${as02_src} AS_02.h AS_02_JXS.h AS_02_internal.h AS_02_ACES.h ACES.h AS_02_IAB.h) include_directories("${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/src/JXS_Codestream_Parser.cpp b/src/JXS_Codestream_Parser.cpp index c27dd45..bb7b729 100644 --- a/src/JXS_Codestream_Parser.cpp +++ b/src/JXS_Codestream_Parser.cpp @@ -33,6 +33,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include #include #include #include diff --git a/src/JXS_Sequence_Parser.cpp b/src/JXS_Sequence_Parser.cpp index f16e730..38b8de4 100644 --- a/src/JXS_Sequence_Parser.cpp +++ b/src/JXS_Sequence_Parser.cpp @@ -32,6 +32,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include +#include #include #include #include @@ -278,4 +279,4 @@ ASDCP::JXS::SequenceParser::FillPictureDescriptor(PictureDescriptor& PDesc) cons // // end JXS_Sequence_Parser.cpp -// \ No newline at end of file +// diff --git a/src/Makefile.am b/src/Makefile.am index 60ef423..179bf05 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -55,7 +55,8 @@ include_HEADERS = \ KM_util.h \ KM_tai.h \ KM_xml.h \ - AS_DCP.h + AS_DCP.h \ + AS_DCP_JXS.h if DEV_HEADERS include_HEADERS += \ @@ -84,6 +85,7 @@ endif if USE_AS_02 include_HEADERS += \ AS_02.h \ + AS_02_JXS.h \ AS_02_ACES.h endif @@ -120,13 +122,12 @@ nodist_libasdcp_la_SOURCES = Metadata_h.tt2 Metadata_cpp.tt2 \ # sources for asdcp library libasdcp_la_SOURCES = MPEG2_Parser.cpp MPEG.cpp JP2K_Codestream_Parser.cpp \ JP2K_Sequence_Parser.cpp JP2K.cpp \ - JXS_Codestream_Parser.cpp JXS_Sequence_Parser.cpp JXS.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 \ h__Reader.cpp h__Writer.cpp AS_DCP_MPEG2.cpp AS_DCP_JP2K.cpp \ - AS_DCP_JXS.cpp AS_DCP_PCM.cpp AS_DCP_TimedText.cpp PCMParserList.cpp \ + AS_DCP_PCM.cpp AS_DCP_TimedText.cpp PCMParserList.cpp \ Wav.h WavFileWriter.h MXF.h Metadata.h \ - JP2K.h JXS.h AS_DCP.h AS_DCP_internal.h KLV.h MPEG.h MXFTypes.h MDD.h \ + JP2K.h JXS.h AS_DCP.h AS_DCP_JXS.h AS_DCP_internal.h KLV.h MPEG.h MXFTypes.h MDD.h \ PCMParserList.h S12MTimecode.h MDD.cpp \ AS_DCP_ATMOS.cpp AS_DCP_DCData.cpp info.in \ DCData_ByteStream_Parser.cpp DCData_Sequence_Parser.cpp \ @@ -141,6 +142,10 @@ if HAVE_OPENSSL libasdcp_la_SOURCES += AS_DCP_AES.cpp endif +if USE_ASDCP_JXS +libasdcp_la_SOURCES += JXS_Codestream_Parser.cpp JXS_Sequence_Parser.cpp JXS.cpp AS_DCP_JXS.cpp +endif + libasdcp_la_LDFLAGS = -release @VERSION@ # additional libraries to link against for a library libasdcp_la_LIBADD = libkumu.la @@ -151,6 +156,7 @@ if USE_AS_02 libas02_la_SOURCES = \ AS_02.h \ AS_02_internal.h \ + AS_02_JXS.h \ ACES.h \ AS_02_ACES.h \ AS_02_IAB.h \ -- cgit v1.2.3