videofilt_processingvideoframes - shekh/VirtualDub2 GitHub Wiki

VirtualDub Plugin SDK 1.2

Processing video frames (runProc)

The runProc method of a video filter is the main method that actually processes image data.

Source and output frame buffers

The source frame buffers are specified by the src field of the VDXFilterActivation structure, and the output frame buffer is specified by the dst field. The task of runProc is to process the source image and write the result into the output image. The host has already allocated both frame buffers and fetched the source frame by the time the filter is invoked, so the only thing that needs to happen is to process the image data.

Note that if paramProc specified that the filter is operating in in-place mode, the source and output frame buffers will point to the same memory.

Execution

runProc is always single-threaded — there is never a case where it is invoked twice on the same filter instance at the same time. However, it is possible that two different instances of the same filter may execute concurrently. Therefore, it is safe to use a buffer that is attached to the filter instance, but two instances should generally not share a buffer that both read and write to.

When possible, memory allocation should not occur within runProc, and it is better to preallocate buffers in startProc instead. There are two reasons for this: it's faster, and it means that allocation failures are caught before the render begins instead of during the render itself. This also goes for other external resources, such as reading images off disk. The exception is if there are enough of them that preloading them is impractical; secondary video files, for instance, would be better off read on the fly.

Sample implementation

This is an example runProc implementation which simply divides all pixel values by two, thus reducing the image to half brightness. Note that runProc in a production filter usually considerably more complex, both in functionality and in implementation.

int runProc(const VDXFilterActivation *fa, const VDXFilterFunctions *ff) {
    int           w        = fa->dst.w;
    int           h        = fa->dst.h;
    uint32       *dst      = (uint32 *)fa->dst.data;
    ptrdiff_t     dstpitch = fa->dst.pitch;
    const uint32 *src      = (const uint32 *)fa->src.data;
    ptrdiff_t     srcpitch = fa->src.pitch;
    
    // loop over all rows
    for(int y=0; y<h; ++y) {
        // loop over all pixels in current row
        for(int x=0; x<w; ++x) {
            uint32 pixelValue = src[x];
            
            // divide all channels by 2
            dst[x] = (pixelValue & 0xfefefe) >> 1;
        }
        
        // advance to next row in destination and source pixmaps
        dst = (uint32 *)((char *)dst + dstpitch);
        src = (const uint32 *)((const char *)src + srcpitch);
    }
    
    return 0;
}

Copyright (C) 2007-2012 Avery Lee.

⚠️ **GitHub.com Fallback** ⚠️