127 lines
3.2 KiB
C++
127 lines
3.2 KiB
C++
|
// Copyright (c) 1997 Microsoft Corporation. All Rights Reserved.
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include "ddraw.h"
|
||
|
#include "mmstream.h"
|
||
|
#include "amstream.h"
|
||
|
#include "ddstream.h"
|
||
|
|
||
|
|
||
|
#define RELEASE(x) if (x) (x)->Release();
|
||
|
#define CHECK_ERROR(x) \
|
||
|
if (FAILED(hr = (x))) { \
|
||
|
printf(#x " failed with HRESULT(0x%8.8X)\n", hr); \
|
||
|
goto Exit; \
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT OpenMMStream(const char * pszFileName, IDirectDraw *pDD, IMultiMediaStream **ppMMStream)
|
||
|
{
|
||
|
*ppMMStream = NULL;
|
||
|
IAMMultiMediaStream *pAMStream;
|
||
|
HRESULT hr;
|
||
|
|
||
|
CHECK_ERROR(CoCreateInstance(CLSID_AMMultiMediaStream, NULL, CLSCTX_INPROC_SERVER,
|
||
|
IID_IAMMultiMediaStream, (void **)&pAMStream));
|
||
|
CHECK_ERROR(pAMStream->Initialize(STREAMTYPE_READ, 0, NULL));
|
||
|
CHECK_ERROR(pAMStream->AddMediaStream(pDD, &MSPID_PrimaryVideo, 0, NULL));
|
||
|
CHECK_ERROR(pAMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio, AMMSF_ADDDEFAULTRENDERER, NULL));
|
||
|
|
||
|
WCHAR wPath[MAX_PATH];
|
||
|
MultiByteToWideChar(CP_ACP, 0, pszFileName, -1, wPath, sizeof(wPath)/sizeof(wPath[0]));
|
||
|
|
||
|
CHECK_ERROR(pAMStream->OpenFile(wPath, 0));
|
||
|
|
||
|
*ppMMStream = pAMStream;
|
||
|
pAMStream->AddRef();
|
||
|
|
||
|
Exit:
|
||
|
if (pAMStream == NULL) {
|
||
|
printf("Could not create a CLSID_MultiMediaStream object\n"
|
||
|
"Check you have run regsvr32 amstream.dll\n");
|
||
|
}
|
||
|
RELEASE(pAMStream);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT RenderStreamToSurface(IDirectDraw *pDD, IDirectDrawSurface *pPrimary,
|
||
|
IMultiMediaStream *pMMStream)
|
||
|
{
|
||
|
|
||
|
HRESULT hr;
|
||
|
IMediaStream *pPrimaryVidStream = NULL;
|
||
|
IDirectDrawMediaStream *pDDStream = NULL;
|
||
|
IDirectDrawSurface *pSurface = NULL;
|
||
|
IDirectDrawStreamSample *pSample = NULL;
|
||
|
|
||
|
RECT rect;
|
||
|
|
||
|
CHECK_ERROR(pMMStream->GetMediaStream(MSPID_PrimaryVideo, &pPrimaryVidStream));
|
||
|
CHECK_ERROR(pPrimaryVidStream->QueryInterface(IID_IDirectDrawMediaStream, (void **)&pDDStream));
|
||
|
|
||
|
CHECK_ERROR(pDDStream->CreateSample(NULL, NULL, 0, &pSample));
|
||
|
CHECK_ERROR(pSample->GetSurface(&pSurface, &rect));
|
||
|
|
||
|
CHECK_ERROR(pMMStream->SetState(STREAMSTATE_RUN));
|
||
|
|
||
|
while (true) {
|
||
|
if (pSample->Update(0, NULL, NULL, 0) != S_OK) {
|
||
|
break;
|
||
|
}
|
||
|
pPrimary->Blt(&rect, pSurface, &rect, DDBLT_WAIT, NULL);
|
||
|
}
|
||
|
|
||
|
Exit:
|
||
|
RELEASE(pPrimaryVidStream);
|
||
|
RELEASE(pDDStream);
|
||
|
RELEASE(pSample);
|
||
|
RELEASE(pSurface);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
int _CRTAPI1
|
||
|
main(
|
||
|
int argc,
|
||
|
char *argv[]
|
||
|
)
|
||
|
{
|
||
|
if (argc < 2) {
|
||
|
printf("Usage : simple movie.ext\n");
|
||
|
exit(0);
|
||
|
}
|
||
|
CoInitialize(NULL);
|
||
|
IDirectDraw *pDD;
|
||
|
|
||
|
HRESULT hr = DirectDrawCreate(NULL, &pDD, NULL);
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
DDSURFACEDESC ddsd;
|
||
|
IDirectDrawSurface *pPrimarySurface;
|
||
|
|
||
|
pDD->SetCooperativeLevel(GetDesktopWindow(), DDSCL_NORMAL);
|
||
|
|
||
|
ddsd.dwSize = sizeof(ddsd);
|
||
|
ddsd.dwFlags = DDSD_CAPS;
|
||
|
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
||
|
hr = pDD->CreateSurface(&ddsd, &pPrimarySurface, NULL);
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
IMultiMediaStream *pMMStream;
|
||
|
hr = OpenMMStream(argv[1], pDD, &pMMStream);
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
RenderStreamToSurface(pDD, pPrimarySurface, pMMStream);
|
||
|
pMMStream->Release();
|
||
|
}
|
||
|
pPrimarySurface->Release();
|
||
|
}
|
||
|
pDD->Release();
|
||
|
} else {
|
||
|
printf("Could not open DirectDraw - check it is installed\n");
|
||
|
}
|
||
|
CoUninitialize();
|
||
|
return 0;
|
||
|
}
|