diff options
author | Fabrice Bellard <fabrice@bellard.org> | 2003-01-11 05:02:14 +0000 |
---|---|---|
committer | Fabrice Bellard <fabrice@bellard.org> | 2003-01-11 05:02:14 +0000 |
commit | 87a0a6816f63c37fd6ea78ff8801e9f2d18e93f7 (patch) | |
tree | 7fef66f2bcce32f3d60bc8306e3c6de8df6524bf /libavformat/utils.c | |
parent | f746a0461694a8951d003395d79af8eba9dae5ed (diff) | |
download | ffmpeg-87a0a6816f63c37fd6ea78ff8801e9f2d18e93f7.tar.gz |
added still image support
Originally committed as revision 1439 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r-- | libavformat/utils.c | 127 |
1 files changed, 115 insertions, 12 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index e5159495df..2defc319d8 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -35,6 +35,7 @@ AVInputFormat *first_iformat; AVOutputFormat *first_oformat; +AVImageFormat *first_image_format; void av_register_input_format(AVInputFormat *format) { @@ -84,6 +85,11 @@ AVOutputFormat *guess_format(const char *short_name, const char *filename, AVOutputFormat *fmt, *fmt_found; int score_max, score; + /* specific test for image sequences */ + if (!short_name && filename && filename_number_test(filename) >= 0) { + return guess_format("image", NULL, NULL); + } + /* find the proper file type */ fmt_found = NULL; score_max = 0; @@ -326,8 +332,8 @@ int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, fmt = av_probe_input_format(pd, 0); } - /* if no file needed do not try to open one */ if (!fmt || !(fmt->flags & AVFMT_NOFILE)) { + /* if no file needed do not try to open one */ if (url_fopen(&ic->pb, filename, URL_RDONLY) < 0) { err = AVERROR_IO; goto fail; @@ -365,6 +371,14 @@ int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, ic->iformat = fmt; + /* check filename in case of an image number is expected */ + if (ic->iformat->flags & AVFMT_NEEDNUMBER) { + if (filename_number_test(ic->filename) < 0) { + err = AVERROR_NUMEXPECTED; + goto fail1; + } + } + /* allocate private data */ ic->priv_data = av_mallocz(fmt->priv_data_size); if (!ic->priv_data) { @@ -375,14 +389,6 @@ int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, /* default pts settings is MPEG like */ av_set_pts_info(ic, 33, 1, 90000); - /* check filename in case of an image number is expected */ - if (ic->iformat->flags & AVFMT_NEEDNUMBER) { - if (filename_number_test(ic->filename) < 0) { - err = AVERROR_NUMEXPECTED; - goto fail1; - } - } - err = ic->iformat->read_header(ic, ap); if (err < 0) goto fail1; @@ -707,6 +713,21 @@ AVStream *av_new_stream(AVFormatContext *s, int id) /************************************************************/ /* output media file */ +int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap) +{ + int ret; + + s->priv_data = av_mallocz(s->oformat->priv_data_size); + if (!s->priv_data) + return AVERROR_NOMEM; + if (s->oformat->set_parameters) { + ret = s->oformat->set_parameters(s, ap); + if (ret < 0) + return ret; + } + return 0; +} + /** * allocate the stream private data and write the stream header to an * output media file @@ -719,9 +740,6 @@ int av_write_header(AVFormatContext *s) int ret, i; AVStream *st; - s->priv_data = av_mallocz(s->oformat->priv_data_size); - if (!s->priv_data) - return AVERROR_NOMEM; /* default pts settings is MPEG like */ av_set_pts_info(s, 33, 1, 90000); ret = s->oformat->write_header(s); @@ -1291,3 +1309,88 @@ void av_frac_add(AVFrac *f, INT64 incr) } f->num = num; } + +/** + * register a new image format + * @param img_fmt Image format descriptor + */ +void av_register_image_format(AVImageFormat *img_fmt) +{ + AVImageFormat **p; + + p = &first_image_format; + while (*p != NULL) p = &(*p)->next; + *p = img_fmt; + img_fmt->next = NULL; +} + +/* guess image format */ +AVImageFormat *av_probe_image_format(AVProbeData *pd) +{ + AVImageFormat *fmt1, *fmt; + int score, score_max; + + fmt = NULL; + score_max = 0; + for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) { + if (fmt1->img_probe) { + score = fmt1->img_probe(pd); + if (score > score_max) { + score_max = score; + fmt = fmt1; + } + } + } + return fmt; +} + +AVImageFormat *guess_image_format(const char *filename) +{ + AVImageFormat *fmt1; + + for(fmt1 = first_image_format; fmt1 != NULL; fmt1 = fmt1->next) { + if (fmt1->extensions && match_ext(filename, fmt1->extensions)) + return fmt1; + } + return NULL; +} + +/** + * Read an image from a stream. + * @param gb byte stream containing the image + * @param fmt image format, NULL if probing is required + */ +int av_read_image(ByteIOContext *pb, const char *filename, + AVImageFormat *fmt, + int (*alloc_cb)(void *, AVImageInfo *info), void *opaque) +{ + char buf[PROBE_BUF_SIZE]; + AVProbeData probe_data, *pd = &probe_data; + offset_t pos; + int ret; + + if (!fmt) { + pd->filename = (char *)filename; + pd->buf = buf; + pos = url_ftell(pb); + pd->buf_size = get_buffer(pb, buf, PROBE_BUF_SIZE); + url_fseek(pb, pos, SEEK_SET); + fmt = av_probe_image_format(pd); + } + if (!fmt) + return AVERROR_NOFMT; + ret = fmt->img_read(pb, alloc_cb, opaque); + return ret; +} + +/** + * Write an image to a stream. + * @param pb byte stream for the image output + * @param fmt image format + * @param img image data and informations + */ +int av_write_image(ByteIOContext *pb, AVImageFormat *fmt, AVImageInfo *img) +{ + return fmt->img_write(pb, img); +} + |