Mercurial > libavformat.hg
annotate img2.c @ 5953:c3ebc8d7af38 libavformat
Remove useless assert(), since this can (in theora) be used for any Xiph
codec, so there's no reason to (invalidly) limit it to only Theora.
Also fixes issue 1880 (compilation error on -DDEBUG).
author | rbultje |
---|---|
date | Thu, 15 Apr 2010 13:30:12 +0000 |
parents | 11bb10c37225 |
children | 6090375e2696 |
rev | line source |
---|---|
497 | 1 /* |
2 * Image format | |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4247
diff
changeset
|
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard |
497 | 4 * Copyright (c) 2004 Michael Niedermayer |
5 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1291
diff
changeset
|
6 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1291
diff
changeset
|
7 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1291
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
497 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1291
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
497 | 12 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1291
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
497 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1291
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
497 | 21 */ |
3286 | 22 |
4208
af07c3bd3bfa
include intreadwrite.h, fix compilation, img2.c use AV_RL32
bcoudurier
parents:
4206
diff
changeset
|
23 #include "libavutil/intreadwrite.h" |
3286 | 24 #include "libavutil/avstring.h" |
497 | 25 #include "avformat.h" |
3288 | 26 #include <strings.h> |
497 | 27 |
28 typedef struct { | |
29 int img_first; | |
30 int img_last; | |
31 int img_number; | |
32 int img_count; | |
33 int is_pipe; | |
34 char path[1024]; | |
35 } VideoData; | |
36 | |
37 typedef struct { | |
38 enum CodecID id; | |
39 const char *str; | |
40 } IdStrMap; | |
41 | |
42 static const IdStrMap img_tags[] = { | |
43 { CODEC_ID_MJPEG , "jpeg"}, | |
44 { CODEC_ID_MJPEG , "jpg"}, | |
5052 | 45 { CODEC_ID_LJPEG , "ljpg"}, |
581 | 46 { CODEC_ID_PNG , "png"}, |
3080 | 47 { CODEC_ID_PNG , "mng"}, |
583 | 48 { CODEC_ID_PPM , "ppm"}, |
4064 | 49 { CODEC_ID_PPM , "pnm"}, |
583 | 50 { CODEC_ID_PGM , "pgm"}, |
51 { CODEC_ID_PGMYUV , "pgmyuv"}, | |
52 { CODEC_ID_PBM , "pbm"}, | |
53 { CODEC_ID_PAM , "pam"}, | |
497 | 54 { CODEC_ID_MPEG1VIDEO, "mpg1-img"}, |
55 { CODEC_ID_MPEG2VIDEO, "mpg2-img"}, | |
56 { CODEC_ID_MPEG4 , "mpg4-img"}, | |
57 { CODEC_ID_FFV1 , "ffv1-img"}, | |
635 | 58 { CODEC_ID_RAWVIDEO , "y"}, |
875 | 59 { CODEC_ID_BMP , "bmp"}, |
1409 | 60 { CODEC_ID_GIF , "gif"}, |
1416 | 61 { CODEC_ID_TARGA , "tga"}, |
62 { CODEC_ID_TIFF , "tiff"}, | |
3404 | 63 { CODEC_ID_TIFF , "tif"}, |
1985 | 64 { CODEC_ID_SGI , "sgi"}, |
2074 | 65 { CODEC_ID_PTX , "ptx"}, |
2859 | 66 { CODEC_ID_PCX , "pcx"}, |
2867 | 67 { CODEC_ID_SUNRAST , "sun"}, |
68 { CODEC_ID_SUNRAST , "ras"}, | |
69 { CODEC_ID_SUNRAST , "rs"}, | |
70 { CODEC_ID_SUNRAST , "im1"}, | |
71 { CODEC_ID_SUNRAST , "im8"}, | |
72 { CODEC_ID_SUNRAST , "im24"}, | |
73 { CODEC_ID_SUNRAST , "sunras"}, | |
4119 | 74 { CODEC_ID_JPEG2000 , "jp2"}, |
5022 | 75 { CODEC_ID_DPX , "dpx"}, |
3289 | 76 { CODEC_ID_NONE , NULL} |
497 | 77 }; |
78 | |
3769 | 79 static const int sizes[][2] = { |
635 | 80 { 640, 480 }, |
81 { 720, 480 }, | |
82 { 720, 576 }, | |
83 { 352, 288 }, | |
84 { 352, 240 }, | |
85 { 160, 128 }, | |
86 { 512, 384 }, | |
87 { 640, 352 }, | |
88 { 640, 240 }, | |
89 }; | |
90 | |
91 static int infer_size(int *width_ptr, int *height_ptr, int size) | |
92 { | |
93 int i; | |
94 | |
4001 | 95 for(i=0;i<FF_ARRAY_ELEMS(sizes);i++) { |
635 | 96 if ((sizes[i][0] * sizes[i][1]) == size) { |
97 *width_ptr = sizes[i][0]; | |
98 *height_ptr = sizes[i][1]; | |
99 return 0; | |
100 } | |
101 } | |
102 return -1; | |
103 } | |
497 | 104 static enum CodecID av_str2id(const IdStrMap *tags, const char *str) |
105 { | |
530 | 106 str= strrchr(str, '.'); |
107 if(!str) return CODEC_ID_NONE; | |
108 str++; | |
497 | 109 |
110 while (tags->id) { | |
3288 | 111 if (!strcasecmp(str, tags->str)) |
112 return tags->id; | |
497 | 113 |
114 tags++; | |
115 } | |
116 return CODEC_ID_NONE; | |
117 } | |
118 | |
119 /* return -1 if no image found */ | |
885 | 120 static int find_image_range(int *pfirst_index, int *plast_index, |
497 | 121 const char *path) |
122 { | |
123 char buf[1024]; | |
124 int range, last_index, range1, first_index; | |
125 | |
126 /* find the first image */ | |
127 for(first_index = 0; first_index < 5; first_index++) { | |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1175
diff
changeset
|
128 if (av_get_frame_filename(buf, sizeof(buf), path, first_index) < 0){ |
885 | 129 *pfirst_index = |
498 | 130 *plast_index = 1; |
5325
feffcbc89904
Fixes detection and error reporting of non-existing files in img2.c.
benoit
parents:
5118
diff
changeset
|
131 if(url_exist(buf)) |
feffcbc89904
Fixes detection and error reporting of non-existing files in img2.c.
benoit
parents:
5118
diff
changeset
|
132 return 0; |
feffcbc89904
Fixes detection and error reporting of non-existing files in img2.c.
benoit
parents:
5118
diff
changeset
|
133 return -1; |
498 | 134 } |
497 | 135 if (url_exist(buf)) |
136 break; | |
137 } | |
138 if (first_index == 5) | |
139 goto fail; | |
885 | 140 |
497 | 141 /* find the last image */ |
142 last_index = first_index; | |
143 for(;;) { | |
144 range = 0; | |
145 for(;;) { | |
146 if (!range) | |
147 range1 = 1; | |
148 else | |
149 range1 = 2 * range; | |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1175
diff
changeset
|
150 if (av_get_frame_filename(buf, sizeof(buf), path, |
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1175
diff
changeset
|
151 last_index + range1) < 0) |
497 | 152 goto fail; |
153 if (!url_exist(buf)) | |
154 break; | |
155 range = range1; | |
156 /* just in case... */ | |
157 if (range >= (1 << 30)) | |
158 goto fail; | |
159 } | |
160 /* we are sure than image last_index + range exists */ | |
161 if (!range) | |
162 break; | |
163 last_index += range; | |
164 } | |
165 *pfirst_index = first_index; | |
166 *plast_index = last_index; | |
167 return 0; | |
168 fail: | |
169 return -1; | |
170 } | |
171 | |
172 | |
173 static int image_probe(AVProbeData *p) | |
174 { | |
1594
ffb64cb62cc9
Fix a crash when probing img2 format with a NULL filename.
aurel
parents:
1551
diff
changeset
|
175 if (p->filename && av_str2id(img_tags, p->filename)) { |
1551
ee4ef413497e
probe with some success image files not containing number pattern but having recognized image extension
bcoudurier
parents:
1416
diff
changeset
|
176 if (av_filename_number_test(p->filename)) |
ee4ef413497e
probe with some success image files not containing number pattern but having recognized image extension
bcoudurier
parents:
1416
diff
changeset
|
177 return AVPROBE_SCORE_MAX; |
ee4ef413497e
probe with some success image files not containing number pattern but having recognized image extension
bcoudurier
parents:
1416
diff
changeset
|
178 else |
ee4ef413497e
probe with some success image files not containing number pattern but having recognized image extension
bcoudurier
parents:
1416
diff
changeset
|
179 return AVPROBE_SCORE_MAX/2; |
ee4ef413497e
probe with some success image files not containing number pattern but having recognized image extension
bcoudurier
parents:
1416
diff
changeset
|
180 } |
ee4ef413497e
probe with some success image files not containing number pattern but having recognized image extension
bcoudurier
parents:
1416
diff
changeset
|
181 return 0; |
497 | 182 } |
183 | |
583 | 184 enum CodecID av_guess_image2_codec(const char *filename){ |
185 return av_str2id(img_tags, filename); | |
186 } | |
187 | |
497 | 188 static int img_read_header(AVFormatContext *s1, AVFormatParameters *ap) |
189 { | |
190 VideoData *s = s1->priv_data; | |
191 int first_index, last_index; | |
192 AVStream *st; | |
193 | |
194 s1->ctx_flags |= AVFMTCTX_NOHEADER; | |
195 | |
196 st = av_new_stream(s1, 0); | |
197 if (!st) { | |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1594
diff
changeset
|
198 return AVERROR(ENOMEM); |
497 | 199 } |
200 | |
2189 | 201 av_strlcpy(s->path, s1->filename, sizeof(s->path)); |
497 | 202 s->img_number = 0; |
203 s->img_count = 0; | |
885 | 204 |
497 | 205 /* find format */ |
206 if (s1->iformat->flags & AVFMT_NOFILE) | |
207 s->is_pipe = 0; | |
574 | 208 else{ |
497 | 209 s->is_pipe = 1; |
2023 | 210 st->need_parsing = AVSTREAM_PARSE_FULL; |
574 | 211 } |
885 | 212 |
1003 | 213 if (!ap->time_base.num) { |
743 | 214 av_set_pts_info(st, 60, 1, 25); |
497 | 215 } else { |
743 | 216 av_set_pts_info(st, 60, ap->time_base.num, ap->time_base.den); |
497 | 217 } |
885 | 218 |
1003 | 219 if(ap->width && ap->height){ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
220 st->codec->width = ap->width; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
221 st->codec->height= ap->height; |
635 | 222 } |
885 | 223 |
497 | 224 if (!s->is_pipe) { |
225 if (find_image_range(&first_index, &last_index, s->path) < 0) | |
5325
feffcbc89904
Fixes detection and error reporting of non-existing files in img2.c.
benoit
parents:
5118
diff
changeset
|
226 return AVERROR(ENOENT); |
497 | 227 s->img_first = first_index; |
228 s->img_last = last_index; | |
229 s->img_number = first_index; | |
230 /* compute duration */ | |
231 st->start_time = 0; | |
743 | 232 st->duration = last_index - first_index + 1; |
497 | 233 } |
885 | 234 |
5600
4266e4129b61
Avoid using deprecated AVFormatParameters::[audio|video]_codec_id field.
jai_menon
parents:
5406
diff
changeset
|
235 if(s1->video_codec_id){ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5867
diff
changeset
|
236 st->codec->codec_type = AVMEDIA_TYPE_VIDEO; |
5600
4266e4129b61
Avoid using deprecated AVFormatParameters::[audio|video]_codec_id field.
jai_menon
parents:
5406
diff
changeset
|
237 st->codec->codec_id = s1->video_codec_id; |
4266e4129b61
Avoid using deprecated AVFormatParameters::[audio|video]_codec_id field.
jai_menon
parents:
5406
diff
changeset
|
238 }else if(s1->audio_codec_id){ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5867
diff
changeset
|
239 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; |
5600
4266e4129b61
Avoid using deprecated AVFormatParameters::[audio|video]_codec_id field.
jai_menon
parents:
5406
diff
changeset
|
240 st->codec->codec_id = s1->audio_codec_id; |
583 | 241 }else{ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5867
diff
changeset
|
242 st->codec->codec_type = AVMEDIA_TYPE_VIDEO; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
243 st->codec->codec_id = av_str2id(img_tags, s->path); |
583 | 244 } |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5867
diff
changeset
|
245 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ap->pix_fmt != PIX_FMT_NONE) |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
246 st->codec->pix_fmt = ap->pix_fmt; |
497 | 247 |
248 return 0; | |
249 } | |
250 | |
251 static int img_read_packet(AVFormatContext *s1, AVPacket *pkt) | |
252 { | |
253 VideoData *s = s1->priv_data; | |
254 char filename[1024]; | |
635 | 255 int i; |
256 int size[3]={0}, ret[3]={0}; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
257 ByteIOContext *f[3]; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
258 AVCodecContext *codec= s1->streams[0]->codec; |
497 | 259 |
260 if (!s->is_pipe) { | |
261 /* loop over input */ | |
1175
8b53c0f3e7ad
add loop_input to AVFormatContext, getting rid of old hack
mru
parents:
1169
diff
changeset
|
262 if (s1->loop_input && s->img_number > s->img_last) { |
497 | 263 s->img_number = s->img_first; |
590 | 264 } |
5118 | 265 if (s->img_number > s->img_last) |
266 return AVERROR_EOF; | |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1175
diff
changeset
|
267 if (av_get_frame_filename(filename, sizeof(filename), |
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1175
diff
changeset
|
268 s->path, s->img_number)<0 && s->img_number > 1) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
269 return AVERROR(EIO); |
635 | 270 for(i=0; i<3; i++){ |
5049
d8613bee3863
Print meaningful error messages when url_fopen fails.
jai_menon
parents:
5022
diff
changeset
|
271 if (url_fopen(&f[i], filename, URL_RDONLY) < 0) { |
5867
b5d74258cd23
Dont senselessly fail on rawvideo that isnt 3 files per frame.
michael
parents:
5653
diff
changeset
|
272 if(i==1) |
b5d74258cd23
Dont senselessly fail on rawvideo that isnt 3 files per frame.
michael
parents:
5653
diff
changeset
|
273 break; |
5049
d8613bee3863
Print meaningful error messages when url_fopen fails.
jai_menon
parents:
5022
diff
changeset
|
274 av_log(s1, AV_LOG_ERROR, "Could not open file : %s\n",filename); |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
275 return AVERROR(EIO); |
5049
d8613bee3863
Print meaningful error messages when url_fopen fails.
jai_menon
parents:
5022
diff
changeset
|
276 } |
764
cdb845a57ae4
drop most url_fileno() calls (allows to use ByteIOContext directly in caller apps instead of URLProtocol)
aurel
parents:
743
diff
changeset
|
277 size[i]= url_fsize(f[i]); |
885 | 278 |
635 | 279 if(codec->codec_id != CODEC_ID_RAWVIDEO) |
280 break; | |
281 filename[ strlen(filename) - 1 ]= 'U' + i; | |
282 } | |
885 | 283 |
635 | 284 if(codec->codec_id == CODEC_ID_RAWVIDEO && !codec->width) |
285 infer_size(&codec->width, &codec->height, size[0]); | |
497 | 286 } else { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
287 f[0] = s1->pb; |
635 | 288 if (url_feof(f[0])) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
289 return AVERROR(EIO); |
635 | 290 size[0]= 4096; |
497 | 291 } |
292 | |
635 | 293 av_new_packet(pkt, size[0] + size[1] + size[2]); |
497 | 294 pkt->stream_index = 0; |
5913
11bb10c37225
Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents:
5910
diff
changeset
|
295 pkt->flags |= AV_PKT_FLAG_KEY; |
497 | 296 |
635 | 297 pkt->size= 0; |
298 for(i=0; i<3; i++){ | |
299 if(size[i]){ | |
300 ret[i]= get_buffer(f[i], pkt->data + pkt->size, size[i]); | |
301 if (!s->is_pipe) | |
302 url_fclose(f[i]); | |
303 if(ret[i]>0) | |
304 pkt->size += ret[i]; | |
305 } | |
497 | 306 } |
307 | |
635 | 308 if (ret[0] <= 0 || ret[1]<0 || ret[2]<0) { |
497 | 309 av_free_packet(pkt); |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
310 return AVERROR(EIO); /* signal EOF */ |
497 | 311 } else { |
312 s->img_count++; | |
313 s->img_number++; | |
314 return 0; | |
315 } | |
316 } | |
317 | |
4206 | 318 #if CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER |
497 | 319 /******************************************************/ |
320 /* image output */ | |
321 | |
322 static int img_write_header(AVFormatContext *s) | |
323 { | |
324 VideoData *img = s->priv_data; | |
325 | |
326 img->img_number = 1; | |
2189 | 327 av_strlcpy(img->path, s->filename, sizeof(img->path)); |
497 | 328 |
329 /* find format */ | |
330 if (s->oformat->flags & AVFMT_NOFILE) | |
331 img->is_pipe = 0; | |
332 else | |
333 img->is_pipe = 1; | |
885 | 334 |
497 | 335 return 0; |
336 } | |
337 | |
338 static int img_write_packet(AVFormatContext *s, AVPacket *pkt) | |
339 { | |
340 VideoData *img = s->priv_data; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
341 ByteIOContext *pb[3]; |
497 | 342 char filename[1024]; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
764
diff
changeset
|
343 AVCodecContext *codec= s->streams[ pkt->stream_index ]->codec; |
635 | 344 int i; |
497 | 345 |
346 if (!img->is_pipe) { | |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1175
diff
changeset
|
347 if (av_get_frame_filename(filename, sizeof(filename), |
5406
cef1f2baca9c
print error message when image2 muxer fail to compute frame filename
bcoudurier
parents:
5325
diff
changeset
|
348 img->path, img->img_number) < 0 && img->img_number>1) { |
cef1f2baca9c
print error message when image2 muxer fail to compute frame filename
bcoudurier
parents:
5325
diff
changeset
|
349 av_log(s, AV_LOG_ERROR, "Could not get frame filename from pattern\n"); |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
350 return AVERROR(EIO); |
5406
cef1f2baca9c
print error message when image2 muxer fail to compute frame filename
bcoudurier
parents:
5325
diff
changeset
|
351 } |
635 | 352 for(i=0; i<3; i++){ |
5049
d8613bee3863
Print meaningful error messages when url_fopen fails.
jai_menon
parents:
5022
diff
changeset
|
353 if (url_fopen(&pb[i], filename, URL_WRONLY) < 0) { |
d8613bee3863
Print meaningful error messages when url_fopen fails.
jai_menon
parents:
5022
diff
changeset
|
354 av_log(s, AV_LOG_ERROR, "Could not open file : %s\n",filename); |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
355 return AVERROR(EIO); |
5049
d8613bee3863
Print meaningful error messages when url_fopen fails.
jai_menon
parents:
5022
diff
changeset
|
356 } |
885 | 357 |
635 | 358 if(codec->codec_id != CODEC_ID_RAWVIDEO) |
359 break; | |
360 filename[ strlen(filename) - 1 ]= 'U' + i; | |
361 } | |
497 | 362 } else { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2274
diff
changeset
|
363 pb[0] = s->pb; |
497 | 364 } |
885 | 365 |
635 | 366 if(codec->codec_id == CODEC_ID_RAWVIDEO){ |
731 | 367 int ysize = codec->width * codec->height; |
368 put_buffer(pb[0], pkt->data , ysize); | |
369 put_buffer(pb[1], pkt->data + ysize, (pkt->size - ysize)/2); | |
370 put_buffer(pb[2], pkt->data + ysize +(pkt->size - ysize)/2, (pkt->size - ysize)/2); | |
635 | 371 put_flush_packet(pb[1]); |
372 put_flush_packet(pb[2]); | |
373 url_fclose(pb[1]); | |
374 url_fclose(pb[2]); | |
375 }else{ | |
4247 | 376 if(av_str2id(img_tags, s->filename) == CODEC_ID_JPEG2000){ |
377 AVStream *st = s->streams[0]; | |
378 if(st->codec->extradata_size > 8 && | |
379 AV_RL32(st->codec->extradata+4) == MKTAG('j','p','2','h')){ | |
380 if(pkt->size < 8 || AV_RL32(pkt->data+4) != MKTAG('j','p','2','c')) | |
381 goto error; | |
382 put_be32(pb[0], 12); | |
383 put_tag (pb[0], "jP "); | |
384 put_be32(pb[0], 0x0D0A870A); // signature | |
385 put_be32(pb[0], 20); | |
386 put_tag (pb[0], "ftyp"); | |
387 put_tag (pb[0], "jp2 "); | |
388 put_be32(pb[0], 0); | |
389 put_tag (pb[0], "jp2 "); | |
390 put_buffer(pb[0], st->codec->extradata, st->codec->extradata_size); | |
391 }else if(pkt->size < 8 || | |
392 (!st->codec->extradata_size && | |
393 AV_RL32(pkt->data+4) != MKTAG('j','P',' ',' '))){ // signature | |
394 error: | |
395 av_log(s, AV_LOG_ERROR, "malformated jpeg2000 codestream\n"); | |
396 return -1; | |
397 } | |
398 } | |
635 | 399 put_buffer(pb[0], pkt->data, pkt->size); |
400 } | |
401 put_flush_packet(pb[0]); | |
497 | 402 if (!img->is_pipe) { |
635 | 403 url_fclose(pb[0]); |
497 | 404 } |
405 | |
406 img->img_number++; | |
407 return 0; | |
408 } | |
409 | |
4206 | 410 #endif /* CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER */ |
903
68bc3ca12e79
Put muxer-specific code parts in #ifdef CONFIG_MUXERS.
diego
parents:
896
diff
changeset
|
411 |
497 | 412 /* input */ |
4206 | 413 #if CONFIG_IMAGE2_DEMUXER |
1169 | 414 AVInputFormat image2_demuxer = { |
497 | 415 "image2", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3404
diff
changeset
|
416 NULL_IF_CONFIG_SMALL("image2 sequence"), |
497 | 417 sizeof(VideoData), |
418 image_probe, | |
419 img_read_header, | |
420 img_read_packet, | |
3431 | 421 NULL, |
497 | 422 NULL, |
423 NULL, | |
498 | 424 AVFMT_NOFILE, |
497 | 425 }; |
1169 | 426 #endif |
4206 | 427 #if CONFIG_IMAGE2PIPE_DEMUXER |
1169 | 428 AVInputFormat image2pipe_demuxer = { |
497 | 429 "image2pipe", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3404
diff
changeset
|
430 NULL_IF_CONFIG_SMALL("piped image2 sequence"), |
497 | 431 sizeof(VideoData), |
432 NULL, /* no probe */ | |
433 img_read_header, | |
434 img_read_packet, | |
435 }; | |
1169 | 436 #endif |
497 | 437 |
438 /* output */ | |
4206 | 439 #if CONFIG_IMAGE2_MUXER |
1169 | 440 AVOutputFormat image2_muxer = { |
497 | 441 "image2", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3404
diff
changeset
|
442 NULL_IF_CONFIG_SMALL("image2 sequence"), |
497 | 443 "", |
4759
0c9699c40b66
PCX encoder that handles 1-, 8-, and 24-bpp pixfmts.
cehoyos
parents:
4251
diff
changeset
|
444 "bmp,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png,ppm,sgi,tif,tiff,jp2", |
497 | 445 sizeof(VideoData), |
446 CODEC_ID_NONE, | |
447 CODEC_ID_MJPEG, | |
448 img_write_header, | |
449 img_write_packet, | |
3140 | 450 NULL, |
5653
25eca7e2cf64
Add flag so muxers not needing width/height can signal this.
michael
parents:
5600
diff
changeset
|
451 .flags= AVFMT_NOTIMESTAMPS | AVFMT_NODIMENSIONS | AVFMT_NOFILE |
497 | 452 }; |
1169 | 453 #endif |
4206 | 454 #if CONFIG_IMAGE2PIPE_MUXER |
1169 | 455 AVOutputFormat image2pipe_muxer = { |
497 | 456 "image2pipe", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3404
diff
changeset
|
457 NULL_IF_CONFIG_SMALL("piped image2 sequence"), |
497 | 458 "", |
459 "", | |
460 sizeof(VideoData), | |
461 CODEC_ID_NONE, | |
462 CODEC_ID_MJPEG, | |
463 img_write_header, | |
464 img_write_packet, | |
5653
25eca7e2cf64
Add flag so muxers not needing width/height can signal this.
michael
parents:
5600
diff
changeset
|
465 .flags= AVFMT_NOTIMESTAMPS | AVFMT_NODIMENSIONS |
497 | 466 }; |
903
68bc3ca12e79
Put muxer-specific code parts in #ifdef CONFIG_MUXERS.
diego
parents:
896
diff
changeset
|
467 #endif |