| /* | |
| * 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(); | |
| } |