wineqtdecoder: initial commit of the video decoder using Mac OS/X QuickTime Framework

Ken Thomases ken at codeweavers.com
Tue Nov 30 10:33:46 CST 2010


On Nov 30, 2010, at 6:52 AM, Alexandre Julliard wrote:

> Aric Stewart <aric at codeweavers.com> writes:
> 
>> ---
>> configure                             |    8 +-
>> configure.ac                          |    5 +
>> dlls/wineqtdecoder/Makefile.in        |   11 +
>> dlls/wineqtdecoder/main.c             |  135 +++++++++
>> dlls/wineqtdecoder/qtvdecoder.c       |  536
>> +++++++++++++++++++++++++++++++++
>> dlls/wineqtdecoder/version.rc         |   26 ++
>> dlls/wineqtdecoder/wineqtdecoder.spec |    4 +
>> 7 files changed, 724 insertions(+), 1 deletions(-)
>> create mode 100644 dlls/wineqtdecoder/Makefile.in
>> create mode 100644 dlls/wineqtdecoder/main.c
>> create mode 100644 dlls/wineqtdecoder/qtvdecoder.c
>> create mode 100644 dlls/wineqtdecoder/version.rc
>> create mode 100644 dlls/wineqtdecoder/wineqtdecoder.spec
> 
> This is showing many deprecated function warnings even on Leopard. We
> should try to avoid that in new code.

Aric,

The DecompressSequenceBeginS takes a CGrafPort or GWorld.  These are QuickDraw concepts and are very, very obsolete.  DecompressSequenceBeginS should be deprecated, itself, since it depends on them, but doesn't appear to be.  The documentation on this whole area is terrible.  Apple seems to have blackholed even the documentation of the more modern APIs.  (You can still get it from within Xcode 3.2.x if you go into preferences and subscribe to the Leopard docset.  But it seems largely gone from their website.)

As is often the case, the headers provide what documentation there is.  According to the headers (/System/Library/Frameworks/QuickTime.framework/Headers/ImageCompression.h), the replacement is ICMDecompressionSessionCreate() and friends, also in that header.  (That header has both old APIs and new.  You want the ones introduced with Mac OS X 10.4 or later, or QuickTime 7 or later.)

The ICMDecompression... functions feed you CVPixelBuffer objects through a callback.  Those are documented here <http://developer.apple.com/library/mac/#documentation/QuartzCore/Reference/CVPixelBufferRef/>.  (Take note of the "Derived from" info at the top of that page.  If you feel that CVPixelBuffer is missing some important API, it may be provided by the base classes.)

The ICMDecompression... API seems kind of asynchronous in nature, but I think you can force it to fully decompress frames immediately via the frameTime parameter to ICMDecompressionSessionDecodeFrame().  The flags field of ICMFrameTimeRecord can include icmFrameTimeDecodeImmediately.

The next thing that might be useful are some techniques to avoid doing the pixel copying manually.  Depending on the output format you require (This->outputDepth and This->rowBytes), you may be able to create a CGBitmapContext to wrap the output buffer.  Then, you can create a CGImage from the CVPixelBuffer, and draw the image into the context.  (The modern Mac APIs don't really have blit operations, they copy and/or convert images by drawing.)  Some of these techniques are illustrated in this sample code: <http://developer.apple.com/library/mac/#samplecode/CaptureAndCompressIPBMovie/>.  Actually, it sort of does the reverse.  It wraps the CVPixelBuffer in the bitmap context and draws onto it, but the principle is similar.

I hope that helps.

-Ken




More information about the wine-devel mailing list