+static int aac_sync(const uint8_t *buf, int *channels, int *sample_rate,
+ int *bit_rate, int *samples)
+{
+ GetBitContext bits;
+ int size, rdb, ch, sr;
+
+ init_get_bits(&bits, buf, AAC_HEADER_SIZE * 8);
+
+ if(get_bits(&bits, 12) != 0xfff)
+ return 0;
+
+ get_bits(&bits, 1);
+ get_bits(&bits, 2);
+ get_bits(&bits, 1); /* protection_absent */
+ get_bits(&bits, 2);
+ sr = get_bits(&bits, 4);
+ if(!aac_sample_rates[sr])
+ return 0;
+ get_bits(&bits, 1); /* private_bit */
+ ch = get_bits(&bits, 3);
+ if(!aac_channels[ch])
+ return 0;
+ get_bits(&bits, 1); /* original/copy */
+ get_bits(&bits, 1); /* home */
+
+ /* adts_variable_header */
+ get_bits(&bits, 1); /* copyright_identification_bit */
+ get_bits(&bits, 1); /* copyright_identification_start */
+ size = get_bits(&bits, 13);
+ get_bits(&bits, 11); /* adts_buffer_fullness */
+ rdb = get_bits(&bits, 2);
+
+ *channels = aac_channels[ch];
+ *sample_rate = aac_sample_rates[sr];
+ *samples = (rdb + 1) * 1024;
+ *bit_rate = size * 8 * *sample_rate / *samples;
+
+ return size;
+}
+