img2dec.c 26.4 KB
Newer Older
1 2 3 4 5
/*
 * Image format
 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
 * Copyright (c) 2004 Michael Niedermayer
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9 10 11 12
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * 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 15 16 17 18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * 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 21 22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

23
#define _DEFAULT_SOURCE
24
#define _BSD_SOURCE
A
Andrey Utkin 已提交
25
#include <sys/stat.h>
26 27 28 29 30
#include "libavutil/avstring.h"
#include "libavutil/log.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/parseutils.h"
31
#include "libavutil/intreadwrite.h"
32
#include "avformat.h"
33
#include "avio_internal.h"
34
#include "internal.h"
35
#include "img2.h"
36

37
#if HAVE_GLOB
38 39 40 41 42 43 44 45 46 47
/* Locally define as 0 (bitwise-OR no-op) any missing glob options that
   are non-posix glibc/bsd extensions. */
#ifndef GLOB_NOMAGIC
#define GLOB_NOMAGIC 0
#endif
#ifndef GLOB_BRACE
#define GLOB_BRACE 0
#endif

#endif /* HAVE_GLOB */
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

static const int sizes[][2] = {
    { 640, 480 },
    { 720, 480 },
    { 720, 576 },
    { 352, 288 },
    { 352, 240 },
    { 160, 128 },
    { 512, 384 },
    { 640, 352 },
    { 640, 240 },
};

static int infer_size(int *width_ptr, int *height_ptr, int size)
{
    int i;

D
Diego Biurrun 已提交
65
    for (i = 0; i < FF_ARRAY_ELEMS(sizes); i++) {
66
        if ((sizes[i][0] * sizes[i][1]) == size) {
D
Diego Biurrun 已提交
67
            *width_ptr  = sizes[i][0];
68 69 70 71
            *height_ptr = sizes[i][1];
            return 0;
        }
    }
D
Diego Biurrun 已提交
72

73 74 75
    return -1;
}

76 77 78
static int is_glob(const char *path)
{
#if HAVE_GLOB
79 80 81 82 83 84 85 86 87 88 89
    size_t span = 0;
    const char *p = path;

    while (p = strchr(p, '%')) {
        if (*(++p) == '%') {
            ++p;
            continue;
        }
        if (span = strspn(p, "*?[]{}"))
            break;
    }
90
    /* Did we hit a glob char or get to the end? */
91
    return span != 0;
92 93 94 95 96
#else
    return 0;
#endif
}

97 98 99 100 101 102 103 104 105
/**
 * Get index range of image files matched by path.
 *
 * @param pfirst_index pointer to index updated with the first number in the range
 * @param plast_index  pointer to index updated with the last number in the range
 * @param path         path which has to be matched by the image files in the range
 * @param start_index  minimum accepted value for the first index in the range
 * @return -1 if no image file could be found
 */
106
static int find_image_range(AVIOContext *pb, int *pfirst_index, int *plast_index,
107
                            const char *path, int start_index, int start_index_range)
108 109 110 111 112
{
    char buf[1024];
    int range, last_index, range1, first_index;

    /* find the first image */
113
    for (first_index = start_index; first_index < start_index + start_index_range; first_index++) {
D
Diego Biurrun 已提交
114
        if (av_get_frame_filename(buf, sizeof(buf), path, first_index) < 0) {
115
            *pfirst_index =
D
Diego Biurrun 已提交
116
            *plast_index  = 1;
117
            if (pb || avio_check(buf, AVIO_FLAG_READ) > 0)
118 119 120 121 122 123
                return 0;
            return -1;
        }
        if (avio_check(buf, AVIO_FLAG_READ) > 0)
            break;
    }
124
    if (first_index == start_index + start_index_range)
125 126 127 128
        goto fail;

    /* find the last image */
    last_index = first_index;
D
Diego Biurrun 已提交
129
    for (;;) {
130
        range = 0;
D
Diego Biurrun 已提交
131
        for (;;) {
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
            if (!range)
                range1 = 1;
            else
                range1 = 2 * range;
            if (av_get_frame_filename(buf, sizeof(buf), path,
                                      last_index + range1) < 0)
                goto fail;
            if (avio_check(buf, AVIO_FLAG_READ) <= 0)
                break;
            range = range1;
            /* just in case... */
            if (range >= (1 << 30))
                goto fail;
        }
        /* we are sure than image last_index + range exists */
        if (!range)
            break;
        last_index += range;
    }
    *pfirst_index = first_index;
D
Diego Biurrun 已提交
152
    *plast_index  = last_index;
153
    return 0;
D
Diego Biurrun 已提交
154 155

fail:
156 157 158
    return -1;
}

