summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2019-09-14 22:06:00 +0200
committersfan5 <sfan5@live.de>2019-09-14 23:02:39 +0200
commit8925f10962d13d9c3cbcb2e198b892177366c09f (patch)
treec692f022cfc2693b4d3b36fd47892b7cb469952e /player
parent7cf288ec77f838d3a2ca3134c164ddaaf2b6df55 (diff)
downloadmpv-8925f10962d13d9c3cbcb2e198b892177366c09f.tar.bz2
mpv-8925f10962d13d9c3cbcb2e198b892177366c09f.tar.xz
image_writer: move convert_image() to player/screenshot.c
Diffstat (limited to 'player')
-rw-r--r--player/screenshot.c37
-rw-r--r--player/screenshot.h8
2 files changed, 45 insertions, 0 deletions
diff --git a/player/screenshot.c b/player/screenshot.c
index e24ca051f1..df8da9697c 100644
--- a/player/screenshot.c
+++ b/player/screenshot.c
@@ -38,6 +38,7 @@
#include "video/mp_image_pool.h"
#include "video/out/vo.h"
#include "video/image_writer.h"
+#include "video/sws_utils.h"
#include "sub/osd.h"
#include "video/csputils.h"
@@ -387,6 +388,42 @@ static struct mp_image *screenshot_get(struct MPContext *mpctx, int mode,
return image;
}
+struct mp_image *convert_image(struct mp_image *image, int destfmt,
+ struct mp_log *log)
+{
+ int d_w, d_h;
+ mp_image_params_get_dsize(&image->params, &d_w, &d_h);
+
+ struct mp_image_params p = {
+ .imgfmt = destfmt,
+ .w = d_w,
+ .h = d_h,
+ .p_w = 1,
+ .p_h = 1,
+ };
+ mp_image_params_guess_csp(&p);
+
+ if (mp_image_params_equal(&p, &image->params))
+ return mp_image_new_ref(image);
+
+ struct mp_image *dst = mp_image_alloc(p.imgfmt, p.w, p.h);
+ if (!dst) {
+ mp_err(log, "Out of memory.\n");
+ return NULL;
+ }
+ mp_image_copy_attributes(dst, image);
+
+ dst->params = p;
+
+ 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;
+}
+
// mode is the same as in screenshot_get()
static struct mp_image *screenshot_get_rgb(struct MPContext *mpctx, int mode)
{
diff --git a/player/screenshot.h b/player/screenshot.h
index f479fca3f8..1ccee790d6 100644
--- a/player/screenshot.h
+++ b/player/screenshot.h
@@ -21,6 +21,8 @@
#include <stdbool.h>
struct MPContext;
+struct mp_image;
+struct mp_log;
// One time initialization at program start.
void screenshot_init(struct MPContext *mpctx);
@@ -28,6 +30,12 @@ void screenshot_init(struct MPContext *mpctx);
// Called by the playback core code when a new frame is displayed.
void screenshot_flip(struct MPContext *mpctx);
+/* 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);
+
// Handlers for the user-facing commands.
void cmd_screenshot(void *p);
void cmd_screenshot_to_file(void *p);