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)