X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fh__02_Reader.cpp;h=b3c092b39ede5b625a55a6ef94b50ca1c180b50a;hb=250b2032101b132a29e935173034cc4393f76978;hp=45825f07755403a7ed67d1b17af9327b771a10b8;hpb=ed84256d7687b8255991308361e26013b7071dd9;p=asdcplib.git diff --git a/src/h__02_Reader.cpp b/src/h__02_Reader.cpp index 45825f0..b3c092b 100644 --- a/src/h__02_Reader.cpp +++ b/src/h__02_Reader.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2011-2015, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, +Copyright (c) 2011-2018, Robert Scheler, Heiko Sparenberg Fraunhofer IIS, John Hurst All rights reserved. @@ -93,7 +93,7 @@ AS_02::MXF::AS02IndexReader::InitFromFile(const Kumu::FileReader& reader, const } else if ( i->BodySID != first_body_sid ) { - DefaultLogSink().Debug("The index assembler is ignoring BodySID %d.\n", i->BodySID); + // DefaultLogSink().Debug("The index assembler is ignoring BodySID %d.\n", i->BodySID); continue; } @@ -353,7 +353,7 @@ AS_02::MXF::AS02IndexReader::Lookup(ui32_t frame_num, ASDCP::MXF::IndexTableSegm { ui64_t start_pos = segment->IndexStartPosition; - if ( segment->EditUnitByteCount > 0 ) + if ( segment->EditUnitByteCount > 0 ) // CBR { if ( m_PacketList->m_List.size() > 1 ) DefaultLogSink().Error("Unexpected multiple IndexTableSegment in CBR file\n"); @@ -365,13 +365,21 @@ AS_02::MXF::AS02IndexReader::Lookup(ui32_t frame_num, ASDCP::MXF::IndexTableSegm return RESULT_OK; } else if ( (ui64_t)frame_num >= start_pos - && (ui64_t)frame_num < (start_pos + segment->IndexDuration) ) + && (ui64_t)frame_num < (start_pos + segment->IndexDuration) ) // VBR in segments { ui64_t tmp = frame_num - start_pos; assert(tmp <= 0xFFFFFFFFL); - Entry = segment->IndexEntryArray[(ui32_t) tmp]; - Entry.StreamOffset = Entry.StreamOffset - segment->RtEntryOffset + segment->RtFileOffset; - return RESULT_OK; + + if ( tmp < segment->IndexEntryArray.size() ) + { + Entry = segment->IndexEntryArray[(ui32_t) tmp]; + Entry.StreamOffset = Entry.StreamOffset - segment->RtEntryOffset + segment->RtFileOffset; + return RESULT_OK; + } + else + { + DefaultLogSink().Error("Malformed index table segment, IndexDuration does not match entries.\n"); + } } } } @@ -391,7 +399,7 @@ AS_02::h__AS02Reader::~h__AS02Reader() {} // AS-DCP method of opening an MXF file for read Result_t -AS_02::h__AS02Reader::OpenMXFRead(const char* filename) +AS_02::h__AS02Reader::OpenMXFRead(const std::string& filename) { bool has_header_essence = false; Result_t result = ASDCP::MXF::TrackFileReader::OpenMXFRead(filename); @@ -403,13 +411,12 @@ AS_02::h__AS02Reader::OpenMXFRead(const char* filename) { // UL OP1a_ul(m_Dict->ul(MDD_OP1a)); - InterchangeObject* Object; m_Info.LabelSetType = LS_MXF_SMPTE; if ( m_HeaderPart.OperationalPattern != OP1a_ul ) { char strbuf[IdentBufferLen]; - const MDDEntry* Entry = m_Dict->FindUL(m_HeaderPart.OperationalPattern.Value()); + const MDDEntry* Entry = m_Dict->FindULAnyVersion(m_HeaderPart.OperationalPattern.Value()); if ( Entry == 0 ) { @@ -423,10 +430,13 @@ AS_02::h__AS02Reader::OpenMXFRead(const char* filename) } // - if ( m_RIP.PairArray.front().ByteOffset != 0 ) + if ( ! m_RIP.PairArray.empty() ) { - DefaultLogSink().Error("First Partition in RIP is not at offset 0.\n"); - return RESULT_AS02_FORMAT; + if ( m_RIP.PairArray.front().ByteOffset != 0 ) + { + DefaultLogSink().Error("First Partition in RIP is not at offset 0.\n"); + return RESULT_AS02_FORMAT; + } } Kumu::fpos_t first_partition_after_header = 0;