00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "parser.h"
00024 #include "aac_ac3_parser.h"
00025 #include "bitstream.h"
00026
00027
00028 #define AAC_HEADER_SIZE 7
00029
00030
00031 static const int aac_sample_rates[16] = {
00032 96000, 88200, 64000, 48000, 44100, 32000,
00033 24000, 22050, 16000, 12000, 11025, 8000, 7350
00034 };
00035
00036 static const int aac_channels[8] = {
00037 0, 1, 2, 3, 4, 5, 6, 8
00038 };
00039
00040
00041 static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
00042 int *bit_rate, int *samples)
00043 {
00044 GetBitContext bits;
00045 int size, rdb, ch, sr;
00046
00047 init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
00048
00049 if(get_bits(&bits, 12) != 0xfff)
00050 return 0;
00051
00052 skip_bits1(&bits);
00053 skip_bits(&bits, 2);
00054 skip_bits1(&bits);
00055 skip_bits(&bits, 2);
00056 sr = get_bits(&bits, 4);
00057 if(!aac_sample_rates[sr])
00058 return 0;
00059 skip_bits1(&bits);
00060 ch = get_bits(&bits, 3);
00061 if(!aac_channels[ch])
00062 return 0;
00063 skip_bits1(&bits);
00064 skip_bits1(&bits);
00065
00066
00067 skip_bits1(&bits);
00068 skip_bits1(&bits);
00069 size = get_bits(&bits, 13);
00070 if(size < AAC_HEADER_SIZE)
00071 return 0;
00072
00073 skip_bits(&bits, 11);
00074 rdb = get_bits(&bits, 2);
00075
00076 *channels = aac_channels[ch];
00077 *sample_rate = aac_sample_rates[sr];
00078 *samples = (rdb + 1) * 1024;
00079 *bit_rate = size * 8 * *sample_rate / *samples;
00080
00081 return size;
00082 }
00083
00084 static int aac_parse_init(AVCodecParserContext *s1)
00085 {
00086 AACAC3ParseContext *s = s1->priv_data;
00087 s->inbuf_ptr = s->inbuf;
00088 s->header_size = AAC_HEADER_SIZE;
00089 s->sync = aac_sync;
00090 return 0;
00091 }
00092
00093
00094 AVCodecParser aac_parser = {
00095 { CODEC_ID_AAC },
00096 sizeof(AACAC3ParseContext),
00097 aac_parse_init,
00098 ff_aac_ac3_parse,
00099 NULL,
00100 };