X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FAS_DCP_MPEG2.cpp;h=bd2709e3344eae1f6a6c6d78e4cf57fd255baf22;hb=830570c46c4d39a8a5767f83875e3ef2f79ecc98;hp=26988e45c4121341236f16f8241eb2b9d5ee7464;hpb=dde89765744dad9a6b9d13126092d9bfc2dbc0d7;p=asdcplib.git diff --git a/src/AS_DCP_MPEG2.cpp b/src/AS_DCP_MPEG2.cpp index 26988e4..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 @@ -46,7 +46,8 @@ MD_to_MPEG2_VDesc(MXF::MPEG2VideoDescriptor* VDescObj, MPEG2::VideoDescriptor& V 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; @@ -73,7 +74,6 @@ MPEG2_VDesc_to_MD(MPEG2::VideoDescriptor& VDesc, MXF::MPEG2VideoDescriptor* VDes ASDCP_TEST_NULL(VDescObj); VDescObj->SampleRate = VDesc.SampleRate; - VDescObj->SampleRate.Numerator = VDesc.FrameRate; VDescObj->ContainerDuration = VDesc.ContainerDuration; VDescObj->FrameLayout = VDesc.FrameLayout; @@ -102,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\ - HorizontalSubsmpl: %lu\n\ - VerticalSubsmpl: %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, @@ -212,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; } @@ -231,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, Dict::ul(MDD_MPEG2Essence), Ctx, HMAC); + Result_t result = ReadEKLVFrame(FrameNum, FrameBuf, Dict::ul(MDD_MPEG2Essence), Ctx, HMAC); if ( ASDCP_FAILURE(result) ) return result; @@ -264,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 ) @@ -273,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); } @@ -387,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); @@ -436,7 +440,11 @@ ASDCP::MPEG2::MXFWriter::h__Writer::SetSourceStream(const VideoDescriptor& VDesc 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; } @@ -459,7 +467,7 @@ ASDCP::MPEG2::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESE Entry.StreamOffset = m_StreamOffset; if ( ASDCP_SUCCESS(result) ) - result = WriteEKLVPacket(FrameBuf, Dict::ul(MDD_MPEG2Essence), Ctx, HMAC); + result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC); if ( ASDCP_FAILURE(result) ) return result; @@ -485,8 +493,15 @@ ASDCP::MPEG2::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESE // update the index manager Entry.TemporalOffset = - FrameBuf.TemporalOffset(); - Entry.KeyFrameOffset = m_GOPOffset; + 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++; @@ -529,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();