D
Diego Biurrun 已提交
159
static int img_read_probe(AVProbeData *p)
160 161 162 163
{
    if (p->filename && ff_guess_image2_codec(p->filename)) {
        if (av_filename_number_test(p->filename))
            return AVPROBE_SCORE_MAX;
164 165
        else if (is_glob(p->filename))
            return AVPROBE_SCORE_MAX;
166 167
        else if (p->filename[strcspn(p->filename, "*?{")]) // probably PT_GLOB
            return AVPROBE_SCORE_EXTENSION + 2; // score chosen to be a tad above the image pipes
168 169
        else if (p->buf_size == 0)
            return 0;
170
        else if (av_match_ext(p->filename, "raw") || av_match_ext(p->filename, "gif"))
171
            return 5;
172
        else
173
            return AVPROBE_SCORE_EXTENSION;
174 175 176 177
    }
    return 0;
}

178
int ff_img_read_header(AVFormatContext *s1)
179 180
{
    VideoDemuxData *s = s1->priv_data;
181
    int first_index = 1, last_index = 1;
182
    AVStream *st;
183
    enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE;
184 185 186 187 188 189 190 191

    s1->ctx_flags |= AVFMTCTX_NOHEADER;

    st = avformat_new_stream(s1, NULL);
    if (!st) {
        return AVERROR(ENOMEM);
    }

D
Diego Biurrun 已提交
192 193 194 195
    if (s->pixel_format &&
        (pix_fmt = av_get_pix_fmt(s->pixel_format)) == AV_PIX_FMT_NONE) {
        av_log(s1, AV_LOG_ERROR, "No such pixel format: %s.\n",
               s->pixel_format);
196 197 198 199 200
        return AVERROR(EINVAL);
    }

    av_strlcpy(s->path, s1->filename, sizeof(s->path));
    s->img_number = 0;
D
Diego Biurrun 已提交
201
    s->img_count  = 0;
202 203 204 205

    /* find format */
    if (s1->iformat->flags & AVFMT_NOFILE)
        s->is_pipe = 0;
D
Diego Biurrun 已提交
206 207
    else {
        s->is_pipe       = 1;
208 209 210
        st->need_parsing = AVSTREAM_PARSE_FULL;
    }

211 212 213 214 215 216 217
    if (s->ts_from_file == 2) {
#if !HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
        av_log(s1, AV_LOG_ERROR, "POSIX.1-2008 not supported, nanosecond file timestamps unavailable\n");
        return AVERROR(ENOSYS);
#endif
        avpriv_set_pts_info(st, 64, 1, 1000000000);
    } else if (s->ts_from_file)
218
        avpriv_set_pts_info(st, 64, 1, 1);
A
Andrey Utkin 已提交
219
    else
220
        avpriv_set_pts_info(st, 64, s->framerate.den, s->framerate.num);
221

222 223 224
    if (s->width && s->height) {
        st->codec->width  = s->width;
        st->codec->height = s->height;
225 226 227
    }

    if (!s->is_pipe) {
228
        if (s->pattern_type == PT_GLOB_SEQUENCE) {
229 230
        s->use_glob = is_glob(s->path);
        if (s->use_glob) {
231
#if HAVE_GLOB
232
            char *p = s->path, *q, *dup;
233
            int gerr;
234
#endif
235

236 237 238
            av_log(s1, AV_LOG_WARNING, "Pattern type 'glob_sequence' is deprecated: "
                   "use pattern_type 'glob' instead\n");
#if HAVE_GLOB
239 240 241 242 243 244 245 246 247 248 249 250 251 252
            dup = q = av_strdup(p);
            while (*q) {
                /* Do we have room for the next char and a \ insertion? */
                if ((p - s->path) >= (sizeof(s->path) - 2))
                  break;
                if (*q == '%' && strspn(q + 1, "%*?[]{}"))
                    ++q;
                else if (strspn(q, "\\*?[]{}"))
                    *p++ = '\\';
                *p++ = *q++;
            }
            *p = 0;
            av_free(dup);

253
            gerr = glob(s->path, GLOB_NOCHECK|GLOB_BRACE|GLOB_NOMAGIC, NULL, &s->globstate);
254 255 256 257 258 259
            if (gerr != 0) {
                return AVERROR(ENOENT);
            }
            first_index = 0;
            last_index = s->globstate.gl_pathc - 1;
#endif
260 261 262
        }
        }
        if ((s->pattern_type == PT_GLOB_SEQUENCE && !s->use_glob) || s->pattern_type == PT_SEQUENCE) {
263
            if (find_image_range(s1->pb, &first_index, &last_index, s->path,
264
                                 s->start_number, s->start_number_range) < 0) {
265
                av_log(s1, AV_LOG_ERROR,
266
                       "Could find no file with path '%s' and index in the range %d-%d\n",
267
                       s->path, s->start_number, s->start_number + s->start_number_range - 1);
268
                return AVERROR(ENOENT);
269
            }
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
        } else if (s->pattern_type == PT_GLOB) {
#if HAVE_GLOB
            int gerr;
            gerr = glob(s->path, GLOB_NOCHECK|GLOB_BRACE|GLOB_NOMAGIC, NULL, &s->globstate);
            if (gerr != 0) {
                return AVERROR(ENOENT);
            }
            first_index = 0;
            last_index = s->globstate.gl_pathc - 1;
            s->use_glob = 1;
#else
            av_log(s1, AV_LOG_ERROR,
                   "Pattern type 'glob' was selected but globbing "
                   "is not supported by this libavformat build\n");
            return AVERROR(ENOSYS);
#endif
286
        } else if (s->pattern_type != PT_GLOB_SEQUENCE && s->pattern_type != PT_NONE) {
287 288 289
            av_log(s1, AV_LOG_ERROR,
                   "Unknown value '%d' for pattern_type option\n", s->pattern_type);
            return AVERROR(EINVAL);
290
        }
D
Diego Biurrun 已提交
291 292
        s->img_first  = first_index;
        s->img_last   = last_index;
293 294
        s->img_number = first_index;
        /* compute duration */
295 296 297 298
        if (!s->ts_from_file) {
            st->start_time = 0;
            st->duration   = last_index - first_index + 1;
        }
299 300
    }

D
Diego Biurrun 已提交
301
    if (s1->video_codec_id) {
302
        st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
D
Diego Biurrun 已提交
303 304
        st->codec->codec_id   = s1->video_codec_id;
    } else if (s1->audio_codec_id) {
305
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
D
Diego Biurrun 已提交
306
        st->codec->codec_id   = s1->audio_codec_id;
307 308 309
    } else if (s1->iformat->raw_codec_id) {
        st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
        st->codec->codec_id   = s1->iformat->raw_codec_id;
D
Diego Biurrun 已提交
310
    } else {
311 312
        const char *str = strrchr(s->path, '.');
        s->split_planes       = str && !av_strcasecmp(str + 1, "y");
313
        st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
314
        if (s1->pb) {
315
            int probe_buffer_size = 2048;
316
            uint8_t *probe_buffer = av_realloc(NULL, probe_buffer_size + AVPROBE_PADDING_SIZE);
317
            AVInputFormat *fmt = NULL;
318
            AVProbeData pd = { 0 };
319 320 321 322 323 324 325 326 327 328

            if (!probe_buffer)
                return AVERROR(ENOMEM);

            probe_buffer_size = avio_read(s1->pb, probe_buffer, probe_buffer_size);
            if (probe_buffer_size < 0) {
                av_free(probe_buffer);
                return probe_buffer_size;
            }
            memset(probe_buffer + probe_buffer_size, 0, AVPROBE_PADDING_SIZE);
329 330

            pd.buf = probe_buffer;
331
            pd.buf_size = probe_buffer_size;
332 333 334 335 336 337 338 339 340 341 342 343 344
            pd.filename = s1->filename;

            while ((fmt = av_iformat_next(fmt))) {
                if (fmt->read_header != ff_img_read_header ||
                    !fmt->read_probe ||
                    (fmt->flags & AVFMT_NOFILE) ||
                    !fmt->raw_codec_id)
                    continue;
                if (fmt->read_probe(&pd) > 0) {
                    st->codec->codec_id = fmt->raw_codec_id;
                    break;
                }
            }
345 346 347 348
            if (s1->flags & AVFMT_FLAG_CUSTOM_IO) {
                avio_seek(s1->pb, 0, SEEK_SET);
            } else
                ffio_rewind_with_probe_data(s1->pb, &probe_buffer, probe_buffer_size);
349 350 351
        }
        if (st->codec->codec_id == AV_CODEC_ID_NONE)
            st->codec->codec_id = ff_guess_image2_codec(s->path);
352 353
        if (st->codec->codec_id == AV_CODEC_ID_LJPEG)
            st->codec->codec_id = AV_CODEC_ID_MJPEG;
354 355
        if (st->codec->codec_id == AV_CODEC_ID_ALIAS_PIX) // we cannot distingiush this from BRENDER_PIX
            st->codec->codec_id = AV_CODEC_ID_NONE;
356
    }
D
Diego Biurrun 已提交
357 358
    if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
        pix_fmt != AV_PIX_FMT_NONE)
