comparison flacdec.c @ 9248:f8973e93809a libavcodec

flacdec: cosmetics: separate the pure frame header parsing code from other frame header decoding code
author jbr
date Sun, 22 Mar 2009 23:19:49 +0000
parents cbf65173eed3
children 353cfdb196e8
comparison
equal deleted inserted replaced
9247:ef4444d8b2fc 9248:f8973e93809a
502 channels = 2; 502 channels = 2;
503 } else { 503 } else {
504 av_log(s->avctx, AV_LOG_ERROR, "invalid channel mode: %d\n", ch_mode); 504 av_log(s->avctx, AV_LOG_ERROR, "invalid channel mode: %d\n", ch_mode);
505 return -1; 505 return -1;
506 } 506 }
507 if (channels != s->channels) {
508 av_log(s->avctx, AV_LOG_ERROR, "switching channel layout mid-stream "
509 "is not supported\n");
510 return -1;
511 }
512 507
513 /* bits per sample */ 508 /* bits per sample */
514 bps_code = get_bits(gb, 3); 509 bps_code = get_bits(gb, 3);
515 if (bps_code == 3 || bps_code == 7) { 510 if (bps_code == 3 || bps_code == 7) {
516 av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n", 511 av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n",
517 bps_code); 512 bps_code);
518 return -1; 513 return -1;
519 } 514 }
520 bps = sample_size_table[bps_code]; 515 bps = sample_size_table[bps_code];
521 if (bps && bps != s->bps) {
522 av_log(s->avctx, AV_LOG_ERROR, "switching bps mid-stream is not "
523 "supported\n");
524 return -1;
525 }
526 if (s->bps > 16) {
527 s->avctx->sample_fmt = SAMPLE_FMT_S32;
528 s->sample_shift = 32 - s->bps;
529 s->is32 = 1;
530 } else {
531 s->avctx->sample_fmt = SAMPLE_FMT_S16;
532 s->sample_shift = 16 - s->bps;
533 s->is32 = 0;
534 }
535 516
536 /* reserved bit */ 517 /* reserved bit */
537 if (get_bits1(gb)) { 518 if (get_bits1(gb)) {
538 av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n"); 519 av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n");
539 return -1; 520 return -1;
553 blocksize = get_bits(gb, 8) + 1; 534 blocksize = get_bits(gb, 8) + 1;
554 } else if (bs_code == 7) { 535 } else if (bs_code == 7) {
555 blocksize = get_bits(gb, 16) + 1; 536 blocksize = get_bits(gb, 16) + 1;
556 } else { 537 } else {
557 blocksize = ff_flac_blocksize_table[bs_code]; 538 blocksize = ff_flac_blocksize_table[bs_code];
558 }
559 if (blocksize > s->max_blocksize) {
560 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize,
561 s->max_blocksize);
562 return -1;
563 } 539 }
564 540
565 /* sample rate */ 541 /* sample rate */
566 if (sr_code < 12) { 542 if (sr_code < 12) {
567 samplerate = ff_flac_sample_rate_table[sr_code]; 543 samplerate = ff_flac_sample_rate_table[sr_code];
574 } else { 550 } else {
575 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", 551 av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n",
576 sr_code); 552 sr_code);
577 return -1; 553 return -1;
578 } 554 }
555
556 /* header CRC-8 check */
557 skip_bits(gb, 8);
558 if (av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, gb->buffer,
559 get_bits_count(gb)/8)) {
560 av_log(s->avctx, AV_LOG_ERROR, "header crc mismatch\n");
561 return -1;
562 }
563
564 if (channels != s->channels) {
565 av_log(s->avctx, AV_LOG_ERROR, "switching channel layout mid-stream "
566 "is not supported\n");
567 return -1;
568 }
569 s->ch_mode = ch_mode;
570
571 if (bps && bps != s->bps) {
572 av_log(s->avctx, AV_LOG_ERROR, "switching bps mid-stream is not "
573 "supported\n");
574 return -1;
575 }
576 if (s->bps > 16) {
577 s->avctx->sample_fmt = SAMPLE_FMT_S32;
578 s->sample_shift = 32 - s->bps;
579 s->is32 = 1;
580 } else {
581 s->avctx->sample_fmt = SAMPLE_FMT_S16;
582 s->sample_shift = 16 - s->bps;
583 s->is32 = 0;
584 }
585
586 if (blocksize > s->max_blocksize) {
587 av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize,
588 s->max_blocksize);
589 return -1;
590 }
591 s->blocksize = blocksize;
592
579 if (samplerate == 0) { 593 if (samplerate == 0) {
580 samplerate = s->samplerate; 594 samplerate = s->samplerate;
581 } else if (samplerate != s->samplerate) { 595 } else if (samplerate != s->samplerate) {
582 av_log(s->avctx, AV_LOG_WARNING, "sample rate changed from %d to %d\n", 596 av_log(s->avctx, AV_LOG_WARNING, "sample rate changed from %d to %d\n",
583 s->samplerate, samplerate); 597 s->samplerate, samplerate);
584 } 598 }
585
586 /* header CRC-8 check */
587 skip_bits(gb, 8);
588 if (av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, gb->buffer,
589 get_bits_count(gb)/8)) {
590 av_log(s->avctx, AV_LOG_ERROR, "header crc mismatch\n");
591 return -1;
592 }
593
594 s->blocksize = blocksize;
595 s->samplerate = s->avctx->sample_rate = samplerate; 599 s->samplerate = s->avctx->sample_rate = samplerate;
596 s->bps = bps;
597 s->ch_mode = ch_mode;
598 600
599 // dump_headers(s->avctx, (FLACStreaminfo *)s); 601 // dump_headers(s->avctx, (FLACStreaminfo *)s);
600 602
601 /* subframes */ 603 /* subframes */
602 for (i = 0; i < s->channels; i++) { 604 for (i = 0; i < s->channels; i++) {