From 2469cb5d1f6056f770ef3e454773595b9f720faa Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 20 Apr 2015 23:04:34 +0200 Subject: [PATCH] image_writer: factor image conversion into a separate function Needed for a later commit. --- video/image_writer.c | 56 ++++++++++++++++++++++++-------------------- video/image_writer.h | 6 +++++ 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/video/image_writer.c b/video/image_writer.c index 88ffb7964c..3ef3b9edc2 100644 --- a/video/image_writer.c +++ b/video/image_writer.c @@ -279,15 +279,38 @@ const char *image_writer_file_ext(const struct image_writer_opts *opts) return get_writer(opts)->file_ext; } -bool write_image(struct mp_image *image, const struct image_writer_opts *opts, - const char *filename, struct mp_log *log) +struct mp_image *convert_image(struct mp_image *image, int destfmt, + struct mp_log *log) { - struct mp_image *allocated_image = NULL; - struct image_writer_opts defs = image_writer_opts_defaults; int d_w = image->params.d_w; int d_h = image->params.d_h; bool is_anamorphic = image->w != d_w || image->h != d_h; + // Caveat: no colorspace/levels conversion done if pixel formats equal + // it's unclear what colorspace/levels the target wants + if (image->imgfmt == destfmt && !is_anamorphic) + return mp_image_new_ref(image); + + struct mp_image *dst = mp_image_alloc(destfmt, d_w, d_h); + if (!dst) { + mp_err(log, "Out of memory.\n"); + return NULL; + } + mp_image_copy_attributes(dst, image); + + if (mp_image_swscale(dst, image, mp_sws_hq_flags) < 0) { + mp_err(log, "Error when converting image.\n"); + talloc_free(dst); + return NULL; + } + + return dst; +} + +bool write_image(struct mp_image *image, const struct image_writer_opts *opts, + const char *filename, struct mp_log *log) +{ + struct image_writer_opts defs = image_writer_opts_defaults; if (!opts) opts = &defs; @@ -295,25 +318,9 @@ bool write_image(struct mp_image *image, const struct image_writer_opts *opts, struct image_writer_ctx ctx = { log, opts, writer, image->fmt }; int destfmt = get_target_format(&ctx, image->imgfmt); - // Caveat: no colorspace/levels conversion done if pixel formats equal - // it's unclear what colorspace/levels the target wants - if (image->imgfmt != destfmt || is_anamorphic) { - struct mp_image *dst = mp_image_alloc(destfmt, d_w, d_h); - if (!dst) { - mp_err(log, "Out of memory.\n"); - return 0; - } - mp_image_copy_attributes(dst, image); - - if (mp_image_swscale(dst, image, mp_sws_hq_flags) < 0) { - mp_err(log, "Error when converting image.\n"); - talloc_free(dst); - return 0; - } - - allocated_image = dst; - image = dst; - } + struct mp_image *dst = convert_image(image, destfmt, log); + if (!dst) + return false; FILE *fp = fopen(filename, "wb"); bool success = false; @@ -326,8 +333,7 @@ bool write_image(struct mp_image *image, const struct image_writer_opts *opts, mp_err(log, "Error writing file '%s'!\n", filename); } - talloc_free(allocated_image); - + talloc_free(dst); return success; } diff --git a/video/image_writer.h b/video/image_writer.h index d7cdd99125..b27db3981a 100644 --- a/video/image_writer.h +++ b/video/image_writer.h @@ -51,5 +51,11 @@ const char *image_writer_file_ext(const struct image_writer_opts *opts); bool write_image(struct mp_image *image, const struct image_writer_opts *opts, const char *filename, struct mp_log *log); +/* Return the image converted to the given format. If the pixel aspect ratio is + * not 1:1, the image is scaled as well. Returns NULL on failure. + */ +struct mp_image *convert_image(struct mp_image *image, int destfmt, + struct mp_log *log); + // Debugging helper. void dump_png(struct mp_image *image, const char *filename, struct mp_log *log);