X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FAS_DCP_MPEG2.cpp;h=d2f288573553b3d32ea9aa1a52fec56169fb3852;hb=57ddb7894042229bbc5f14e9257068afcc6f8725;hp=103cd44938a7279844ea774d063cd0e9c514265b;hpb=a526fabf937848823b02d5486a6ec38f8442bb1c;p=asdcplib.git diff --git a/src/AS_DCP_MPEG2.cpp b/src/AS_DCP_MPEG2.cpp index 103cd44..d2f2885 100755 --- a/src/AS_DCP_MPEG2.cpp +++ b/src/AS_DCP_MPEG2.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2004-2006, John Hurst +Copyright (c) 2004-2007, John Hurst All rights reserved. Redistribution and use in source and binary forms, with or without @@ -30,14 +30,16 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "AS_DCP_internal.h" -#include "MDD.h" //------------------------------------------------------------------------------------------ +static std::string MPEG_PACKAGE_LABEL = "File Package: SMPTE 381M frame wrapping of MPEG2 video elementary stream"; +static std::string PICT_DEF_LABEL = "Picture Track"; + // ASDCP::Result_t -ASDCP::MD_to_MPEG2_VDesc(MXF::MPEG2VideoDescriptor* VDescObj, MPEG2::VideoDescriptor& VDesc) +MD_to_MPEG2_VDesc(MXF::MPEG2VideoDescriptor* VDescObj, MPEG2::VideoDescriptor& VDesc) { ASDCP_TEST_NULL(VDescObj); @@ -57,13 +59,40 @@ ASDCP::MD_to_MPEG2_VDesc(MXF::MPEG2VideoDescriptor* VDescObj, MPEG2::VideoDescri VDesc.ColorSiting = VDescObj->ColorSiting; VDesc.CodedContentType = VDescObj->CodedContentType; - VDesc.LowDelay = VDescObj->LowDelay; + VDesc.LowDelay = VDescObj->LowDelay == 0 ? false : true; VDesc.BitRate = VDescObj->BitRate; VDesc.ProfileAndLevel = VDescObj->ProfileAndLevel; return RESULT_OK; } +// +ASDCP::Result_t +MPEG2_VDesc_to_MD(MPEG2::VideoDescriptor& VDesc, MXF::MPEG2VideoDescriptor* VDescObj) +{ + ASDCP_TEST_NULL(VDescObj); + + VDescObj->SampleRate = VDesc.SampleRate; + VDescObj->ContainerDuration = VDesc.ContainerDuration; + + VDescObj->FrameLayout = VDesc.FrameLayout; + VDescObj->StoredWidth = VDesc.StoredWidth; + VDescObj->StoredHeight = VDesc.StoredHeight; + VDescObj->AspectRatio = VDesc.AspectRatio; + + VDescObj->ComponentDepth = VDesc.ComponentDepth; + VDescObj->HorizontalSubsampling = VDesc.HorizontalSubsampling; + VDescObj->VerticalSubsampling = VDesc.VerticalSubsampling; + VDescObj->ColorSiting = VDesc.ColorSiting; + VDescObj->CodedContentType = VDesc.CodedContentType; + + VDescObj->LowDelay = VDesc.LowDelay ? 1 : 0; + VDescObj->BitRate = VDesc.BitRate; + VDescObj->ProfileAndLevel = VDesc.ProfileAndLevel; + return RESULT_OK; +} + + // void ASDCP::MPEG2::VideoDescriptorDump(const VideoDescriptor& VDesc, FILE* stream) @@ -72,20 +101,20 @@ ASDCP::MPEG2::VideoDescriptorDump(const VideoDescriptor& VDesc, FILE* stream) stream = stderr; fprintf(stream, "\ - SampleRate: %lu/%lu\n\ - FrameLayout: %lu\n\ - StoredWidth: %lu\n\ - StoredHeight: %lu\n\ - AspectRatio: %lu/%lu\n\ - ComponentDepth: %lu\n\ -HorizontalSubsampling: %lu\n\ - VerticalSubsampling: %lu\n\ - ColorSiting: %lu\n\ - CodedContentType: %lu\n\ - LowDelay: %lu\n\ - BitRate: %lu\n\ - ProfileAndLevel: %lu\n\ - ContainerDuration: %lu\n", + SampleRate: %d/%d\n\ + FrameLayout: %u\n\ + StoredWidth: %u\n\ + StoredHeight: %u\n\ + AspectRatio: %d/%d\n\ + ComponentDepth: %u\n\ + HorizontalSubsmpl: %u\n\ + VerticalSubsmpl: %u\n\ + ColorSiting: %u\n\ + CodedContentType: %u\n\ + LowDelay: %u\n\ + BitRate: %u\n\ + ProfileAndLevel: %u\n\ + ContainerDuration: %u\n", VDesc.SampleRate.Numerator ,VDesc.SampleRate.Denominator, VDesc.FrameLayout, VDesc.StoredWidth, @@ -144,7 +173,7 @@ ASDCP::MPEG2::MXFReader::h__Reader::OpenRead(const char* filename) result = InitMXFIndex(); if( ASDCP_SUCCESS(result) ) - result = InitInfo(m_Info); + result = InitInfo(); return result; } @@ -182,7 +211,7 @@ ASDCP::MPEG2::MXFReader::h__Reader::FindFrameGOPStart(ui32_t FrameNum, ui32_t& K if ( ASDCP_FAILURE(m_FooterPart.Lookup(FrameNum, TmpEntry)) ) { - DefaultLogSink().Error("Frame value out of range: %lu\n", FrameNum); + DefaultLogSink().Error("Frame value out of range: %u\n", FrameNum); return RESULT_RANGE; } @@ -201,7 +230,7 @@ ASDCP::MPEG2::MXFReader::h__Reader::ReadFrame(ui32_t FrameNum, FrameBuffer& Fram if ( ! m_File.IsOpen() ) return RESULT_INIT; - Result_t result = ReadEKLVPacket(FrameNum, FrameBuf, MPEGEssenceUL_Data, Ctx, HMAC); + Result_t result = ReadEKLVFrame(FrameNum, FrameBuf, Dict::ul(MDD_MPEG2Essence), Ctx, HMAC); if ( ASDCP_FAILURE(result) ) return result; @@ -234,7 +263,7 @@ ASDCP::MPEG2::FrameBuffer::Dump(FILE* stream, ui32_t dump_len) const if ( stream == 0 ) stream = stderr; - fprintf(stream, "Frame: %06lu, %c%-2hu, %7lu bytes", + fprintf(stream, "Frame: %06u, %c%-2hu, %7u bytes", m_FrameNumber, FrameTypeChar(m_FrameType), m_TemporalOffset, m_Size); if ( m_GOPStart ) @@ -243,7 +272,7 @@ ASDCP::MPEG2::FrameBuffer::Dump(FILE* stream, ui32_t dump_len) const fputc('\n', stream); if ( dump_len > 0 ) - hexdump(m_Data, dump_len, stream); + Kumu::hexdump(m_Data, dump_len, stream); } @@ -350,8 +379,6 @@ ASDCP::MPEG2::MXFReader::DumpIndex(FILE* stream) const //------------------------------------------------------------------------------------------ -#if 0 - // class ASDCP::MPEG2::MXFWriter::h__Writer : public ASDCP::h__Writer @@ -359,10 +386,14 @@ class ASDCP::MPEG2::MXFWriter::h__Writer : public ASDCP::h__Writer public: VideoDescriptor m_VDesc; ui32_t m_GOPOffset; + byte_t m_EssenceUL[SMPTE_UL_LENGTH]; ASDCP_NO_COPY_CONSTRUCT(h__Writer); - h__Writer() : m_GOPOffset(0) {} + h__Writer() : m_GOPOffset(0) { + memset(m_EssenceUL, 0, SMPTE_UL_LENGTH); + } + ~h__Writer(){} Result_t OpenWrite(const char*, ui32_t HeaderSize); @@ -380,13 +411,12 @@ ASDCP::MPEG2::MXFWriter::h__Writer::OpenWrite(const char* filename, ui32_t Heade if ( ! m_State.Test_BEGIN() ) return RESULT_STATE; - m_File = new MXFFile; - - Result_t result = m_File->OpenWrite(filename); + Result_t result = m_File.OpenWrite(filename); if ( ASDCP_SUCCESS(result) ) { - m_EssenceDescriptor = new MDObject("MPEG2VideoDescriptor"); + m_HeaderSize = HeaderSize; + m_EssenceDescriptor = new MPEG2VideoDescriptor; result = m_State.Goto_INIT(); } @@ -401,13 +431,19 @@ ASDCP::MPEG2::MXFWriter::h__Writer::SetSourceStream(const VideoDescriptor& VDesc return RESULT_STATE; m_VDesc = VDesc; - Result_t result = MPEG2_VDesc_to_MD(m_VDesc, *m_EssenceDescriptor); + Result_t result = MPEG2_VDesc_to_MD(m_VDesc, (MPEG2VideoDescriptor*)m_EssenceDescriptor); if ( ASDCP_SUCCESS(result) ) - result = WriteMXFHeader(ESS_MPEG2_VES, m_VDesc.EditRate, 24 /* TCFrameRate */); + result = WriteMXFHeader(MPEG_PACKAGE_LABEL, UL(Dict::ul(MDD_MPEG2_VESWrapping)), + PICT_DEF_LABEL, UL(Dict::ul(MDD_PictureDataDef)), + m_VDesc.EditRate, 24 /* TCFrameRate */); if ( ASDCP_SUCCESS(result) ) - result = m_State.Goto_READY(); + { + memcpy(m_EssenceUL, Dict::ul(MDD_MPEG2Essence), SMPTE_UL_LENGTH); + m_EssenceUL[SMPTE_UL_LENGTH-1] = 1; // first (and only) essence container + result = m_State.Goto_READY(); + } return result; } @@ -426,10 +462,11 @@ ASDCP::MPEG2::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESE if ( m_State.Test_READY() ) result = m_State.Goto_RUNNING(); // first time through, get the body location - ui64_t ThisOffset = m_StreamOffset; + IndexTableSegment::IndexEntry Entry; + Entry.StreamOffset = m_StreamOffset; if ( ASDCP_SUCCESS(result) ) - result = WriteEKLVPacket(FrameBuf, MPEGEssenceUL_Data, Ctx, HMAC); + result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC); if ( ASDCP_FAILURE(result) ) return result; @@ -454,10 +491,17 @@ ASDCP::MPEG2::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESE } // update the index manager - m_IndexMan->OfferEditUnit(0, m_FramesWritten, m_GOPOffset, Flags); - m_IndexMan->OfferTemporalOffset(m_FramesWritten, m_GOPOffset - FrameBuf.TemporalOffset()); - m_IndexMan->OfferOffset(0, m_FramesWritten, ThisOffset); - + Entry.TemporalOffset = - FrameBuf.TemporalOffset(); + Entry.KeyFrameOffset = - m_GOPOffset; + Entry.Flags = Flags; + /* + fprintf(stderr, "to: %4hd ko: %4hd c1: %4hd c2: %4hd fl: 0x%02x\n", + Entry.TemporalOffset, Entry.KeyFrameOffset, + m_GOPOffset + Entry.TemporalOffset, + Entry.KeyFrameOffset - Entry.TemporalOffset, + Entry.Flags); + */ + m_FooterPart.PushIndexEntry(Entry); m_FramesWritten++; m_GOPOffset++; @@ -473,12 +517,9 @@ ASDCP::MPEG2::MXFWriter::h__Writer::Finalize() if ( ! m_State.Test_RUNNING() ) return RESULT_STATE; - if ( ! m_File ) - return RESULT_INIT; - m_State.Goto_FINAL(); - return WriteMXFFooter(ESS_MPEG2_VES); + return WriteMXFFooter(); } @@ -540,7 +581,7 @@ ASDCP::MPEG2::MXFWriter::Finalize() return m_Writer->Finalize(); } -#endif + // // end AS_DCP_MPEG2.cpp