X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FAS_DCP_MPEG2.cpp;h=bd2709e3344eae1f6a6c6d78e4cf57fd255baf22;hb=830570c46c4d39a8a5767f83875e3ef2f79ecc98;hp=a12658354ad146f7bc1f355d890460b56c674ce1;hpb=8095eaa320551b6795d0368c0ad0c227a3167caa;p=asdcplib.git diff --git a/src/AS_DCP_MPEG2.cpp b/src/AS_DCP_MPEG2.cpp index a126583..bd2709e 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,18 +30,66 @@ 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); - VDesc = *((MPEG2::VideoDescriptor*)VDescObj); - VDesc.FrameRate = 0; + + VDesc.SampleRate = VDescObj->SampleRate; + VDesc.EditRate = VDescObj->SampleRate; + VDesc.FrameRate = VDescObj->SampleRate.Numerator; + assert(VDescObj->ContainerDuration <= 0xFFFFFFFFL); + VDesc.ContainerDuration = (ui32_t) VDescObj->ContainerDuration; + + VDesc.FrameLayout = VDescObj->FrameLayout; + VDesc.StoredWidth = VDescObj->StoredWidth; + VDesc.StoredHeight = VDescObj->StoredHeight; + VDesc.AspectRatio = VDescObj->AspectRatio; + + VDesc.ComponentDepth = VDescObj->ComponentDepth; + VDesc.HorizontalSubsampling = VDescObj->HorizontalSubsampling; + VDesc.VerticalSubsampling = VDescObj->VerticalSubsampling; + VDesc.ColorSiting = VDescObj->ColorSiting; + VDesc.CodedContentType = VDescObj->CodedContentType; + + 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; } @@ -54,20 +102,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, @@ -126,7 +174,7 @@ ASDCP::MPEG2::MXFReader::h__Reader::OpenRead(const char* filename) result = InitMXFIndex(); if( ASDCP_SUCCESS(result) ) - result = InitInfo(m_Info); + result = InitInfo(); return result; } @@ -164,7 +212,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; } @@ -183,7 +231,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; @@ -216,7 +264,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 ) @@ -225,7 +273,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); } @@ -332,8 +380,6 @@ ASDCP::MPEG2::MXFReader::DumpIndex(FILE* stream) const //------------------------------------------------------------------------------------------ -#if 0 - // class ASDCP::MPEG2::MXFWriter::h__Writer : public ASDCP::h__Writer @@ -341,10 +387,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); @@ -362,13 +412,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(); } @@ -383,13 +432,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; } @@ -408,10 +463,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; @@ -436,10 +492,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 = 0 - 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++; @@ -455,12 +518,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(); } @@ -484,14 +544,12 @@ ASDCP::MPEG2::MXFWriter::OpenWrite(const char* filename, const WriterInfo& Info, const VideoDescriptor& VDesc, ui32_t HeaderSize) { m_Writer = new h__Writer; + m_Writer->m_Info = Info; Result_t result = m_Writer->OpenWrite(filename, HeaderSize); if ( ASDCP_SUCCESS(result) ) - { - m_Writer->m_Info = Info; - result = m_Writer->SetSourceStream(VDesc); - } + result = m_Writer->SetSourceStream(VDesc); if ( ASDCP_FAILURE(result) ) m_Writer.release(); @@ -522,7 +580,7 @@ ASDCP::MPEG2::MXFWriter::Finalize() return m_Writer->Finalize(); } -#endif + // // end AS_DCP_MPEG2.cpp