X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fidcin.c;h=cd4ebf83fcac3a3c5a96d553b6728740a5aadd51;hb=548b97a66a41e610a419ffec2b4a32d28166dea5;hp=cbbf980233f0d7df54efaddad78c01025712e352;hpb=115329f16062074e11ccf3b89ead6176606c9696;p=ffmpeg diff --git a/libavformat/idcin.c b/libavformat/idcin.c index cbbf980233f..cd4ebf83fca 100644 --- a/libavformat/idcin.c +++ b/libavformat/idcin.c @@ -1,26 +1,28 @@ /* - * Id Quake II CIN File Demuxer + * id Quake II CIN File Demuxer * Copyright (c) 2003 The ffmpeg Project * - * This library is free software; you can redistribute it and/or + * This file is part of FFmpeg. + * + * FFmpeg 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 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * FFmpeg 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 this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file idcin.c - * Id Quake II CIN file demuxer by Mike Melanson (melanson@pcisys.net) - * For more information about the Id CIN format, visit: + * @file + * id Quake II CIN file demuxer by Mike Melanson (melanson@pcisys.net) + * For more information about the id CIN format, visit: * http://www.csse.monash.edu.au/~timf/ * * CIN is a somewhat quirky and ill-defined format. Here are some notes @@ -51,7 +53,7 @@ * audio frame #2: 787 * (bytes/sample) * (# channels) bytes in frame * audio frame #3: 788 * (bytes/sample) * (# channels) bytes in frame * - * Finally, not all Id CIN creation tools agree on the resolution of the + * Finally, not all id CIN creation tools agree on the resolution of the * color palette, apparently. Some creation tools specify red, green, and * blue palette components in terms of 6-bit VGA color DAC values which * range from 0..63. Other tools specify the RGB components as full 8-bit @@ -66,10 +68,11 @@ * transmitting them to the video decoder */ +#include "libavutil/intreadwrite.h" #include "avformat.h" #define HUFFMAN_TABLE_SIZE (64 * 1024) -#define FRAME_PTS_INC (90000 / 14) +#define IDCIN_FPS 14 typedef struct IdcinDemuxContext { int video_stream_index; @@ -92,7 +95,7 @@ static int idcin_probe(AVProbeData *p) unsigned int number; /* - * This is what you could call a "probabilistic" file check: Id CIN + * This is what you could call a "probabilistic" file check: id CIN * files don't have a definite file signature. In lieu of such a marker, * perform sanity checks on the 5 32-bit header fields: * width, height: greater than 0, less than or equal to 1024 @@ -102,32 +105,33 @@ static int idcin_probe(AVProbeData *p) * audio channels: 0 for no audio, or 1 or 2 */ - /* cannot proceed without 20 bytes */ + /* check we have enough data to do all checks, otherwise the + 0-padding may cause a wrong recognition */ if (p->buf_size < 20) return 0; /* check the video width */ - number = LE_32(&p->buf[0]); + number = AV_RL32(&p->buf[0]); if ((number == 0) || (number > 1024)) return 0; /* check the video height */ - number = LE_32(&p->buf[4]); + number = AV_RL32(&p->buf[4]); if ((number == 0) || (number > 1024)) return 0; /* check the audio sample rate */ - number = LE_32(&p->buf[8]); + number = AV_RL32(&p->buf[8]); if ((number != 0) && ((number < 8000) | (number > 48000))) return 0; /* check the audio bytes/sample */ - number = LE_32(&p->buf[12]); + number = AV_RL32(&p->buf[12]); if (number > 2) return 0; /* check the audio channels */ - number = LE_32(&p->buf[16]); + number = AV_RL32(&p->buf[16]); if (number > 2) return 0; @@ -138,8 +142,8 @@ static int idcin_probe(AVProbeData *p) static int idcin_read_header(AVFormatContext *s, AVFormatParameters *ap) { - ByteIOContext *pb = &s->pb; - IdcinDemuxContext *idcin = (IdcinDemuxContext *)s->priv_data; + ByteIOContext *pb = s->pb; + IdcinDemuxContext *idcin = s->priv_data; AVStream *st; unsigned int width, height; unsigned int sample_rate, bytes_per_sample, channels; @@ -153,10 +157,10 @@ static int idcin_read_header(AVFormatContext *s, st = av_new_stream(s, 0); if (!st) - return AVERROR_NOMEM; - av_set_pts_info(st, 33, 1, 90000); + return AVERROR(ENOMEM); + av_set_pts_info(st, 33, 1, IDCIN_FPS); idcin->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_IDCIN; st->codec->codec_tag = 0; /* no fourcc */ st->codec->width = width; @@ -167,7 +171,7 @@ static int idcin_read_header(AVFormatContext *s, st->codec->extradata = av_malloc(HUFFMAN_TABLE_SIZE); if (get_buffer(pb, st->codec->extradata, HUFFMAN_TABLE_SIZE) != HUFFMAN_TABLE_SIZE) - return AVERROR_IO; + return AVERROR(EIO); /* save a reference in order to transport the palette */ st->codec->palctrl = &idcin->palctrl; @@ -176,14 +180,14 @@ static int idcin_read_header(AVFormatContext *s, idcin->audio_present = 1; st = av_new_stream(s, 0); if (!st) - return AVERROR_NOMEM; - av_set_pts_info(st, 33, 1, 90000); + return AVERROR(ENOMEM); + av_set_pts_info(st, 33, 1, IDCIN_FPS); idcin->audio_stream_index = st->index; - st->codec->codec_type = CODEC_TYPE_AUDIO; + st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_tag = 1; st->codec->channels = channels; st->codec->sample_rate = sample_rate; - st->codec->bits_per_sample = bytes_per_sample * 8; + st->codec->bits_per_coded_sample = bytes_per_sample * 8; st->codec->bit_rate = sample_rate * bytes_per_sample * 8 * channels; st->codec->block_align = bytes_per_sample * channels; if (bytes_per_sample == 1) @@ -216,25 +220,25 @@ static int idcin_read_packet(AVFormatContext *s, int ret; unsigned int command; unsigned int chunk_size; - IdcinDemuxContext *idcin = (IdcinDemuxContext *)s->priv_data; - ByteIOContext *pb = &s->pb; + IdcinDemuxContext *idcin = s->priv_data; + ByteIOContext *pb = s->pb; int i; int palette_scale; unsigned char r, g, b; unsigned char palette_buffer[768]; - if (url_feof(&s->pb)) - return AVERROR_IO; + if (url_feof(s->pb)) + return AVERROR(EIO); if (idcin->next_chunk_is_video) { command = get_le32(pb); if (command == 2) { - return AVERROR_IO; + return AVERROR(EIO); } else if (command == 1) { /* trigger a palette change */ idcin->palctrl.palette_changed = 1; if (get_buffer(pb, palette_buffer, 768) != 768) - return AVERROR_IO; + return AVERROR(EIO); /* scale the palette as necessary */ palette_scale = 2; for (i = 0; i < 768; i++) @@ -256,8 +260,8 @@ static int idcin_read_packet(AVFormatContext *s, url_fseek(pb, 4, SEEK_CUR); chunk_size -= 4; ret= av_get_packet(pb, pkt, chunk_size); - if (ret != chunk_size) - return AVERROR_IO; + if (ret < 0) + return ret; pkt->stream_index = idcin->video_stream_index; pkt->pts = idcin->pts; } else { @@ -267,13 +271,13 @@ static int idcin_read_packet(AVFormatContext *s, else chunk_size = idcin->audio_chunk_size1; ret= av_get_packet(pb, pkt, chunk_size); - if (ret != chunk_size) - return AVERROR_IO; + if (ret < 0) + return ret; pkt->stream_index = idcin->audio_stream_index; pkt->pts = idcin->pts; idcin->current_audio_chunk ^= 1; - idcin->pts += FRAME_PTS_INC; + idcin->pts++; } if (idcin->audio_present) @@ -282,24 +286,11 @@ static int idcin_read_packet(AVFormatContext *s, return ret; } -static int idcin_read_close(AVFormatContext *s) -{ - - return 0; -} - -static AVInputFormat idcin_iformat = { +AVInputFormat idcin_demuxer = { "idcin", - "Id CIN format", + NULL_IF_CONFIG_SMALL("id Cinematic format"), sizeof(IdcinDemuxContext), idcin_probe, idcin_read_header, idcin_read_packet, - idcin_read_close, }; - -int idcin_init(void) -{ - av_register_input_format(&idcin_iformat); - return 0; -}