Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
txd.c
Go to the documentation of this file.
1
/*
2
* Renderware TeXture Dictionary (.txd) demuxer
3
* Copyright (c) 2007 Ivo van Poorten
4
*
5
* This file is part of Libav.
6
*
7
* Libav 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
* Libav 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 Libav; 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
33
static
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
40
static
int
txd_read_header
(
AVFormatContext
*s,
AVFormatParameters
*ap) {
41
AVStream
*st;
42
43
st =
avformat_new_stream
(s,
NULL
);
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
54
static
int
txd_read_packet
(
AVFormatContext
*s,
AVPacket
*pkt) {
55
AVIOContext
*pb = s->
pb
;
56
unsigned
int
id
, chunk_size, marker;
57
int
ret;
58
59
next_chunk:
60
id
=
avio_rl32
(pb);
61
chunk_size =
avio_rl32
(pb);
62
marker =
avio_rl32
(pb);
63
64
if
(s->
pb
->
eof_reached
)
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
avio_skip
(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
93
AVInputFormat
ff_txd_demuxer
= {
94
.
name
=
"txd"
,
95
.long_name =
NULL_IF_CONFIG_SMALL
(
"Renderware TeXture Dictionary"
),
96
.read_probe =
txd_probe
,
97
.read_header =
txd_read_header
,
98
.read_packet =
txd_read_packet
,
99
};