decoder/ffmpeg: work around bogus channel count

Initialize the audio_format before calling avcodec_open(), because
avcodec_open() will fill bogus values.
This commit is contained in:
Max Kellermann 2011-11-27 23:39:21 +01:00
parent 6f365c30eb
commit e1b032cbad
2 changed files with 13 additions and 8 deletions

1
NEWS
View File

@ -1,6 +1,7 @@
ver 0.16.6 (2010/??/??) ver 0.16.6 (2010/??/??)
* decoder: * decoder:
- fix assertion failure when resuming streams - fix assertion failure when resuming streams
- ffmpeg: work around bogus channel count
* encoder: * encoder:
- flac, null, wave: fix buffer corruption bug - flac, null, wave: fix buffer corruption bug
- wave: support packed 24 bit samples - wave: support packed 24 bit samples

View File

@ -407,13 +407,6 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input)
return; return;
} }
if (avcodec_open(codec_context, codec)<0) {
g_warning("Could not open codec\n");
av_close_input_stream(format_context);
mpd_ffmpeg_stream_close(stream);
return;
}
GError *error = NULL; GError *error = NULL;
struct audio_format audio_format; struct audio_format audio_format;
if (!audio_format_init_checked(&audio_format, if (!audio_format_init_checked(&audio_format,
@ -422,7 +415,18 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input)
codec_context->channels, &error)) { codec_context->channels, &error)) {
g_warning("%s", error->message); g_warning("%s", error->message);
g_error_free(error); g_error_free(error);
avcodec_close(codec_context); av_close_input_stream(format_context);
mpd_ffmpeg_stream_close(stream);
return;
}
/* the audio format must be read from AVCodecContext by now,
because avcodec_open() has been demonstrated to fill bogus
values into AVCodecContext.channels - a change that will be
reverted later by avcodec_decode_audio3() */
if (avcodec_open(codec_context, codec)<0) {
g_warning("Could not open codec\n");
av_close_input_stream(format_context); av_close_input_stream(format_context);
mpd_ffmpeg_stream_close(stream); mpd_ffmpeg_stream_close(stream);
return; return;