3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4 * Copyright (c) 2004 Michael Niedermayer
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
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.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "libavutil/intreadwrite.h"
24 #include "libavutil/avstring.h"
42 static const IdStrMap img_tags
[] = {
43 { CODEC_ID_MJPEG
, "jpeg"},
44 { CODEC_ID_MJPEG
, "jpg"},
45 { CODEC_ID_LJPEG
, "ljpg"},
46 { CODEC_ID_PNG
, "png"},
47 { CODEC_ID_PNG
, "mng"},
48 { CODEC_ID_PPM
, "ppm"},
49 { CODEC_ID_PPM
, "pnm"},
50 { CODEC_ID_PGM
, "pgm"},
51 { CODEC_ID_PGMYUV
, "pgmyuv"},
52 { CODEC_ID_PBM
, "pbm"},
53 { CODEC_ID_PAM
, "pam"},
54 { CODEC_ID_MPEG1VIDEO
, "mpg1-img"},
55 { CODEC_ID_MPEG2VIDEO
, "mpg2-img"},
56 { CODEC_ID_MPEG4
, "mpg4-img"},
57 { CODEC_ID_FFV1
, "ffv1-img"},
58 { CODEC_ID_RAWVIDEO
, "y"},
59 { CODEC_ID_BMP
, "bmp"},
60 { CODEC_ID_GIF
, "gif"},
61 { CODEC_ID_TARGA
, "tga"},
62 { CODEC_ID_TIFF
, "tiff"},
63 { CODEC_ID_TIFF
, "tif"},
64 { CODEC_ID_SGI
, "sgi"},
65 { CODEC_ID_PTX
, "ptx"},
66 { CODEC_ID_PCX
, "pcx"},
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"},
74 { CODEC_ID_JPEG2000
, "jp2"},
75 { CODEC_ID_DPX
, "dpx"},
76 { CODEC_ID_NONE
, NULL
}
79 static const int sizes
[][2] = {
91 static int infer_size(int *width_ptr
, int *height_ptr
, int size
)
95 for(i
=0;i
<FF_ARRAY_ELEMS(sizes
);i
++) {
96 if ((sizes
[i
][0] * sizes
[i
][1]) == size
) {
97 *width_ptr
= sizes
[i
][0];
98 *height_ptr
= sizes
[i
][1];
104 static enum CodecID
av_str2id(const IdStrMap
*tags
, const char *str
)
106 str
= strrchr(str
, '.');
107 if(!str
) return CODEC_ID_NONE
;
111 if (!strcasecmp(str
, tags
->str
))
116 return CODEC_ID_NONE
;
119 /* return -1 if no image found */
120 static int find_image_range(int *pfirst_index
, int *plast_index
,
124 int range
, last_index
, range1
, first_index
;
126 /* find the first image */
127 for(first_index
= 0; first_index
< 5; first_index
++) {
128 if (av_get_frame_filename(buf
, sizeof(buf
), path
, first_index
) < 0){
136 if (first_index
== 5)
139 /* find the last image */
140 last_index
= first_index
;
148 if (av_get_frame_filename(buf
, sizeof(buf
), path
,
149 last_index
+ range1
) < 0)
154 /* just in case... */
155 if (range
>= (1 << 30))
158 /* we are sure than image last_index + range exists */
163 *pfirst_index
= first_index
;
164 *plast_index
= last_index
;
171 static int image_probe(AVProbeData
*p
)
173 if (p
->filename
&& av_str2id(img_tags
, p
->filename
)) {
174 if (av_filename_number_test(p
->filename
))
175 return AVPROBE_SCORE_MAX
;
177 return AVPROBE_SCORE_MAX
/2;
182 enum CodecID
av_guess_image2_codec(const char *filename
){
183 return av_str2id(img_tags
, filename
);
186 static int img_read_header(AVFormatContext
*s1
, AVFormatParameters
*ap
)
188 VideoData
*s
= s1
->priv_data
;
189 int first_index
, last_index
;
192 s1
->ctx_flags
|= AVFMTCTX_NOHEADER
;
194 st
= av_new_stream(s1
, 0);
196 return AVERROR(ENOMEM
);
199 av_strlcpy(s
->path
, s1
->filename
, sizeof(s
->path
));
204 if (s1
->iformat
->flags
& AVFMT_NOFILE
)
208 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
211 if (!ap
->time_base
.num
) {
212 av_set_pts_info(st
, 60, 1, 25);
214 av_set_pts_info(st
, 60, ap
->time_base
.num
, ap
->time_base
.den
);
217 if(ap
->width
&& ap
->height
){
218 st
->codec
->width
= ap
->width
;
219 st
->codec
->height
= ap
->height
;
223 if (find_image_range(&first_index
, &last_index
, s
->path
) < 0)
225 s
->img_first
= first_index
;
226 s
->img_last
= last_index
;
227 s
->img_number
= first_index
;
228 /* compute duration */
230 st
->duration
= last_index
- first_index
+ 1;
233 if(ap
->video_codec_id
){
234 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
235 st
->codec
->codec_id
= ap
->video_codec_id
;
236 }else if(ap
->audio_codec_id
){
237 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
238 st
->codec
->codec_id
= ap
->audio_codec_id
;
240 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
241 st
->codec
->codec_id
= av_str2id(img_tags
, s
->path
);
243 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
&& ap
->pix_fmt
!= PIX_FMT_NONE
)
244 st
->codec
->pix_fmt
= ap
->pix_fmt
;
249 static int img_read_packet(AVFormatContext
*s1
, AVPacket
*pkt
)
251 VideoData
*s
= s1
->priv_data
;
254 int size
[3]={0}, ret
[3]={0};
256 AVCodecContext
*codec
= s1
->streams
[0]->codec
;
259 /* loop over input */
260 if (s1
->loop_input
&& s
->img_number
> s
->img_last
) {
261 s
->img_number
= s
->img_first
;
263 if (s
->img_number
> s
->img_last
)
265 if (av_get_frame_filename(filename
, sizeof(filename
),
266 s
->path
, s
->img_number
)<0 && s
->img_number
> 1)
269 if (url_fopen(&f
[i
], filename
, URL_RDONLY
) < 0) {
270 av_log(s1
, AV_LOG_ERROR
, "Could not open file : %s\n",filename
);
273 size
[i
]= url_fsize(f
[i
]);
275 if(codec
->codec_id
!= CODEC_ID_RAWVIDEO
)
277 filename
[ strlen(filename
) - 1 ]= 'U' + i
;
280 if(codec
->codec_id
== CODEC_ID_RAWVIDEO
&& !codec
->width
)
281 infer_size(&codec
->width
, &codec
->height
, size
[0]);
289 av_new_packet(pkt
, size
[0] + size
[1] + size
[2]);
290 pkt
->stream_index
= 0;
291 pkt
->flags
|= PKT_FLAG_KEY
;
296 ret
[i
]= get_buffer(f
[i
], pkt
->data
+ pkt
->size
, size
[i
]);
304 if (ret
[0] <= 0 || ret
[1]<0 || ret
[2]<0) {
306 return AVERROR(EIO
); /* signal EOF */
314 #if CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER
315 /******************************************************/
318 static int img_write_header(AVFormatContext
*s
)
320 VideoData
*img
= s
->priv_data
;
323 av_strlcpy(img
->path
, s
->filename
, sizeof(img
->path
));
326 if (s
->oformat
->flags
& AVFMT_NOFILE
)
334 static int img_write_packet(AVFormatContext
*s
, AVPacket
*pkt
)
336 VideoData
*img
= s
->priv_data
;
337 ByteIOContext
*pb
[3];
339 AVCodecContext
*codec
= s
->streams
[ pkt
->stream_index
]->codec
;
343 if (av_get_frame_filename(filename
, sizeof(filename
),
344 img
->path
, img
->img_number
) < 0 && img
->img_number
>1)
347 if (url_fopen(&pb
[i
], filename
, URL_WRONLY
) < 0) {
348 av_log(s
, AV_LOG_ERROR
, "Could not open file : %s\n",filename
);
352 if(codec
->codec_id
!= CODEC_ID_RAWVIDEO
)
354 filename
[ strlen(filename
) - 1 ]= 'U' + i
;
360 if(codec
->codec_id
== CODEC_ID_RAWVIDEO
){
361 int ysize
= codec
->width
* codec
->height
;
362 put_buffer(pb
[0], pkt
->data
, ysize
);
363 put_buffer(pb
[1], pkt
->data
+ ysize
, (pkt
->size
- ysize
)/2);
364 put_buffer(pb
[2], pkt
->data
+ ysize
+(pkt
->size
- ysize
)/2, (pkt
->size
- ysize
)/2);
365 put_flush_packet(pb
[1]);
366 put_flush_packet(pb
[2]);
370 if(av_str2id(img_tags
, s
->filename
) == CODEC_ID_JPEG2000
){
371 AVStream
*st
= s
->streams
[0];
372 if(st
->codec
->extradata_size
> 8 &&
373 AV_RL32(st
->codec
->extradata
+4) == MKTAG('j','p','2','h')){
374 if(pkt
->size
< 8 || AV_RL32(pkt
->data
+4) != MKTAG('j','p','2','c'))
377 put_tag (pb
[0], "jP ");
378 put_be32(pb
[0], 0x0D0A870A); // signature
380 put_tag (pb
[0], "ftyp");
381 put_tag (pb
[0], "jp2 ");
383 put_tag (pb
[0], "jp2 ");
384 put_buffer(pb
[0], st
->codec
->extradata
, st
->codec
->extradata_size
);
385 }else if(pkt
->size
< 8 ||
386 (!st
->codec
->extradata_size
&&
387 AV_RL32(pkt
->data
+4) != MKTAG('j','P',' ',' '))){ // signature
389 av_log(s
, AV_LOG_ERROR
, "malformated jpeg2000 codestream\n");
393 put_buffer(pb
[0], pkt
->data
, pkt
->size
);
395 put_flush_packet(pb
[0]);
404 #endif /* CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER */
407 #if CONFIG_IMAGE2_DEMUXER
408 AVInputFormat image2_demuxer
= {
410 NULL_IF_CONFIG_SMALL("image2 sequence"),
421 #if CONFIG_IMAGE2PIPE_DEMUXER
422 AVInputFormat image2pipe_demuxer
= {
424 NULL_IF_CONFIG_SMALL("piped image2 sequence"),
433 #if CONFIG_IMAGE2_MUXER
434 AVOutputFormat image2_muxer
= {
436 NULL_IF_CONFIG_SMALL("image2 sequence"),
438 "bmp,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png,ppm,sgi,tif,tiff,jp2",
445 .flags
= AVFMT_NOTIMESTAMPS
| AVFMT_NOFILE
448 #if CONFIG_IMAGE2PIPE_MUXER
449 AVOutputFormat image2pipe_muxer
= {
451 NULL_IF_CONFIG_SMALL("piped image2 sequence"),
459 .flags
= AVFMT_NOTIMESTAMPS