Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/videolan/dav1d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.xyz>2019-09-15 03:40:59 +0300
committerJean-Baptiste Kempf <jb@videolan.org>2019-09-28 01:31:02 +0300
commitf6ae8c9c7764d681e1e05f277fd97451636cc6d4 (patch)
treed6427bbd15c5ab2cc0a5b46fe24b24a0a6716158 /examples
parentc0865f35c74bdcc71021630f64dca2db35d2bc8c (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.c24
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();
}