|
|
@@ -40,6 +40,7 @@ typedef struct { |
|
|
|
char *video_size; /**< Set by a private option. */ |
|
|
|
char *framerate; /**< Set by a private option. */ |
|
|
|
int loop; |
|
|
|
int start_number; |
|
|
|
} VideoDemuxData; |
|
|
|
|
|
|
|
static const int sizes[][2] = { |
|
|
@@ -70,13 +71,13 @@ static int infer_size(int *width_ptr, int *height_ptr, int size) |
|
|
|
|
|
|
|
/* return -1 if no image found */ |
|
|
|
static int find_image_range(int *pfirst_index, int *plast_index, |
|
|
|
const char *path) |
|
|
|
const char *path, int max_start) |
|
|
|
{ |
|
|
|
char buf[1024]; |
|
|
|
int range, last_index, range1, first_index; |
|
|
|
|
|
|
|
/* find the first image */ |
|
|
|
for(first_index = 0; first_index < 5; first_index++) { |
|
|
|
for (first_index = 0; first_index < max_start; first_index++) { |
|
|
|
if (av_get_frame_filename(buf, sizeof(buf), path, first_index) < 0){ |
|
|
|
*pfirst_index = |
|
|
|
*plast_index = 1; |
|
|
@@ -182,7 +183,8 @@ static int read_header(AVFormatContext *s1) |
|
|
|
} |
|
|
|
|
|
|
|
if (!s->is_pipe) { |
|
|
|
if (find_image_range(&first_index, &last_index, s->path) < 0) |
|
|
|
if (find_image_range(&first_index, &last_index, s->path, |
|
|
|
FFMAX(s->start_number, 5)) < 0) |
|
|
|
return AVERROR(ENOENT); |
|
|
|
s->img_first = first_index; |
|
|
|
s->img_last = last_index; |
|
|
@@ -283,6 +285,7 @@ static const AVOption options[] = { |
|
|
|
{ "video_size", "", OFFSET(video_size), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, |
|
|
|
{ "framerate", "", OFFSET(framerate), AV_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC }, |
|
|
|
{ "loop", "", OFFSET(loop), AV_OPT_TYPE_INT, {.dbl = 0}, 0, 1, DEC }, |
|
|
|
{ "start_number", "first number in the sequence", OFFSET(start_number), AV_OPT_TYPE_INT, {.dbl = 1}, 1, INT_MAX, DEC }, |
|
|
|
{ NULL }, |
|
|
|
}; |
|
|
|
|
|
|
|