From f9abb07fb341d1c713fa94910dee9950bfcfd06c Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Tue, 5 Apr 2011 12:55:53 -0500 Subject: [PATCH] wineqtdecoder: Move pixel buffer access to utility module. --- dlls/wineqtdecoder/Makefile.in | 1 + dlls/wineqtdecoder/qtprivate.h | 21 ++++++ dlls/wineqtdecoder/qtutils.c | 160 ++++++++++++++++++++++++++++++++++++++++ dlls/wineqtdecoder/qtvdecoder.c | 53 ++++--------- 4 files changed, 196 insertions(+), 39 deletions(-) create mode 100644 dlls/wineqtdecoder/qtprivate.h create mode 100644 dlls/wineqtdecoder/qtutils.c diff --git a/dlls/wineqtdecoder/Makefile.in b/dlls/wineqtdecoder/Makefile.in index 57436b5bcf1..5f18e96a9e0 100644 --- a/dlls/wineqtdecoder/Makefile.in +++ b/dlls/wineqtdecoder/Makefile.in @@ -4,6 +4,7 @@ EXTRALIBS = @QUICKTIMELIB@ C_SRCS = \ main.c \ + qtutils.c \ qtvdecoder.c @MAKE_DLL_RULES@ diff --git a/dlls/wineqtdecoder/qtprivate.h b/dlls/wineqtdecoder/qtprivate.h new file mode 100644 index 00000000000..f530efd7ff3 --- /dev/null +++ b/dlls/wineqtdecoder/qtprivate.h @@ -0,0 +1,21 @@ +/* + * QuickTime Toolkit decoder header + * + * Copyright 2011 Aric Stewart, CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +HRESULT AccessPixelBufferPixels( CVPixelBufferRef pixelBuffer, LPBYTE pbDstStream); diff --git a/dlls/wineqtdecoder/qtutils.c b/dlls/wineqtdecoder/qtutils.c new file mode 100644 index 00000000000..a1e8f059486 --- /dev/null +++ b/dlls/wineqtdecoder/qtutils.c @@ -0,0 +1,160 @@ +/* + * QuickTime Toolkit decoder utils + * + * Copyright 2011 Aric Stewart, CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#define ULONG CoreFoundation_ULONG +#define HRESULT CoreFoundation_HRESULT + +#define LoadResource __carbon_LoadResource +#define CompareString __carbon_CompareString +#define GetCurrentThread __carbon_GetCurrentThread +#define GetCurrentProcess __carbon_GetCurrentProcess +#define AnimatePalette __carbon_AnimatePalette +#define EqualRgn __carbon_EqualRgn +#define FillRgn __carbon_FillRgn +#define FrameRgn __carbon_FrameRgn +#define GetPixel __carbon_GetPixel +#define InvertRgn __carbon_InvertRgn +#define LineTo __carbon_LineTo +#define OffsetRgn __carbon_OffsetRgn +#define PaintRgn __carbon_PaintRgn +#define Polygon __carbon_Polygon +#define ResizePalette __carbon_ResizePalette +#define SetRectRgn __carbon_SetRectRgn + +#define CheckMenuItem __carbon_CheckMenuItem +#define DeleteMenu __carbon_DeleteMenu +#define DrawMenuBar __carbon_DrawMenuBar +#define EnableMenuItem __carbon_EnableMenuItem +#define EqualRect __carbon_EqualRect +#define FillRect __carbon_FillRect +#define FrameRect __carbon_FrameRect +#define GetCursor __carbon_GetCursor +#define GetMenu __carbon_GetMenu +#define InvertRect __carbon_InvertRect +#define IsWindowVisible __carbon_IsWindowVisible +#define MoveWindow __carbon_MoveWindow +#define OffsetRect __carbon_OffsetRect +#define PtInRect __carbon_PtInRect +#define SetCursor __carbon_SetCursor +#define SetRect __carbon_SetRect +#define ShowCursor __carbon_ShowCursor +#define ShowWindow __carbon_ShowWindow +#define UnionRect __carbon_UnionRect + +#include + +#undef LoadResource +#undef CompareString +#undef GetCurrentThread +#undef _CDECL +#undef DPRINTF +#undef GetCurrentProcess +#undef AnimatePalette +#undef EqualRgn +#undef FillRgn +#undef FrameRgn +#undef GetPixel +#undef InvertRgn +#undef LineTo +#undef OffsetRgn +#undef PaintRgn +#undef Polygon +#undef ResizePalette +#undef SetRectRgn +#undef CheckMenuItem +#undef DeleteMenu +#undef DrawMenuBar +#undef EnableMenuItem +#undef EqualRect +#undef FillRect +#undef FrameRect +#undef GetCursor +#undef GetMenu +#undef InvertRect +#undef IsWindowVisible +#undef MoveWindow +#undef OffsetRect +#undef PtInRect +#undef SetCursor +#undef SetRect +#undef ShowCursor +#undef ShowWindow +#undef UnionRect + +#undef ULONG +#undef HRESULT +#undef DPRINTF +#undef STDMETHODCALLTYPE + +#include "windef.h" +#include "winbase.h" +#include "wtypes.h" +#include "winuser.h" +#include "dshow.h" + +#include "wine/debug.h" +#include "qtprivate.h" + +WINE_DEFAULT_DEBUG_CHANNEL(qtdecoder); + +typedef struct { + UInt8 a; /* Alpha Channel */ + UInt8 r; /* red component */ + UInt8 g; /* green component */ + UInt8 b; /* blue component */ +} ARGBPixelRecord, *ARGBPixelPtr, **ARGBPixelHdl; + +HRESULT AccessPixelBufferPixels( CVPixelBufferRef pixelBuffer, LPBYTE pbDstStream) +{ + LPBYTE pPixels = NULL; + LPBYTE out = NULL; + size_t bytesPerRow = 0, height = 0, width = 0; + OSType actualType; + int i; + + actualType = CVPixelBufferGetPixelFormatType(pixelBuffer); + if (k32ARGBPixelFormat != actualType) + { + ERR("Pixel Buffer is not desired Type\n"); + return E_FAIL; + } + CVPixelBufferLockBaseAddress(pixelBuffer,0); + pPixels = (LPBYTE)CVPixelBufferGetBaseAddress(pixelBuffer); + bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer); + height = CVPixelBufferGetHeight(pixelBuffer); + width = CVPixelBufferGetWidth(pixelBuffer); + + for (out = pbDstStream, i = 0; i < height; i++) + { + int j; + for (j = 0; j < width; j++) + { + *((DWORD*)out) = (((ARGBPixelPtr)pPixels)[j].r) << 16 + | (((ARGBPixelPtr)pPixels)[j].g) << 8 + | (((ARGBPixelPtr)pPixels)[j].b); + out+=3; + } + pPixels += bytesPerRow; + } + CVPixelBufferUnlockBaseAddress(pixelBuffer,0); + return S_OK; +} diff --git a/dlls/wineqtdecoder/qtvdecoder.c b/dlls/wineqtdecoder/qtvdecoder.c index 83d5156011e..553a486531b 100644 --- a/dlls/wineqtdecoder/qtvdecoder.c +++ b/dlls/wineqtdecoder/qtvdecoder.c @@ -127,6 +127,8 @@ #include "wine/debug.h" #include "wine/strmbase.h" +#include "qtprivate.h" + extern CLSID CLSID_QTVDecoder; WINE_DEFAULT_DEBUG_CHANNEL(qtdecoder); @@ -142,17 +144,9 @@ typedef struct QTVDecoderImpl HRESULT decodeHR; DWORD outputSize; - DWORD outputWidth, outputHeight, outputDepth; } QTVDecoderImpl; -typedef struct { - UInt8 a; /* Alpha Channel */ - UInt8 r; /* red component */ - UInt8 g; /* green component */ - UInt8 b; /* blue component */ -} ARGBPixelRecord, *ARGBPixelPtr, **ARGBPixelHdl; - static const IBaseFilterVtbl QTVDecoder_Vtbl; static void trackingCallback( @@ -172,11 +166,6 @@ static void trackingCallback( IMediaSample* pOutSample = NULL; LPBYTE pbDstStream; DWORD cbDstStream; - LPBYTE pPixels = NULL; - LPBYTE out = NULL; - size_t bytesPerRow = 0; - - int i; if (result != noErr) { @@ -213,24 +202,9 @@ static void trackingCallback( goto error; } - /* ACCESS THE PIXELS */ - CVPixelBufferLockBaseAddress(pixelBuffer,0); - pPixels = (LPBYTE)CVPixelBufferGetBaseAddress(pixelBuffer); - bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer); - - for (out = pbDstStream, i = 0; i < This->outputHeight; i++) - { - int j; - for (j = 0; j < This->outputWidth; j++) - { - *((DWORD*)out) = (((ARGBPixelPtr)pPixels)[j].r) << 16 - | (((ARGBPixelPtr)pPixels)[j].g) << 8 - | (((ARGBPixelPtr)pPixels)[j].b); - out+=This->outputDepth; - } - pPixels += bytesPerRow; - } - CVPixelBufferUnlockBaseAddress(pixelBuffer,0); + hr = AccessPixelBufferPixels(pixelBuffer, pbDstStream); + if (FAILED(hr)) + goto error; IMediaSample_SetActualDataLength(pOutSample, This->outputSize); @@ -404,6 +378,7 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION OSType fourCC; DecompressorComponent dc; OSType format; + DWORD outputWidth, outputHeight, outputDepth; if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) bmi = &format1->bmiHeader; @@ -425,12 +400,12 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION goto failed; } - This->outputWidth = bmi->biWidth; - This->outputHeight = bmi->biHeight; + outputWidth = bmi->biWidth; + outputHeight = bmi->biHeight; (**This->hImageDescription).cType = fourCC; - (**This->hImageDescription).width = This->outputWidth; - (**This->hImageDescription).height = This->outputHeight; + (**This->hImageDescription).width = outputWidth; + (**This->hImageDescription).height = outputHeight; (**This->hImageDescription).depth = bmi->biBitCount; (**This->hImageDescription).hRes = 72<<16; (**This->hImageDescription).vRes = 72<<16; @@ -445,11 +420,11 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION goto failed; } - n = CFNumberCreate(NULL, kCFNumberIntType, &This->outputWidth); + n = CFNumberCreate(NULL, kCFNumberIntType, &outputWidth); CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferWidthKey, n); CFRelease(n); - n = CFNumberCreate(NULL, kCFNumberIntType, &This->outputHeight); + n = CFNumberCreate(NULL, kCFNumberIntType, &outputHeight); CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferHeightKey, n); CFRelease(n); @@ -462,8 +437,8 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferCGBitmapContextCompatibilityKey, kCFBooleanTrue); CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferCGImageCompatibilityKey, kCFBooleanTrue); - This->outputDepth = 3; - This->outputSize = This->outputWidth * This->outputHeight * This->outputDepth; + outputDepth = 3; + This->outputSize = outputWidth * outputHeight * outputDepth; bmi->biCompression = BI_RGB; bmi->biBitCount = 24; outpmt->subtype = MEDIASUBTYPE_RGB24; -- 2.11.4.GIT