From df64da3b1ef0c7014135bce44e5f82becf81fe79 Mon Sep 17 00:00:00 2001 From: Kostya Date: Fri, 17 Jun 2011 07:28:58 +0000 Subject: [PATCH] bink: pass Bink version to audio decoder through extradata instead of codec_tag. This is needed because not all players (e.g. MPlayer) are able to distinguish two different Bink audio decoders when codec_tag is set. Signed-off-by: Anton Khirnov --- libavcodec/binkaudio.c | 2 +- libavformat/bink.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/libavcodec/binkaudio.c b/libavcodec/binkaudio.c index a05b0b56b2..9722bdff3e 100644 --- a/libavcodec/binkaudio.c +++ b/libavcodec/binkaudio.c @@ -90,7 +90,7 @@ static av_cold int decode_init(AVCodecContext *avctx) return -1; } - s->version_b = avctx->codec_tag == MKTAG('B','I','K','b'); + s->version_b = avctx->extradata && avctx->extradata[3] == 'b'; if (avctx->codec->id == CODEC_ID_BINKAUDIO_RDFT) { // audio is already interleaved for the RDFT format variant diff --git a/libavformat/bink.c b/libavformat/bink.c index 76b457c21b..067673819a 100644 --- a/libavformat/bink.c +++ b/libavformat/bink.c @@ -134,13 +134,18 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap) if (!ast) return AVERROR(ENOMEM); ast->codec->codec_type = AVMEDIA_TYPE_AUDIO; - ast->codec->codec_tag = vst->codec->codec_tag; + ast->codec->codec_tag = 0; ast->codec->sample_rate = avio_rl16(pb); av_set_pts_info(ast, 64, 1, ast->codec->sample_rate); flags = avio_rl16(pb); ast->codec->codec_id = flags & BINK_AUD_USEDCT ? CODEC_ID_BINKAUDIO_DCT : CODEC_ID_BINKAUDIO_RDFT; ast->codec->channels = flags & BINK_AUD_STEREO ? 2 : 1; + ast->codec->extradata = av_mallocz(4 + FF_INPUT_BUFFER_PADDING_SIZE); + if (!ast->codec->extradata) + return AVERROR(ENOMEM); + ast->codec->extradata_size = 4; + AV_WL32(ast->codec->extradata, vst->codec->codec_tag); } for (i = 0; i < bink->num_audio_tracks; i++) -- 2.11.0