359 360 361 362 363
        st->codec->pix_fmt = pix_fmt;

    return 0;
}

364
int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt)
365 366
{
    VideoDemuxData *s = s1->priv_data;
367 368
    char filename_bytes[1024];
    char *filename = filename_bytes;
369
    int i, res;
D
Diego Biurrun 已提交
370 371 372
    int size[3]           = { 0 }, ret[3] = { 0 };
    AVIOContext *f[3]     = { NULL };
    AVCodecContext *codec = s1->streams[0]->codec;
373 374 375 376 377 378 379 380

    if (!s->is_pipe) {
        /* loop over input */
        if (s->loop && s->img_number > s->img_last) {
            s->img_number = s->img_first;
        }
        if (s->img_number > s->img_last)
            return AVERROR_EOF;
381 382 383
        if (s->pattern_type == PT_NONE) {
            av_strlcpy(filename_bytes, s->path, sizeof(filename_bytes));
        } else if (s->use_glob) {
384 385 386 387 388
#if HAVE_GLOB
            filename = s->globstate.gl_pathv[s->img_number];
#endif
        } else {
        if (av_get_frame_filename(filename_bytes, sizeof(filename_bytes),
D
Diego Biurrun 已提交
389 390
                                  s->path,
                                  s->img_number) < 0 && s->img_number > 1)
391
            return AVERROR(EIO);
392
        }
D
Diego Biurrun 已提交
393
        for (i = 0; i < 3; i++) {
394 395
            if (avio_open2(&f[i], filename, AVIO_FLAG_READ,
                           &s1->interrupt_callback, NULL) < 0) {
D
Diego Biurrun 已提交
396
                if (i >= 1)
397
                    break;
D
Diego Biurrun 已提交
398 399
                av_log(s1, AV_LOG_ERROR, "Could not open file : %s\n",
                       filename);
400 401
                return AVERROR(EIO);
            }
D
Diego Biurrun 已提交
402
            size[i] = avio_size(f[i]);
403

404
            if (!s->split_planes)
405
                break;
D
Diego Biurrun 已提交
406
            filename[strlen(filename) - 1] = 'U' + i;
407 408
        }

409
        if (codec->codec_id == AV_CODEC_ID_NONE) {
410
            AVProbeData pd = { 0 };
411
            AVInputFormat *ifmt;
412
            uint8_t header[PROBE_BUF_MIN + AVPROBE_PADDING_SIZE];
413 414 415
            int ret;
            int score = 0;

416
            ret = avio_read(f[0], header, PROBE_BUF_MIN);
417 418
            if (ret < 0)
                return ret;
419
            memset(header + ret, 0, sizeof(header) - ret);
420 421 422 423 424 425 426 427 428 429
            avio_skip(f[0], -ret);
            pd.buf = header;
            pd.buf_size = ret;
            pd.filename = filename;

            ifmt = av_probe_input_format3(&pd, 1, &score);
            if (ifmt && ifmt->read_packet == ff_img_read_packet && ifmt->raw_codec_id)
                codec->codec_id = ifmt->raw_codec_id;
        }

D
Diego Biurrun 已提交
430
        if (codec->codec_id == AV_CODEC_ID_RAWVIDEO && !codec->width)
431 432 433
            infer_size(&codec->width, &codec->height, size[0]);
    } else {
        f[0] = s1->pb;
434 435
        if (avio_feof(f[0]) && s->loop && s->is_pipe)
            avio_seek(f[0], 0, SEEK_SET);
436
        if (avio_feof(f[0]))
437
            return AVERROR_EOF;
438 439
        if (s->frame_size > 0) {
            size[0] = s->frame_size;
440 441
        } else if (!s1->streams[0]->parser) {
            size[0] = avio_size(s1->pb);
442
        } else {
443
            size[0] = 4096;
444
        }
445 446
    }

447
    res = av_new_packet(pkt, size[0] + size[1] + size[2]);
448 449 450
    if (res < 0) {
        goto fail;
    }
451
    pkt->stream_index = 0;
D
Diego Biurrun 已提交
452
    pkt->flags       |= AV_PKT_FLAG_KEY;
A
Andrey Utkin 已提交
453 454
    if (s->ts_from_file) {
        struct stat img_stat;
455 456 457 458
        if (stat(filename, &img_stat)) {
            res = AVERROR(EIO);
            goto fail;
        }
A
Andrey Utkin 已提交
459
        pkt->pts = (int64_t)img_stat.st_mtime;
460 461 462 463
#if HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
        if (s->ts_from_file == 2)
            pkt->pts = 1000000000*pkt->pts + img_stat.st_mtim.tv_nsec;
#endif
464
        av_add_index_entry(s1->streams[0], s->img_number, pkt->pts, 0, 0, AVINDEX_KEYFRAME);
A
Andrey Utkin 已提交
465
    } else if (!s->is_pipe) {
466
        pkt->pts      = s->pts;
A
Andrey Utkin 已提交
467
    }
468

469 470 471
    if (s->is_pipe)
        pkt->pos = avio_tell(f[0]);

D
Diego Biurrun 已提交
472 473 474 475
    pkt->size = 0;
    for (i = 0; i < 3; i++) {
        if (f[i]) {
            ret[i] = avio_read(f[i], pkt->data + pkt->size, size[i]);
476 477 478 479 480 481
            if (s->loop && s->is_pipe && ret[i] == AVERROR_EOF) {
                if (avio_seek(f[i], 0, SEEK_SET) >= 0) {
                    pkt->pos = 0;
                    ret[i] = avio_read(f[i], pkt->data + pkt->size, size[i]);
                }
            }
482
            if (!s->is_pipe)
483
                avio_closep(&f[i]);
D
Diego Biurrun 已提交
484
            if (ret[i] > 0)
485 486 487 488
                pkt->size += ret[i];
        }
    }

D
Diego Biurrun 已提交
489
    if (ret[0] <= 0 || ret[1] < 0 || ret[2] < 0) {
490
        av_packet_unref(pkt);
491
        if (ret[0] < 0) {
492
            res = ret[0];
493
        } else if (ret[1] < 0) {
494 495 496 497 498 499 500
            res = ret[1];
        } else if (ret[2] < 0) {
            res = ret[2];
        } else {
            res = AVERROR_EOF;
        }
        goto fail;
501 502 503
    } else {
        s->img_count++;
        s->img_number++;
504
        s->pts++;
505 506
        return 0;
    }
507 508 509 510 511 512 513 514

fail:
    if (!s->is_pipe) {
        for (i = 0; i < 3; i++) {
            avio_closep(&f[i]);
        }
    }
    return res;
515 516
}

