X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fwestwood.c;h=82b7e94840fc3a945f5267eeae11731c33cae9b8;hb=4bf3c8f226252e18de8051fd0d417c1d39857b67;hp=753daca57178f1edfcbf90e550b832ecd67af6a9;hpb=b250f9c66d3ddd84652d158fb979a5f21e3f2c71;p=ffmpeg diff --git a/libavformat/westwood.c b/libavformat/westwood.c index 753daca5717..82b7e94840f 100644 --- a/libavformat/westwood.c +++ b/libavformat/westwood.c @@ -2,25 +2,25 @@ * Westwood Studios Multimedia Formats Demuxer (VQA, AUD) * Copyright (c) 2003 The ffmpeg Project * - * 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 */ /** - * @file westwood.c + * @file * Westwood Studios VQA & AUD file demuxers * by Mike Melanson (melanson@pcisys.net) * for more information on the Westwood file formats, visit: @@ -35,6 +35,7 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "internal.h" #define AUD_HEADER_SIZE 12 #define AUD_CHUNK_PREAMBLE_SIZE 8 @@ -60,7 +61,6 @@ #define VQA_HEADER_SIZE 0x2A #define VQA_FRAMERATE 15 -#define VQA_VIDEO_PTS_INC (90000 / VQA_FRAMERATE) #define VQA_PREAMBLE_SIZE 8 typedef struct WsAudDemuxContext { @@ -81,7 +81,6 @@ typedef struct WsVqaDemuxContext { int video_stream_index; int64_t audio_frame_counter; - int64_t video_pts; } WsVqaDemuxContext; static int wsaud_probe(AVProbeData *p) @@ -128,11 +127,11 @@ static int wsaud_read_header(AVFormatContext *s, AVFormatParameters *ap) { WsAudDemuxContext *wsaud = s->priv_data; - ByteIOContext *pb = s->pb; + AVIOContext *pb = s->pb; AVStream *st; unsigned char header[AUD_HEADER_SIZE]; - if (get_buffer(pb, header, AUD_HEADER_SIZE) != AUD_HEADER_SIZE) + if (avio_read(pb, header, AUD_HEADER_SIZE) != AUD_HEADER_SIZE) return AVERROR(EIO); wsaud->audio_samplerate = AV_RL16(&header[0]); if (header[11] == 99) @@ -146,11 +145,11 @@ static int wsaud_read_header(AVFormatContext *s, wsaud->audio_bits = (((header[10] & 0x2) >> 1) + 1) * 8; /* initialize the audio decoder stream */ - st = av_new_stream(s, 0); + st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); - av_set_pts_info(st, 33, 1, wsaud->audio_samplerate); - st->codec->codec_type = CODEC_TYPE_AUDIO; + avpriv_set_pts_info(st, 33, 1, wsaud->audio_samplerate); + st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_id = wsaud->audio_type; st->codec->codec_tag = 0; /* no tag */ st->codec->channels = wsaud->audio_channels; @@ -170,12 +169,12 @@ static int wsaud_read_packet(AVFormatContext *s, AVPacket *pkt) { WsAudDemuxContext *wsaud = s->priv_data; - ByteIOContext *pb = s->pb; + AVIOContext *pb = s->pb; unsigned char preamble[AUD_CHUNK_PREAMBLE_SIZE]; unsigned int chunk_size; int ret = 0; - if (get_buffer(pb, preamble, AUD_CHUNK_PREAMBLE_SIZE) != + if (avio_read(pb, preamble, AUD_CHUNK_PREAMBLE_SIZE) != AUD_CHUNK_PREAMBLE_SIZE) return AVERROR(EIO); @@ -215,7 +214,7 @@ static int wsvqa_read_header(AVFormatContext *s, AVFormatParameters *ap) { WsVqaDemuxContext *wsvqa = s->priv_data; - ByteIOContext *pb = s->pb; + AVIOContext *pb = s->pb; AVStream *st; unsigned char *header; unsigned char scratch[VQA_PREAMBLE_SIZE]; @@ -223,23 +222,23 @@ static int wsvqa_read_header(AVFormatContext *s, unsigned int chunk_size; /* initialize the video decoder stream */ - st = av_new_stream(s, 0); + st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); - av_set_pts_info(st, 33, 1, VQA_FRAMERATE); + avpriv_set_pts_info(st, 33, 1, VQA_FRAMERATE); wsvqa->video_stream_index = st->index; - st->codec->codec_type = CODEC_TYPE_VIDEO; + st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = CODEC_ID_WS_VQA; st->codec->codec_tag = 0; /* no fourcc */ /* skip to the start of the VQA header */ - url_fseek(pb, 20, SEEK_SET); + avio_seek(pb, 20, SEEK_SET); /* the VQA header needs to go to the decoder */ st->codec->extradata_size = VQA_HEADER_SIZE; st->codec->extradata = av_mallocz(VQA_HEADER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); header = (unsigned char *)st->codec->extradata; - if (get_buffer(pb, st->codec->extradata, VQA_HEADER_SIZE) != + if (avio_read(pb, st->codec->extradata, VQA_HEADER_SIZE) != VQA_HEADER_SIZE) { av_free(st->codec->extradata); return AVERROR(EIO); @@ -249,11 +248,11 @@ static int wsvqa_read_header(AVFormatContext *s, /* initialize the audio decoder stream for VQA v1 or nonzero samplerate */ if (AV_RL16(&header[24]) || (AV_RL16(&header[0]) == 1 && AV_RL16(&header[2]) == 1)) { - st = av_new_stream(s, 0); + st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); - av_set_pts_info(st, 33, 1, VQA_FRAMERATE); - st->codec->codec_type = CODEC_TYPE_AUDIO; + avpriv_set_pts_info(st, 33, 1, VQA_FRAMERATE); + st->codec->codec_type = AVMEDIA_TYPE_AUDIO; if (AV_RL16(&header[0]) == 1) st->codec->codec_id = CODEC_ID_WESTWOOD_SND1; else @@ -279,7 +278,7 @@ static int wsvqa_read_header(AVFormatContext *s, /* there are 0 or more chunks before the FINF chunk; iterate until * FINF has been skipped and the file will be ready to be demuxed */ do { - if (get_buffer(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE) { + if (avio_read(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE) { av_free(st->codec->extradata); return AVERROR(EIO); } @@ -305,11 +304,9 @@ static int wsvqa_read_header(AVFormatContext *s, break; } - url_fseek(pb, chunk_size, SEEK_CUR); + avio_skip(pb, chunk_size); } while (chunk_tag != FINF_TAG); - wsvqa->video_pts = wsvqa->audio_frame_counter = 0; - return 0; } @@ -317,23 +314,28 @@ static int wsvqa_read_packet(AVFormatContext *s, AVPacket *pkt) { WsVqaDemuxContext *wsvqa = s->priv_data; - ByteIOContext *pb = s->pb; + AVIOContext *pb = s->pb; int ret = -1; unsigned char preamble[VQA_PREAMBLE_SIZE]; unsigned int chunk_type; unsigned int chunk_size; int skip_byte; - while (get_buffer(pb, preamble, VQA_PREAMBLE_SIZE) == VQA_PREAMBLE_SIZE) { + while (avio_read(pb, preamble, VQA_PREAMBLE_SIZE) == VQA_PREAMBLE_SIZE) { chunk_type = AV_RB32(&preamble[0]); chunk_size = AV_RB32(&preamble[4]); skip_byte = chunk_size & 0x01; + if ((chunk_type == SND2_TAG || chunk_type == SND1_TAG) && wsvqa->audio_channels == 0) { + av_log(s, AV_LOG_ERROR, "audio chunk without any audio header information found\n"); + return AVERROR_INVALIDDATA; + } + if ((chunk_type == SND1_TAG) || (chunk_type == SND2_TAG) || (chunk_type == VQFR_TAG)) { if (av_new_packet(pkt, chunk_size)) return AVERROR(EIO); - ret = get_buffer(pb, pkt->data, chunk_size); + ret = avio_read(pb, pkt->data, chunk_size); if (ret != chunk_size) { av_free_packet(pkt); return AVERROR(EIO); @@ -349,11 +351,10 @@ static int wsvqa_read_packet(AVFormatContext *s, wsvqa->audio_frame_counter += AV_RL16(pkt->data) / wsvqa->audio_channels; } else { pkt->stream_index = wsvqa->video_stream_index; - wsvqa->video_pts += VQA_VIDEO_PTS_INC; } /* stay on 16-bit alignment */ if (skip_byte) - url_fseek(pb, 1, SEEK_CUR); + avio_skip(pb, 1); return ret; } else { @@ -364,7 +365,7 @@ static int wsvqa_read_packet(AVFormatContext *s, default: av_log(s, AV_LOG_INFO, "Skipping unknown chunk 0x%08X\n", chunk_type); } - url_fseek(pb, chunk_size + skip_byte, SEEK_CUR); + avio_skip(pb, chunk_size + skip_byte); } } @@ -372,22 +373,22 @@ static int wsvqa_read_packet(AVFormatContext *s, } #if CONFIG_WSAUD_DEMUXER -AVInputFormat wsaud_demuxer = { - "wsaud", - NULL_IF_CONFIG_SMALL("Westwood Studios audio format"), - sizeof(WsAudDemuxContext), - wsaud_probe, - wsaud_read_header, - wsaud_read_packet, +AVInputFormat ff_wsaud_demuxer = { + .name = "wsaud", + .long_name = NULL_IF_CONFIG_SMALL("Westwood Studios audio format"), + .priv_data_size = sizeof(WsAudDemuxContext), + .read_probe = wsaud_probe, + .read_header = wsaud_read_header, + .read_packet = wsaud_read_packet, }; #endif #if CONFIG_WSVQA_DEMUXER -AVInputFormat wsvqa_demuxer = { - "wsvqa", - NULL_IF_CONFIG_SMALL("Westwood Studios VQA format"), - sizeof(WsVqaDemuxContext), - wsvqa_probe, - wsvqa_read_header, - wsvqa_read_packet, +AVInputFormat ff_wsvqa_demuxer = { + .name = "wsvqa", + .long_name = NULL_IF_CONFIG_SMALL("Westwood Studios VQA format"), + .priv_data_size = sizeof(WsVqaDemuxContext), + .read_probe = wsvqa_probe, + .read_header = wsvqa_read_header, + .read_packet = wsvqa_read_packet, }; #endif