annotate txd.c @ 5266:73615b247438 libavformat

Only read ID3v1 tag if ID3v2 isn't present or is empty. This prevents the demuxer from exporting multiple semantically identical but differently named tags. Patch by Anton Khirnov, wyskas gmail
author cehoyos
date Mon, 05 Oct 2009 21:36:56 +0000
parents d4f4eb9ce54f
children cda7add41fbb
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
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3484
diff changeset
22 #include "libavutil/intreadwrite.h"
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
23 #include "avformat.h"
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
24
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
25 #define TXD_FILE 0x16
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
26 #define TXD_INFO 0x01
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
27 #define TXD_EXTRA 0x03
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
28 #define TXD_TEXTURE 0x15
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
29 #define TXD_TEXTURE_DATA 0x01
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
30 #define TXD_MARKER 0x1803ffff
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
31 #define TXD_MARKER2 0x1003ffff
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
32
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
33 static int txd_probe(AVProbeData * pd) {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
34 if (AV_RL32(pd->buf ) == TXD_FILE &&
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
35 (AV_RL32(pd->buf+8) == TXD_MARKER || AV_RL32(pd->buf+8) == TXD_MARKER2))
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
36 return AVPROBE_SCORE_MAX;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
37 return 0;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
38 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
39
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
40 static int txd_read_header(AVFormatContext *s, AVFormatParameters *ap) {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
41 AVStream *st;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
42
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
43 st = av_new_stream(s, 0);
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
44 if (!st)
2273
7eb456c4ed8a Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents: 2072
diff changeset
45 return AVERROR(ENOMEM);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
46 st->codec->codec_type = CODEC_TYPE_VIDEO;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
47 st->codec->codec_id = CODEC_ID_TXD;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
48 st->codec->time_base.den = 5;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
49 st->codec->time_base.num = 1;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
50 /* the parameters will be extracted from the compressed bitstream */
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
51 return 0;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
52 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
53
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
54 static int txd_read_packet(AVFormatContext *s, AVPacket *pkt) {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
55 ByteIOContext *pb = s->pb;
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
56 unsigned int id, chunk_size, marker;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
57 int ret;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
58
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
59 next_chunk:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
60 id = get_le32(pb);
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
61 chunk_size = get_le32(pb);
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
62 marker = get_le32(pb);
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
63
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
64 if (url_feof(s->pb))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
65 return AVERROR(EIO);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
66 if (marker != TXD_MARKER && marker != TXD_MARKER2) {
4636
d4f4eb9ce54f Add a context to av_log() calls.
benoit
parents: 4465
diff changeset
67 av_log(s, AV_LOG_ERROR, "marker does not match\n");
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
68 return AVERROR(EIO);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
69 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
70
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
71 switch (id) {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
72 case TXD_INFO:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
73 if (chunk_size > 100)
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
74 break;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
75 case TXD_EXTRA:
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
76 url_fskip(s->pb, chunk_size);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
77 case TXD_FILE:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
78 case TXD_TEXTURE:
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
79 goto next_chunk;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
80 default:
4636
d4f4eb9ce54f Add a context to av_log() calls.
benoit
parents: 4465
diff changeset
81 av_log(s, 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
82 return AVERROR(EIO);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
83 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
84
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2274
diff changeset
85 ret = av_get_packet(s->pb, pkt, chunk_size);
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
86 pkt->stream_index = 0;
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
87
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2273
diff changeset
88 return ret <= 0 ? AVERROR(EIO) : ret;
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
89 }
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
90
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
91 AVInputFormat txd_demuxer =
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
92 {
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
93 "txd",
4465
042e9a2fdda2 Use more descriptive format long_names.
diego
parents: 4201
diff changeset
94 NULL_IF_CONFIG_SMALL("Renderware TeXture Dictionary"),
2072
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
95 0,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
96 txd_probe,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
97 txd_read_header,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
98 txd_read_packet,
d20edf2ef6d4 Renderware TXD demuxer
ivo
parents:
diff changeset
99 };