X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fbink.c;h=f093e7c3e270ab704c97d706555bdb31cb83c9a5;hb=3b199d29cd597a3518136d78860e172060b9e83d;hp=f76d7b987ad85b14f2dc5ad87f0b2cf5c9822a5d;hpb=6b4aa5dac8f41aa452d0ce9a1bede9e59a303060;p=ffmpeg diff --git a/libavformat/bink.c b/libavformat/bink.c index f76d7b987ad..f093e7c3e27 100644 --- a/libavformat/bink.c +++ b/libavformat/bink.c @@ -3,20 +3,20 @@ * Copyright (c) 2008-2010 Peter Ross (pross@xvid.org) * Copyright (c) 2009 Daniel Verkamp (daniel@drv.nu) * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -28,8 +28,10 @@ * http://wiki.multimedia.cx/index.php?title=Bink_Container */ +#include "libavutil/channel_layout.h" #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "internal.h" enum BinkAudFlags { BINK_AUD_16BITS = 0x4000, ///< prefer 16-bit output @@ -67,7 +69,7 @@ static int probe(AVProbeData *p) return 0; } -static int read_header(AVFormatContext *s, AVFormatParameters *ap) +static int read_header(AVFormatContext *s) { BinkDemuxContext *bink = s->priv_data; AVIOContext *pb = s->pb; @@ -78,7 +80,7 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap) uint16_t flags; int keyframe; - vst = av_new_stream(s, 0); + vst = avformat_new_stream(s, NULL); if (!vst) return AVERROR(ENOMEM); @@ -98,7 +100,7 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap) return AVERROR(EIO); } - url_fskip(pb, 4); + avio_skip(pb, 4); vst->codec->width = avio_rl32(pb); vst->codec->height = avio_rl32(pb); @@ -109,11 +111,14 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap) av_log(s, AV_LOG_ERROR, "invalid header: invalid fps (%d/%d)\n", fps_num, fps_den); return AVERROR(EIO); } - av_set_pts_info(vst, 64, fps_den, fps_num); + avpriv_set_pts_info(vst, 64, fps_den, fps_num); + vst->avg_frame_rate = av_inv_q(vst->time_base); vst->codec->codec_type = AVMEDIA_TYPE_VIDEO; - vst->codec->codec_id = CODEC_ID_BINKVIDEO; + vst->codec->codec_id = AV_CODEC_ID_BINKVIDEO; vst->codec->extradata = av_mallocz(4 + FF_INPUT_BUFFER_PADDING_SIZE); + if (!vst->codec->extradata) + return AVERROR(ENOMEM); vst->codec->extradata_size = 4; avio_read(pb, vst->codec->extradata, 4); @@ -127,20 +132,31 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap) } if (bink->num_audio_tracks) { - url_fskip(pb, 4 * bink->num_audio_tracks); + avio_skip(pb, 4 * bink->num_audio_tracks); for (i = 0; i < bink->num_audio_tracks; i++) { - ast = av_new_stream(s, 1); + ast = avformat_new_stream(s, NULL); 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); + avpriv_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; + AV_CODEC_ID_BINKAUDIO_DCT : AV_CODEC_ID_BINKAUDIO_RDFT; + if (flags & BINK_AUD_STEREO) { + ast->codec->channels = 2; + ast->codec->channel_layout = AV_CH_LAYOUT_STEREO; + } else { + ast->codec->channels = 1; + ast->codec->channel_layout = AV_CH_LAYOUT_MONO; + } + 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++) @@ -169,7 +185,7 @@ static int read_header(AVFormatContext *s, AVFormatParameters *ap) keyframe ? AVINDEX_KEYFRAME : 0); } - url_fskip(pb, 4); + avio_skip(pb, 4); bink->current_track = -1; return 0; @@ -225,7 +241,7 @@ static int read_packet(AVFormatContext *s, AVPacket *pkt) AV_RL32(pkt->data) / (2 * s->streams[bink->current_track]->codec->channels); return 0; } else { - avio_seek(pb, audio_size, SEEK_CUR); + avio_skip(pb, audio_size); } } @@ -247,11 +263,13 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, in BinkDemuxContext *bink = s->priv_data; AVStream *vst = s->streams[0]; - if (url_is_streamed(s->pb)) + if (!s->pb->seekable) return -1; /* seek to the first frame */ - avio_seek(s->pb, vst->index_entries[0].pos, SEEK_SET); + if (avio_seek(s->pb, vst->index_entries[0].pos, SEEK_SET) < 0) + return -1; + bink->video_pts = 0; memset(bink->audio_pts, 0, sizeof(bink->audio_pts)); bink->current_track = -1; @@ -259,12 +277,11 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, in } AVInputFormat ff_bink_demuxer = { - "bink", - NULL_IF_CONFIG_SMALL("Bink"), - sizeof(BinkDemuxContext), - probe, - read_header, - read_packet, - NULL, - read_seek, + .name = "bink", + .long_name = NULL_IF_CONFIG_SMALL("Bink"), + .priv_data_size = sizeof(BinkDemuxContext), + .read_probe = probe, + .read_header = read_header, + .read_packet = read_packet, + .read_seek = read_seek, };