@@ -170,6 +170,8 @@ struct priv {
170170 bool target_hint ;
171171
172172 float corner_rounding ;
173+ float sharpen ;
174+ const struct pl_hook * sharpen_hook ;
173175
174176 struct pl_hdr_metadata last_hdr_metadata ;
175177};
@@ -1875,6 +1877,8 @@ static void uninit(struct vo *vo)
18751877 pl_tex_destroy (p -> gpu , & p -> sub_tex [i ]);
18761878 for (int i = 0 ; i < p -> num_user_hooks ; i ++ )
18771879 pl_mpv_user_shader_destroy (& p -> user_hooks [i ].hook );
1880+ if (p -> sharpen_hook )
1881+ pl_mpv_user_shader_destroy (& p -> sharpen_hook );
18781882
18791883 if (vo -> hwdec_devs ) {
18801884 ra_hwdec_mapper_free (& p -> hwdec_mapper );
@@ -2202,6 +2206,41 @@ static void update_hook_opts(struct priv *p, char **opts, const char *shaderpath
22022206 }
22032207}
22042208
2209+ static const struct pl_hook * create_sharpen_hook (struct priv * p , float param )
2210+ {
2211+ if (param == 0.0f )
2212+ return NULL ;
2213+
2214+ const char * sharpen_shader = talloc_asprintf (p ,
2215+ "//!HOOK MAIN\n"
2216+ "//!BIND HOOKED\n"
2217+ "//!DESC Sharpen (unsharp mask)\n"
2218+ "\n"
2219+ "vec4 hook()\n"
2220+ "{\n"
2221+ " float st1 = 1.2;\n"
2222+ " vec4 p = HOOKED_tex(HOOKED_pos);\n"
2223+ " vec4 sum1 = HOOKED_texOff(st1 * vec2(+1.0, +1.0))\n"
2224+ " + HOOKED_texOff(st1 * vec2(+1.0, -1.0))\n"
2225+ " + HOOKED_texOff(st1 * vec2(-1.0, +1.0))\n"
2226+ " + HOOKED_texOff(st1 * vec2(-1.0, -1.0));\n"
2227+ " float st2 = 1.5;\n"
2228+ " vec4 sum2 = HOOKED_texOff(st2 * vec2(+1.0, 0.0))\n"
2229+ " + HOOKED_texOff(st2 * vec2( 0.0, +1.0))\n"
2230+ " + HOOKED_texOff(st2 * vec2(-1.0, 0.0))\n"
2231+ " + HOOKED_texOff(st2 * vec2( 0.0, -1.0));\n"
2232+ " vec4 t = p * 0.859375 + sum2 * -0.1171875 + sum1 * -0.09765625;\n"
2233+ " return p + t * %f;\n"
2234+ "}\n" ,
2235+ param );
2236+
2237+ const struct pl_hook * hook = pl_mpv_user_shader_parse (p -> gpu , sharpen_shader , strlen (sharpen_shader ));
2238+ if (!hook )
2239+ MP_ERR (p , "Failed to create sharpen shader hook\n" );
2240+
2241+ return hook ;
2242+ }
2243+
22052244static void update_render_options (struct vo * vo )
22062245{
22072246 struct priv * p = vo -> priv ;
@@ -2352,6 +2391,20 @@ static void update_render_options(struct vo *vo)
23522391 }
23532392 }
23542393
2394+ if (p -> sharpen != 0.0f ) {
2395+ if (p -> sharpen_hook )
2396+ pl_mpv_user_shader_destroy (& p -> sharpen_hook );
2397+
2398+ p -> sharpen_hook = create_sharpen_hook (p , p -> sharpen );
2399+ if (p -> sharpen_hook )
2400+ MP_TARRAY_APPEND (p , p -> hooks , pars -> params .num_hooks , p -> sharpen_hook );
2401+ } else {
2402+ if (p -> sharpen_hook ) {
2403+ pl_mpv_user_shader_destroy (& p -> sharpen_hook );
2404+ p -> sharpen_hook = NULL ;
2405+ }
2406+ }
2407+
23552408 pars -> params .hooks = p -> hooks ;
23562409}
23572410
@@ -2398,6 +2451,7 @@ const struct vo_driver video_out_default = {
23982451 {"image-lut-type" , OPT_CHOICE_C (image_lut .type , lut_types )},
23992452 {"target-lut" , OPT_STRING (target_lut .opt ), .flags = M_OPT_FILE },
24002453 {"target-colorspace-hint" , OPT_BOOL (target_hint )},
2454+ {"sharpen" , OPT_FLOAT (sharpen )},
24012455 // No `target-lut-type` because we don't support non-RGB targets
24022456 {"libplacebo-opts" , OPT_KEYVALUELIST (raw_opts )},
24032457 {0 }
0 commit comments