X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FMPEG2_Parser.cpp;h=62eb5f58265e153adecc23e51831de6143b8ea66;hb=d28ab84e2422180474aa3e80cc98097dca25aca0;hp=af7396f1e6428f6307f07124d76847351b2dc946;hpb=bfedf725dac9d13f3a02fe69f45c302ab29d2b1e;p=asdcplib.git diff --git a/src/MPEG2_Parser.cpp b/src/MPEG2_Parser.cpp index af7396f..62eb5f5 100755 --- a/src/MPEG2_Parser.cpp +++ b/src/MPEG2_Parser.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2004-2006, John Hurst +Copyright (c) 2004-2009, John Hurst All rights reserved. Redistribution and use in source and binary forms, with or without @@ -54,6 +54,23 @@ enum ParserState_t { ST_SLICE, }; +const char* +StringParserState(ParserState_t state) +{ + switch ( state ) + { + case ST_INIT: return "INIT"; + case ST_SEQ: return "SEQ"; + case ST_PIC: return "PIC"; + case ST_GOP: return "GOP"; + case ST_EXT: return "EXT"; + case ST_SLICE: return "SLICE"; + } + + return "*UNKNOWN*"; +} + + // class h__ParserState @@ -74,11 +91,12 @@ class h__ParserState switch ( m_State ) { case ST_INIT: + case ST_EXT: m_State = ST_SEQ; return RESULT_OK; } - DefaultLogSink().Error("SEQ follows 0x%02x\n", m_State); + DefaultLogSink().Error("SEQ follows %s\n", StringParserState(m_State)); return RESULT_STATE; } @@ -94,7 +112,7 @@ class h__ParserState return RESULT_OK; } - DefaultLogSink().Error("Slice follows 0x%02x\n", m_State); + DefaultLogSink().Error("Slice follows %s\n", StringParserState(m_State)); return RESULT_STATE; } @@ -112,7 +130,7 @@ class h__ParserState return RESULT_OK; } - DefaultLogSink().Error("PIC follows 0x%02x\n", m_State); + DefaultLogSink().Error("PIC follows %s\n", StringParserState(m_State)); return RESULT_STATE; } @@ -128,7 +146,7 @@ class h__ParserState return RESULT_OK; } - DefaultLogSink().Error("GOP follows 0x%02x\n", m_State); + DefaultLogSink().Error("GOP follows %s\n", StringParserState(m_State)); return RESULT_STATE; } @@ -145,7 +163,7 @@ class h__ParserState return RESULT_OK; } - DefaultLogSink().Error("EXT follows 0x%02x\n", m_State); + DefaultLogSink().Error("EXT follows %s\n", StringParserState(m_State)); return RESULT_STATE; } }; @@ -288,9 +306,9 @@ public: return RESULT_FALSE; } - Accessor::Picture PIC(b); - m_TemporalRef = PIC.TemporalRef(); - m_FrameType = PIC.FrameType(); + Accessor::Picture pic(b); + m_TemporalRef = pic.TemporalRef(); + m_FrameType = pic.FrameType(); m_FrameSize += s; return m_State.Goto_PIC(); } @@ -399,7 +417,10 @@ ASDCP::MPEG2::Parser::h__Parser::OpenRead(const char* filename) // Since no one complained and that's the easiest thing to implement, // I have left it that way. Let me know if you want to be able to // locate the first GOP in the stream. - if ( p[0] != 0 || p[1] != 0 || p[2] != 1 || ! ( p[3] == SEQ_START || p[3] == PIC_START ) ) + ui32_t i = 0; + while ( p[i] == 0 ) i++; + + if ( i < 2 || p[i] != 1 || ! ( p[i+1] == SEQ_START || p[i+1] == PIC_START ) ) { DefaultLogSink().Error("Frame buffer does not begin with a PIC or SEQ start code.\n"); return RESULT_RAW_FORMAT; @@ -414,6 +435,8 @@ ASDCP::MPEG2::Parser::h__Parser::OpenRead(const char* filename) if ( ASDCP_SUCCESS(result) ) { + ui64_t tmp = m_FileReader.Size() / 65536; // a gross approximation + m_ParamsDelegate.m_VDesc.ContainerDuration = (ui32_t) tmp; m_Parser.SetDelegate(&m_ParserDelegate); m_FileReader.Seek(0); } @@ -460,7 +483,7 @@ ASDCP::MPEG2::Parser::h__Parser::ReadFrame(FrameBuffer& FB) { if ( FB.Capacity() < ( write_offset + VESReadSize ) ) { - DefaultLogSink().Error("FrameBuf.Capacity: %lu FrameLength: %lu\n", + DefaultLogSink().Error("FrameBuf.Capacity: %u FrameLength: %u\n", FB.Capacity(), ( write_offset + VESReadSize )); return RESULT_SMALLBUF; }