517
static int img_read_close(struct AVFormatContext* s1)
518 519
{
#if HAVE_GLOB
520
    VideoDemuxData *s = s1->priv_data;
521 522 523 524 525 526 527
    if (s->use_glob) {
        globfree(&s->globstate);
    }
#endif
    return 0;
}

P
Paul B Mahol 已提交
528 529 530
static int img_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
{
    VideoDemuxData *s1 = s->priv_data;
531 532 533 534 535 536 537 538 539
    AVStream *st = s->streams[0];

    if (s1->ts_from_file) {
        int index = av_index_search_timestamp(st, timestamp, flags);
        if(index < 0)
            return -1;
        s1->img_number = st->index_entries[index].pos;
        return 0;
    }
P
Paul B Mahol 已提交
540

541
    if (timestamp < 0 || !s1->loop && timestamp > s1->img_last - s1->img_first)
P
Paul B Mahol 已提交
542
        return -1;
543 544
    s1->img_number = timestamp%(s1->img_last - s1->img_first + 1) + s1->img_first;
    s1->pts = timestamp;
P
Paul B Mahol 已提交
545 546 547
    return 0;
}

548 549
#define OFFSET(x) offsetof(VideoDemuxData, x)
#define DEC AV_OPT_FLAG_DECODING_PARAM
550
const AVOption ff_img_options[] = {
551
    { "framerate",    "set the video framerate",             OFFSET(framerate),    AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, 0,   DEC },
552
    { "loop",         "force loop over input file sequence", OFFSET(loop),         AV_OPT_TYPE_BOOL,   {.i64 = 0   }, 0, 1,       DEC },
553

554
    { "pattern_type", "set pattern type",                    OFFSET(pattern_type), AV_OPT_TYPE_INT,    {.i64=PT_GLOB_SEQUENCE}, 0,       INT_MAX, DEC, "pattern_type"},
555 556 557
    { "glob_sequence","select glob/sequence pattern type",   0, AV_OPT_TYPE_CONST,  {.i64=PT_GLOB_SEQUENCE}, INT_MIN, INT_MAX, DEC, "pattern_type" },
    { "glob",         "select glob pattern type",            0, AV_OPT_TYPE_CONST,  {.i64=PT_GLOB         }, INT_MIN, INT_MAX, DEC, "pattern_type" },
    { "sequence",     "select sequence pattern type",        0, AV_OPT_TYPE_CONST,  {.i64=PT_SEQUENCE     }, INT_MIN, INT_MAX, DEC, "pattern_type" },
558
    { "none",         "disable pattern matching",            0, AV_OPT_TYPE_CONST,  {.i64=PT_NONE         }, INT_MIN, INT_MAX, DEC, "pattern_type" },
559

560
    { "pixel_format", "set video pixel format",              OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0,       DEC },
561
    { "start_number", "set first number in the sequence",    OFFSET(start_number), AV_OPT_TYPE_INT,    {.i64 = 0   }, INT_MIN, INT_MAX, DEC },
562
    { "start_number_range", "set range for looking at the first sequence number", OFFSET(start_number_range), AV_OPT_TYPE_INT, {.i64 = 5}, 1, INT_MAX, DEC },
563
    { "video_size",   "set video size",                      OFFSET(width),        AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0,   DEC },
564
    { "frame_size",   "force frame size in bytes",           OFFSET(frame_size),   AV_OPT_TYPE_INT,    {.i64 = 0   }, 0, INT_MAX, DEC },
565 566
    { "ts_from_file", "set frame timestamp from file's one", OFFSET(ts_from_file), AV_OPT_TYPE_INT,    {.i64 = 0   }, 0, 2,       DEC, "ts_type" },
    { "none", "none",                   0, AV_OPT_TYPE_CONST,    {.i64 = 0   }, 0, 2,       DEC, "ts_type" },
M
Michael Niedermayer 已提交
567 568
    { "sec",  "second precision",       0, AV_OPT_TYPE_CONST,    {.i64 = 1   }, 0, 2,       DEC, "ts_type" },
    { "ns",   "nano second precision",  0, AV_OPT_TYPE_CONST,    {.i64 = 2   }, 0, 2,       DEC, "ts_type" },
569 570 571 572 573 574 575
    { NULL },
};

