/*
-Copyright (c) 2004, John Hurst
+Copyright (c) 2004-2011, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
#include <Wav.h>
#include <assert.h>
+#include <KM_log.h>
+using Kumu::DefaultLogSink;
using namespace ASDCP;
using namespace ASDCP::PCM;
using namespace ASDCP::Wav;
+using namespace ASDCP::RF64;
//------------------------------------------------------------------------------------------
//
class ASDCP::PCM::WAVParser::h__WAVParser
{
- FileReader m_FileReader;
+ Kumu::FileReader m_FileReader;
bool m_EOF;
ui32_t m_DataStart;
- ui32_t m_DataLength;
- ui32_t m_ReadCount;
+ ui64_t m_DataLength;
+ ui64_t m_ReadCount;
ui32_t m_FrameBufferSize;
ui32_t m_FramesRead;
Rational m_PictureRate;
Close();
}
- Result_t OpenRead(const char* filename, const Rational& PictureRate);
+ Result_t OpenRead(const std::string& filename, const Rational& PictureRate);
void Close();
void Reset();
Result_t ReadFrame(FrameBuffer&);
+ Result_t Seek(ui32_t frame_number);
};
//
ASDCP::Result_t
-ASDCP::PCM::WAVParser::h__WAVParser::OpenRead(const char* filename, const Rational& PictureRate)
+ASDCP::PCM::WAVParser::h__WAVParser::OpenRead(const std::string& filename, const Rational& PictureRate)
{
- ASDCP_TEST_NULL_STR(filename);
-
Result_t result = m_FileReader.OpenRead(filename);
if ( ASDCP_SUCCESS(result) )
m_FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(m_ADesc);
m_DataLength = WavHeader.data_len;
m_ADesc.ContainerDuration = m_DataLength / m_FrameBufferSize;
+ m_ADesc.ChannelFormat = PCM::CF_NONE;
Reset();
}
else
m_FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(m_ADesc);
m_DataLength = AIFFHeader.data_len;
m_ADesc.ContainerDuration = m_DataLength / m_FrameBufferSize;
+ m_ADesc.ChannelFormat = PCM::CF_NONE;
Reset();
}
+ else
+ {
+ SimpleRF64Header RF64Header;
+ m_FileReader.Seek(0);
+ result = RF64Header.ReadFromFile(m_FileReader, &m_DataStart);
+
+ if ( ASDCP_SUCCESS(result) )
+ {
+ RF64Header.FillADesc(m_ADesc, PictureRate);
+ m_FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(m_ADesc);
+ m_DataLength = RF64Header.data_len;
+ m_ADesc.ContainerDuration = m_DataLength / m_FrameBufferSize;
+ m_ADesc.ChannelFormat = PCM::CF_NONE;
+ Reset();
+ }
+ }
}
}
{
FB.Size(0);
- if ( m_EOF || m_ReadCount >= m_DataLength )
- return RESULT_ENDOFFILE;
+ if ( m_EOF )
+ {
+ return RESULT_ENDOFFILE;
+ }
if ( FB.Capacity() < m_FrameBufferSize )
{
- DefaultLogSink().Error("FrameBuf.Capacity: %lu FrameLength: %lu\n",
+ DefaultLogSink().Error("FrameBuf.Capacity: %u FrameLength: %u\n",
FB.Capacity(), m_FrameBufferSize);
return RESULT_SMALLBUF;
}
m_EOF = true;
if ( read_count > 0 )
- result = RESULT_OK;
+ {
+ result = RESULT_OK;
+ }
}
if ( ASDCP_SUCCESS(result) )
m_ReadCount += read_count;
FB.Size(read_count);
FB.FrameNumber(m_FramesRead++);
+
+ if ( read_count < FB.Capacity() )
+ {
+ memset(FB.Data() + FB.Size(), 0, FB.Capacity() - FB.Size());
+ }
}
return result;
}
+//
+ASDCP::Result_t ASDCP::PCM::WAVParser::h__WAVParser::Seek(ui32_t frame_number)
+{
+ m_FramesRead = frame_number - 1;
+ m_ReadCount = 0;
+ return m_FileReader.Seek(m_DataStart + m_FrameBufferSize * frame_number);
+}
+
//------------------------------------------------------------------------------------------
// Opens the stream for reading, parses enough data to provide a complete
// set of stream metadata for the MXFWriter below.
ASDCP::Result_t
-ASDCP::PCM::WAVParser::OpenRead(const char* filename, const Rational& PictureRate) const
+ASDCP::PCM::WAVParser::OpenRead(const std::string& filename, const Rational& PictureRate) const
{
const_cast<ASDCP::PCM::WAVParser*>(this)->m_Parser = new h__WAVParser;
return RESULT_OK;
}
+ASDCP::Result_t ASDCP::PCM::WAVParser::Seek(ui32_t frame_number) const
+{
+ if ( m_Parser.empty() )
+ return RESULT_INIT;
+
+ return m_Parser->Seek(frame_number);;
+}
//
// end PCM_Parser.cpp