Modified to enforce execution order of the predicates
[asdcplib.git] / src / h__02_Reader.cpp
index 1a0de1175151c0caa721bb220f9d7bb42bf50ef3..b3c092b39ede5b625a55a6ef94b50ca1c180b50a 100644 (file)
@@ -1,5 +1,5 @@
 /*
-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.
@@ -65,7 +65,7 @@ AS_02::default_md_object_init()
     
 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() {}
 
@@ -77,7 +77,7 @@ AS_02::MXF::AS02IndexReader::InitFromFile(const Kumu::FileReader& reader, const
   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;
 
@@ -93,7 +93,8 @@ AS_02::MXF::AS02IndexReader::InitFromFile(const Kumu::FileReader& reader, const
        }
       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);
@@ -227,8 +228,8 @@ AS_02::MXF::AS02IndexReader::InitFromFile(const Kumu::FileReader& reader, const
       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");
@@ -280,13 +281,15 @@ AS_02::MXF::AS02IndexReader::InitFromBuffer(const byte_t* p, ui32_t l, const ui6
        }
       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;
 }
@@ -341,16 +344,16 @@ AS_02::MXF::AS02IndexReader::GetDuration() const
 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");
@@ -362,17 +365,26 @@ 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");
+               }
            }
        }
     }
 
+  DefaultLogSink().Error("AS_02::MXF::AS02IndexReader::Lookup FAILED: frame_num=%d\n", frame_num);
   return RESULT_FAIL;
 }
 
@@ -387,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<OP1aHeader, AS_02::MXF::AS02IndexReader>::OpenMXFRead(filename);
@@ -399,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 )
            {
@@ -419,15 +430,18 @@ 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;
       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 )
        {