Mercurial > libavcodec.hg
comparison alac.c @ 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 | ec58e76c25a3 |
children | a25842a4df43 |
comparison
equal
deleted
inserted
replaced
6777:6f402a181803 | 6778:1926f42527c7 |
---|---|
113 | 113 |
114 /* buffer size / 2 ? */ | 114 /* buffer size / 2 ? */ |
115 alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr); | 115 alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr); |
116 ptr++; /* ??? */ | 116 ptr++; /* ??? */ |
117 alac->setinfo_sample_size = *ptr++; | 117 alac->setinfo_sample_size = *ptr++; |
118 if (alac->setinfo_sample_size > 32) { | |
119 av_log(alac->avctx, AV_LOG_ERROR, "setinfo_sample_size too large\n"); | |
120 return -1; | |
121 } | |
118 alac->setinfo_rice_historymult = *ptr++; | 122 alac->setinfo_rice_historymult = *ptr++; |
119 alac->setinfo_rice_initialhistory = *ptr++; | 123 alac->setinfo_rice_initialhistory = *ptr++; |
120 alac->setinfo_rice_kmodifier = *ptr++; | 124 alac->setinfo_rice_kmodifier = *ptr++; |
121 ptr++; /* channels? */ | 125 ptr++; /* channels? */ |
122 bytestream_get_be16(&ptr); /* ??? */ | 126 bytestream_get_be16(&ptr); /* ??? */ |
529 */ | 533 */ |
530 } | 534 } |
531 } | 535 } |
532 } else { | 536 } else { |
533 /* not compressed, easy case */ | 537 /* not compressed, easy case */ |
534 if (alac->setinfo_sample_size <= 16) { | |
535 int i, chan; | 538 int i, chan; |
536 for (chan = 0; chan < channels; chan++) | 539 for (chan = 0; chan < channels; chan++) |
537 for (i = 0; i < outputsamples; i++) { | 540 for (i = 0; i < outputsamples; i++) { |
538 int32_t audiobits; | 541 int32_t audiobits; |
539 | 542 |
540 audiobits = get_bits(&alac->gb, alac->setinfo_sample_size); | 543 audiobits = get_bits_long(&alac->gb, alac->setinfo_sample_size); |
541 audiobits = extend_sign32(audiobits, readsamplesize); | 544 audiobits = extend_sign32(audiobits, alac->setinfo_sample_size); |
542 | 545 |
543 alac->outputsamples_buffer[chan][i] = audiobits; | 546 alac->outputsamples_buffer[chan][i] = audiobits; |
544 } | 547 } |
545 } else { | |
546 int i, chan; | |
547 for (chan = 0; chan < channels; chan++) | |
548 for (i = 0; i < outputsamples; i++) { | |
549 int32_t audiobits; | |
550 | |
551 audiobits = get_bits(&alac->gb, 16); | |
552 /* special case of sign extension.. | |
553 * as we'll be ORing the low 16bits into this */ | |
554 audiobits = audiobits << 16; | |
555 audiobits = audiobits >> (32 - alac->setinfo_sample_size); | |
556 audiobits |= get_bits(&alac->gb, alac->setinfo_sample_size - 16); | |
557 | |
558 alac->outputsamples_buffer[chan][i] = audiobits; | |
559 } | |
560 } | |
561 /* wasted_bytes = 0; */ | 548 /* wasted_bytes = 0; */ |
562 interlacing_shift = 0; | 549 interlacing_shift = 0; |
563 interlacing_leftweight = 0; | 550 interlacing_leftweight = 0; |
564 } | 551 } |
565 if (get_bits(&alac->gb, 3) != 7) | 552 if (get_bits(&alac->gb, 3) != 7) |