mistserver/lib/adts.h
2017-05-12 12:55:30 +02:00

86 lines
2.6 KiB
C++

#include <stdint.h>
#include <string>
#include "bitstream.h"
namespace aac {
class adts {
public:
adts();
adts(const char * _data, unsigned long _len);
adts(const adts & rhs);
~adts();
adts& operator = (const adts & rhs);
bool sameHeader(const adts & rhs) const;
unsigned long getAACProfile() const;
unsigned long getFrequencyIndex() const;
unsigned long getFrequency() const;
unsigned long getChannelConfig() const;
unsigned long getChannelCount() const;
unsigned long getHeaderSize() const;
unsigned long getPayloadSize() const;
unsigned long getCompleteSize() const;
unsigned long getSampleCount() const;
bool hasSync() const;
char * getPayload();
std::string toPrettyString() const;
operator bool() const;
private:
char * data;
unsigned long len;
};
class AudSpecConf{
public:
static inline uint32_t rate(const std::string & conf){
Utils::bitstream bs;
bs.append(conf.data(), conf.size());
if (bs.get(5) == 31){bs.skip(6);}//skip object type
switch (bs.get(4)){//frequency index
case 0: return 96000;
case 1: return 88200;
case 2: return 64000;
case 3: return 48000;
case 4: return 44100;
case 5: return 32000;
case 6: return 24000;
case 7: return 22050;
case 8: return 16000;
case 9: return 12000;
case 10: return 11025;
case 11: return 8000;
case 12: return 7350;
case 15: return bs.get(24);
default: return 0;
}
}
static inline uint16_t channels(const std::string & conf){
Utils::bitstream bs;
bs.append(conf.data(), conf.size());
if (bs.get(5) == 31){bs.skip(6);}//skip object type
if (bs.get(4) == 15){bs.skip(24);}//frequency index
return bs.get(4);//channel configuration
}
static inline uint8_t objtype(const std::string & conf){
Utils::bitstream bs;
bs.append(conf.data(), conf.size());
uint8_t ot = bs.get(5);
if (ot == 31){return bs.get(6)+32;}
return ot;
}
static inline uint16_t samples(const std::string & conf){
Utils::bitstream bs;
bs.append(conf.data(), conf.size());
if (bs.get(5) == 31){bs.skip(6);}//skip object type
if (bs.get(4) == 15){bs.skip(24);}//frequency index
bs.skip(4);//channel configuration
if (bs.get(1)){
return 960;
}else{
return 1024;
}
}
};
}