summaryrefslogtreecommitdiff
path: root/src/AS_02_PHDR.h
diff options
context:
space:
mode:
authormschroffel <mschroffel@cinecert.com>2014-08-07 19:14:00 +0000
committermschroffel <>2014-08-07 19:14:00 +0000
commit8d24b6effb0377fc3041c2e024e7c5593caecc52 (patch)
tree7d07981e634d09698933c680a1d55b5bbc2db8b0 /src/AS_02_PHDR.h
parent7f3035721a09a68106454a53be4fe7f967543195 (diff)
version bump
Diffstat (limited to 'src/AS_02_PHDR.h')
-rw-r--r--src/AS_02_PHDR.h159
1 files changed, 159 insertions, 0 deletions
diff --git a/src/AS_02_PHDR.h b/src/AS_02_PHDR.h
new file mode 100644
index 0000000..b3c94e7
--- /dev/null
+++ b/src/AS_02_PHDR.h
@@ -0,0 +1,159 @@
+
+
+#ifndef _AS_02_PHDR_H_
+#define _AS_02_PHDR_H_
+
+#include "AS_02.h"
+
+namespace AS_02
+{
+
+ namespace PHDR
+ {
+ //
+ class FrameBuffer : public ASDCP::JP2K::FrameBuffer
+ {
+ public:
+ std::string OpaqueMetadata;
+
+ 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 reads a sequence of files containing
+ // JPEG 2000 P-HDR pictures and metadata.
+ class SequenceParser
+ {
+ class h__SequenceParser;
+ Kumu::mem_ptr<h__SequenceParser> 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 pairs of files, each containing the codestream for exactly one picture (.j2c)
+ // and the corresponding P-HDR metadata (.xml). 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. The contents of the metadata files will
+ // not be analyzed (i.e., the raw bytes will be passed in without scrutiny.) If the
+ // "pedantic" parameter is given and is true, the J2C parser will check the JPEG 2000
+ // metadata for each codestream and fail if a mismatch is detected.
+ Result_t OpenRead(const std::string& filename, bool pedantic = false) const;
+
+ // Opens a file sequence for reading. The sequence is expected to contain one or
+ // more pairs of filenames, each naming a file containing the codestream (.j2c) and the
+ // corresponding P-HDR metadata (.xml) 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<std::string>& file_list, bool pedantic = false) 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(ASDCP::JP2K::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(AS_02::PHDR::FrameBuffer&) const;
+ };
+
+ //
+ 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&,
+ 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 AS_02::PHDR::FrameBuffer&, ASDCP::AESEncContext* = 0, ASDCP::HMACContext* = 0);
+
+ // Closes the MXF file, writing the final index, the PHDR master metadata and the revised header.
+ Result_t Finalize(const std::string& PHDR_master_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. If master metadata is available it will
+ // be placed into the string object passed as the second argument.
+ Result_t OpenRead(const std::string& filename, std::string& PHDR_master_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, AS_02::PHDR::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 PHDR
+
+} // end namespace AS_02
+
+#endif // _AS_02_PHDR_H_
+
+//
+// end AS_02_PHDR.h
+//