/*
-Copyright (c) 2011-2013, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
+Copyright (c) 2011-2018, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
John Hurst
All rights reserved.
AS_02::MXF::AS02IndexReader::AS02IndexReader(const ASDCP::Dictionary*& d) :
m_Duration(0), m_BytesPerEditUnit(0),
- ASDCP::MXF::Partition(m_Dict), m_Dict(d) {}
+ ASDCP::MXF::Partition(d), m_Dict(d) {}
AS_02::MXF::AS02IndexReader::~AS02IndexReader() {}
body_part_array_t body_part_array;
body_part_array_t::const_iterator body_part_iter;
- ASDCP::MXF::Array<ASDCP::MXF::RIP::Pair>::const_iterator i;
+ RIP::const_pair_iterator i;
Result_t result = m_IndexSegmentData.Capacity(128*Kumu::Kilobyte); // will be grown if needed
ui32_t first_body_sid = 0;
}
else if ( i->BodySID != first_body_sid )
{
- DefaultLogSink().Error("RIP contains multipls BodySID identities.\n");
+ // DefaultLogSink().Debug("The index assembler is ignoring BodySID %d.\n", i->BodySID);
+ continue;
}
reader.Seek(i->ByteOffset);
fprintf(stderr, " EditUnitByteCount = %u\n", segment->EditUnitByteCount);
fprintf(stderr, " IndexSID = %u\n", segment->IndexSID);
fprintf(stderr, " BodySID = %u\n", segment->BodySID);
- fprintf(stderr, " SliceCount = %hu\n", segment->SliceCount);
- fprintf(stderr, " PosTableCount = %hu\n", segment->PosTableCount);
+ fprintf(stderr, " SliceCount = %hhu\n", segment->SliceCount);
+ fprintf(stderr, " PosTableCount = %hhu\n", segment->PosTableCount);
fprintf(stderr, " RtFileOffset = %s\n", i64sz(segment->RtFileOffset, identbuf));
fprintf(stderr, " RtEntryOffset = %s\n", i64sz(segment->RtEntryOffset, identbuf));
fprintf(stderr, " IndexEntryArray:\n");
}
else
{
- DefaultLogSink().Error("Error initializing packet\n");
+ DefaultLogSink().Error("Error initializing index segment packet.\n");
delete object;
}
}
if ( KM_FAILURE(result) )
- DefaultLogSink().Error("Failed to initialize AS02IndexReader\n");
+ {
+ DefaultLogSink().Error("Failed to initialize AS02IndexReader.\n");
+ }
return result;
}
Result_t
AS_02::MXF::AS02IndexReader::Lookup(ui32_t frame_num, ASDCP::MXF::IndexTableSegment::IndexEntry& Entry) const
{
- std::list<InterchangeObject*>::iterator li;
- for ( li = m_PacketList->m_List.begin(); li != m_PacketList->m_List.end(); li++ )
+ std::list<InterchangeObject*>::iterator i;
+ for ( i = m_PacketList->m_List.begin(); i != m_PacketList->m_List.end(); ++i )
{
- IndexTableSegment *segment = dynamic_cast<IndexTableSegment*>(*li);
+ IndexTableSegment *segment = dynamic_cast<IndexTableSegment*>(*i);
if ( segment != 0 )
{
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");
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");
+ }
}
}
}
+ DefaultLogSink().Error("AS_02::MXF::AS02IndexReader::Lookup FAILED: frame_num=%d\n", frame_num);
return RESULT_FAIL;
}
// 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<OP1aHeader, AS_02::MXF::AS02IndexReader>::OpenMXFRead(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 )
{
}
//
- 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;
bool has_body_sid = false;
- Array<RIP::Pair>::iterator r_i;
+ RIP::pair_iterator r_i;
for ( r_i = m_RIP.PairArray.begin(); r_i != m_RIP.PairArray.end(); ++r_i )
{