#ifndef _AP4_AC4_PARSER_H_
#define _AP4_AC4_PARSER_H_
#include "Ap4Types.h"
#include "Ap4BitStream.h"
#include "Ap4Dac4Atom.h"
#define AP4_AC4_HEADER_SIZE 7
#define AP4_AC4_MAX_TOC_SIZE 512
#define AP4_AC4_SYNC_WORD 0xAC40
#define AP4_AC4_SYNC_WORD_CRC 0xAC41
class AP4_Ac4Header {
public:
AP4_Ac4Header(const AP4_UI08* bytes, unsigned int size);
~AP4_Ac4Header();
AP4_Result Check();
AP4_UI32 m_SyncWord;
AP4_UI32 m_HeaderSize;
AP4_UI32 m_FrameSize;
AP4_UI32 m_CrcSize;
AP4_UI32 m_ChannelCount;
AP4_UI32 m_BitstreamVersion;
AP4_UI32 m_SequenceCounter;
AP4_UI32 m_BWaitFrames;
AP4_UI32 m_WaitFrames;
AP4_UI32 m_BrCode;
AP4_UI32 m_FsIndex;
AP4_UI32 m_FrameRateIndex;
AP4_UI32 m_BIframeGlobal;
AP4_UI32 m_BSinglePresentation;
AP4_UI32 m_BMorePresentations;
AP4_UI32 m_NPresentations;
AP4_UI32 m_BPayloadBase;
AP4_UI32 m_PayloadBase;
AP4_UI32 m_BProgramId;
AP4_UI32 m_ShortProgramId;
AP4_UI32 m_BProgramUuidPresent;
AP4_Byte m_ProgramUuid[16];
static bool m_DeprecatedV0;
AP4_Dac4Atom::Ac4Dsi::PresentationV1 *m_PresentationV1;
static bool MatchFixed(AP4_Ac4Header& frame, AP4_Ac4Header& next_frame);
private:
AP4_Result GetPresentationVersionBySGIndex(unsigned int substream_group_index);
AP4_Result GetPresentationIndexBySGIndex (unsigned int substream_group_index);
};
typedef struct {
AP4_UI32 m_HeaderSize;
AP4_UI32 m_FrameSize;
AP4_UI32 m_CRCSize;
AP4_UI32 m_ChannelCount;
AP4_UI32 m_SampleDuration;
AP4_UI32 m_MediaTimeScale;
AP4_UI32 m_Iframe;
AP4_Dac4Atom::Ac4Dsi m_Ac4Dsi;
} AP4_Ac4FrameInfo;
typedef struct {
AP4_BitStream* m_Source;
AP4_Ac4FrameInfo m_Info;
} AP4_Ac4Frame;
class AP4_Ac4Parser {
public:
AP4_Ac4Parser();
virtual ~AP4_Ac4Parser();
AP4_Result Reset();
AP4_Result Feed(const AP4_UI08* buffer,
AP4_Size* buffer_size,
AP4_Flags flags = 0);
AP4_Result FindFrame(AP4_Ac4Frame& frame);
AP4_Result Skip(AP4_Size size);
AP4_Size GetBytesFree();
AP4_Size GetBytesAvailable();
private:
AP4_Result FindHeader(AP4_UI08* header);
AP4_UI32 GetSyncFrameSize(AP4_BitReader &bits);
AP4_BitStream m_Bits;
AP4_Cardinal m_FrameCount;
};
#endif