| /* |
| * Unit tests for MultiMedia Stream functions |
| * |
| * Copyright (C) 2009 Christian Costa |
| * |
| * 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 <assert.h> |
| |
| #define COBJMACROS |
| |
| #include "wine/test.h" |
| #include "initguid.h" |
| #include "amstream.h" |
| |
| #define FILE_LEN 9 |
| static const char fileA[FILE_LEN] = "test.avi"; |
| |
| IAMMultiMediaStream* pams; |
| IDirectDraw7* pdd7 = NULL; |
| IDirectDrawSurface7* pdds7 = NULL; |
| |
| static int create_ammultimediastream(void) |
| { |
| return S_OK == CoCreateInstance( |
| &CLSID_AMMultiMediaStream, NULL, CLSCTX_INPROC_SERVER, &IID_IAMMultiMediaStream, (LPVOID*)&pams); |
| } |
| |
| static void release_ammultimediastream(void) |
| { |
| IAMMultiMediaStream_Release(pams); |
| } |
| |
| static int create_directdraw(void) |
| { |
| HRESULT hr; |
| IDirectDraw* pdd = NULL; |
| DDSURFACEDESC2 ddsd; |
| |
| hr = DirectDrawCreate(NULL, &pdd, NULL); |
| ok(hr==DD_OK, "DirectDrawCreate returned: %x\n", hr); |
| if (hr != DD_OK) |
| goto error; |
| |
| hr = IDirectDraw_QueryInterface(pdd, &IID_IDirectDraw7, (LPVOID*)&pdd7); |
| ok(hr==DD_OK, "QueryInterface returned: %x\n", hr); |
| if (hr != DD_OK) goto error; |
| |
| hr = IDirectDraw7_SetCooperativeLevel(pdd7, GetDesktopWindow(), DDSCL_NORMAL); |
| ok(hr==DD_OK, "SetCooperativeLevel returned: %x\n", hr); |
| |
| ZeroMemory(&ddsd, sizeof(ddsd)); |
| ddsd.dwSize = sizeof(ddsd); |
| ddsd.dwFlags = DDSD_CAPS; |
| ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; |
| hr = IDirectDraw7_CreateSurface(pdd7, &ddsd, &pdds7, NULL); |
| ok(hr==DD_OK, "CreateSurface returned: %x\n", hr); |
| |
| return TRUE; |
| |
| error: |
| if (pdds7) |
| IDirectDrawSurface7_Release(pdds7); |
| if (pdd7) |
| IDirectDraw7_Release(pdd7); |
| if (pdd) |
| IDirectDraw_Release(pdd); |
| |
| return FALSE; |
| } |
| |
| static void release_directdraw(void) |
| { |
| IDirectDrawSurface7_Release(pdds7); |
| IDirectDraw7_Release(pdd7); |
| } |
| |
| static void test_openfile(void) |
| { |
| HANDLE h; |
| HRESULT hr; |
| WCHAR fileW[FILE_LEN]; |
| IGraphBuilder* pgraph; |
| |
| if (!create_ammultimediastream()) |
| return; |
| |
| h = CreateFileA(fileA, 0, 0, NULL, OPEN_EXISTING, 0, NULL); |
| if (h == INVALID_HANDLE_VALUE) { |
| release_ammultimediastream(); |
| return; |
| } |
| |
| MultiByteToWideChar(CP_ACP, 0, fileA, -1, fileW, FILE_LEN); |
| |
| hr = IAMMultiMediaStream_GetFilterGraph(pams, &pgraph); |
| ok(hr==S_OK, "IAMMultiMediaStream_GetFilterGraph returned: %x\n", hr); |
| ok(pgraph==NULL, "Filtergraph should not be created yet\n"); |
| |
| if (pgraph) |
| IGraphBuilder_Release(pgraph); |
| |
| hr = IAMMultiMediaStream_OpenFile(pams, fileW, 0); |
| ok(hr==S_OK, "IAMMultiMediaStream_OpenFile returned: %x\n", hr); |
| |
| hr = IAMMultiMediaStream_GetFilterGraph(pams, &pgraph); |
| ok(hr==S_OK, "IAMMultiMediaStream_GetFilterGraph returned: %x\n", hr); |
| ok(pgraph!=NULL, "Filtergraph should be created\n"); |
| |
| if (pgraph) |
| IGraphBuilder_Release(pgraph); |
| |
| release_ammultimediastream(); |
| } |
| |
| static void renderfile(const char * fileA) |
| { |
| HRESULT hr; |
| WCHAR fileW[FILE_LEN]; |
| IMediaStream *pvidstream = NULL; |
| IDirectDrawMediaStream *pddstream = NULL; |
| IDirectDrawStreamSample *pddsample = NULL; |
| |
| if (!create_directdraw()) |
| return; |
| |
| MultiByteToWideChar(CP_ACP, 0, fileA, -1, fileW, FILE_LEN); |
| |
| hr = IAMMultiMediaStream_Initialize(pams, STREAMTYPE_READ, 0, NULL); |
| ok(hr==S_OK, "IAMMultiMediaStream_Initialize returned: %x\n", hr); |
| |
| hr = IAMMultiMediaStream_AddMediaStream(pams, (IUnknown*)pdd7, &MSPID_PrimaryVideo, 0, NULL); |
| ok(hr==S_OK, "IAMMultiMediaStream_AddMediaStream returned: %x\n", hr); |
| |
| hr = IAMMultiMediaStream_AddMediaStream(pams, NULL, &MSPID_PrimaryAudio, AMMSF_ADDDEFAULTRENDERER, NULL); |
| ok(hr==S_OK, "IAMMultiMediaStream_AddMediaStream returned: %x\n", hr); |
| |
| hr = IAMMultiMediaStream_OpenFile(pams, fileW, 0); |
| ok(hr==S_OK, "IAMMultiMediaStream_OpenFile returned: %x\n", hr); |
| |
| hr = IAMMultiMediaStream_GetMediaStream(pams, &MSPID_PrimaryVideo, &pvidstream); |
| ok(hr==S_OK, "IAMMultiMediaStream_GetMediaStream returned: %x\n", hr); |
| if (FAILED(hr)) goto error; |
| |
| hr = IMediaStream_QueryInterface(pvidstream, &IID_IDirectDrawMediaStream, (LPVOID*)&pddstream); |
| ok(hr==S_OK, "IMediaStream_QueryInterface returned: %x\n", hr); |
| if (FAILED(hr)) goto error; |
| |
| hr = IDirectDrawMediaStream_CreateSample(pddstream, NULL, NULL, 0, &pddsample); |
| todo_wine ok(hr==S_OK, "IDirectDrawMediaStream_CreateSample returned: %x\n", hr); |
| |
| error: |
| if (pddsample) |
| IDirectDrawMediaSample_Release(pddsample); |
| if (pddstream) |
| IDirectDrawMediaStream_Release(pddstream); |
| if (pvidstream) |
| IMediaStream_Release(pvidstream); |
| |
| release_directdraw(); |
| } |
| |
| static void test_render(void) |
| { |
| HANDLE h; |
| |
| if (!create_ammultimediastream()) |
| return; |
| |
| h = CreateFileA(fileA, 0, 0, NULL, OPEN_EXISTING, 0, NULL); |
| if (h != INVALID_HANDLE_VALUE) { |
| CloseHandle(h); |
| renderfile(fileA); |
| } |
| |
| release_ammultimediastream(); |
| } |
| |
| START_TEST(amstream) |
| { |
| CoInitializeEx(NULL, COINIT_MULTITHREADED); |
| test_openfile(); |
| test_render(); |
| CoUninitialize(); |
| } |