Skip to content

Instantly share code, notes, and snippets.

@richardpl
Last active December 1, 2018 20:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save richardpl/02a283eefd9636a15435b1c5596dedeb to your computer and use it in GitHub Desktop.
Save richardpl/02a283eefd9636a15435b1c5596dedeb to your computer and use it in GitHub Desktop.
WIP: scopes picked by menu and windows to set parameters
--[[
mpv scopes
Copyright 2018 Paul B Mahol
License: public domain
--]]
-- ------ config -------
local mp_msg = require 'mp.msg'
local intensity = 0.04
local envelope = 0
local last_key = 1
local set_global_parameters = false
local set_pixscope_parameters = false
local set_oscilloscope_parameters = false
local set_extractplane_parameters = false
local set_brng_parameters = false
local set_limiter_parameters = false
local w_posx = 1
local w_posy = 1
local v_posx = 1
local v_posy = 1
local h_posx = 1
local h_posy = 1
local o_components = 7
local o_posx = 0.5
local o_posy = 0.5
local p_posx = 0.5
local p_posy = 0.5
local p_w = 7
local p_h = 7
local tilt = 0.5
local graticule = 0
local e_plane = "y"
local brng_red = 0xFF
local brng_green = 0xFF
local brng_blue = 0x00
local limiter_min = 0
local limiter_speed = 1
local limiter_max = 255
local limiter_planes = 7
local function get_filter(key)
local filters = {
{filter = {'null'}},
{filter = {'waveform=f=acolor:i='..intensity..':g='..graticule..':e='..envelope}},
{filter = {'vectorscope=m=color3:i='..intensity..':g='..graticule..':e='..envelope}},
{filter = {'histogram'}},
{filter = {'split=4[a][b][c][d],[a]waveform=g='..graticule..':i='..intensity..':e='..envelope..'[a],[b]waveform=g='..graticule..':mode=row:i='..intensity..':e='..envelope..':[b],[c]vectorscope=g='..graticule..':i='..intensity..':e='..envelope..':[c],[d][a][b][c]xstack=4:layout=0_0|0_h0|w0_0|w0_h0'}},
{filter = {'split=9[a][b][c][d][e][f][g][h][i],[a]waveform=g='..graticule..':i='..intensity..':e='..envelope..'[a],[b]waveform=g='..graticule..':i='..intensity..':e='..envelope..':f=acolor[b],[d]waveform=g='..graticule..':i='..intensity..':e='..envelope..':mode=row[d],[e]vectorscope=g='..graticule..':i='..intensity..':e='..envelope..'[e],[f]vectorscope=color2:g='..graticule..':i='..intensity..':e='..envelope..'[f],[g]vectorscope=m=color:g='..graticule..':i='..intensity..':e='..envelope..'[g],[h]waveform=m=row:f=acolor:g='..graticule..':i='..intensity..':e='..envelope..'[h],[i]vectorscope=g='..graticule..':i='..intensity..':e='..envelope..':m=color3[i],[a][b][c][d][e][f][g][h][i]xstack=inputs=9:layout=w3_0|w3_h0+h2|w3_h0|0_h4|0_0|w3+w1_0|0_h1+h2|w3+w1_h0|w3+w1_h1+h2'}},
{filter = {'oscilloscope=x='..o_posx..':y='..o_posy..':t='..tilt..':c='..o_components}},
{filter = {'split[a][b],[a]vectorscope=g='..graticule..':i='..intensity..':e='..envelope..':m=color3,format=yuva444p|yuva444p9|yuva444p10[a],[b][a]overlay=x=(W-w)*'..v_posx..':y=(H-h)*'..v_posy}},
{filter = {'split[a][b],[a]waveform=g='..graticule..':f=acolor:i='..intensity..':e='..envelope..',format=yuva444p|yuva444p9|yuva444p10[a],[b][a]overlay=x=(W-w)*'..w_posx..':y=(H-h)*'..w_posy}},
{filter = {'split[a][b],[a]histogram=d=parade,format=yuva444p|yuva444p9|yuva444p10[a],[b][a]overlay=x=(W-w)*'..h_posx..':y=(H-h)*'..h_posy}},
{filter = {'waveform=g='..graticule..':fl=numbers+dots:s=ire:i='..intensity..':e='..envelope}},
{filter = {'waveform=m=row:g='..graticule..':fl=numbers+dots:s=ire:i='..intensity..':e='..envelope}},
{filter = {'vectorscope=g='..graticule..':i='..intensity..':e='..envelope}},
{filter = {'split=4[a][b][c][d],[a]vectorscope=m=3:g='..graticule..':i='..intensity..'[a],[b]vectorscope=m=3:g='..graticule..':i='..intensity..':l=0:h=.3[b],[c]vectorscope=m=3:g='..graticule..':i='..intensity..':l=.3:h=.6[c],[d]vectorscope=m=3:g='..graticule..':i='..intensity..':l=.6:h=1[d],[a][b][c][d]xstack=inputs=4:0_0|w0_0|0_h0|w0_h0'}},
{filter = {'histogram=d=parade'}},
{filter = {'pixscope=x='..p_posx..':y='..p_posy..':w='..p_w..':h='..p_h}},
{filter = {'format=yuv444p|yuv422p|yuv420p|yuv444p|yuv410p,extractplanes=u+v,hstack'}},
{filter = {'format=yuv444p|yuv422p|yuv420p|yuv444p|yuv410p,extractplanes='..e_plane}},
{filter = {'tblend=all_mode=grainextract'}},
{filter = {'signalstats=out=brng:c=0x'..string.format("%02x", brng_red)..string.format("%02x", brng_green)..string.format("%02x", brng_blue)}},
{filter = {'limiter=min='..limiter_min..':max='..limiter_max..':planes='..limiter_planes}},
}
return filters[key].filter
end
-- the mpv command string for adding the filter
local function get_cmd(filter)
return 'no-osd vf set lavfi=[' .. filter[1] .. ']'
end
local function bool_to_number(value)
return value == true and 1 or value == false and 0
end
local function show_menu()
mp.gui_new_frame();
mp.gui_set_next_window_bg_alpha(0.5)
if mp.gui_begin_main_menu_bar() then
if mp.gui_begin_menu("Filters", 1) then
if mp.gui_menu_item_bool("None", 0, 1) then
mp.command(get_cmd(get_filter(1)))
last_key = 1
end
if mp.gui_menu_item_bool("Color Waveform", 0, 1) then
mp.command(get_cmd(get_filter(2)))
last_key = 2
end
if mp.gui_menu_item_bool("Color Vectorscope", 0, 1) then
mp.command(get_cmd(get_filter(3)))
last_key = 3
end
if mp.gui_menu_item_bool("Histogram", 0, 1) then
mp.command(get_cmd(get_filter(4)))
last_key = 4
end
if mp.gui_menu_item_bool("Filter Combo 4", 0, 1) then
mp.command(get_cmd(get_filter(5)))
last_key = 5
end
if mp.gui_menu_item_bool("Oscilloscope", 0, 1) then
mp.command(get_cmd(get_filter(7)))
last_key = 7
end
if mp.gui_menu_item_bool("Overlaid Vectorscope", 0, 1) then
mp.command(get_cmd(get_filter(8)))
last_key = 8
end
if mp.gui_menu_item_bool("Overlaid Waveform", 0, 1) then
mp.command(get_cmd(get_filter(9)))
last_key = 9
end
if mp.gui_menu_item_bool("Overlaid Histogram", 0, 1) then
mp.command(get_cmd(get_filter(10)))
last_key = 10
end
if mp.gui_menu_item_bool("Pixel Scope", 0, 1) then
mp.command(get_cmd(get_filter(16)))
last_key = 16
end
if mp.gui_menu_item_bool("Extract Planes UV Equal", 0, 1) then
mp.command(get_cmd(get_filter(17)))
last_key = 17
end
if mp.gui_menu_item_bool("Extract Plane", 0, 1) then
mp.command(get_cmd(get_filter(18)))
last_key = 18
end
if mp.gui_menu_item_bool("Temporal Difference", 0, 1) then
mp.command(get_cmd(get_filter(19)))
last_key = 19
end
if mp.gui_menu_item_bool("Broadcast Range Pixels", 0, 1) then
mp.command(get_cmd(get_filter(20)))
last_key = 20
end
if mp.gui_menu_item_bool("Limiter", 0, 1) then
mp.command(get_cmd(get_filter(21)))
last_key = 21
end
mp.gui_end_menu()
end
if mp.gui_begin_menu("Parameters", 1) then
if mp.gui_menu_item_bool("Set global parameters", 0, 1) then
set_global_parameters = not set_global_parameters
end
if mp.gui_menu_item_bool("Set oscilloscope parameters", 0, 1) then
set_oscilloscope_parameters = not set_oscilloscope_parameters
end
if mp.gui_menu_item_bool("Set pixel scope parameters", 0, 1) then
set_pixscope_parameters = not set_pixscope_parameters
end
if mp.gui_menu_item_bool("Set extract plane parameters", 0, 1) then
set_extractplane_parameters = not set_extractplane_parameters
end
if mp.gui_menu_item_bool("Set broadcast range pixels parameters", 0, 1) then
set_brng_parameters = not set_brng_parameters
end
if mp.gui_menu_item_bool("Set limiter parameters", 0, 1) then
set_limiter_parameters = not set_limiter_parameters
end
mp.gui_end_menu()
end
mp.gui_end_main_menu_bar()
end
if set_global_parameters then
local can_draw = 0
can_draw, set_global_parameters = mp.gui_begin("global parameters", bool_to_number(set_global_parameters))
if can_draw then
new_intensity = mp.gui_slider_float("intensity", intensity, 0, 1)
if new_intensity ~= intensity then
intensity = new_intensity
end
new_envelope = mp.gui_slider_int("envelope", envelope, 0, 3)
if new_envelope ~= envelope then
envelope = new_envelope
end
new_graticule = mp.gui_slider_int("graticule", graticule, 0, 2)
if new_graticule ~= graticule then
graticule = new_graticule
end
mp.gui_button("apply", 0, 0)
if mp.gui_is_item_clicked(0) then
mp.command(get_cmd(get_filter(last_key)))
end
mp.gui_end()
end
end
if set_oscilloscope_parameters then
local can_draw = 0
can_draw, set_oscilloscope_parameters = mp.gui_begin("oscilloscope parameters", bool_to_number(set_oscilloscope_parameters))
if can_draw then
new_o_posx = mp.gui_slider_float("position X", o_posx, 0, 1)
if new_o_posx ~= o_posx then
o_posx = new_o_posx
end
new_o_posy = mp.gui_slider_float("position Y", o_posy, 0, 1)
if new_o_posy ~= o_posy then
o_posy = new_o_posy
end
new_tilt = mp.gui_slider_float("tilt", tilt, 0, 1)
if new_tilt ~= tilt then
tilt = new_tilt
end
new_o_components = mp.gui_slider_int("components", o_components, 0, 15)
if new_o_components ~= o_components then
o_components = new_o_components
end
mp.gui_button("apply", 0, 0)
if mp.gui_is_item_clicked(0) then
mp.command(get_cmd(get_filter(last_key)))
end
mp.gui_end()
end
end
if set_pixscope_parameters then
local can_draw = 0
can_draw, set_pixscope_parameters = mp.gui_begin("pixel scope parameters", bool_to_number(set_pixscope_parameters))
if can_draw then
new_p_posx = mp.gui_slider_float("position X", p_posx, 0, 1)
if new_p_posx ~= p_posx then
p_posx = new_p_posx
end
new_p_posy = mp.gui_slider_float("position Y", p_posy, 0, 1)
if new_p_posy ~= p_posy then
p_posy = new_p_posy
end
new_p_w = mp.gui_slider_int("width", p_w, 1, 80)
if new_p_w ~= p_w then
p_w = new_p_w
end
new_p_h = mp.gui_slider_int("height", p_h, 1, 80)
if new_p_h ~= p_h then
p_h = new_p_h
end
mp.gui_button("apply", 0, 0)
if mp.gui_is_item_clicked(0) then
mp.command(get_cmd(get_filter(last_key)))
end
mp.gui_end()
end
end
if set_extractplane_parameters then
local can_draw = 0
can_draw, set_extractplane_parameters = mp.gui_begin("extract plane parameters", bool_to_number(set_extractplane_parameters))
local plane
if e_plane == "y" then
plane = 0
end
if e_plane == "u" then
plane = 1
end
if e_plane == "v" then
plane = 2
end
if can_draw then
new_plane = mp.gui_slider_int("plane", plane, 0, 2)
if new_plane ~= plane then
plane = new_plane
if plane == 0 then
e_plane = "y"
end
if plane == 1 then
e_plane = "u"
end
if plane == 2 then
e_plane = "v"
end
end
mp.gui_button("apply", 0, 0)
if mp.gui_is_item_clicked(0) then
mp.command(get_cmd(get_filter(last_key)))
end
mp.gui_end()
end
end
if set_brng_parameters then
local can_draw = 0
local got_color = 0
can_draw, set_brng_parameters = mp.gui_begin("broadcast range pixels parameters", bool_to_number(set_brng_parameters))
local r = brng_red / 255.
local g = brng_green / 255.
local b = brng_blue / 255.
if can_draw then
got_color, r, g, b = mp.gui_color_picker3("color", r, g, b)
if got_color then
brng_red = math.floor(r * 255)
brng_green = math.floor(g * 255)
brng_blue = math.floor(b * 255)
end
mp.gui_button("apply", 0, 0)
if mp.gui_is_item_clicked(0) then
mp.command(get_cmd(get_filter(last_key)))
end
mp.gui_end()
end
end
if set_limiter_parameters then
local can_draw = 0
can_draw, set_limiter_parameters = mp.gui_begin("limiter parameters", bool_to_number(set_limiter_parameters))
if can_draw then
new_speed = mp.gui_drag_int("speed", limiter_speed, 1, 1, 8192)
if new_speed ~= limiter_speed then
limiter_speed = new_speed
end
new_min = mp.gui_drag_int("min", limiter_min, limiter_speed, 0, 65535)
if new_min ~= limiter_min then
limiter_min = new_min
end
new_max = mp.gui_drag_int("max", limiter_max, limiter_speed, 0, 65535)
if new_max ~= limiter_max then
limiter_max = new_max
end
new_planes = mp.gui_slider_int("planes", limiter_planes, 0, 15)
if new_planes ~= limiter_planes then
limiter_planes = new_planes
end
mp.gui_button("apply", 0, 0)
if mp.gui_is_item_clicked(0) then
mp.command(get_cmd(get_filter(last_key)))
end
mp.gui_end()
end
end
mp.gui_end_frame()
end
mp.register_event("tick", show_menu)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment