aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Kalvachev <ikalvachev@gmail.com>2011-06-16 19:35:33 +0300
committerMichael Niedermayer <michaelni@gmx.at>2011-06-20 23:28:55 +0200
commit093768c9a4855b82c13124f835b655dd70883012 (patch)
tree6d64245937efda9cf495ac00d1c0d0987d341b1c
parentcfbaeb311d906099bd9b8fbf0fa38cdb1b08f23e (diff)
downloadffmpeg-093768c9a4855b82c13124f835b655dd70883012.tar.gz
Fix bink audio playback outside of FFmpeg.
There are 2 known Bink audio codecs. Additionally they have a different flavor if they are found inside Bink-b "BIKb" file. In order to guess the correct flavor, the demuxer sets the audio codec_tag to be the same as the file format tag. This causes problem because same tag is used for both audio codecs. The hack works in FFmpeg because audio codecs are identified by their codec_id, but other players rely on standard behavior. This fix removes the codec_tag hack and instead uses artificial extradata format to signal the codec flavor. This would also allow proper embedding of Bink audio in other containers. Signed-off-by: Ivan Kalvachev <ikalvachev@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/binkaudio.c3
-rw-r--r--libavformat/bink.c4
2 files changed, 5 insertions, 2 deletions
diff --git a/libavcodec/binkaudio.c b/libavcodec/binkaudio.c
index bf1d412ed1..ff36458c7e 100644
--- a/libavcodec/binkaudio.c
+++ b/libavcodec/binkaudio.c
@@ -90,7 +90,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
return -1;
}
- s->version_b = avctx->codec_tag == MKTAG('B','I','K','b');
+ if (avctx->extradata && avctx->extradata_size > 0)
+ s->version_b = avctx->extradata[0];
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 3bcaff3c51..eed52cdb49 100644
--- a/libavformat/bink.c
+++ b/libavformat/bink.c
@@ -134,13 +134,15 @@ 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->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(1 + FF_INPUT_BUFFER_PADDING_SIZE);
+ ast->codec->extradata_size = 1;
+ ast->codec->extradata[0] = vst->codec->codec_tag == MKTAG('B','I','K','b');
}
for (i = 0; i < bink->num_audio_tracks; i++)