|
|
@ -812,7 +812,7 @@ static const int ac3_channels[8] = { |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, |
|
|
|
static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, |
|
|
|
int *bit_rate) |
|
|
|
int *bit_rate) |
|
|
|
{ |
|
|
|
{ |
|
|
|
unsigned int fscod, frmsizecod, acmod, bsid, lfeon; |
|
|
|
unsigned int fscod, frmsizecod, acmod, bsid, lfeon; |
|
|
|
GetBitContext bits; |
|
|
|
GetBitContext bits; |
|
|
@ -820,26 +820,26 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, |
|
|
|
init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8); |
|
|
|
init_get_bits(&bits, buf, AC3_HEADER_SIZE * 8); |
|
|
|
|
|
|
|
|
|
|
|
if(get_bits(&bits, 16) != 0x0b77) |
|
|
|
if(get_bits(&bits, 16) != 0x0b77) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
get_bits(&bits, 16); /* crc */ |
|
|
|
get_bits(&bits, 16); /* crc */ |
|
|
|
fscod = get_bits(&bits, 2); |
|
|
|
fscod = get_bits(&bits, 2); |
|
|
|
frmsizecod = get_bits(&bits, 6); |
|
|
|
frmsizecod = get_bits(&bits, 6); |
|
|
|
|
|
|
|
|
|
|
|
if(!ac3_sample_rates[fscod]) |
|
|
|
if(!ac3_sample_rates[fscod]) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
bsid = get_bits(&bits, 5); |
|
|
|
bsid = get_bits(&bits, 5); |
|
|
|
if(bsid > 8) |
|
|
|
if(bsid > 8) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
get_bits(&bits, 3); /* bsmod */ |
|
|
|
get_bits(&bits, 3); /* bsmod */ |
|
|
|
acmod = get_bits(&bits, 3); |
|
|
|
acmod = get_bits(&bits, 3); |
|
|
|
if(acmod & 1 && acmod != 1) |
|
|
|
if(acmod & 1 && acmod != 1) |
|
|
|
get_bits(&bits, 2); /* cmixlev */ |
|
|
|
get_bits(&bits, 2); /* cmixlev */ |
|
|
|
if(acmod & 4) |
|
|
|
if(acmod & 4) |
|
|
|
get_bits(&bits, 2); /* surmixlev */ |
|
|
|
get_bits(&bits, 2); /* surmixlev */ |
|
|
|
if(acmod & 2) |
|
|
|
if(acmod & 2) |
|
|
|
get_bits(&bits, 2); /* dsurmod */ |
|
|
|
get_bits(&bits, 2); /* dsurmod */ |
|
|
|
lfeon = get_bits(&bits, 1); |
|
|
|
lfeon = get_bits(&bits, 1); |
|
|
|
|
|
|
|
|
|
|
|
*sample_rate = ac3_sample_rates[fscod]; |
|
|
|
*sample_rate = ac3_sample_rates[fscod]; |
|
|
@ -881,7 +881,7 @@ static int ac3_parse(AVCodecParserContext *s1, |
|
|
|
s->inbuf_ptr += len; |
|
|
|
s->inbuf_ptr += len; |
|
|
|
buf_size -= len; |
|
|
|
buf_size -= len; |
|
|
|
if ((s->inbuf_ptr - s->inbuf) == AC3_HEADER_SIZE) { |
|
|
|
if ((s->inbuf_ptr - s->inbuf) == AC3_HEADER_SIZE) { |
|
|
|
len = ac3_sync(s->inbuf, &channels, &sample_rate, &bit_rate); |
|
|
|
len = ac3_sync(s->inbuf, &channels, &sample_rate, &bit_rate); |
|
|
|
if (len == 0) { |
|
|
|
if (len == 0) { |
|
|
|
/* no sync found : move by one byte (inefficient, but simple!) */ |
|
|
|
/* no sync found : move by one byte (inefficient, but simple!) */ |
|
|
|
memmove(s->inbuf, s->inbuf + 1, AC3_HEADER_SIZE - 1); |
|
|
|
memmove(s->inbuf, s->inbuf + 1, AC3_HEADER_SIZE - 1); |
|
|
@ -892,7 +892,7 @@ static int ac3_parse(AVCodecParserContext *s1, |
|
|
|
avctx->sample_rate = sample_rate; |
|
|
|
avctx->sample_rate = sample_rate; |
|
|
|
/* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */ |
|
|
|
/* set channels,except if the user explicitly requests 1 or 2 channels, XXX/FIXME this is a bit ugly */ |
|
|
|
if(avctx->channels!=1 && avctx->channels!=2){ |
|
|
|
if(avctx->channels!=1 && avctx->channels!=2){ |
|
|
|
avctx->channels = channels; |
|
|
|
avctx->channels = channels; |
|
|
|
} |
|
|
|
} |
|
|
|
avctx->bit_rate = bit_rate; |
|
|
|
avctx->bit_rate = bit_rate; |
|
|
|
avctx->frame_size = 6 * 256; |
|
|
|
avctx->frame_size = 6 * 256; |
|
|
|