#if CONFIG_IMAGE2_DEMUXER
static const AVClass img2_class = {
    .class_name = "image2 demuxer",
    .item_name  = av_default_item_name,
576
    .option     = ff_img_options,
577 578 579 580 581 582
    .version    = LIBAVUTIL_VERSION_INT,
};
AVInputFormat ff_image2_demuxer = {
    .name           = "image2",
    .long_name      = NULL_IF_CONFIG_SMALL("image2 sequence"),
    .priv_data_size = sizeof(VideoDemuxData),
D
Diego Biurrun 已提交
583
    .read_probe     = img_read_probe,
584 585
    .read_header    = ff_img_read_header,
    .read_packet    = ff_img_read_packet,
586
    .read_close     = img_read_close,
P
Paul B Mahol 已提交
587
    .read_seek      = img_read_seek,
588 589 590 591 592 593 594 595
    .flags          = AVFMT_NOFILE,
    .priv_class     = &img2_class,
};
#endif
#if CONFIG_IMAGE2PIPE_DEMUXER
static const AVClass img2pipe_class = {
    .class_name = "image2pipe demuxer",
    .item_name  = av_default_item_name,
596
    .option     = ff_img_options,
597 598 599 600 601 602
    .version    = LIBAVUTIL_VERSION_INT,
};
AVInputFormat ff_image2pipe_demuxer = {
    .name           = "image2pipe",
    .long_name      = NULL_IF_CONFIG_SMALL("piped image2 sequence"),
    .priv_data_size = sizeof(VideoDemuxData),
603 604
    .read_header    = ff_img_read_header,
    .read_packet    = ff_img_read_packet,
605 606 607
    .priv_class     = &img2pipe_class,
};
#endif
608 609 610 611

