19,502
社区成员
发帖
与我相关
我的任务
分享
enum EDDGPEPixelFormat
{
ddgpePixelFormat_1bpp = 0,
ddgpePixelFormat_2bpp,
ddgpePixelFormat_4bpp,
ddgpePixelFormat_8bpp,
ddgpePixelFormat_565,
ddgpePixelFormat_5551,
ddgpePixelFormat_4444,
ddgpePixelFormat_5550,
ddgpePixelFormat_8880,
ddgpePixelFormat_8888,
ddgpePixelFormat_YUYV,
ddgpePixelFormat_UYVY,
ddgpePixelFormat_YUY2, //12
ddgpePixelFormat_YV12,
// some generic types
// Use dwPixelFormatData in conjunction with this info
ddgpePixelFormat_15bppGeneric,
ddgpePixelFormat_16bppGeneric,
ddgpePixelFormat_24bppGeneric,
ddgpePixelFormat_32bppGeneric,
ddgpePixelFormat_UnknownFormat,
// you can assign custom formats starting with this value
ddgpePixelFormat_CustomFormat = 0x1000
};
Video Streaming Sample Code
This sample code reads a file and renders it to a primary DirectDraw surface. For brevity, this example performs minimal error checking.
#include <stdio.h>
#include "ddraw.h" // DirectDraw interfaces
#include "mmstream.h" // multimedia stream interfaces
#include "amstream.h" // DirectShow multimedia stream interfaces
#include "ddstream.h" // DirectDraw multimedia stream interfaces
HRESULT RenderStreamToSurface(IDirectDrawSurface *pSurface,
IMultiMediaStream *pMMStream)
{
IMediaStream *pPrimaryVidStream;
IDirectDrawMediaStream *pDDStream;
IDirectDrawStreamSample *pSample;
RECT rect;
DDSURFACEDESC ddsd;
HRESULT hr;
hr = pMMStream->GetMediaStream(MSPID_PrimaryVideo, &pPrimaryVidStream);
if (FAILED(hr))
{
return hr;
}
pPrimaryVidStream->QueryInterface(IID_IDirectDrawMediaStream, (void **)&pDDStream);
ddsd.dwSize = sizeof(ddsd);
hr = pDDStream->GetFormat(&ddsd, NULL, NULL, NULL);
if (SUCCEEDED(hr))
{
rect.top = rect.left = 0;
rect.bottom = ddsd.dwHeight;
rect.right = ddsd.dwWidth;
hr = pDDStream->CreateSample(pSurface, &rect, 0, &pSample);
if (SUCCEEDED(hr))
{
pMMStream->SetState(STREAMSTATE_RUN);
while (pSample->Update(0, NULL, NULL, NULL) == S_OK)
{
// Empty loop.
}
pMMStream->SetState(STREAMSTATE_STOP);
pSample->Release();
}
}
pDDStream->Release();
pPrimaryVidStream->Release();
return hr;
}
HRESULT RenderFileToMMStream(
const char * szFileName,
IMultiMediaStream **ppMMStream,
IDirectDraw *pDD)
{
if (strlen(szFileName) > MAX_PATH)
{
return E_INVALIDARG;
}
IAMMultiMediaStream *pAMStream;
HRESULT hr = CoCreateInstance(CLSID_AMMultiMediaStream, NULL,
CLSCTX_INPROC_SERVER, IID_IAMMultiMediaStream,
(void **)&pAMStream);
if (FAILED(hr)
{
return hr;
}
WCHAR wPath[MAX_PATH + 1];
MultiByteToWideChar(CP_ACP, 0, szFileName, -1, wPath, MAX_PATH + 1);
pAMStream->Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD, NULL);
pAMStream->AddMediaStream(pDD, &MSPID_PrimaryVideo, 0, NULL);
pAMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio, AMMSF_ADDDEFAULTRENDERER, NULL);
hr = pAMStream->OpenFile(wPath, 0);
if (SUCCEEDED(hr))
{
hr = pAMStream->QueryInterface(IID_IMultiMediaStream,
(void**)ppMMStream);
}
pAMStream->Release();
return hr;
}
int __cdecl main(int argc, char *argv[])
{
if (argc < 2)
{
printf("Usage : showstrm movie.ext\n");
exit(0);
}
DDSURFACEDESC ddsd;
IDirectDraw *pDD;
IDirectDrawSurface *pPrimarySurface;
IMultiMediaStream *pMMStream;
CoInitialize(NULL);
DirectDrawCreate(NULL, &pDD, NULL);
pDD->SetCooperativeLevel(GetDesktopWindow(), DDSCL_NORMAL);
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
pDD->CreateSurface(&ddsd, &pPrimarySurface, NULL);
HRESULT hr = RenderFileToMMStream(argv[1], &pMMStream, pDD);
if (SUCCEEDED(hr))
{
RenderStreamToSurface(pPrimarySurface, pMMStream);
pMMStream->Release();
}
pPrimarySurface->Release();
pDD->Release();
CoUninitialize();
return 0;
}