Mercurial > libavformat.hg
annotate thp.c @ 6274:1c656ac8c9c9 libavformat
Allow all valid (and only valid) characters in URL scheme for url_open()
The URL specification allows letters, numbers, plus, hyphen, and period
in the scheme part. The isalpha() test would allow additional characters
depending on locale settings while rejecting numbers and punctuation.
author | mru |
---|---|
date | Sun, 18 Jul 2010 18:38:23 +0000 |
parents | 536e5527c1e0 |
children |
rev | line source |
---|---|
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
1 /* |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
2 * THP Demuxer |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4201
diff
changeset
|
3 * Copyright (c) 2007 Marco Gerards |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
4 * |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
5 * This file is part of FFmpeg. |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
6 * |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
11 * |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
16 * |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
20 */ |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
21 |
4201
7d2f3f1b68d8
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
3424
diff
changeset
|
22 #include "libavutil/intreadwrite.h" |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
23 #include "avformat.h" |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
24 |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
25 typedef struct ThpDemuxContext { |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
26 int version; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
27 int first_frame; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
28 int first_framesz; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
29 int last_frame; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
30 int compoff; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
31 int framecnt; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
32 AVRational fps; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
33 int frame; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
34 int next_frame; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
35 int next_framesz; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
36 int video_stream_index; |
1988 | 37 int audio_stream_index; |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
38 int compcount; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
39 unsigned char components[16]; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
40 AVStream* vst; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
41 int has_audio; |
1988 | 42 int audiosize; |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
43 } ThpDemuxContext; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
44 |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
45 |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
46 static int thp_probe(AVProbeData *p) |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
47 { |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
48 /* check file header */ |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
49 if (AV_RL32(p->buf) == MKTAG('T', 'H', 'P', '\0')) |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
50 return AVPROBE_SCORE_MAX; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
51 else |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
52 return 0; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
53 } |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
54 |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
55 static int thp_read_header(AVFormatContext *s, |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
56 AVFormatParameters *ap) |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
57 { |
2004 | 58 ThpDemuxContext *thp = s->priv_data; |
59 AVStream *st; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2555
diff
changeset
|
60 ByteIOContext *pb = s->pb; |
2004 | 61 int i; |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
62 |
2004 | 63 /* Read the file header. */ |
64 get_be32(pb); /* Skip Magic. */ | |
65 thp->version = get_be32(pb); | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
66 |
2004 | 67 get_be32(pb); /* Max buf size. */ |
68 get_be32(pb); /* Max samples. */ | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
69 |
2004 | 70 thp->fps = av_d2q(av_int2flt(get_be32(pb)), INT_MAX); |
71 thp->framecnt = get_be32(pb); | |
72 thp->first_framesz = get_be32(pb); | |
73 get_be32(pb); /* Data size. */ | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
74 |
2004 | 75 thp->compoff = get_be32(pb); |
76 get_be32(pb); /* offsetDataOffset. */ | |
77 thp->first_frame = get_be32(pb); | |
78 thp->last_frame = get_be32(pb); | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
79 |
2004 | 80 thp->next_framesz = thp->first_framesz; |
81 thp->next_frame = thp->first_frame; | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
82 |
2004 | 83 /* Read the component structure. */ |
84 url_fseek (pb, thp->compoff, SEEK_SET); | |
85 thp->compcount = get_be32(pb); | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
86 |
2004 | 87 /* Read the list of component types. */ |
88 get_buffer(pb, thp->components, 16); | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
89 |
2004 | 90 for (i = 0; i < thp->compcount; i++) { |
91 if (thp->components[i] == 0) { | |
92 if (thp->vst != 0) | |
93 break; | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
94 |
2004 | 95 /* Video component. */ |
96 st = av_new_stream(s, 0); | |
97 if (!st) | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2004
diff
changeset
|
98 return AVERROR(ENOMEM); |
2004 | 99 |
100 /* The denominator and numerator are switched because 1/fps | |
101 is required. */ | |
102 av_set_pts_info(st, 64, thp->fps.den, thp->fps.num); | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
4251
diff
changeset
|
103 st->codec->codec_type = AVMEDIA_TYPE_VIDEO; |
2004 | 104 st->codec->codec_id = CODEC_ID_THP; |
105 st->codec->codec_tag = 0; /* no fourcc */ | |
106 st->codec->width = get_be32(pb); | |
107 st->codec->height = get_be32(pb); | |
108 st->codec->sample_rate = av_q2d(thp->fps); | |
109 thp->vst = st; | |
110 thp->video_stream_index = st->index; | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
111 |
2004 | 112 if (thp->version == 0x11000) |
113 get_be32(pb); /* Unknown. */ | |
114 } else if (thp->components[i] == 1) { | |
115 if (thp->has_audio != 0) | |
116 break; | |
117 | |
118 /* Audio component. */ | |
119 st = av_new_stream(s, 0); | |
120 if (!st) | |
2273
7eb456c4ed8a
Replace all occurrences of AVERROR_NOMEM with AVERROR(ENOMEM).
takis
parents:
2004
diff
changeset
|
121 return AVERROR(ENOMEM); |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
122 |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
4251
diff
changeset
|
123 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; |
2004 | 124 st->codec->codec_id = CODEC_ID_ADPCM_THP; |
125 st->codec->codec_tag = 0; /* no fourcc */ | |
126 st->codec->channels = get_be32(pb); /* numChannels. */ | |
127 st->codec->sample_rate = get_be32(pb); /* Frequency. */ | |
128 | |
129 av_set_pts_info(st, 64, 1, st->codec->sample_rate); | |
130 | |
131 thp->audio_stream_index = st->index; | |
132 thp->has_audio = 1; | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
133 } |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
134 } |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
135 |
2004 | 136 return 0; |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
137 } |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
138 |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
139 static int thp_read_packet(AVFormatContext *s, |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
140 AVPacket *pkt) |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
141 { |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
142 ThpDemuxContext *thp = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2555
diff
changeset
|
143 ByteIOContext *pb = s->pb; |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
144 int size; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
145 int ret; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
146 |
1988 | 147 if (thp->audiosize == 0) { |
2004 | 148 /* Terminate when last frame is reached. */ |
149 if (thp->frame >= thp->framecnt) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
150 return AVERROR(EIO); |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
151 |
2004 | 152 url_fseek(pb, thp->next_frame, SEEK_SET); |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
153 |
2004 | 154 /* Locate the next frame and read out its size. */ |
155 thp->next_frame += thp->next_framesz; | |
156 thp->next_framesz = get_be32(pb); | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
157 |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
158 get_be32(pb); /* Previous total size. */ |
2004 | 159 size = get_be32(pb); /* Total size of this frame. */ |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
160 |
2004 | 161 /* Store the audiosize so the next time this function is called, |
162 the audio can be read. */ | |
163 if (thp->has_audio) | |
164 thp->audiosize = get_be32(pb); /* Audio size. */ | |
165 else | |
166 thp->frame++; | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
167 |
2004 | 168 ret = av_get_packet(pb, pkt, size); |
169 if (ret != size) { | |
170 av_free_packet(pkt); | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
171 return AVERROR(EIO); |
2004 | 172 } |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
173 |
2004 | 174 pkt->stream_index = thp->video_stream_index; |
175 } else { | |
1988 | 176 ret = av_get_packet(pb, pkt, thp->audiosize); |
177 if (ret != thp->audiosize) { | |
178 av_free_packet(pkt); | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2273
diff
changeset
|
179 return AVERROR(EIO); |
1988 | 180 } |
181 | |
182 pkt->stream_index = thp->audio_stream_index; | |
183 thp->audiosize = 0; | |
184 thp->frame++; | |
185 } | |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
186 |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
187 return 0; |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
188 } |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
189 |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
190 AVInputFormat thp_demuxer = { |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
191 "thp", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
2771
diff
changeset
|
192 NULL_IF_CONFIG_SMALL("THP"), |
1974
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
193 sizeof(ThpDemuxContext), |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
194 thp_probe, |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
195 thp_read_header, |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
196 thp_read_packet |
51c5fe603dba
support for the THP game format by Marco Gerards, mgerards xs4all nl
diego
parents:
diff
changeset
|
197 }; |