diff options
author | Niklas Haas <git@haasn.xyz> | 2019-09-15 03:40:59 +0300 |
---|---|---|
committer | Jean-Baptiste Kempf <jb@videolan.org> | 2019-09-28 01:31:02 +0300 |
commit | f6ae8c9c7764d681e1e05f277fd97451636cc6d4 (patch) | |
tree | d6427bbd15c5ab2cc0a5b46fe24b24a0a6716158 /examples | |
parent | c0865f35c74bdcc71021630f64dca2db35d2bc8c (diff) |
dav1dplay: add --highquality to toggle render quality
Only meaningful with libplacebo. The defaults are higher quality than
SDL so it's an unfair comparison and definitely too much for slow iGPUs
at 4K res. Make the defaults fast/dumb processing only, and guard the
debanding/dithering/upscaling/etc. behind a new --highquality flag.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/dav1dplay.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/examples/dav1dplay.c b/examples/dav1dplay.c index faf51e7..0bdea05 100644 --- a/examples/dav1dplay.c +++ b/examples/dav1dplay.c @@ -28,6 +28,7 @@ #include "vcs_version.h" #include <getopt.h> +#include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <string.h> @@ -48,6 +49,7 @@ */ typedef struct { const char *inputfile; + int highquality; } Dav1dPlaySettings; #define WINDOW_WIDTH 910 @@ -156,7 +158,7 @@ typedef struct rdr_info // Callback to destroy the renderer void (*destroy_renderer)(void *cookie); // Callback to the render function that renders a prevously sent frame - void (*render)(void *cookie); + void (*render)(void *cookie, const Dav1dPlaySettings *settings); // Callback to the send frame function int (*update_frame)(void *cookie, Dav1dPicture *dav1d_pic); } Dav1dPlayRenderInfo; @@ -325,7 +327,7 @@ static void placebo_renderer_destroy(void *cookie) pl_context_destroy(&(rd_priv_ctx->ctx)); } -static void placebo_render(void *cookie) +static void placebo_render(void *cookie, const Dav1dPlaySettings *settings) { Dav1dPlayRendererPrivateContext *rd_priv_ctx = cookie; assert(rd_priv_ctx != NULL); @@ -358,8 +360,9 @@ static void placebo_render(void *cookie) .height = img->params.h, }; - struct pl_render_params render_params = pl_render_default_params; - //render_params.upscaler = &pl_filter_ewa_lanczos; + struct pl_render_params render_params = {0}; + if (settings->highquality) + render_params = pl_render_default_params; struct pl_render_target target; pl_render_target_from_swapchain(&target, &frame); @@ -516,7 +519,7 @@ static void sdl_renderer_destroy(void *cookie) free(rd_priv_ctx); } -static void sdl_render(void *cookie) +static void sdl_render(void *cookie, const Dav1dPlaySettings *settings) { Dav1dPlayRendererPrivateContext *rd_priv_ctx = cookie; assert(rd_priv_ctx != NULL); @@ -649,6 +652,7 @@ static void dp_settings_print_usage(const char *const app, " --input/-i $file: input file\n" " --framethreads $num: number of frame threads (default: 1)\n" " --tilethreads $num: number of tile threads (default: 1)\n" + " --highquality: enable high quality rendering\n" " --version/-v: print version and exit\n"); exit(1); } @@ -677,6 +681,7 @@ static void dp_rd_ctx_parse_args(Dav1dPlayRenderContext *rd_ctx, enum { ARG_FRAME_THREADS = 256, ARG_TILE_THREADS, + ARG_HIGH_QUALITY, }; // Long options @@ -685,6 +690,7 @@ static void dp_rd_ctx_parse_args(Dav1dPlayRenderContext *rd_ctx, { "version", 0, NULL, 'v' }, { "framethreads", 1, NULL, ARG_FRAME_THREADS }, { "tilethreads", 1, NULL, ARG_TILE_THREADS }, + { "highquality", 0, NULL, ARG_HIGH_QUALITY }, { NULL, 0, NULL, 0 }, }; @@ -696,6 +702,12 @@ static void dp_rd_ctx_parse_args(Dav1dPlayRenderContext *rd_ctx, case 'v': fprintf(stderr, "%s\n", dav1d_version()); exit(0); + case ARG_HIGH_QUALITY: + settings->highquality = true; +#ifndef HAVE_PLACEBO_VULKAN + fprintf(stderr, "warning: --highquality requires libplacebo\n"); +#endif + break; case ARG_FRAME_THREADS: lib_settings->n_frame_threads = parse_unsigned(optarg, ARG_FRAME_THREADS, argv[0]); @@ -862,7 +874,7 @@ static void dp_rd_ctx_render(Dav1dPlayRenderContext *rd_ctx) fprintf(stderr, "Frame displayed %f seconds too late\n", wait_time/(float)1000); } - renderer_info.render(rd_ctx->rd_priv); + renderer_info.render(rd_ctx->rd_priv, &rd_ctx->settings); rd_ctx->last_ticks = SDL_GetTicks(); } |