player/command: add ability to scale overlay

This commit is contained in:
Graham Booker 2022-10-03 13:58:45 -05:00 committed by sfan5
parent f886eb5678
commit 4754bd54c7
3 changed files with 20 additions and 5 deletions

View File

@ -1033,7 +1033,7 @@ Input Commands that are Possibly Subject to Change
information about the key state. The special key name ``unmapped`` can be information about the key state. The special key name ``unmapped`` can be
used to match any unmapped key. used to match any unmapped key.
``overlay-add <id> <x> <y> <file> <offset> <fmt> <w> <h> <stride>`` ``overlay-add <id> <x> <y> <file> <offset> <fmt> <w> <h> <stride> <dw> <dh>``
Add an OSD overlay sourced from raw data. This might be useful for scripts Add an OSD overlay sourced from raw data. This might be useful for scripts
and applications controlling mpv, and which want to display things on top and applications controlling mpv, and which want to display things on top
of the video window. of the video window.
@ -1091,6 +1091,11 @@ Input Commands that are Possibly Subject to Change
(Technically, the minimum size would be ``stride * (h - 1) + w * 4``, but (Technically, the minimum size would be ``stride * (h - 1) + w * 4``, but
for simplicity, the player will access all ``stride * h`` bytes.) for simplicity, the player will access all ``stride * h`` bytes.)
``dw`` and ``dh`` specify the (optional) display size of the overlay.
The overlay visible portion of the overlay (``w`` and ``h``) is scaled to
in display to ``dw`` and ``dh``. If parameters are not present, the
values for ``w`` and ``h`` are used.
.. note:: .. note::
Before mpv 0.18.1, you had to do manual "double buffering" when updating Before mpv 0.18.1, you had to do manual "double buffering" when updating

View File

@ -23,7 +23,7 @@
#include "misc/bstr.h" #include "misc/bstr.h"
#include "options/m_option.h" #include "options/m_option.h"
#define MP_CMD_DEF_MAX_ARGS 9 #define MP_CMD_DEF_MAX_ARGS 11
#define MP_CMD_OPT_ARG M_OPT_OPTIONAL_PARAM #define MP_CMD_OPT_ARG M_OPT_OPTIONAL_PARAM
struct mp_log; struct mp_log;

View File

@ -124,6 +124,7 @@ static const struct m_option udata_type = {
struct overlay { struct overlay {
struct mp_image *source; struct mp_image *source;
int x, y; int x, y;
int dw, dh;
}; };
struct hook_handler { struct hook_handler {
@ -4450,8 +4451,8 @@ static void recreate_overlays(struct MPContext *mpctx)
struct sub_bitmap b = { struct sub_bitmap b = {
.bitmap = s->planes[0], .bitmap = s->planes[0],
.stride = s->stride[0], .stride = s->stride[0],
.w = s->w, .dw = s->w, .w = s->w, .dw = o->dw,
.h = s->h, .dh = s->h, .h = s->h, .dh = o->dh,
.x = o->x, .x = o->x,
.y = o->y, .y = o->y,
}; };
@ -4548,7 +4549,12 @@ static void cmd_overlay_add(void *pcmd)
int offset = cmd->args[4].v.i; int offset = cmd->args[4].v.i;
char *fmt = cmd->args[5].v.s; char *fmt = cmd->args[5].v.s;
int w = cmd->args[6].v.i, h = cmd->args[7].v.i, stride = cmd->args[8].v.i; int w = cmd->args[6].v.i, h = cmd->args[7].v.i, stride = cmd->args[8].v.i;
int dw = cmd->args[9].v.i, dh = cmd->args[10].v.i;
if (dw <= 0)
dw = w;
if (dh <= 0)
dh = h;
if (strcmp(fmt, "bgra") != 0) { if (strcmp(fmt, "bgra") != 0) {
MP_ERR(mpctx, "overlay-add: unsupported OSD format '%s'\n", fmt); MP_ERR(mpctx, "overlay-add: unsupported OSD format '%s'\n", fmt);
goto error; goto error;
@ -4565,6 +4571,8 @@ static void cmd_overlay_add(void *pcmd)
.source = mp_image_alloc(IMGFMT_BGRA, w, h), .source = mp_image_alloc(IMGFMT_BGRA, w, h),
.x = x, .x = x,
.y = y, .y = y,
.dw = dw,
.dh = dh,
}; };
if (!overlay.source) if (!overlay.source)
goto error; goto error;
@ -6719,7 +6727,9 @@ const struct mp_cmd_def mp_cmds[] = {
{"fmt", OPT_STRING(v.s)}, {"fmt", OPT_STRING(v.s)},
{"w", OPT_INT(v.i)}, {"w", OPT_INT(v.i)},
{"h", OPT_INT(v.i)}, {"h", OPT_INT(v.i)},
{"stride", OPT_INT(v.i)}, }}, {"stride", OPT_INT(v.i)},
{"dw", OPT_INT(v.i)},
{"dh", OPT_INT(v.i)}, }},
{ "overlay-remove", cmd_overlay_remove, { {"id", OPT_INT(v.i)} } }, { "overlay-remove", cmd_overlay_remove, { {"id", OPT_INT(v.i)} } },
{ "osd-overlay", cmd_osd_overlay, { "osd-overlay", cmd_osd_overlay,