From 498c544ad20be3e5ebf9c481cc239958399fba12 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 30 Oct 2006 02:19:55 +0000 Subject: [PATCH] dont set the sampling rate just because 1 mp3 packet header says so (fixes playback speed on some old mencoder generated avis which where then dumped to mp3) Originally committed as revision 6837 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mpegaudio.h | 2 +- libavcodec/mpegaudiodec.c | 11 ++++++----- libavcodec/parser.c | 7 +++---- libavformat/mp3.c | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libavcodec/mpegaudio.h b/libavcodec/mpegaudio.h index 9f6d73cac4..3eadf92a81 100644 --- a/libavcodec/mpegaudio.h +++ b/libavcodec/mpegaudio.h @@ -72,7 +72,7 @@ typedef int32_t MPA_INT; #endif int l2_select_table(int bitrate, int nb_channels, int freq, int lsf); -int mpa_decode_header(AVCodecContext *avctx, uint32_t head); +int mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate); void ff_mpa_synth_init(MPA_INT *window); void ff_mpa_synth_filter(MPA_INT *synth_buf_ptr, int *synth_buf_offset, MPA_INT *window, int *dither_state, diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index 7d6087adde..071c1a192c 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -1190,7 +1190,7 @@ static int decode_header(MPADecodeContext *s, uint32_t header) /* useful helper to get mpeg audio stream infos. Return -1 if error in header, otherwise the coded frame size in bytes */ -int mpa_decode_header(AVCodecContext *avctx, uint32_t head) +int mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate) { MPADecodeContext s1, *s = &s1; @@ -1217,7 +1217,7 @@ int mpa_decode_header(AVCodecContext *avctx, uint32_t head) break; } - avctx->sample_rate = s->sample_rate; + *sample_rate = s->sample_rate; avctx->channels = s->nb_channels; avctx->bit_rate = s->bit_rate; avctx->sub_id = s->layer; @@ -2547,7 +2547,6 @@ retry: return -1; } /* update codec info */ - avctx->sample_rate = s->sample_rate; avctx->channels = s->nb_channels; avctx->bit_rate = s->bit_rate; avctx->sub_id = s->layer; @@ -2574,9 +2573,11 @@ retry: } out_size = mp_decode_frame(s, out_samples, buf, buf_size); - if(out_size>=0) + if(out_size>=0){ *data_size = out_size; - else + avctx->sample_rate = s->sample_rate; + //FIXME maybe move the other codec info stuff from above here too + }else av_log(avctx, AV_LOG_DEBUG, "Error while decoding MPEG audio frame.\n"); //FIXME return -1 / but also return the number of bytes consumed s->frame_size = 0; return buf_size; diff --git a/libavcodec/parser.c b/libavcodec/parser.c index c82744bdff..6fabdf650a 100644 --- a/libavcodec/parser.c +++ b/libavcodec/parser.c @@ -666,11 +666,10 @@ static int mpegaudio_parse(AVCodecParserContext *s1, } if ((s->inbuf_ptr - s->inbuf) >= MPA_HEADER_SIZE) { got_header: - sr= avctx->sample_rate; header = (s->inbuf[0] << 24) | (s->inbuf[1] << 16) | (s->inbuf[2] << 8) | s->inbuf[3]; - ret = mpa_decode_header(avctx, header); + ret = mpa_decode_header(avctx, header, &sr); if (ret < 0) { s->header_count= -2; /* no sync found : move by one byte (inefficient, but simple!) */ @@ -694,8 +693,8 @@ static int mpegaudio_parse(AVCodecParserContext *s1, } #endif } - if(s->header_count <= 0) - avctx->sample_rate= sr; //FIXME ugly + if(s->header_count > 1) + avctx->sample_rate= sr; } } else #if 0 diff --git a/libavformat/mp3.c b/libavformat/mp3.c index 582e7e8547..0e39d25ba7 100644 --- a/libavformat/mp3.c +++ b/libavformat/mp3.c @@ -247,7 +247,7 @@ static void id3_create_tag(AVFormatContext *s, uint8_t *buf) static int mp3_read_probe(AVProbeData *p) { int max_frames, first_frames; - int fsize, frames; + int fsize, frames, sample_rate; uint32_t header; uint8_t *buf, *buf2, *end; AVCodecContext avctx; @@ -267,7 +267,7 @@ static int mp3_read_probe(AVProbeData *p) for(frames = 0; buf2 < end; frames++) { header = (buf2[0] << 24) | (buf2[1] << 16) | (buf2[2] << 8) | buf2[3]; - fsize = mpa_decode_header(&avctx, header); + fsize = mpa_decode_header(&avctx, header, &sample_rate); if(fsize < 0) break; buf2 += fsize;