diff options
| author | mschroffel <mschroffel@cinecert.com> | 2014-08-07 19:14:00 +0000 |
|---|---|---|
| committer | mschroffel <> | 2014-08-07 19:14:00 +0000 |
| commit | 8d24b6effb0377fc3041c2e024e7c5593caecc52 (patch) | |
| tree | 7d07981e634d09698933c680a1d55b5bbc2db8b0 /src/AS_02_PHDR.h | |
| parent | 7f3035721a09a68106454a53be4fe7f967543195 (diff) | |
version bump
Diffstat (limited to 'src/AS_02_PHDR.h')
| -rw-r--r-- | src/AS_02_PHDR.h | 159 |
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 +// |
