X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FAS_DCP_MPEG2.cpp;h=bd2709e3344eae1f6a6c6d78e4cf57fd255baf22;hb=830570c46c4d39a8a5767f83875e3ef2f79ecc98;hp=51fd80222df6de183f612f6197c292a8f1691ff8;hpb=e73ef2046cf4f6beb730be071022aaedb3b44bba;p=asdcplib.git diff --git a/src/AS_DCP_MPEG2.cpp b/src/AS_DCP_MPEG2.cpp index 51fd802..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,21 +30,24 @@ 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.SampleRate = VDescObj->SampleRate; VDesc.EditRate = VDescObj->SampleRate; VDesc.FrameRate = VDescObj->SampleRate.Numerator; - VDesc.ContainerDuration = VDescObj->ContainerDuration; + assert(VDescObj->ContainerDuration <= 0xFFFFFFFFL); + VDesc.ContainerDuration = (ui32_t) VDescObj->ContainerDuration; VDesc.FrameLayout = VDescObj->FrameLayout; VDesc.StoredWidth = VDescObj->StoredWidth; @@ -57,7 +60,7 @@ 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; @@ -66,8 +69,27 @@ ASDCP::MD_to_MPEG2_VDesc(MXF::MPEG2VideoDescriptor* VDescObj, MPEG2::VideoDescri // ASDCP::Result_t -ASDCP::MPEG2_VDesc_to_MD(MPEG2::VideoDescriptor&, MXF::MPEG2VideoDescriptor*) +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; } @@ -80,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, @@ -152,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; } @@ -190,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; } @@ -209,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; @@ -242,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 ) @@ -251,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); } @@ -365,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); @@ -390,7 +416,8 @@ ASDCP::MPEG2::MXFWriter::h__Writer::OpenWrite(const char* filename, ui32_t Heade if ( ASDCP_SUCCESS(result) ) { - // m_EssenceDescriptor = new MDObject("MPEG2VideoDescriptor"); + m_HeaderSize = HeaderSize; + m_EssenceDescriptor = new MPEG2VideoDescriptor; result = m_State.Goto_INIT(); } @@ -405,13 +432,19 @@ ASDCP::MPEG2::MXFWriter::h__Writer::SetSourceStream(const VideoDescriptor& VDesc return RESULT_STATE; m_VDesc = VDesc; - Result_t result = RESULT_OK; // 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; } @@ -430,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; @@ -458,12 +492,17 @@ ASDCP::MPEG2::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESE } // update the index manager -#if 0 - 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); -#endif - + 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++; @@ -481,7 +520,7 @@ ASDCP::MPEG2::MXFWriter::h__Writer::Finalize() m_State.Goto_FINAL(); - return WriteMXFFooter(ESS_MPEG2_VES); + return WriteMXFFooter(); } @@ -505,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();