version revv
[asdcplib.git] / src / PCMParserList.cpp
index 919a76e4ca497ccdc3070fc298388850626f9d33..2ebdfa0b69f9c26ca3e7905d4654f8a7562e538c 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2009, John Hurst
+Copyright (c) 2004-2012, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -30,9 +30,12 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
 #include <PCMParserList.h>
+#include <KM_fileio.h>
+#include <KM_log.h>
 #include <assert.h>
 
 using namespace ASDCP;
+using namespace Kumu;
 
 
 ASDCP::ParserInstance::ParserInstance() : m_p(0), m_SampleSize(0)
@@ -45,7 +48,7 @@ ASDCP::ParserInstance::~ParserInstance()
 
 // PCM::CalcSampleSize(ADesc);
 Result_t
-ASDCP::ParserInstance::OpenRead(const char* filename, Rational& PictureRate)
+ASDCP::ParserInstance::OpenRead(const char* filename, const Rational& PictureRate)
 {
   ASDCP_TEST_NULL_STR(filename);
 
@@ -56,7 +59,7 @@ ASDCP::ParserInstance::OpenRead(const char* filename, Rational& PictureRate)
 
   if ( ASDCP_SUCCESS(result) )
     {
-      ADesc.SampleRate = PictureRate;
+      ADesc.EditRate = PictureRate;
       m_SampleSize = PCM::CalcSampleSize(ADesc);
       result = FB.Capacity(PCM::CalcFrameBufferSize(ADesc));
     }
@@ -105,26 +108,88 @@ ASDCP::PCMParserList::~PCMParserList()
     }
 }
 
-
 //
 Result_t
-ASDCP::PCMParserList::OpenRead(ui32_t argc, const char** argv, Rational& PictureRate)
+ASDCP::PCMParserList::OpenRead(ui32_t argc, const char** argv, const Rational& PictureRate)
 {
   ASDCP_TEST_NULL_STR(argv);
+  PathList_t TmpFileList;
+
+  for ( ui32_t i = 0; i < argc; ++i )
+    TmpFileList.push_back(argv[i]);
+
+  return OpenRead(TmpFileList, PictureRate);
+}
+
+//
+Result_t
+ASDCP::PCMParserList::OpenRead(const Kumu::PathList_t& argv, const Rational& PictureRate)
+{
   Result_t result = RESULT_OK;
+  PathList_t::iterator fi;
+  Kumu::PathList_t file_list;
 
-  for ( ui32_t i = 0; i < argc && ASDCP_SUCCESS(result); i++ )
+  if ( argv.size() == 1 && PathIsDirectory(argv.front()) )
     {
-      ParserInstance* I = new ParserInstance;
-      result = I->OpenRead(argv[i], PictureRate);
+      DirScanner Dir;
+      char name_buf[MaxFilePath];
+      result = Dir.Open(argv.front().c_str());
 
-      if ( ASDCP_SUCCESS(result) )
+      if ( KM_SUCCESS(result) )
+       result = Dir.GetNext(name_buf);
+
+      while ( KM_SUCCESS(result) )
        {
-         if ( i == 0 )
-           m_ADesc = I->ADesc;
+         if ( name_buf[0] != '.' ) // no hidden files
+           {
+             std::string tmp_path = argv.front() + "/" + name_buf;
+             file_list.push_back(tmp_path);
+           }
+
+         result = Dir.GetNext(name_buf);
+       }
 
+      if ( result == RESULT_ENDOFFILE )
+       {
+         result = RESULT_OK;
+         file_list.sort();
+       }
+    }
+  else
+    {
+      file_list = argv;
+    }
+
+  for ( fi = file_list.begin(); KM_SUCCESS(result) && fi != file_list.end(); ++fi )
+    {
+      mem_ptr<ParserInstance> I = new ParserInstance;
+      result = I->OpenRead(fi->c_str(), PictureRate);
+
+      if ( ASDCP_SUCCESS(result) )
+       {
+         if ( fi == file_list.begin() )
+           {
+             m_ADesc = I->ADesc;
+           }
          else
-           m_ADesc.BlockAlign += I->ADesc.BlockAlign;
+           {
+             if ( I->ADesc.AudioSamplingRate != m_ADesc.AudioSamplingRate )
+               {
+                 DefaultLogSink().Error("AudioSamplingRate mismatch in PCM parser list.");
+                 return RESULT_FORMAT;
+               }
+
+             if ( I->ADesc.QuantizationBits  != m_ADesc.QuantizationBits )
+               {
+                 DefaultLogSink().Error("QuantizationBits mismatch in PCM parser list.");
+                 return RESULT_FORMAT;
+               }
+
+             if ( I->ADesc.ContainerDuration < m_ADesc.ContainerDuration )
+               m_ADesc.ContainerDuration = I->ADesc.ContainerDuration;
+
+             m_ADesc.BlockAlign += I->ADesc.BlockAlign;
+           }
 
          m_ChannelCount += I->ADesc.ChannelCount;
        }
@@ -133,15 +198,22 @@ ASDCP::PCMParserList::OpenRead(ui32_t argc, const char** argv, Rational& Picture
        result = I->FB.Capacity(PCM::CalcFrameBufferSize(m_ADesc));
 
       if ( ASDCP_SUCCESS(result) )
-       push_back(I);
+       {
+         push_back(I);
+         I.release();
+       }
     }
 
-  m_ADesc.ChannelCount = m_ChannelCount;
-  m_ADesc.AvgBps = m_ADesc.AvgBps * m_ChannelCount;
+  if ( ASDCP_SUCCESS(result) )
+    {
+      m_ADesc.ChannelCount = m_ChannelCount;
+      m_ADesc.AvgBps = (ui32_t)(ceil(m_ADesc.AudioSamplingRate.Quotient()) * m_ADesc.BlockAlign);
+    }
+  else
+    {
+      clear();
+    }
 
-  if ( ASDCP_FAILURE(result) )
-    clear();
-  
   return result;
 }