Mercurial > libavcodec.hg
changeset 6778:1926f42527c7 libavcodec
simplify decoding of uncompressed samples. patch by matthieu castet <castet matthieu free fr>.
author | jbr |
---|---|
date | Sun, 11 May 2008 18:13:30 +0000 |
parents | 6f402a181803 |
children | a25842a4df43 |
files | alac.c |
diffstat | 1 files changed, 6 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/alac.c Sun May 11 11:49:25 2008 +0000 +++ b/alac.c Sun May 11 18:13:30 2008 +0000 @@ -115,6 +115,10 @@ alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr); ptr++; /* ??? */ alac->setinfo_sample_size = *ptr++; + if (alac->setinfo_sample_size > 32) { + av_log(alac->avctx, AV_LOG_ERROR, "setinfo_sample_size too large\n"); + return -1; + } alac->setinfo_rice_historymult = *ptr++; alac->setinfo_rice_initialhistory = *ptr++; alac->setinfo_rice_kmodifier = *ptr++; @@ -531,33 +535,16 @@ } } else { /* not compressed, easy case */ - if (alac->setinfo_sample_size <= 16) { int i, chan; for (chan = 0; chan < channels; chan++) for (i = 0; i < outputsamples; i++) { int32_t audiobits; - audiobits = get_bits(&alac->gb, alac->setinfo_sample_size); - audiobits = extend_sign32(audiobits, readsamplesize); + audiobits = get_bits_long(&alac->gb, alac->setinfo_sample_size); + audiobits = extend_sign32(audiobits, alac->setinfo_sample_size); alac->outputsamples_buffer[chan][i] = audiobits; } - } else { - int i, chan; - for (chan = 0; chan < channels; chan++) - for (i = 0; i < outputsamples; i++) { - int32_t audiobits; - - audiobits = get_bits(&alac->gb, 16); - /* special case of sign extension.. - * as we'll be ORing the low 16bits into this */ - audiobits = audiobits << 16; - audiobits = audiobits >> (32 - alac->setinfo_sample_size); - audiobits |= get_bits(&alac->gb, alac->setinfo_sample_size - 16); - - alac->outputsamples_buffer[chan][i] = audiobits; - } - } /* wasted_bytes = 0; */ interlacing_shift = 0; interlacing_leftweight = 0;