#ifndef _AP4_ADTS_PARSER_H_
#define _AP4_ADTS_PARSER_H_
#include "Ap4Types.h"
#include "Ap4BitStream.h"
extern const AP4_UI32 AP4_AdtsSamplingFrequencyTable[16];
class AP4_AdtsHeader {
public:
AP4_AdtsHeader(const AP4_UI08* bytes);
AP4_Result Check();
unsigned int m_Id;
unsigned int m_ProtectionAbsent;
unsigned int m_ProfileObjectType;
unsigned int m_SamplingFrequencyIndex;
unsigned int m_ChannelConfiguration;
unsigned int m_FrameLength;
unsigned int m_RawDataBlocks;
static bool MatchFixed(unsigned char* a, unsigned char* b);
};
typedef enum {
AP4_AAC_STANDARD_MPEG2,
AP4_AAC_STANDARD_MPEG4
} AP4_AacStandard;
typedef enum {
AP4_AAC_PROFILE_MAIN,
AP4_AAC_PROFILE_LC,
AP4_AAC_PROFILE_SSR,
AP4_AAC_PROFILE_LTP
} AP4_AacProfile;
typedef struct {
AP4_AacStandard m_Standard;
AP4_AacProfile m_Profile;
unsigned int m_SamplingFrequencyIndex;
AP4_UI32 m_SamplingFrequency;
unsigned int m_ChannelConfiguration;
unsigned int m_FrameLength;
} AP4_AacFrameInfo;
typedef struct {
AP4_BitStream* m_Source;
AP4_AacFrameInfo m_Info;
} AP4_AacFrame;
class AP4_AdtsParser {
public:
AP4_AdtsParser();
virtual ~AP4_AdtsParser();
AP4_Result Reset();
AP4_Result Feed(const AP4_UI08* buffer,
AP4_Size* buffer_size,
AP4_Flags flags = 0);
AP4_Result FindFrame(AP4_AacFrame& frame);
AP4_Result Skip(AP4_Size size);
AP4_Size GetBytesFree();
AP4_Size GetBytesAvailable();
private:
AP4_Result FindHeader(AP4_UI08* header);
AP4_BitStream m_Bits;
AP4_Cardinal m_FrameCount;
};
#endif