annotate txd.c @ 3754:8d267b43eaba libavformat

Move malloc() down until after all initializations, so that the resource is only allocated if initialization worked. This means that on failure, we don't have to deallocate it.
author rbultje
date Sat, 23 Aug 2008 18:46:30 +0000
parents 31a0f3b99ef7
children 7d2f3f1b68d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
1 /*
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
2 * Renderware TeXture Dictionary (.txd) demuxer
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
3 * Copyright (c) 2007 Ivo van Poorten
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
4 *
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
5 * This file is part of FFmpeg.
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
6 *
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
11 *
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
15 * Lesser General Public License for more details.
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
16 *
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
20 */
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
21
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
22 #include "avformat.h"
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
23
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
24 #define TXD_FILE 0x16
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
25 #define TXD_INFO 0x01
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
26 #define TXD_EXTRA 0x03
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
27 #define TXD_TEXTURE 0x15
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
28 #define TXD_TEXTURE_DATA 0x01
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
29 #define TXD_MARKER 0x1803ffff
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
30 #define TXD_MARKER2 0x1003ffff
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
31
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
32 static int txd_probe(AVProbeData * pd) {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
33 if (AV_RL32(pd->buf ) == TXD_FILE &&
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
34 (AV_RL32(pd->buf+8) == TXD_MARKER || AV_RL32(pd->buf+8) == TXD_MARKER2))
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
35 return AVPROBE_SCORE_MAX;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
36 return 0;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
37 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
38
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
39 static int txd_read_header(AVFormatContext *s, AVFormatParameters *ap) {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
40 AVStream *st;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
41
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
42 st = av_new_stream(s, 0);
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
43 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2072
diff changeset
44 return AVERROR(ENOMEM);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
45 st->codec->codec_type = CODEC_TYPE_VIDEO;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
46 st->codec->codec_id = CODEC_ID_TXD;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
47 st->codec->time_base.den = 5;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
48 st->codec->time_base.num = 1;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
49 /* the parameters will be extracted from the compressed bitstream */
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
50 return 0;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
51 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
52
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
53 static int txd_read_packet(AVFormatContext *s, AVPacket *pkt) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
54 ByteIOContext *pb = s->pb;
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
55 unsigned int id, chunk_size, marker;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
56 int ret;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
57
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
58 next_chunk:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
59 id = get_le32(pb);
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
60 chunk_size = get_le32(pb);
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
61 marker = get_le32(pb);
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
62
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
63 if (url_feof(s->pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
64 return AVERROR(EIO);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
65 if (marker != TXD_MARKER && marker != TXD_MARKER2) {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
66 av_log(NULL, AV_LOG_ERROR, "marker does not match\n");
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
67 return AVERROR(EIO);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
68 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
69
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
70 switch (id) {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
71 case TXD_INFO:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
72 if (chunk_size > 100)
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
73 break;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
74 case TXD_EXTRA:
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
75 url_fskip(s->pb, chunk_size);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
76 case TXD_FILE:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
77 case TXD_TEXTURE:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
78 goto next_chunk;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
79 default:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
80 av_log(NULL, AV_LOG_ERROR, "unknown chunk id %i\n", id);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
81 return AVERROR(EIO);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
82 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
83
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
84 ret = av_get_packet(s->pb, pkt, chunk_size);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
85 pkt->stream_index = 0;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
86
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
87 return ret <= 0 ? AVERROR(EIO) : ret;
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
88 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
89
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
90 AVInputFormat txd_demuxer =
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
91 {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
92 "txd",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 2771
diff changeset
93 NULL_IF_CONFIG_SMALL("txd format"),
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
94 0,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
95 txd_probe,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
96 txd_read_header,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
97 txd_read_packet,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
98 };