OverLua provides a Lua 5.1 runtime environment with access to all standard libraries. The Avisynth filter ------------------- The Avisynth filter version of OverLua exports one function: OverLua(clip c, string scriptfile, string "datastring", string "vfrfile") The clip c argument is self-explanatory, the clip to render on. The scripfile is the path to the Lua script you want to load and run. datastring is a freeform string to pass to the Lua script. This will often be the path to a file with additional data for the script, such as timed subtitles/karaoke. vfrfile is the path to a timecode file Matroska format 1 or 2. If supplied, it will be used to translate frame numbers to timestamps instead of relying on the frame rate provided by Avisynth. VFR support is not implemented yet. API the Lua script must implement --------------------------------- Any initialisation, such as loading external data files, should be done in the Lua script's global environment. OverLua expects one function in the script: function render_frame(frame, timestamp) The function name must be literal "render_frame". It must not be local. The "frame" parameter is a userdata object representing the video frame there must be rendered to. Other functions take this object as parameter. The "timestamp" parameter is a value of type "number", representing the timestamp of the frame to be rendered, in seconds. The timestamp may be non-integer with any precision. The render_frame function should not return anything. Instead it modifies the frame object. The render_frame function should not assume that frames are requested in any specific order. If a "datastring" argument is supplied to the OverLua Avisynth function, the argument value will be available through the global variable "overlua_datastring" in the Lua script environment. The frame object ---------------- The "frame" object passed to the render_frame function has a number of fields accessible. The frame is always stored as RGB. No alpha channel is supported. frame.width An integer number storing the width of the frame in pixels. Read only. frame.height An integer number storing the height of the frame in pixels. Read only. red, green, blue = frame(x, y) "red", "green" and "blue" will be numbers in range 0..255 that will receive the respective colour channel values for the requested pixel. "x" and "y" are the pixel coordinates for the pixel to retrieve Pixel coordinates are counted from zero and start in the upper left corner. A pixel with coordinates (X, Y) has pixel number Y*frame.width+X. frame[n] = {red, green, blue} Set the value of the given pixel. The table on the right side of the equal sign must have at least three entries which must all be numbers. They are taken as red, green and blue values respectively, in regular enumeration order. "n" is the pixel number to be set. A pixel with coordinates (X, Y) has pixel number Y*frame.width+X. Using a table constructor as shown is recommended. surface = frame.create_cairo_surface() Create a Cairo rgb24 surface from the video frame. Drawing to the surface will _not_ affect the video frame. If you want the changes to the surface visible on the video you will need to overlay this surface on the video. frame.overlay_cairo_surface(surface, x, y) Overlay the given Cairo surface at the video frame such that the upper, left corner of the surface is positioned at pixel (x, y) on the video. Only argb32 and rgb24 type surfaces are supported. Proper alpha blending is used for argb32 surfaces. Setting a pixel value for a pixel outside the frame has no effect. Specifically, it will not produce an error or a warning message. Reading a pixel value for a pixel outside the frame will return black, ie. (0, 0, 0). Vector graphics interface ------------------------- OverLua uses the Cairo library for all vector graphics handling, including text handling. See lua-cairo.txt for details. Raster graphics processing interface ------------------------------------ A raster graphics processing interface is also provided, to post-process the graphics produced by the vector graphics interface. The raster graphics interface operates directly on Cairo surfaces. raster.gaussian_blur(surface, sigma) Applies a strength sigma gaussian blur on the surface. raster.box3(surface, repetitions) raster.box5(sutface, repetitions) raster.box15(surface, repetitions) Applies a box filter (blur) of various sizes to the surface as many times as specified. Please note that no specific optimisation is done for applying box filters over more general filters and using box blur over gaussian blur is probably no faster and might even be slower. More filtering functions are planned, though no specifics yet. Wishes/suggestions are welcome, and so are patches to add more functions.