Page 1 of 1

Calling vlc.var.set(input, "time") in input callback

Posted: 02 Aug 2013 09:18
by kuway
Hi,
I'm working on a script which can skip some sections I'm not interested in a video file, for example, skip the commercials or timeout section for a sports game. I think this can be done by implementing a VLC extension lua module.

The basic algorithm is like below, when the first time I watch the video, I skip these sections manually, and during the playback, I keep the start-end positions of each skipped sections in the script, and finally write down those data into a file when the playback ended. Next time when I play the same video file, the script will load the skipped sections, and whenever the playback time reach some skip section, the script will skip it by calling vlc.var.set(input, "time", nextPos).

However, I was blocked because when I call vlc.var.set(input, "time", nextPos) in the input callback function, VLC freeze and doesn't response to any user action, I can close the VLC main window, but the process is still alive so I need to use the task manager to kill the process. I try to put the code piece in another functions like activate() and input_changed(), and it works fine. I guess maybe do it in the callback function may hit some deadlock, but as long as this issue exist, there should be no other way to do my subject. Does anyone know how to work around this issue?

Below is the sample code to reproduce this issue, I work on a Windows 7 PC, VLC version 2.07,

-- Extension description
function descriptor()
return {
title = "Change Time Test" ;
version = "1.0" ;
author = "Kuway" ;
url = 'http://www.google.com';
shortdesc = "Change play position(time) in lua";
description = "Try to change position(time) of input in the input listener callback";
capabilities = { "input-listener" }
}
end

input = 0


function input_event_handler(var, old, new, data)

local CurrentPos = vlc.var.get(input, "time")

if CurrentPos % 10 < 1 then
vlc.var.set(input, "time", CurrentPos + 5)
end

end

function input_changed()
if input ~=0 then
-- Delete old callback
vlc.var.del_callback(input, "intf-event", input_event_handler, "Change time")
end

input = vlc.object.input()

if input ~= 0 then
vlc.var.add_callback(input, "intf-event", input_event_handler, "Change time")
end
end


function activate()
if vlc.object.input() then
input_changed()
end
end


function deactivate()
if input then
vlc.var.del_callback(input, "intf-event", input_event_handler, "Change time")
end
end

function meta_changed()
end

Re: Calling vlc.var.set(input, "time") in input callback

Posted: 02 Aug 2013 15:13
by mederi
The same idea is on my to-do list of enhancements for my Subtitler extension (if subtitle text starts with [SKIP] or [MUTE] command, then perform appropriate action). O.K. I am going to look at it now, whether I am able to help you.

Re: Calling vlc.var.set(input, "time") in input callback

Posted: 02 Aug 2013 22:50
by mederi
Please test the code and read my comments in function input_event_handler().

Code: Select all

-- Extension description function descriptor() return { title = "Change Time Test - revision" ; version = "1.0" ; author = "Kuway" ; url = 'http://www.google.com'; shortdesc = "Change play position(time) in lua"; description = "Try to change position(time) of input in the input listener callback"; capabilities = { "input-listener" } } end input = 0 parts_to_skip = {{5,10}, {20,28}} -- start time, end time couples like in subtitles function input_event_handler(var, old, new, data) local CurrentPos = vlc.var.get(input, "time") -- Watch values in VLC menu: Tools -> Messages window. vlc.msg.info("[test] CurrentPos=" .. CurrentPos .. " (".. CurrentPos % 10 ..") / os.clock()=".. os.clock() .." / Event code: new=".. new) -- Use subtitling core from Subtitler (lite) extension if you do not have a better idea. if not skip then skip_example=parts_to_skip[1] if CurrentPos>=skip_example[1] and CurrentPos<skip_example[2] then skip=skip_example --(1) VLC-1.1.x only: --vlc.var.set(input, "time", skip[2]) --(1x) --(2) VLC-2.0.x workaround according to a solution in Sampler 1.1 extension: local duration = vlc.var.get(input,"length") vlc.var.set(input,"position", skip[2] / duration) --(2x) vlc.msg.info("[test] !!! Go to new position (time) !!!") end else if CurrentPos>=skip[2] or CurrentPos<skip[1] then skip=nil end end --[[ if CurrentPos % 10 < 1 then vlc.var.set(input, "time", CurrentPos + 5) end --]] end function input_changed() if input ~=0 then -- Delete old callback vlc.var.del_callback(input, "intf-event", input_event_handler, "Change time") end input = vlc.object.input() if input ~= 0 then vlc.var.add_callback(input, "intf-event", input_event_handler, "Change time") end end function activate() if vlc.object.input() then input_changed() end end function deactivate() if input then vlc.var.del_callback(input, "intf-event", input_event_handler, "Change time") end end function meta_changed() end
http://trac.videolan.org/vlc/ticket/6527#comment:3
...
As a workaround, set the position instead of time:

Code: Select all

-- vlc.var.set(input, "time", goto_time) local duration = vlc.input.item():duration() vlc.var.set(input,"position", goto_time / duration)
...
Subtitler (lite)

Re: Calling vlc.var.set(input, "time") in input callback

Posted: 03 Aug 2013 13:51
by evilperro
The same idea is on my to-do list of enhancements for my Subtitler extension (if subtitle text starts with [SKIP] or [MUTE] command, then perform appropriate action). O.K. I am going to look at it now, whether I am able to help you.
As I requested here please also try to implement a feature where the user himself can choose keywords that will prompt the skip. This would work well with series that have an intro-song that is subbed. With your approach the uploader of the .srt file has to write these commands. Sure the user could manually insert the commands in all the subtitle files in a given folder using search and replace or some more advanced software that could autoamte it, but would be far simpler [for user] if keywords could just be added to a list which the extension look for when a given video file is played.

Thanks for getting the ball rolling, I can't believe after all these years this hasn't been done yet. Not in other players as well it seems, tried googling it. Sure there's the chapter skip, but not all videos have chapters.