Mercurial > libavcodec.hg
changeset 4501:665d7cd95fd3 libavcodec
fix parsing of RealAudio AC-3/DolbyNet
author | jbr |
---|---|
date | Fri, 09 Feb 2007 02:02:09 +0000 |
parents | 18a88f830d1a |
children | ff5472c81ab8 |
files | parser.c |
diffstat | 1 files changed, 6 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/parser.c Thu Feb 08 18:55:36 2007 +0000 +++ b/parser.c Fri Feb 09 02:02:09 2007 +0000 @@ -657,7 +657,7 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate, int *bit_rate, int *samples) { - unsigned int fscod, frmsizecod, acmod, bsid, lfeon; + unsigned int fscod, frmsizecod, acmod, bsid, lfeon, halfratecod; unsigned int strmtyp, substreamid, frmsiz, fscod2, numblkscod; GetBitContext bits; @@ -667,7 +667,7 @@ return 0; bsid = show_bits_long(&bits, 29) & 0x1f; - if(bsid <= 8) { /* Normal AC-3 */ + if(bsid <= 10) { /* Normal AC-3 */ skip_bits(&bits, 16); /* crc */ fscod = get_bits(&bits, 2); frmsizecod = get_bits(&bits, 6); @@ -686,13 +686,14 @@ skip_bits(&bits, 2); /* dsurmod */ lfeon = get_bits1(&bits); - *sample_rate = ac3_sample_rates[fscod]; - *bit_rate = ac3_bitrates[frmsizecod] * 1000; + halfratecod = FFMAX(bsid, 8) - 8; + *sample_rate = ac3_sample_rates[fscod] >> halfratecod; + *bit_rate = (ac3_bitrates[frmsizecod] * 1000) >> halfratecod; *channels = ac3_channels[acmod] + lfeon; *samples = 6 * 256; return ac3_frame_sizes[frmsizecod][fscod] * 2; - } else if (bsid >= 10 && bsid <= 16) { /* Enhanced AC-3 */ + } else if (bsid > 10 && bsid <= 16) { /* Enhanced AC-3 */ strmtyp = get_bits(&bits, 2); substreamid = get_bits(&bits, 3);