X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FAS_02.h;h=61a2c1e0ba6b83c0e1fd715086c01c5361643d52;hb=0e18995c6a3eab16ddb428d6e5f734e88ae7c131;hp=e4f761f56ca49ec84ed98060c9af3ebbc9279e9f;hpb=c87b3d28b21c927561606cc65a25b47aebc69355;p=asdcplib.git diff --git a/src/AS_02.h b/src/AS_02.h index e4f761f..61a2c1e 100644 --- a/src/AS_02.h +++ b/src/AS_02.h @@ -1,5 +1,5 @@ /* -Copyright (c) 2011-2016, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, +Copyright (c) 2011-2018, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, John Hurst All rights reserved. @@ -349,6 +349,11 @@ namespace AS_02 Result_t ResolveRID(const byte_t* uuid, ASDCP::TimedText::FrameBuffer& FrameBuf) const; }; + + // Generate UUID asset ID values from file contents + Kumu::UUID CreatePNGNameId(const std::string& image_name); + Kumu::UUID CreateFontNameId(const std::string& font_name); + // class ST2052_TextParser { @@ -367,6 +372,11 @@ namespace AS_02 // Parse an XML string Result_t OpenRead(const std::string& xml_doc, const std::string& filename) const; + // The "profile_name" parameter was removed from OpenRead() because it made the API + // awkward WRT lexical compatibility with TimedText_Parser. The value can still be + // modified by changing the descriptor's NamespaceName property after the call to + // FillTimedTextDescriptor() has set it. + // Fill a TimedTextDescriptor struct with the values from the file's contents. // Returns RESULT_INIT if the file is not open. Result_t FillTimedTextDescriptor(ASDCP::TimedText::TimedTextDescriptor&) const; @@ -488,7 +498,98 @@ namespace AS_02 }; } // namespace TimedText + namespace ISXD + { + // + 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&, + const std::string& isxd_document_namespace, + 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); + + // Writes an XML text document to the MXF file as per RP 2057. If the + // optional AESEncContext argument is present, the document is encrypted + // prior to writing. Fails if the file is not open, is finalized, or an + // operating system error occurs. + Result_t AddDmsGenericPartUtf8Text(const ASDCP::FrameBuffer& frame_buffer, ASDCP::AESEncContext* enc = 0, ASDCP::HMACContext* hmac = 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; + + // 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; + + // Reads a Generic Stream Partition payload. Returns RESULT_INIT if the file is + // not open, or RESULT_FORMAT if the SID is not present in the RIP, or if the + // actual partition at ByteOffset does not have a matching BodySID value. + // Encryption is not currently supported. + Result_t ReadGenericStreamPartitionPayload(ui32_t SID, ASDCP::FrameBuffer& FrameBuf); + + // Print debugging information to stream + void DumpHeaderMetadata(FILE* = 0) const; + void DumpIndex(FILE* = 0) const; + }; + + } } // namespace AS_02