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/avstring.h"
41 static const IdStrMap img_tags
[] = {
42 { CODEC_ID_MJPEG
, "jpeg"},
43 { CODEC_ID_MJPEG
, "jpg"},
44 { CODEC_ID_LJPEG
, "ljpg"},
45 { CODEC_ID_PNG
, "png"},
46 { CODEC_ID_PNG
, "mng"},
47 { CODEC_ID_PPM
, "ppm"},
48 { CODEC_ID_PGM
, "pgm"},
49 { CODEC_ID_PGMYUV
, "pgmyuv"},
50 { CODEC_ID_PBM
, "pbm"},
51 { CODEC_ID_PAM
, "pam"},
52 { CODEC_ID_MPEG1VIDEO
, "mpg1-img"},
53 { CODEC_ID_MPEG2VIDEO
, "mpg2-img"},
54 { CODEC_ID_MPEG4
, "mpg4-img"},
55 { CODEC_ID_FFV1
, "ffv1-img"},
56 { CODEC_ID_RAWVIDEO
, "y"},
57 { CODEC_ID_BMP
, "bmp"},
58 { CODEC_ID_GIF
, "gif"},
59 { CODEC_ID_TARGA
, "tga"},
60 { CODEC_ID_TIFF
, "tiff"},
61 { CODEC_ID_TIFF
, "tif"},
62 { CODEC_ID_SGI
, "sgi"},
63 { CODEC_ID_PTX
, "ptx"},
64 { CODEC_ID_PCX
, "pcx"},
65 { CODEC_ID_SUNRAST
, "sun"},
66 { CODEC_ID_SUNRAST
, "ras"},
67 { CODEC_ID_SUNRAST
, "rs"},
68 { CODEC_ID_SUNRAST
, "im1"},
69 { CODEC_ID_SUNRAST
, "im8"},
70 { CODEC_ID_SUNRAST
, "im24"},
71 { CODEC_ID_SUNRAST
, "sunras"},
72 { CODEC_ID_NONE
, NULL
}
75 static const int sizes
[][2] = {
87 static int infer_size(int *width_ptr
, int *height_ptr
, int size
)
91 for(i
=0;i
<FF_ARRAY_ELEMS(sizes
);i
++) {
92 if ((sizes
[i
][0] * sizes
[i
][1]) == size
) {
93 *width_ptr
= sizes
[i
][0];
94 *height_ptr
= sizes
[i
][1];
100 static enum CodecID
av_str2id(const IdStrMap
*tags
, const char *str
)
102 str
= strrchr(str
, '.');
103 if(!str
) return CODEC_ID_NONE
;
107 if (!strcasecmp(str
, tags
->str
))
112 return CODEC_ID_NONE
;
115 /* return -1 if no image found */
116 static int find_image_range(int *pfirst_index
, int *plast_index
,
120 int range
, last_index
, range1
, first_index
;
122 /* find the first image */
123 for(first_index
= 0; first_index
< 5; first_index
++) {
124 if (av_get_frame_filename(buf
, sizeof(buf
), path
, first_index
) < 0){
132 if (first_index
== 5)
135 /* find the last image */
136 last_index
= first_index
;
144 if (av_get_frame_filename(buf
, sizeof(buf
), path
,
145 last_index
+ range1
) < 0)
150 /* just in case... */
151 if (range
>= (1 << 30))
154 /* we are sure than image last_index + range exists */
159 *pfirst_index
= first_index
;
160 *plast_index
= last_index
;
167 static int image_probe(AVProbeData
*p
)
169 if (p
->filename
&& av_str2id(img_tags
, p
->filename
)) {
170 if (av_filename_number_test(p
->filename
))
171 return AVPROBE_SCORE_MAX
;
173 return AVPROBE_SCORE_MAX
/2;
178 enum CodecID
av_guess_image2_codec(const char *filename
){
179 return av_str2id(img_tags
, filename
);
182 static int img_read_header(AVFormatContext
*s1
, AVFormatParameters
*ap
)
184 VideoData
*s
= s1
->priv_data
;
185 int first_index
, last_index
;
188 s1
->ctx_flags
|= AVFMTCTX_NOHEADER
;
190 st
= av_new_stream(s1
, 0);
192 return AVERROR(ENOMEM
);
195 av_strlcpy(s
->path
, s1
->filename
, sizeof(s
->path
));
200 if (s1
->iformat
->flags
& AVFMT_NOFILE
)
204 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
207 if (!ap
->time_base
.num
) {
208 av_set_pts_info(st
, 60, 1, 25);
210 av_set_pts_info(st
, 60, ap
->time_base
.num
, ap
->time_base
.den
);
213 if(ap
->width
&& ap
->height
){
214 st
->codec
->width
= ap
->width
;
215 st
->codec
->height
= ap
->height
;
219 if (find_image_range(&first_index
, &last_index
, s
->path
) < 0)
221 s
->img_first
= first_index
;
222 s
->img_last
= last_index
;
223 s
->img_number
= first_index
;
224 /* compute duration */
226 st
->duration
= last_index
- first_index
+ 1;
229 if(ap
->video_codec_id
){
230 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
231 st
->codec
->codec_id
= ap
->video_codec_id
;
232 }else if(ap
->audio_codec_id
){
233 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
234 st
->codec
->codec_id
= ap
->audio_codec_id
;
236 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
237 st
->codec
->codec_id
= av_str2id(img_tags
, s
->path
);
239 if(st
->codec
->codec_type
== CODEC_TYPE_VIDEO
&& ap
->pix_fmt
!= PIX_FMT_NONE
)
240 st
->codec
->pix_fmt
= ap
->pix_fmt
;
245 static int img_read_packet(AVFormatContext
*s1
, AVPacket
*pkt
)
247 VideoData
*s
= s1
->priv_data
;
250 int size
[3]={0}, ret
[3]={0};
252 AVCodecContext
*codec
= s1
->streams
[0]->codec
;
255 /* loop over input */
256 if (s1
->loop_input
&& s
->img_number
> s
->img_last
) {
257 s
->img_number
= s
->img_first
;
259 if (av_get_frame_filename(filename
, sizeof(filename
),
260 s
->path
, s
->img_number
)<0 && s
->img_number
> 1)
263 if (url_fopen(&f
[i
], filename
, URL_RDONLY
) < 0)
265 size
[i
]= url_fsize(f
[i
]);
267 if(codec
->codec_id
!= CODEC_ID_RAWVIDEO
)
269 filename
[ strlen(filename
) - 1 ]= 'U' + i
;
272 if(codec
->codec_id
== CODEC_ID_RAWVIDEO
&& !codec
->width
)
273 infer_size(&codec
->width
, &codec
->height
, size
[0]);
281 av_new_packet(pkt
, size
[0] + size
[1] + size
[2]);
282 pkt
->stream_index
= 0;
283 pkt
->flags
|= PKT_FLAG_KEY
;
288 ret
[i
]= get_buffer(f
[i
], pkt
->data
+ pkt
->size
, size
[i
]);
296 if (ret
[0] <= 0 || ret
[1]<0 || ret
[2]<0) {
298 return AVERROR(EIO
); /* signal EOF */
306 #if defined(CONFIG_IMAGE2_MUXER) || defined(CONFIG_IMAGE2PIPE_MUXER)
307 /******************************************************/
310 static int img_write_header(AVFormatContext
*s
)
312 VideoData
*img
= s
->priv_data
;
315 av_strlcpy(img
->path
, s
->filename
, sizeof(img
->path
));
318 if (s
->oformat
->flags
& AVFMT_NOFILE
)
326 static int img_write_packet(AVFormatContext
*s
, AVPacket
*pkt
)
328 VideoData
*img
= s
->priv_data
;
329 ByteIOContext
*pb
[3];
331 AVCodecContext
*codec
= s
->streams
[ pkt
->stream_index
]->codec
;
335 if (av_get_frame_filename(filename
, sizeof(filename
),
336 img
->path
, img
->img_number
) < 0 && img
->img_number
>1)
339 if (url_fopen(&pb
[i
], filename
, URL_WRONLY
) < 0)
342 if(codec
->codec_id
!= CODEC_ID_RAWVIDEO
)
344 filename
[ strlen(filename
) - 1 ]= 'U' + i
;
350 if(codec
->codec_id
== CODEC_ID_RAWVIDEO
){
351 int ysize
= codec
->width
* codec
->height
;
352 put_buffer(pb
[0], pkt
->data
, ysize
);
353 put_buffer(pb
[1], pkt
->data
+ ysize
, (pkt
->size
- ysize
)/2);
354 put_buffer(pb
[2], pkt
->data
+ ysize
+(pkt
->size
- ysize
)/2, (pkt
->size
- ysize
)/2);
355 put_flush_packet(pb
[1]);
356 put_flush_packet(pb
[2]);
360 put_buffer(pb
[0], pkt
->data
, pkt
->size
);
362 put_flush_packet(pb
[0]);
371 #endif /* defined(CONFIG_IMAGE2_MUXER) || defined(CONFIG_IMAGE2PIPE_MUXER) */
374 #ifdef CONFIG_IMAGE2_DEMUXER
375 AVInputFormat image2_demuxer
= {
377 NULL_IF_CONFIG_SMALL("image2 sequence"),
388 #ifdef CONFIG_IMAGE2PIPE_DEMUXER
389 AVInputFormat image2pipe_demuxer
= {
391 NULL_IF_CONFIG_SMALL("piped image2 sequence"),
400 #ifdef CONFIG_IMAGE2_MUXER
401 AVOutputFormat image2_muxer
= {
403 NULL_IF_CONFIG_SMALL("image2 sequence"),
405 "bmp,jpeg,jpg,ljpg,pam,pbm,pgm,pgmyuv,png,ppm,sgi,tif,tiff",
412 .flags
= AVFMT_NOTIMESTAMPS
| AVFMT_NOFILE
415 #ifdef CONFIG_IMAGE2PIPE_MUXER
416 AVOutputFormat image2pipe_muxer
= {
418 NULL_IF_CONFIG_SMALL("piped image2 sequence"),
426 .flags
= AVFMT_NOTIMESTAMPS