build: remove empty $(OBJS) target
[ffmpeg.git] / libavformat / img2.c
1 /*
2  * Image format
3  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4  * Copyright (c) 2004 Michael Niedermayer
5  *
6  * This file is part of Libav.
7  *
8  * Libav 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.
12  *
13  * Libav 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.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with Libav; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 #include "libavutil/intreadwrite.h"
24 #include "libavutil/avstring.h"
25 #include "libavutil/log.h"
26 #include "libavutil/opt.h"
27 #include "libavutil/pixdesc.h"
28 #include "libavutil/parseutils.h"
29 #include "avformat.h"
30 #include "avio_internal.h"
31 #include "internal.h"
32 #include <strings.h>
33
34 typedef struct {
35     const AVClass *class;  /**< Class for private options. */
36     int img_first;
37     int img_last;
38     int img_number;
39     int img_count;
40     int is_pipe;
41     char path[1024];
42     char *pixel_format;     /**< Set by a private option. */
43     char *video_size;       /**< Set by a private option. */
44     char *framerate;        /**< Set by a private option. */
45 } VideoData;
46
47 typedef struct {
48     enum CodecID id;
49     const char *str;
50 } IdStrMap;
51
52 static const IdStrMap img_tags[] = {
53     { CODEC_ID_MJPEG     , "jpeg"},
54     { CODEC_ID_MJPEG     , "jpg"},
55     { CODEC_ID_LJPEG     , "ljpg"},
56     { CODEC_ID_PNG       , "png"},
57     { CODEC_ID_PNG       , "mng"},
58     { CODEC_ID_PPM       , "ppm"},
59     { CODEC_ID_PPM       , "pnm"},
60     { CODEC_ID_PGM       , "pgm"},
61     { CODEC_ID_PGMYUV    , "pgmyuv"},
62     { CODEC_ID_PBM       , "pbm"},
63     { CODEC_ID_PAM       , "pam"},
64     { CODEC_ID_MPEG1VIDEO, "mpg1-img"},
65     { CODEC_ID_MPEG2VIDEO, "mpg2-img"},
66     { CODEC_ID_MPEG4     , "mpg4-img"},
67     { CODEC_ID_FFV1      , "ffv1-img"},
68     { CODEC_ID_RAWVIDEO  , "y"},
69     { CODEC_ID_BMP       , "bmp"},
70     { CODEC_ID_GIF       , "gif"},
71     { CODEC_ID_TARGA     , "tga"},
72     { CODEC_ID_TIFF      , "tiff"},
73     { CODEC_ID_TIFF      , "tif"},
74     { CODEC_ID_SGI       , "sgi"},
75     { CODEC_ID_PTX       , "ptx"},
76     { CODEC_ID_PCX       , "pcx"},
77     { CODEC_ID_SUNRAST   , "sun"},
78     { CODEC_ID_SUNRAST   , "ras"},
79     { CODEC_ID_SUNRAST   , "rs"},
80     { CODEC_ID_SUNRAST   , "im1"},
81     { CODEC_ID_SUNRAST   , "im8"},
82     { CODEC_ID_SUNRAST   , "im24"},
83     { CODEC_ID_SUNRAST   , "sunras"},
84     { CODEC_ID_JPEG2000  , "jp2"},
85     { CODEC_ID_DPX       , "dpx"},
86     { CODEC_ID_PICTOR    , "pic"},
87     { CODEC_ID_NONE      , NULL}
88 };
89
90 static const int sizes[][2] = {
91     { 640, 480 },
92     { 720, 480 },
93     { 720, 576 },
94     { 352, 288 },
95     { 352, 240 },
96     { 160, 128 },
97     { 512, 384 },
98     { 640, 352 },
99     { 640, 240 },
100 };
101
102 static int infer_size(int *width_ptr, int *height_ptr, int size)
103 {
104     int i;
105
106     for(i=0;i<FF_ARRAY_ELEMS(sizes);i++) {
107         if ((sizes[i][0] * sizes[i][1]) == size) {
108             *width_ptr = sizes[i][0];
109             *height_ptr = sizes[i][1];
110             return 0;
111         }
112     }
113     return -1;
114 }
115 static enum CodecID av_str2id(const IdStrMap *tags, const char *str)
116 {
117     str= strrchr(str, '.');
118     if(!str) return CODEC_ID_NONE;
119     str++;
120
121     while (tags->id) {
122         if (!strcasecmp(str, tags->str))
123             return tags->id;
124
125         tags++;
126     }
127     return CODEC_ID_NONE;
128 }
129
130 /* return -1 if no image found */
131 static int find_image_range(int *pfirst_index, int *plast_index,
132                             const char *path)
133 {
134     char buf[1024];
135     int range, last_index, range1, first_index;
136
137     /* find the first image */
138     for(first_index = 0; first_index < 5; first_index++) {
139         if (av_get_frame_filename(buf, sizeof(buf), path, first_index) < 0){
140             *pfirst_index =
141             *plast_index = 1;
142             if (avio_check(buf, AVIO_FLAG_READ) > 0)
143                 return 0;
144             return -1;
145         }
146         if (avio_check(buf, AVIO_FLAG_READ) > 0)
147             break;
148     }
149     if (first_index == 5)
150         goto fail;
151
152     /* find the last image */
153     last_index = first_index;
154     for(;;) {
155         range = 0;
156         for(;;) {
157             if (!range)
158                 range1 = 1;
159             else
160                 range1 = 2 * range;
161             if (av_get_frame_filename(buf, sizeof(buf), path,
162                                       last_index + range1) < 0)
163                 goto fail;
164             if (avio_check(buf, AVIO_FLAG_READ) <= 0)
165                 break;
166             range = range1;
167             /* just in case... */
168             if (range >= (1 << 30))
169                 goto fail;
170         }
171         /* we are sure than image last_index + range exists */
172         if (!range)
173             break;
174         last_index += range;
175     }
176     *pfirst_index = first_index;
177     *plast_index = last_index;
178     return 0;
179  fail:
180     return -1;
181 }
182
183
184 static int read_probe(AVProbeData *p)
185 {
186     if (p->filename && av_str2id(img_tags, p->filename)) {
187         if (av_filename_number_test(p->filename))
188             return AVPROBE_SCORE_MAX;
189         else
190             return AVPROBE_SCORE_MAX/2;
191     }
192     return 0;
193 }
194
195 enum CodecID ff_guess_image2_codec(const char *filename)
196 {
197     return av_str2id(img_tags, filename);
198 }
199
200 #if FF_API_GUESS_IMG2_CODEC
201 enum CodecID av_guess_image2_codec(const char *filename){
202     return av_str2id(img_tags, filename);
203 }
204 #endif
205
206 static int read_header(AVFormatContext *s1, AVFormatParameters *ap)
207 {
208     VideoData *s = s1->priv_data;
209     int first_index, last_index, ret = 0;
210     int width = 0, height = 0;
211     AVStream *st;
212     enum PixelFormat pix_fmt = PIX_FMT_NONE;
213     AVRational framerate;
214
215     s1->ctx_flags |= AVFMTCTX_NOHEADER;
216
217     st = av_new_stream(s1, 0);
218     if (!st) {
219         return AVERROR(ENOMEM);
220     }
221
222     if (s->pixel_format && (pix_fmt = av_get_pix_fmt(s->pixel_format)) == PIX_FMT_NONE) {
223         av_log(s1, AV_LOG_ERROR, "No such pixel format: %s.\n", s->pixel_format);
224         return AVERROR(EINVAL);
225     }
226     if (s->video_size && (ret = av_parse_video_size(&width, &height, s->video_size)) < 0) {
227         av_log(s, AV_LOG_ERROR, "Could not parse video size: %s.\n", s->video_size);
228         return ret;
229     }
230     if ((ret = av_parse_video_rate(&framerate, s->framerate)) < 0) {
231         av_log(s, AV_LOG_ERROR, "Could not parse framerate: %s.\n", s->framerate);
232         return ret;
233     }
234 #if FF_API_FORMAT_PARAMETERS
235     if (ap->pix_fmt != PIX_FMT_NONE)
236         pix_fmt = ap->pix_fmt;
237     if (ap->width > 0)
238         width = ap->width;
239     if (ap->height > 0)
240         height = ap->height;
241     if (ap->time_base.num)
242         framerate = (AVRational){ap->time_base.den, ap->time_base.num};
243 #endif
244
245     av_strlcpy(s->path, s1->filename, sizeof(s->path));
246     s->img_number = 0;
247     s->img_count = 0;
248
249     /* find format */
250     if (s1->iformat->flags & AVFMT_NOFILE)
251         s->is_pipe = 0;
252     else{
253         s->is_pipe = 1;
254         st->need_parsing = AVSTREAM_PARSE_FULL;
255     }
256
257     av_set_pts_info(st, 60, framerate.den, framerate.num);
258
259     if (width && height) {
260         st->codec->width  = width;
261         st->codec->height = height;
262     }
263
264     if (!s->is_pipe) {
265         if (find_image_range(&first_index, &last_index, s->path) < 0)
266             return AVERROR(ENOENT);
267         s->img_first = first_index;
268         s->img_last = last_index;
269         s->img_number = first_index;
270         /* compute duration */
271         st->start_time = 0;
272         st->duration = last_index - first_index + 1;
273     }
274
275     if(s1->video_codec_id){
276         st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
277         st->codec->codec_id = s1->video_codec_id;
278     }else if(s1->audio_codec_id){
279         st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
280         st->codec->codec_id = s1->audio_codec_id;
281     }else{
282         st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
283         st->codec->codec_id = av_str2id(img_tags, s->path);
284     }
285     if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO && pix_fmt != PIX_FMT_NONE)
286         st->codec->pix_fmt = pix_fmt;
287
288     return 0;
289 }
290
291 static int read_packet(AVFormatContext *s1, AVPacket *pkt)
292 {
293     VideoData *s = s1->priv_data;
294     char filename[1024];
295     int i;
296     int size[3]={0}, ret[3]={0};
297     AVIOContext *f[3];
298     AVCodecContext *codec= s1->streams[0]->codec;
299
300     if (!s->is_pipe) {
301         /* loop over input */
302         if (s1->loop_input && s->img_number > s->img_last) {
303             s->img_number = s->img_first;
304         }
305         if (s->img_number > s->img_last)
306             return AVERROR_EOF;
307         if (av_get_frame_filename(filename, sizeof(filename),
308                                   s->path, s->img_number)<0 && s->img_number > 1)
309             return AVERROR(EIO);
310         for(i=0; i<3; i++){
311             if (avio_open(&f[i], filename, AVIO_FLAG_READ) < 0) {
312                 if(i==1)
313                     break;
314                 av_log(s1, AV_LOG_ERROR, "Could not open file : %s\n",filename);
315                 return AVERROR(EIO);
316             }
317             size[i]= avio_size(f[i]);
318
319             if(codec->codec_id != CODEC_ID_RAWVIDEO)
320                 break;
321             filename[ strlen(filename) - 1 ]= 'U' + i;
322         }
323
324         if(codec->codec_id == CODEC_ID_RAWVIDEO && !codec->width)
325             infer_size(&codec->width, &codec->height, size[0]);
326     } else {
327         f[0] = s1->pb;
328         if (f[0]->eof_reached)
329             return AVERROR(EIO);
330         size[0]= 4096;
331     }
332
333     av_new_packet(pkt, size[0] + size[1] + size[2]);
334     pkt->stream_index = 0;
335     pkt->flags |= AV_PKT_FLAG_KEY;
336
337     pkt->size= 0;
338     for(i=0; i<3; i++){
339         if(size[i]){
340             ret[i]= avio_read(f[i], pkt->data + pkt->size, size[i]);
341             if (!s->is_pipe)
342                 avio_close(f[i]);
343             if(ret[i]>0)
344                 pkt->size += ret[i];
345         }
346     }
347
348     if (ret[0] <= 0 || ret[1]<0 || ret[2]<0) {
349         av_free_packet(pkt);
350         return AVERROR(EIO); /* signal EOF */
351     } else {
352         s->img_count++;
353         s->img_number++;
354         return 0;
355     }
356 }
357
358 #if CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER
359 /******************************************************/
360 /* image output */
361
362 static int write_header(AVFormatContext *s)
363 {
364     VideoData *img = s->priv_data;
365
366     img->img_number = 1;
367     av_strlcpy(img->path, s->filename, sizeof(img->path));
368
369     /* find format */
370     if (s->oformat->flags & AVFMT_NOFILE)
371         img->is_pipe = 0;
372     else
373         img->is_pipe = 1;
374
375     return 0;
376 }
377
378 static int write_packet(AVFormatContext *s, AVPacket *pkt)
379 {
380     VideoData *img = s->priv_data;
381     AVIOContext *pb[3];
382     char filename[1024];
383     AVCodecContext *codec= s->streams[ pkt->stream_index ]->codec;
384     int i;
385
386     if (!img->is_pipe) {
387         if (av_get_frame_filename(filename, sizeof(filename),
388                                   img->path, img->img_number) < 0 && img->img_number>1) {
389             av_log(s, AV_LOG_ERROR,
390                    "Could not get frame filename number %d from pattern '%s'\n",
391                    img->img_number, img->path);
392             return AVERROR(EIO);
393         }
394         for(i=0; i<3; i++){
395             if (avio_open(&pb[i], filename, AVIO_FLAG_WRITE) < 0) {
396                 av_log(s, AV_LOG_ERROR, "Could not open file : %s\n",filename);
397                 return AVERROR(EIO);
398             }
399
400             if(codec->codec_id != CODEC_ID_RAWVIDEO)
401                 break;
402             filename[ strlen(filename) - 1 ]= 'U' + i;
403         }
404     } else {
405         pb[0] = s->pb;
406     }
407
408     if(codec->codec_id == CODEC_ID_RAWVIDEO){
409         int ysize = codec->width * codec->height;
410         avio_write(pb[0], pkt->data        , ysize);
411         avio_write(pb[1], pkt->data + ysize, (pkt->size - ysize)/2);
412         avio_write(pb[2], pkt->data + ysize +(pkt->size - ysize)/2, (pkt->size - ysize)/2);
413         avio_flush(pb[1]);
414         avio_flush(pb[2]);
415         avio_close(pb[1]);
416         avio_close(pb[2]);
417     }else{
418         if(av_str2id(img_tags, s->filename) == CODEC_ID_JPEG2000){
419             AVStream *st = s->streams[0];
420             if(st->codec->extradata_size > 8 &&
421                AV_RL32(st->codec->extradata+4) == MKTAG('j','p','2','h')){
422                 if(pkt->size < 8 || AV_RL32(pkt->data+4) != MKTAG('j','p','2','c'))
423                     goto error;
424                 avio_wb32(pb[0], 12);
425                 ffio_wfourcc(pb[0], "jP  ");
426                 avio_wb32(pb[0], 0x0D0A870A); // signature
427                 avio_wb32(pb[0], 20);
428                 ffio_wfourcc(pb[0], "ftyp");
429                 ffio_wfourcc(pb[0], "jp2 ");
430                 avio_wb32(pb[0], 0);
431                 ffio_wfourcc(pb[0], "jp2 ");
432                 avio_write(pb[0], st->codec->extradata, st->codec->extradata_size);
433             }else if(pkt->size < 8 ||
434                      (!st->codec->extradata_size &&
435                       AV_RL32(pkt->data+4) != MKTAG('j','P',' ',' '))){ // signature
436             error:
437                 av_log(s, AV_LOG_ERROR, "malformated jpeg2000 codestream\n");
438                 return -1;
439             }
440         }
441         avio_write(pb[0], pkt->data, pkt->size);
442     }
443     avio_flush(pb[0]);
444     if (!img->is_pipe) {
445         avio_close(pb[0]);
446     }
447
448     img->img_number++;
449     return 0;
450 }
451
452 #endif /* CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER */
453
454 #define OFFSET(x) offsetof(VideoData, x)
455 #define DEC AV_OPT_FLAG_DECODING_PARAM
456 static const AVOption options[] = {
457     { "pixel_format", "", OFFSET(pixel_format), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
458     { "video_size",   "", OFFSET(video_size),   FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
459     { "framerate",    "", OFFSET(framerate),    FF_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC },
460     { NULL },
461 };
462
463 static const AVClass img2_class = {
464     .class_name = "image2 demuxer",
465     .item_name  = av_default_item_name,
466     .option     = options,
467     .version    = LIBAVUTIL_VERSION_INT,
468 };
469
470 /* input */
471 #if CONFIG_IMAGE2_DEMUXER
472 AVInputFormat ff_image2_demuxer = {
473     .name           = "image2",
474     .long_name      = NULL_IF_CONFIG_SMALL("image2 sequence"),
475     .priv_data_size = sizeof(VideoData),
476     .read_probe     = read_probe,
477     .read_header    = read_header,
478     .read_packet    = read_packet,
479     .flags          = AVFMT_NOFILE,
480     .priv_class     = &img2_class,
481 };
482 #endif
483 #if CONFIG_IMAGE2PIPE_DEMUXER
484 AVInputFormat ff_image2pipe_demuxer = {
485     .name           = "image2pipe",
486     .long_name      = NULL_IF_CONFIG_SMALL("piped image2 sequence"),
487     .priv_data_size = sizeof(VideoData),
488     .read_header    = read_header,
489     .read_packet    = read_packet,
490     .priv_class     = &img2_class,
491 };
492 #endif
493
494 /* output */
495 #if CONFIG_IMAGE2_MUXER
496 AVOutputFormat ff_image2_muxer = {
497     .name           = "image2",
498     .long_name      = NULL_IF_CONFIG_SMALL("image2 sequence"),
499     .extensions     = "bmp,jpeg,jpg,ljpg,pam,pbm,pcx,pgm,pgmyuv,png,"
500                       "ppm,sgi,tga,tif,tiff,jp2",
501     .priv_data_size = sizeof(VideoData),
502     .video_codec    = CODEC_ID_MJPEG,
503     .write_header   = write_header,
504     .write_packet   = write_packet,
505     .flags          = AVFMT_NOTIMESTAMPS | AVFMT_NODIMENSIONS | AVFMT_NOFILE
506 };
507 #endif
508 #if CONFIG_IMAGE2PIPE_MUXER
509 AVOutputFormat ff_image2pipe_muxer = {
510     .name           = "image2pipe",
511     .long_name      = NULL_IF_CONFIG_SMALL("piped image2 sequence"),
512     .priv_data_size = sizeof(VideoData),
513     .video_codec    = CODEC_ID_MJPEG,
514     .write_header   = write_header,
515     .write_packet   = write_packet,
516     .flags          = AVFMT_NOTIMESTAMPS | AVFMT_NODIMENSIONS
517 };
518 #endif