X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Favs.c;h=74721b63c4b6c014f8e27e7bd0831934fd2c6ad9;hb=5f2c8315b3c1b28da0386fddb118ad6a0ed77a0c;hp=0fa77defffc30acf8bc2f1a7333f1a33ef22b25a;hpb=b78e7197a81e193827cf2408fe25bc1f14843a72;p=ffmpeg diff --git a/libavformat/avs.c b/libavformat/avs.c index 0fa77defffc..74721b63c4b 100644 --- a/libavformat/avs.c +++ b/libavformat/avs.c @@ -2,21 +2,21 @@ * AVS demuxer. * Copyright (c) 2006 Aurelien Jacobs * - * 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 - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "avformat.h" @@ -24,7 +24,7 @@ typedef struct avs_format { - voc_dec_context_t voc; + VocDecContext voc; AVStream *st_video; AVStream *st_audio; int width; @@ -34,40 +34,41 @@ typedef struct avs_format { int nb_frames; int remaining_frame_size; int remaining_audio_size; -} avs_format_t; +} AvsFormat; typedef enum avs_block_type { + AVS_NONE = 0x00, AVS_VIDEO = 0x01, AVS_AUDIO = 0x02, AVS_PALETTE = 0x03, AVS_GAME_DATA = 0x04, -} avs_block_type_t; +} AvsBlockType; static int avs_probe(AVProbeData * p) { const uint8_t *d; - if (p->buf_size < 2) - return 0; d = p->buf; if (d[0] == 'w' && d[1] == 'W' && d[2] == 0x10 && d[3] == 0) - return 50; + /* Ensure the buffer probe scores higher than the extension probe. + * This avoids problems with misdetection as AviSynth scripts. */ + return AVPROBE_SCORE_EXTENSION + 1; return 0; } -static int avs_read_header(AVFormatContext * s, AVFormatParameters * ap) +static int avs_read_header(AVFormatContext * s) { - avs_format_t *avs = s->priv_data; + AvsFormat *avs = s->priv_data; s->ctx_flags |= AVFMTCTX_NOHEADER; - url_fskip(&s->pb, 4); - avs->width = get_le16(&s->pb); - avs->height = get_le16(&s->pb); - avs->bits_per_sample = get_le16(&s->pb); - avs->fps = get_le16(&s->pb); - avs->nb_frames = get_le32(&s->pb); + avio_skip(s->pb, 4); + avs->width = avio_rl16(s->pb); + avs->height = avio_rl16(s->pb); + avs->bits_per_sample = avio_rl16(s->pb); + avs->fps = avio_rl16(s->pb); + avs->nb_frames = avio_rl32(s->pb); avs->remaining_frame_size = 0; avs->remaining_audio_size = 0; @@ -83,10 +84,10 @@ static int avs_read_header(AVFormatContext * s, AVFormatParameters * ap) static int avs_read_video_packet(AVFormatContext * s, AVPacket * pkt, - avs_block_type_t type, int sub_type, int size, + AvsBlockType type, int sub_type, int size, uint8_t * palette, int palette_size) { - avs_format_t *avs = s->priv_data; + AvsFormat *avs = s->priv_data; int ret; ret = av_new_packet(pkt, size + palette_size); @@ -105,46 +106,46 @@ avs_read_video_packet(AVFormatContext * s, AVPacket * pkt, pkt->data[palette_size + 1] = type; pkt->data[palette_size + 2] = size & 0xFF; pkt->data[palette_size + 3] = (size >> 8) & 0xFF; - ret = get_buffer(&s->pb, pkt->data + palette_size + 4, size - 4) + 4; + ret = avio_read(s->pb, pkt->data + palette_size + 4, size - 4) + 4; if (ret < size) { - av_free_packet(pkt); - return AVERROR_IO; + av_packet_unref(pkt); + return AVERROR(EIO); } pkt->size = ret + palette_size; pkt->stream_index = avs->st_video->index; if (sub_type == 0) - pkt->flags |= PKT_FLAG_KEY; + pkt->flags |= AV_PKT_FLAG_KEY; return 0; } static int avs_read_audio_packet(AVFormatContext * s, AVPacket * pkt) { - avs_format_t *avs = s->priv_data; + AvsFormat *avs = s->priv_data; int ret, size; - size = url_ftell(&s->pb); - ret = voc_get_packet(s, pkt, avs->st_audio, avs->remaining_audio_size); - size = url_ftell(&s->pb) - size; + size = avio_tell(s->pb); + ret = ff_voc_get_packet(s, pkt, avs->st_audio, avs->remaining_audio_size); + size = avio_tell(s->pb) - size; avs->remaining_audio_size -= size; - if (ret == AVERROR_IO) + if (ret == AVERROR(EIO)) return 0; /* this indicate EOS */ if (ret < 0) return ret; pkt->stream_index = avs->st_audio->index; - pkt->flags |= PKT_FLAG_KEY; + pkt->flags |= AV_PKT_FLAG_KEY; return size; } static int avs_read_packet(AVFormatContext * s, AVPacket * pkt) { - avs_format_t *avs = s->priv_data; + AvsFormat *avs = s->priv_data; int sub_type = 0, size = 0; - avs_block_type_t type = 0; + AvsBlockType type = AVS_NONE; int palette_size = 0; uint8_t palette[4 + 3 * 256]; int ret; @@ -155,48 +156,51 @@ static int avs_read_packet(AVFormatContext * s, AVPacket * pkt) while (1) { if (avs->remaining_frame_size <= 0) { - if (!get_le16(&s->pb)) /* found EOF */ - return AVERROR_IO; - avs->remaining_frame_size = get_le16(&s->pb) - 4; + if (!avio_rl16(s->pb)) /* found EOF */ + return AVERROR(EIO); + avs->remaining_frame_size = avio_rl16(s->pb) - 4; } while (avs->remaining_frame_size > 0) { - sub_type = get_byte(&s->pb); - type = get_byte(&s->pb); - size = get_le16(&s->pb); + sub_type = avio_r8(s->pb); + type = avio_r8(s->pb); + size = avio_rl16(s->pb); + if (size < 4) + return AVERROR_INVALIDDATA; avs->remaining_frame_size -= size; switch (type) { case AVS_PALETTE: - ret = get_buffer(&s->pb, palette, size - 4); + if (size - 4 > sizeof(palette)) + return AVERROR_INVALIDDATA; + ret = avio_read(s->pb, palette, size - 4); if (ret < size - 4) - return AVERROR_IO; + return AVERROR(EIO); palette_size = size; break; case AVS_VIDEO: if (!avs->st_video) { - avs->st_video = av_new_stream(s, AVS_VIDEO); - if (avs->st_video == NULL) - return AVERROR_NOMEM; - avs->st_video->codec->codec_type = CODEC_TYPE_VIDEO; - avs->st_video->codec->codec_id = CODEC_ID_AVS; + avs->st_video = avformat_new_stream(s, NULL); + if (!avs->st_video) + return AVERROR(ENOMEM); + avs->st_video->codec->codec_type = AVMEDIA_TYPE_VIDEO; + avs->st_video->codec->codec_id = AV_CODEC_ID_AVS; avs->st_video->codec->width = avs->width; avs->st_video->codec->height = avs->height; - avs->st_video->codec->bits_per_sample=avs->bits_per_sample; + avs->st_video->codec->bits_per_coded_sample=avs->bits_per_sample; avs->st_video->nb_frames = avs->nb_frames; - avs->st_video->codec->time_base = (AVRational) { - 1, avs->fps}; + avs->st_video->avg_frame_rate = (AVRational){avs->fps, 1}; } return avs_read_video_packet(s, pkt, type, sub_type, size, palette, palette_size); case AVS_AUDIO: if (!avs->st_audio) { - avs->st_audio = av_new_stream(s, AVS_AUDIO); - if (avs->st_audio == NULL) - return AVERROR_NOMEM; - avs->st_audio->codec->codec_type = CODEC_TYPE_AUDIO; + avs->st_audio = avformat_new_stream(s, NULL); + if (!avs->st_audio) + return AVERROR(ENOMEM); + avs->st_audio->codec->codec_type = AVMEDIA_TYPE_AUDIO; } avs->remaining_audio_size = size - 4; size = avs_read_audio_packet(s, pkt); @@ -205,7 +209,7 @@ static int avs_read_packet(AVFormatContext * s, AVPacket * pkt) break; default: - url_fskip(&s->pb, size - 4); + avio_skip(s->pb, size - 4); } } } @@ -216,12 +220,12 @@ static int avs_read_close(AVFormatContext * s) return 0; } -AVInputFormat avs_demuxer = { - "avs", - "avs format", - sizeof(avs_format_t), - avs_probe, - avs_read_header, - avs_read_packet, - avs_read_close, +AVInputFormat ff_avs_demuxer = { + .name = "avs", + .long_name = NULL_IF_CONFIG_SMALL("AVS"), + .priv_data_size = sizeof(AvsFormat), + .read_probe = avs_probe, + .read_header = avs_read_header, + .read_packet = avs_read_packet, + .read_close = avs_read_close, };