1/* 2 * Renderware TeXture Dictionary (.txd) demuxer 3 * Copyright (c) 2007 Ivo van Poorten 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#include "libavutil/intreadwrite.h" 23#include "avformat.h" 24 25#define TXD_FILE 0x16 26#define TXD_INFO 0x01 27#define TXD_EXTRA 0x03 28#define TXD_TEXTURE 0x15 29#define TXD_TEXTURE_DATA 0x01 30#define TXD_MARKER 0x1803ffff 31#define TXD_MARKER2 0x1003ffff 32 33static int txd_probe(AVProbeData * pd) { 34 if (AV_RL32(pd->buf ) == TXD_FILE && 35 (AV_RL32(pd->buf+8) == TXD_MARKER || AV_RL32(pd->buf+8) == TXD_MARKER2)) 36 return AVPROBE_SCORE_MAX; 37 return 0; 38} 39 40static int txd_read_header(AVFormatContext *s, AVFormatParameters *ap) { 41 AVStream *st; 42 43 st = av_new_stream(s, 0); 44 if (!st) 45 return AVERROR(ENOMEM); 46 st->codec->codec_type = AVMEDIA_TYPE_VIDEO; 47 st->codec->codec_id = CODEC_ID_TXD; 48 st->codec->time_base.den = 5; 49 st->codec->time_base.num = 1; 50 /* the parameters will be extracted from the compressed bitstream */ 51 return 0; 52} 53 54static int txd_read_packet(AVFormatContext *s, AVPacket *pkt) { 55 ByteIOContext *pb = s->pb; 56 unsigned int id, chunk_size, marker; 57 int ret; 58 59next_chunk: 60 id = get_le32(pb); 61 chunk_size = get_le32(pb); 62 marker = get_le32(pb); 63 64 if (url_feof(s->pb)) 65 return AVERROR_EOF; 66 if (marker != TXD_MARKER && marker != TXD_MARKER2) { 67 av_log(s, AV_LOG_ERROR, "marker does not match\n"); 68 return AVERROR_INVALIDDATA; 69 } 70 71 switch (id) { 72 case TXD_INFO: 73 if (chunk_size > 100) 74 break; 75 case TXD_EXTRA: 76 url_fskip(s->pb, chunk_size); 77 case TXD_FILE: 78 case TXD_TEXTURE: 79 goto next_chunk; 80 default: 81 av_log(s, AV_LOG_ERROR, "unknown chunk id %i\n", id); 82 return AVERROR_INVALIDDATA; 83 } 84 85 ret = av_get_packet(s->pb, pkt, chunk_size); 86 if (ret < 0) 87 return ret; 88 pkt->stream_index = 0; 89 90 return 0; 91} 92 93AVInputFormat txd_demuxer = 94{ 95 "txd", 96 NULL_IF_CONFIG_SMALL("Renderware TeXture Dictionary"), 97 0, 98 txd_probe, 99 txd_read_header, 100 txd_read_packet, 101}; 102