Current version

v1.10.4 (stable)


Main page
Archived news
Plugin SDK
Knowledge base
Contact info
Other projects

VirtualDub history

If you're looking for the list of changes to VirtualDub since the previous version, you're looking in the wrong place -- the list of changes is available in the Help menu of the program itself.

If you want to know how I came to write VirtualDub, then you're in the right place.  I've just spent several hours in the ECE lab at UCSB getting a project working, so I feel like doing something else.  So in a time long ago, in a dorm far, far away...

How it all started

[Sailor Moon SuperS op frame]

By my senior year of high school I'd gotten onto the Internet with the almighty 28.8K baud modem.  I was fairly new to talking to millions of people online, and had embarrassed myself on Usenet on a couple of occasions, but I could use a web browser.  One of the files I happened to stumble on was a movie file of the Sailor Moon SuperS movie intro.  It was 15Mb and extremely high-quality in all its blocky Cinepak splendor, but it was something I'd never seen before, Japanese animation (anime).  Later that year, I got myself a video capture card, and one of the first clips I tried to capture -- unsuccessfully -- was the opening from the North American dubbed version of Sailor Moon.  It looked very different than regular cartoons, and more importantly, it looked really neat.  This is how I got hooked on anime.  (Since then, I've seen a lot more than Sailor Moon.)

What does this mean?  Anime is what started me on desktop video.  Would you believe that I'd write over 700K of code because of anime?  I wouldn't have, back then.

The software that comes with the card always bites


One of the big problems I had at the time was that the capture program that came with my card was a simplistic 16-bit application that refused to capture above 160x120, 15fps without dropping a ton of frames.  It wasn't until I started programming in Windows that I riffled through the MSDN collection and discovered that the software that had come with my card was a barely modified version of a Microsoft sample application!  The MSDN CD I had also had the source code to a 32-bit version called AVICapture, which I compiled and ran.  Sure enough, I went from being able to capture 160x120 to 320x240 at the same frame rate.  It turned out that the 16-bit application was disabling the disk cache entirely during the capture session, which caused the hard drive to thrash horribly and basically eat it performance-wise.  While making some modifications to this program, I managed to destabilize it, and when I got tired of rebooting repeatedly trying to track the bug down, I started to rewrite it from scratch -- this became the integrated capture mode of VirtualDub.

Before that happened, though, I'd been experimenting with postage-stamp-sized video at 160x120, and RealVideo encoder.  RealVideo had just come out, and being able to cram a 15Mb video file down to a streamable <1Mb file was pretty neat.  Unfortunately, all my sources were VHS, and... well, VHS quality.  However, it seemed that reducing down 320x240 video to 160x120 would give a better picture.  Out of this grew a utility called AVIreduce which did exactly that.  It is this utility that became the nucleus of VirtualDub.  You can still see a few remnants of the AVIreduce code in dub.cpp, which is the least object-oriented part of the program, with an enormous class using variables such as lVStreamPos.  Unsurprisingly, the now seldom-used reduce2 filter was the first filter to be implemented.

To this day, one of my side hobbies is to figure out the best way to produce the smallest good-looking video files from crummy video sources.  Some of my experiments are the hresync filter (removed in version 1.3) and the smoother filter.

A side trip through the AVI editor


Some time in the middle of my freshman year at UCSB, I'd begun to attend the local anime club and saw a four-episode series called Birdy the Mighty.  I'll spare you the plot details, but suffice it to say I liked the series to pick up copies of the episodes on tape.  One of the problems with tape is that seeking to a point you want to show somebody is a bitch, and so I realized that I could do so much more quickly if I captured it to a video file.  So I started capturing it with AVIcapture and compressing it with a classic Video for Windows program called VidEdit.  For those of you who are familiar with ripped episodes of anime, this was a terrible rip; I did episode 1 in 7 segments at 10fps because I had to capture uncompressed and didn't have very much disk space, and the files got stored onto a CD-R in Indeo 4.1 with uncompressed audio -- hardly acceptable nowadays.  I still have my homemade "Birdy" CD around here somewhere, and no, I don't distribute.  You wouldn't want it anyway.

Halfway through, I got fed up with VidEdit.  Since it was a 16-bit program, it locked up USER while compressing a frame, and since I was using the slow Indeo 4.1, I could bring up the Start menu if I held my mouse button down over the icon for several seconds.  That caused me to compile another Microsoft sample program, AVIedit.  Being a 32-bit program, AVIedit wouldn't lock my system during compression.  One of the big problems with AVIedit, though, was that it had a horrible progress indicator.  Specifically, none.  All it said was "Saving...." I managed to hack one in, but because of the way the AVISaveV() function works, all I had to work with was an integer completion percentage; the function didn't even tell you a frame count.  At three seconds per frame and about 4,000 frames per clip, this gave quite a large progress granularity.  It was my frustration with AVIedit that motivated me to add compression abilities very early on in VirtualDub, and to this date I do all my AVI compression with it.

A few months later, I purchased a miroVideo DRX with hardware motion-JPEG compression.  It came with a non-linear editing program called MGI VideoWave 1.0c.  I installed it, and found it had MPEG encoding.  So I plugged in a clip and tried it.  It took about 15 seconds for every 3 frames on my P166 and complained about an invalid MPEG file when I tried to load the output file back in!  I deleted the trash off my system and swore never to install it again.  If VideoWave had worked correctly, I probably would have used it instead and VirtualDub wouldn't exist.

Developing the program

[VirtualDub 0.5]

Those of you who have known me online for a while know that the first program I released, and my first big project, was a 32-bit DOS paint program called VGAPaint 386.  Well, VirtualDub is my first, and only, major Windows project.  I started VirtualDub with only a basic knowledge of Win32 programming.  After browsing a few pages of the Visual C++ starter's guide with no knowledge of C++ (I only knew ANSI C), I'd chucked the manual early on and decided to program in bare Win32, without MFC.  This is why VirtualDub has a fairly simplistic interface, and why the program is only a single, stand-alone 400K statically linked executable.

Most of you probably don't know this, but the build number in VirtualDub increments once for every compile that I do on the program, even for debug builds.  I did a few hundred builds before implementing the autonumber system, but in any case I actually have compiled over 13,000 versions of the program.  The earliest build I have of VirtualDub is around 650; this build already has many of the characteristic features of the program, including the ability to process the audio stream of a file while copying over its video untouched, and the quick framerate and audio format buttons in capture mode.  It wasn't until Public Release 1 (build 1482) that I posted the program to the Internet, and not until around version 1.0 pre-5 (build 6904) that people started to express interest in the program.

A few miscellaneous facts about the program:

And so on...

Well, VirtualDub has come a long way from its humble beginnings.  Since then, the program has gained 21 filters, the ability to decode MPEG-1 files, more than doubled in speed, and nearly quintupled in object size.  I hope you enjoy using the program.  To all the anime lovers out there, this program's dedicated to you; it wouldn't have happened otherwise.