wineqtdecoder: Move pixel buffer access to utility module.
This commit is contained in:
parent
ed71339d17
commit
f9abb07fb3
|
@ -4,6 +4,7 @@ EXTRALIBS = @QUICKTIMELIB@
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
main.c \
|
main.c \
|
||||||
|
qtutils.c \
|
||||||
qtvdecoder.c
|
qtvdecoder.c
|
||||||
|
|
||||||
@MAKE_DLL_RULES@
|
@MAKE_DLL_RULES@
|
||||||
|
|
|
@ -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);
|
|
@ -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 <CoreVideo/CVPixelBuffer.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
|
@ -127,6 +127,8 @@
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
#include "wine/strmbase.h"
|
#include "wine/strmbase.h"
|
||||||
|
|
||||||
|
#include "qtprivate.h"
|
||||||
|
|
||||||
extern CLSID CLSID_QTVDecoder;
|
extern CLSID CLSID_QTVDecoder;
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(qtdecoder);
|
WINE_DEFAULT_DEBUG_CHANNEL(qtdecoder);
|
||||||
|
@ -142,17 +144,9 @@ typedef struct QTVDecoderImpl
|
||||||
HRESULT decodeHR;
|
HRESULT decodeHR;
|
||||||
|
|
||||||
DWORD outputSize;
|
DWORD outputSize;
|
||||||
DWORD outputWidth, outputHeight, outputDepth;
|
|
||||||
|
|
||||||
} QTVDecoderImpl;
|
} 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 const IBaseFilterVtbl QTVDecoder_Vtbl;
|
||||||
|
|
||||||
static void trackingCallback(
|
static void trackingCallback(
|
||||||
|
@ -172,11 +166,6 @@ static void trackingCallback(
|
||||||
IMediaSample* pOutSample = NULL;
|
IMediaSample* pOutSample = NULL;
|
||||||
LPBYTE pbDstStream;
|
LPBYTE pbDstStream;
|
||||||
DWORD cbDstStream;
|
DWORD cbDstStream;
|
||||||
LPBYTE pPixels = NULL;
|
|
||||||
LPBYTE out = NULL;
|
|
||||||
size_t bytesPerRow = 0;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (result != noErr)
|
if (result != noErr)
|
||||||
{
|
{
|
||||||
|
@ -213,24 +202,9 @@ static void trackingCallback(
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ACCESS THE PIXELS */
|
hr = AccessPixelBufferPixels(pixelBuffer, pbDstStream);
|
||||||
CVPixelBufferLockBaseAddress(pixelBuffer,0);
|
if (FAILED(hr))
|
||||||
pPixels = (LPBYTE)CVPixelBufferGetBaseAddress(pixelBuffer);
|
goto error;
|
||||||
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);
|
|
||||||
|
|
||||||
IMediaSample_SetActualDataLength(pOutSample, This->outputSize);
|
IMediaSample_SetActualDataLength(pOutSample, This->outputSize);
|
||||||
|
|
||||||
|
@ -404,6 +378,7 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION
|
||||||
OSType fourCC;
|
OSType fourCC;
|
||||||
DecompressorComponent dc;
|
DecompressorComponent dc;
|
||||||
OSType format;
|
OSType format;
|
||||||
|
DWORD outputWidth, outputHeight, outputDepth;
|
||||||
|
|
||||||
if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
|
if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
|
||||||
bmi = &format1->bmiHeader;
|
bmi = &format1->bmiHeader;
|
||||||
|
@ -425,12 +400,12 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
This->outputWidth = bmi->biWidth;
|
outputWidth = bmi->biWidth;
|
||||||
This->outputHeight = bmi->biHeight;
|
outputHeight = bmi->biHeight;
|
||||||
|
|
||||||
(**This->hImageDescription).cType = fourCC;
|
(**This->hImageDescription).cType = fourCC;
|
||||||
(**This->hImageDescription).width = This->outputWidth;
|
(**This->hImageDescription).width = outputWidth;
|
||||||
(**This->hImageDescription).height = This->outputHeight;
|
(**This->hImageDescription).height = outputHeight;
|
||||||
(**This->hImageDescription).depth = bmi->biBitCount;
|
(**This->hImageDescription).depth = bmi->biBitCount;
|
||||||
(**This->hImageDescription).hRes = 72<<16;
|
(**This->hImageDescription).hRes = 72<<16;
|
||||||
(**This->hImageDescription).vRes = 72<<16;
|
(**This->hImageDescription).vRes = 72<<16;
|
||||||
|
@ -445,11 +420,11 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = CFNumberCreate(NULL, kCFNumberIntType, &This->outputWidth);
|
n = CFNumberCreate(NULL, kCFNumberIntType, &outputWidth);
|
||||||
CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferWidthKey, n);
|
CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferWidthKey, n);
|
||||||
CFRelease(n);
|
CFRelease(n);
|
||||||
|
|
||||||
n = CFNumberCreate(NULL, kCFNumberIntType, &This->outputHeight);
|
n = CFNumberCreate(NULL, kCFNumberIntType, &outputHeight);
|
||||||
CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferHeightKey, n);
|
CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferHeightKey, n);
|
||||||
CFRelease(n);
|
CFRelease(n);
|
||||||
|
|
||||||
|
@ -462,8 +437,8 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION
|
||||||
CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferCGBitmapContextCompatibilityKey, kCFBooleanTrue);
|
CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferCGBitmapContextCompatibilityKey, kCFBooleanTrue);
|
||||||
CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferCGImageCompatibilityKey, kCFBooleanTrue);
|
CFDictionaryAddValue(This->outputBufferAttributes, kCVPixelBufferCGImageCompatibilityKey, kCFBooleanTrue);
|
||||||
|
|
||||||
This->outputDepth = 3;
|
outputDepth = 3;
|
||||||
This->outputSize = This->outputWidth * This->outputHeight * This->outputDepth;
|
This->outputSize = outputWidth * outputHeight * outputDepth;
|
||||||
bmi->biCompression = BI_RGB;
|
bmi->biCompression = BI_RGB;
|
||||||
bmi->biBitCount = 24;
|
bmi->biBitCount = 24;
|
||||||
outpmt->subtype = MEDIASUBTYPE_RGB24;
|
outpmt->subtype = MEDIASUBTYPE_RGB24;
|
||||||
|
|
Loading…
Reference in New Issue