static int bmp_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;
612
    int ihsize;
613

614 615 616 617 618 619 620 621
    if (AV_RB16(b) != 0x424d)
        return 0;

    ihsize = AV_RL32(b+14);
    if (ihsize < 12 || ihsize > 255)
        return 0;

    if (!AV_RN32(b + 6)) {
622
        return AVPROBE_SCORE_EXTENSION + 1;
623
    }
T
Timothy Gu 已提交
624
    return AVPROBE_SCORE_EXTENSION / 4;
625 626
}

627 628 629 630 631 632 633 634 635 636 637
static int dds_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (   AV_RB64(b) == 0x444453207c000000
        && AV_RL32(b +  8)
        && AV_RL32(b + 12))
        return AVPROBE_SCORE_MAX - 1;
    return 0;
}

638 639 640
static int dpx_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;
641 642
    int w, h;
    int is_big = (AV_RN32(b) == AV_RN32("SDPX"));
643

644 645 646 647 648 649 650 651
    if (p->buf_size < 0x304+8)
        return 0;
    w = is_big ? AV_RB32(p->buf + 0x304) : AV_RL32(p->buf + 0x304);
    h = is_big ? AV_RB32(p->buf + 0x308) : AV_RL32(p->buf + 0x308);
    if (w <= 0 || h <= 0)
        return 0;

    if (is_big || AV_RN32(b) == AV_RN32("XPDS"))
