Skip to content
48 changes: 48 additions & 0 deletions src/MXF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1301,6 +1301,54 @@ ASDCP::MXF::OPAtomIndexFooter::ContainerDuration() const
return container_duration;
}

//
ui64_t
ASDCP::MXF::OPAtomIndexFooter::GetLargestElementSize() const
{
ui64_t last_offset = 0, largest_size = 0;
bool have_prev = false;
std::list<InterchangeObject*>::iterator li;

for ( li = m_PacketList->m_List.begin(); li != m_PacketList->m_List.end(); li++ )
{
IndexTableSegment *segment = dynamic_cast<IndexTableSegment*>(*li);

if ( segment == 0 )
continue;

if ( segment->EditUnitByteCount > 0 )
return segment->EditUnitByteCount;

for ( ui32_t i = 0; i < segment->IndexEntryArray.size(); ++i )
{
ui64_t offset = segment->IndexEntryArray[i].StreamOffset;

if ( have_prev )
{
ui64_t this_size = offset - last_offset;
if ( this_size > largest_size )
largest_size = this_size;
}

last_offset = offset;
have_prev = true;
}
}

if ( have_prev && m_ECOffset > 0 && (ui64_t)m_ECOffset < ThisPartition )
{
ui64_t essence_extent = ThisPartition - m_ECOffset;
if ( essence_extent > last_offset )
{
ui64_t last_element_size = essence_extent - last_offset;
if ( last_element_size > largest_size )
largest_size = last_element_size;
}
}

return largest_size;
}

//
ASDCP::Result_t
ASDCP::MXF::OPAtomIndexFooter::Lookup(ui32_t frame_num, IndexTableSegment::IndexEntry& Entry) const
Expand Down
1 change: 1 addition & 0 deletions src/MXF.h
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,7 @@ namespace ASDCP
virtual Result_t GetMDObjectsByType(const byte_t* ObjectID, std::list<InterchangeObject*>& ObjectList);

virtual ui64_t ContainerDuration() const;
virtual ui64_t GetLargestElementSize() const;
virtual Result_t Lookup(ui32_t frame_num, IndexTableSegment::IndexEntry&) const;
virtual void PushIndexEntry(const IndexTableSegment::IndexEntry&);
virtual void SetDeltaParams(const IndexTableSegment::DeltaEntry&);
Expand Down
1 change: 1 addition & 0 deletions src/h__Reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ ASDCP::h__ASDCPReader::OpenMXFRead(const std::string& filename)

if ( ASDCP_SUCCESS(result) )
{
m_IndexAccess.m_ECOffset = m_HeaderPart.BodyOffset;
m_IndexAccess.m_Lookup = &m_HeaderPart.m_Primer;
result = m_IndexAccess.InitFromFile(*m_File);
}
Expand Down
Loading