summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.dev>2021-11-25 22:00:30 +0100
committerNiklas Haas <github-daiK1o@haasn.dev>2021-11-28 11:58:53 +0100
commitc66f3b0123508d2a60987065a6ee596ff28bb36b (patch)
treec1b0bc461803d797d39b981a8ea0070b58753ea8
parentf08db00d2613dd96900a85f0e2080aee89bafc4c (diff)
downloadmpv-c66f3b0123508d2a60987065a6ee596ff28bb36b.tar.bz2
mpv-c66f3b0123508d2a60987065a6ee596ff28bb36b.tar.xz
vo_gpu_next: factor out some common helpers
In preparation of VOCTRL_SCREENSHOT support
-rw-r--r--video/out/vo_gpu_next.c106
1 files changed, 63 insertions, 43 deletions
diff --git a/video/out/vo_gpu_next.c b/video/out/vo_gpu_next.c
index be42f95164..1bb2c53418 100644
--- a/video/out/vo_gpu_next.c
+++ b/video/out/vo_gpu_next.c
@@ -596,16 +596,11 @@ static void info_callback(void *priv, const struct pl_render_info *info)
frame->count = index + 1;
}
-static void draw_frame(struct vo *vo, struct vo_frame *frame)
+static void update_options(struct priv *p)
{
- struct priv *p = vo->priv;
- pl_gpu gpu = p->gpu;
if (m_config_cache_update(p->opts_cache))
update_render_options(p);
- p->params.info_callback = info_callback;
- p->params.info_priv = vo;
-
update_lut(p, &p->lut);
p->params.lut = p->lut.lut;
p->params.lut_type = p->lut.type;
@@ -619,6 +614,64 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame)
p->color_adjustment.hue = cparams.hue;
p->color_adjustment.saturation = cparams.saturation;
p->color_adjustment.gamma = cparams.gamma;
+}
+
+static void apply_target_options(struct priv *p, struct pl_frame *target)
+{
+
+ update_lut(p, &p->target_lut);
+ target->lut = p->target_lut.lut;
+ target->lut_type = p->target_lut.type;
+
+#ifdef PL_HAVE_LCMS
+ target->profile = p->icc_profile;
+#endif
+
+ // Colorspace overrides
+ const struct gl_video_opts *opts = p->opts_cache->opts;
+ if (opts->target_prim)
+ target->color.primaries = mp_prim_to_pl(opts->target_prim);
+ if (opts->target_trc)
+ target->color.transfer = mp_trc_to_pl(opts->target_trc);
+ if (opts->target_peak)
+ target->color.sig_peak = opts->target_peak;
+ if (opts->dither_depth > 0) {
+ struct pl_bit_encoding *tbits = &target->repr.bits;
+ tbits->color_depth += opts->dither_depth - tbits->sample_depth;
+ tbits->sample_depth = opts->dither_depth;
+ }
+}
+
+static void apply_crop(struct pl_frame *frame, struct mp_rect crop,
+ int width, int height)
+{
+ frame->crop = (struct pl_rect2df) {
+ .x0 = crop.x0,
+ .y0 = crop.y0,
+ .x1 = crop.x1,
+ .y1 = crop.y1,
+ };
+
+ // mpv gives us rotated/flipped rects, libplacebo expects unrotated
+ pl_rect2df_rotate(&frame->crop, -frame->rotation);
+ if (frame->crop.x1 < frame->crop.x0) {
+ frame->crop.x0 = width - frame->crop.x0;
+ frame->crop.x1 = width - frame->crop.x1;
+ }
+
+ if (frame->crop.y1 < frame->crop.y0) {
+ frame->crop.y0 = height - frame->crop.y0;
+ frame->crop.y1 = height - frame->crop.y1;
+ }
+}
+
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
+{
+ struct priv *p = vo->priv;
+ pl_gpu gpu = p->gpu;
+ update_options(p);
+ p->params.info_callback = info_callback;
+ p->params.info_priv = vo;
// Push all incoming frames into the frame queue
for (int n = 0; n < frame->num_frames; n++) {
@@ -677,31 +730,12 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame)
// Calculate target
struct pl_frame target;
pl_frame_from_swapchain(&target, &swframe);
+ apply_target_options(p, &target);
write_overlays(vo, p->osd_res, 0, OSD_DRAW_OSD_ONLY, &p->osd_state, &target, swframe.flipped);
- target.crop = (struct pl_rect2df) { p->dst.x0, p->dst.y0, p->dst.x1, p->dst.y1 };
+ apply_crop(&target, p->dst, swframe.fbo->params.w, swframe.fbo->params.h);
if (swframe.flipped)
MPSWAP(float, target.crop.y0, target.crop.y1);
- update_lut(p, &p->target_lut);
- target.lut = p->target_lut.lut;
- target.lut_type = p->target_lut.type;
-#ifdef PL_HAVE_LCMS
- target.profile = p->icc_profile;
-#endif
-
- // Target colorspace overrides
- if (opts->target_prim)
- target.color.primaries = mp_prim_to_pl(opts->target_prim);
- if (opts->target_trc)
- target.color.transfer = mp_trc_to_pl(opts->target_trc);
- if (opts->target_peak)
- target.color.sig_peak = opts->target_peak;
- if (opts->dither_depth > 0) {
- struct pl_bit_encoding *tbits = &target.repr.bits;
- tbits->color_depth += opts->dither_depth - tbits->sample_depth;
- tbits->sample_depth = opts->dither_depth;
- }
-
struct pl_frame_mix mix = {0};
if (frame->current) {
// Update queue state
@@ -734,22 +768,8 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame)
// instead flushing the queue on resizes, but doing it this way avoids
// unnecessarily re-uploading frames.
for (int i = 0; i < mix.num_frames; i++) {
- struct pl_frame *img = (struct pl_frame *) mix.frames[i];
- img->crop = (struct pl_rect2df) {
- p->src.x0, p->src.y0, p->src.x1, p->src.y1,
- };
-
- // mpv gives us rotated/flipped rects, libplacebo expects unrotated
- pl_rect2df_rotate(&img->crop, -img->rotation);
- if (img->crop.x1 < img->crop.x0) {
- img->crop.x0 = vo->params->w - img->crop.x0;
- img->crop.x1 = vo->params->w - img->crop.x1;
- }
-
- if (img->crop.y1 < img->crop.y0) {
- img->crop.y0 = vo->params->h - img->crop.y0;
- img->crop.y1 = vo->params->h - img->crop.y1;
- }
+ apply_crop((struct pl_frame *) mix.frames[i], p->src,
+ vo->params->w, vo->params->h);
}
}