Modified to enforce execution order of the predicates
[asdcplib.git] / src / h__02_Reader.cpp
index cf2b00f340c27e89884f5a6b91cfe8d45d633456..b3c092b39ede5b625a55a6ef94b50ca1c180b50a 100644 (file)
@@ -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;
        }
 
@@ -228,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");
@@ -281,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;
 }
@@ -351,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");
@@ -363,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");
+               }
            }
        }
     }
@@ -389,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);
@@ -401,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 )
            {
@@ -421,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;