Everything is moving

I’ve now switched to using git instead of subversion and the project is now located on github instead of google code. The links to the left for the bug tracker and source have been updated to reflect this.

This website is also going to switch host because dreamhost is slow and ridiculously expensive to use after the first year compared to what you actually get. Because of this the website may be down for a few days until everything is set up again. The domain switch should happen any day now…

Here’s a picture of a snail to illustrate the R19 release process:SAMSUNG CSC

Slowing Down

My previous post about looking for work was a lot more successful that I expected so I’ve been busy with work recently. The project isn’t dead though, I intend to continue with the improvements until at least the QTGMC script can run well using only native plugins.

I’ve already started working on some minor scripting changes. The most noticeable one being that python scripts will now be using a singleton pattern for the core (may change some more but from R19 vs.get_core() is the most appropriate way to obtain a core instance).

Oh, and apparently R18 may be one memory leak bug short of beta quality and I’ll try to hunt that one down tomorrow…

R18 – Beta Quality

I’m back on my release early and often schedule… or at least something resembling it. This is a big bug fix release and officially brings the core of VapourSynth to beta quality. Less memory will be leaked and pressing F2 in VirtualDub is no longer the fastest way to run out of address space and crash.

There are only a few more things to add and change but the goal is getting closer. Report any bug you find no matter how small it is. The focus of the next release will be on performance and I’m interested in all speed comparisons between VapourSynth and Avisynth, especially the single threaded versions.

You should also check out Chikuzen’s GenericFilters which implement almost all missing features from masktools that aren’t already present in the core. This has made it possible to port a few more scripts to be fully native.

If you’re curious about the future direction and changes go check out the bug tracker. I use it as a place to write down most planned enhancements as well and scribble a row or two about it. I have also been commissioned to make an image writer plugin based on ImageMagick so that will most likely show up before R19.

R17 – A Soft Package

It took a bit longer than I anticipated to get R17 done but it’s finally done enough. The highlights are:

  • User contributions! – this is the first release where several fixes and parts were contributed by other people
  • The new Expr filter (similar to mt_lutxyz) which can evaluate expressions per pixels during run-time
  • A subtitle filter based on libass (inappropriately named assvapour)
  • Lots of bugfixes, for example AVISource should now be usable with all formats and alpha output
  • Even stricter checks for filters – the ongoing work to detect common coding and API usage errors continues

With this release a few more popular scripts can be implemented using only VapourSynth filters, however the work will continue to recreate the missing common filters from masktools. I would appreciate some help in implementing equivalents to mt_edge, mt_inpand, mt_expand, mt_inflate and mt_deflate. It’s a simple project and good for someone who wants to get started writing filters and help out, I just happen to want to start with the challenging stuff. MVTools. The core part of several of the most powerful Avisynth scripts and a something that could certainly use a rewrite.

Finally Using the Bug Tracker

I’ve added link to the bug tracker on Google Code and I will be checking it a lot more often. It’s the best way of submitting documentation corrections as well. Just remember to quickly check the closed reports too because I usually only upload a new documentation revision when a new version is released of VapourSynth. You can find the link in the sidebar.

R16 – The Slightly Less Broken Release

R15 had a serious issue that prevented the Avisynth compatibility stuff from working with anything except YV12, this release mainly fixes it. There isn’t much else new of interest in this release.

If you need more stuff to fidget with then go try the new resizers for VapourSynth too. They will most likely replace swscale once they become stable so testing is appreciated. They’re based on the dither tools code.

Next on my own todo list is a plugin to evaluate expressions at run-time, think mt_lutxy(z) but without insane memory requirements for 16bit formats. The other thing on the list mostly is about VSFS and that is to improve error handling and adapt the code to the latest Pismo File Mount API.

R15 – API Improvements

The time has come to break the API slightly to add some missing features. It also ends the alpha support discussion. The proper (and only) way to handle alpha is to return it as a separate mask clip. To make this easier filters now have a reasonably simple API to return more than one clip.

The new filters this time try to fill in some of the biggest feature holes, they are Merge, MaskedMerge and AVISource. MaskedMerge is very similar to masktool’s mt_merge in terms of functionality and the other two are very similar to the internal Avisynth filters with the same name. AVISource can of course open both VapourSynth and Avisynth scripts for import too.

There are also minor changes that need to be done to make plugins compile (binary compatibility with old plugins is however preserved). Previously the VSNodeRef type was always declared as const, this superfluous const declaration has now been removed everywhere in the API. Below are examples of the other two changes needed.

vsapi->setVideoInfo(a, b);
Change it to:
vsapi->setVideoInfo(a, 1, b);

The other construct that needs changing is filter creation which now automatically assigns itself to the out map:

cref = vsapi->createFilter(in, out, "Invert", invertInit, invertGetFrame, invertFree, fmParallel, 0, data, core);
vsapi->propSetNode(out, "clip", cref, 0);
vsapi->freeNode(cref);
Change it to:
vsapi->createFilter(in, out, "Invert", invertInit, invertGetFrame, invertFree, fmParallel, 0, data, core);

And don’t forget to check out my previous post with suggested tasks if you want to help out.

VapourSynth Tasks

I’ve hinted that there are plenty of things left to do before. Especially in my forum posts. Repeatedly. So in this post I’ll list some tasks I think should be done. Not all of them are programming either.

  • Proofread the documentation — most it was written after midnight so suggest clarifications too
  • Write testcases to cover more parts of the code — testing the python bindings is important too so only some scripting knowledge needed to help out with it
  • Add override file support to VIVTC (good entry level programming task)
  • Convert the EEDI3 port to pure C (simple if you know the difference between C and C++)
  • Port your favorite function/plugin from Avisynth — there’s something for everyone here
  • Port your favorite Avisynth script
  • Make a nice editor with preview — think AvsP
  • Write some simple getting started examples or maybe a quick introduction for Avisynth users
  • Add support for more output formats in vfw — clean up the output code too a bit
  • Write a good implementation of edge detection filters — canny, sobel and friends for higher depths would be nice
  • Your own ideas here

Minimum Requirements

I never mentioned the minimum requirements for VapourSynth. I completely forgot about it. It wasn’t until a poor ancient Athlon user reported crashes I remembered that I actually do have minimum requirements. So what are they? and why?

  • A CPU with SSE2 support (may be disregarded if not running on an x86 CPU)
  • XP SP3 or later (may be disregarded if not a windows user of course)

That’s it! Not so bloody. The rationale for only supporting XP and later mostly comes down to testing. There’s simply no one who uses older systems around to provide testing. Maybe my code will run,  maybe it won’t, but there’s no way to justify spending time testing it myself.

SSE2 on the other hand requires a bit more motivation. It’s very good to have when optimizing filters. Also, most CPUs support it today, it has reached the levels MMX support had 10 years ago or so. Every single x64 CPU must also support it. It’s everywhere.  And it’s good. For example the transpose function in VapourSynth runs a bit over 10 times faster with SSE2 optimizations.

I think that’s all I have to say about the minimum requirements. There’s always Avisynth for the few who don’t qualify.