Mercurial > libavformat.hg
changeset 189:e3cfb9131dfa libavformat
update duration and start_time
author | bellard |
---|---|
date | Fri, 08 Aug 2003 17:53:30 +0000 |
parents | 6c9d6422a2f6 |
children | 94fa5e3367ed |
files | img.c |
diffstat | 1 files changed, 70 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/img.c Fri Aug 08 17:52:53 2003 +0000 +++ b/img.c Fri Aug 08 17:53:30 2003 +0000 @@ -33,6 +33,56 @@ void *ptr; } VideoData; + +/* return -1 if no image found */ +static int find_image_range(int *pfirst_index, int *plast_index, + const char *path) +{ + char buf[1024]; + int range, last_index, range1, first_index; + + /* find the first image */ + for(first_index = 0; first_index < 5; first_index++) { + if (get_frame_filename(buf, sizeof(buf), path, first_index) < 0) + goto fail; + if (url_exist(buf)) + break; + } + if (first_index == 5) + goto fail; + + /* find the last image */ + last_index = first_index; + for(;;) { + range = 0; + for(;;) { + if (!range) + range1 = 1; + else + range1 = 2 * range; + if (get_frame_filename(buf, sizeof(buf), path, + last_index + range1) < 0) + goto fail; + if (!url_exist(buf)) + 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; + *plast_index = last_index; + return 0; + fail: + return -1; +} + + static int image_probe(AVProbeData *p) { if (filename_number_test(p->filename) >= 0 && guess_image_format(p->filename)) @@ -55,7 +105,7 @@ static int img_read_header(AVFormatContext *s1, AVFormatParameters *ap) { VideoData *s = s1->priv_data; - int i, ret; + int ret, first_index, last_index; char buf[1024]; ByteIOContext pb1, *f = &pb1; AVStream *st; @@ -78,16 +128,26 @@ else s->is_pipe = 1; + if (!ap || !ap->frame_rate) { + st->codec.frame_rate = 25; + st->codec.frame_rate_base = 1; + } else { + st->codec.frame_rate = ap->frame_rate; + st->codec.frame_rate_base = ap->frame_rate_base; + } + if (!s->is_pipe) { - /* try to find the first image */ - for(i=0;i<5;i++) { - if (get_frame_filename(buf, sizeof(buf), s->path, s->img_number) < 0) - goto fail; - if (url_fopen(f, buf, URL_RDONLY) >= 0) - break; - s->img_number++; - } - if (i == 5) + if (find_image_range(&first_index, &last_index, s->path) < 0) + goto fail; + s->img_number = first_index; + /* compute duration */ + st->start_time = 0; + st->duration = ((int64_t)AV_TIME_BASE * + (last_index - first_index + 1) * + st->codec.frame_rate_base) / st->codec.frame_rate; + if (get_frame_filename(buf, sizeof(buf), s->path, s->img_number) < 0) + goto fail; + if (url_fopen(f, buf, URL_RDONLY) < 0) goto fail; } else { f = &s1->pb; @@ -110,14 +170,6 @@ st->codec.pix_fmt = s->pix_fmt; s->img_size = avpicture_get_size(s->pix_fmt, s->width, s->height); - if (!ap || !ap->frame_rate){ - st->codec.frame_rate = 25; - st->codec.frame_rate_base = 1; - }else{ - st->codec.frame_rate = ap->frame_rate; - st->codec.frame_rate_base = ap->frame_rate_base; - } - return 0; fail1: if (!s->is_pipe)