652 653 654 655 656 657 658 659 660 661 662 663 664
        return AVPROBE_SCORE_EXTENSION + 1;
    return 0;
}

static int exr_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (AV_RL32(b) == 20000630)
        return AVPROBE_SCORE_EXTENSION + 1;
    return 0;
}

C
Carl Eugen Hoyos 已提交
665 666 667 668 669 670 671 672 673 674
static int j2k_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (AV_RB64(b) == 0x0000000c6a502020 ||
        AV_RB32(b) == 0xff4fff51)
        return AVPROBE_SCORE_EXTENSION + 1;
    return 0;
}

C
Carl Eugen Hoyos 已提交
675 676 677
static int jpeg_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;
678
    int i, state = 0xD8;
C
Carl Eugen Hoyos 已提交
679 680 681 682 683 684

    if (AV_RB16(b) != 0xFFD8 ||
        AV_RB32(b) == 0xFFD8FFF7)
    return 0;

    b += 2;
685
    for (i = 0; i < p->buf_size - 3; i++) {
C
Carl Eugen Hoyos 已提交
686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713
        int c;
        if (b[i] != 0xFF)
            continue;
        c = b[i + 1];
        switch (c) {
        case 0xD8:
            return 0;
        case 0xC0:
        case 0xC1:
        case 0xC2:
        case 0xC3:
        case 0xC5:
        case 0xC6:
        case 0xC7:
            if (state != 0xD8)
                return 0;
            state = 0xC0;
            break;
        case 0xDA:
            if (state != 0xC0)
                return 0;
            state = 0xDA;
            break;
        case 0xD9:
            if (state != 0xDA)
                return 0;
            state = 0xD9;
            break;
714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
        case 0xE0:
        case 0xE1:
        case 0xE2:
        case 0xE3:
        case 0xE4:
        case 0xE5:
        case 0xE6:
        case 0xE7:
        case 0xE8:
        case 0xE9:
        case 0xEA:
        case 0xEB:
        case 0xEC:
        case 0xED:
        case 0xEE:
        case 0xEF:
            i += AV_RB16(&b[i + 2]) + 1;
            break;
C
Carl Eugen Hoyos 已提交
732 733 734 735 736 737 738 739 740 741 742 743
        default:
            if (  (c >= 0x02 && c <= 0xBF)
                || c == 0xC8)
                return 0;
        }
    }

    if (state == 0xD9)
        return AVPROBE_SCORE_EXTENSION + 1;
    return AVPROBE_SCORE_EXTENSION / 8;
}

C
Carl Eugen Hoyos 已提交
744 745 746 747 748 749 750 751 752
static int jpegls_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (AV_RB32(b) == 0xffd8fff7)
         return AVPROBE_SCORE_EXTENSION + 1;
    return 0;
}

753 754 755 756
static int qdraw_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

757 758 759 760 761 762 763 764 765
    if (   p->buf_size >= 528
        && (AV_RB64(b + 520) & 0xFFFFFFFFFFFF) == 0x001102ff0c00
        && AV_RB16(b + 520)
        && AV_RB16(b + 518))
        return AVPROBE_SCORE_MAX * 3 / 4;
    if (   (AV_RB64(b + 8) & 0xFFFFFFFFFFFF) == 0x001102ff0c00
        && AV_RB16(b + 8)
        && AV_RB16(b + 6))
        return AVPROBE_SCORE_EXTENSION / 4;
