Skip to content

Instantly share code, notes, and snippets.

@myfreeer
Last active June 24, 2025 04:30
Show Gist options
  • Select an option

  • Save myfreeer/d744c445aa71c0eeb165ca39cf6c0511 to your computer and use it in GitHub Desktop.

Select an option

Save myfreeer/d744c445aa71c0eeb165ca39cf6c0511 to your computer and use it in GitHub Desktop.
mpv user-script to cycle between lavfi's denoise filters, tested over mpv 0.25.0-58-g99cef59fc
-- settings
-- key_binding: press the key specified below
-- to cycle between denoise filters below,
-- set it to nil to disable the binding
local key_binding = "n"
-- key_binding_reverse cycle between denoise filters below
-- in reverse order, set it to nil to disable the binding,
-- set it to a single-char string to enable
local key_binding_reverse = nil
-- denoisers: specify names of denoise libavfilter filters
-- from `mpv --vf=lavfi=help` command
-- where the last 3 filters (dctdnoiz, owdenoise, nlmeans)
-- are too slow to be used in playback
local denoisers = {
"removegrain"
,"atadenoise"
,"hqdn3d"
,"vaguedenoiser"
-- ,"dctdnoiz"
-- ,"owdenoise"
-- ,"nlmeans"
}
local denoiser_count = #denoisers
local filter_index = 0
local script_name = mp.get_script_name()
local denoise_label = string.format("%s-denoise", script_name)
-- from https://github.com/mpv-player/mpv/blob/39e04e929483847a3e0722d86d53f69837ed99db/TOOLS/lua/autocrop.lua
function del_filter_if_present(label)
-- necessary because mp.command('vf del @label:filter') raises an
-- error if the filter doesn't exist
local vfs = mp.get_property_native("vf")
for i,vf in pairs(vfs) do
if vf["label"] == label then
table.remove(vfs, i)
mp.set_property_native("vf", vfs)
return true
end
end
return false
end
function cycle_denoise()
if not del_filter_if_present(denoise_label) then
filter_index = 0
end
filter_index = filter_index + 1
if filter_index > denoiser_count then
mp.osd_message("denoise filters removed", osd_time)
return
end
-- insert the filter
mp.command(
string.format(
'vf add @%s:lavfi=graph="%s"',
denoise_label, denoisers[filter_index]
)
)
end
function cycle_denoise_reverse()
if not del_filter_if_present(denoise_label) then
filter_index = denoiser_count
else
filter_index = filter_index - 1
end
if filter_index < 1 then
mp.osd_message("denoise filters removed", osd_time)
return
end
-- insert the filter
mp.command(
string.format(
'vf add @%s:lavfi=graph="%s"',
denoise_label, denoisers[filter_index]
)
)
end
if key_binding then
mp.add_key_binding(key_binding, "denoise", cycle_denoise)
end
if key_binding_reverse then
mp.add_key_binding(key_binding_reverse, "denoise-reverse", cycle_denoise_reverse)
end
@veganomy
Copy link
Copy Markdown

@myfreeer That is exactly why I asked. Doesn't work with no-input-default-bindings

@myfreeer
Copy link
Copy Markdown
Author

@myfreeer That is exactly why I asked. Doesn't work with no-input-default-bindings

@veganomy You'll need to change mp.add_key_binding to mp.add_forced_key_binding in line 89 and 93 according to the doc

@veganomy
Copy link
Copy Markdown

veganomy commented Jan 19, 2025

Why not just use forced function in your script? Like what's the point of preventing the bindings from users who do no-input-default-bindings ? Like I don't even use n binding and the script doesn't work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment