Mercurial > libavcodec.hg
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++) { |