Kostya Shishkov <[email protected]> writes: > This is needed because not all players (e.g. MPlayer) are able to distinguish > two different Bink audio decoders when codec_tag is set. > --- > 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 a05b0b5..9722bdf 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 76b457c..0676738 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++) > --
I'm not sure which abuse is worse. -- Måns Rullgård [email protected] _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