766 767 768
    return 0;
}

769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811
static int pictor_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (AV_RL16(b) == 0x1234)
        return AVPROBE_SCORE_EXTENSION / 4;
    return 0;
}

static int png_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (AV_RB64(b) == 0x89504e470d0a1a0a)
        return AVPROBE_SCORE_MAX - 1;
    return 0;
}

static int sgi_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (AV_RB16(b) == 474 &&
        (b[2] & ~1) == 0 &&
        (b[3] & ~3) == 0 && b[3] &&
        (AV_RB16(b + 4) & ~7) == 0 && AV_RB16(b + 4))
        return AVPROBE_SCORE_EXTENSION + 1;
    return 0;
}

static int sunrast_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (AV_RB32(b) == 0x59a66a95)
        return AVPROBE_SCORE_EXTENSION + 1;
    return 0;
}

static int tiff_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

812 813
    if (AV_RB32(b) == 0x49492a00 ||
        AV_RB32(b) == 0x4D4D002a)
814 815 816 817
        return AVPROBE_SCORE_EXTENSION + 1;
    return 0;
}

C
Carl Eugen Hoyos 已提交
818 819 820 821 822 823 824 825 826 827
static int webp_probe(AVProbeData *p)
{
    const uint8_t *b = p->buf;

    if (AV_RB32(b)     == 0x52494646 &&
        AV_RB32(b + 8) == 0x57454250)
        return AVPROBE_SCORE_MAX - 1;
    return 0;
}

828 829 830 831
#define IMAGEAUTO_DEMUXER(imgname, codecid)\
static const AVClass imgname ## _class = {\
    .class_name = AV_STRINGIFY(imgname) " demuxer",\
    .item_name  = av_default_item_name,\
832
    .option     = ff_img_options,\
833 834 835 836
    .version    = LIBAVUTIL_VERSION_INT,\
};\
AVInputFormat ff_image_ ## imgname ## _pipe_demuxer = {\
    .name           = AV_STRINGIFY(imgname) "_pipe",\
837
    .long_name      = NULL_IF_CONFIG_SMALL("piped " AV_STRINGIFY(imgname) " sequence"),\
838 839 840 841 842
    .priv_data_size = sizeof(VideoDemuxData),\
    .read_probe     = imgname ## _probe,\
    .read_header    = ff_img_read_header,\
    .read_packet    = ff_img_read_packet,\
    .priv_class     = & imgname ## _class,\
843
    .flags          = AVFMT_GENERIC_INDEX, \
844 845 846 847
    .raw_codec_id   = codecid,\
};

IMAGEAUTO_DEMUXER(bmp,     AV_CODEC_ID_BMP)
848
IMAGEAUTO_DEMUXER(dds,     AV_CODEC_ID_DDS)
849 850
IMAGEAUTO_DEMUXER(dpx,     AV_CODEC_ID_DPX)
IMAGEAUTO_DEMUXER(exr,     AV_CODEC_ID_EXR)
C
Carl Eugen Hoyos 已提交
851
IMAGEAUTO_DEMUXER(j2k,     AV_CODEC_ID_JPEG2000)
C
Carl Eugen Hoyos 已提交
852
IMAGEAUTO_DEMUXER(jpeg,    AV_CODEC_ID_MJPEG)
C
Carl Eugen Hoyos 已提交
853
IMAGEAUTO_DEMUXER(jpegls,  AV_CODEC_ID_JPEGLS)
854 855
IMAGEAUTO_DEMUXER(pictor,  AV_CODEC_ID_PICTOR)
IMAGEAUTO_DEMUXER(png,     AV_CODEC_ID_PNG)
856
IMAGEAUTO_DEMUXER(qdraw,   AV_CODEC_ID_QDRAW)
857 858 859
IMAGEAUTO_DEMUXER(sgi,     AV_CODEC_ID_SGI)
IMAGEAUTO_DEMUXER(sunrast, AV_CODEC_ID_SUNRAST)
IMAGEAUTO_DEMUXER(tiff,    AV_CODEC_ID_TIFF)
C
Carl Eugen Hoyos 已提交
860
IMAGEAUTO_DEMUXER(webp,    AV_CODEC_ID_WEBP)