qedit: Implement IMediaDet_get_StreamMediaType.
This commit is contained in:
parent
38994a42f4
commit
3b0d68e409
@ -1,6 +1,6 @@
|
|||||||
/* DirectShow Media Detector object (QEDIT.DLL)
|
/* DirectShow Media Detector object (QEDIT.DLL)
|
||||||
*
|
*
|
||||||
* Copyright 2008 Google (Lei Zhang)
|
* Copyright 2008 Google (Lei Zhang, Dan Hipschman)
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -17,6 +17,7 @@
|
|||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#define COBJMACROS
|
#define COBJMACROS
|
||||||
@ -39,10 +40,13 @@ typedef struct MediaDetImpl {
|
|||||||
IBaseFilter *splitter;
|
IBaseFilter *splitter;
|
||||||
long num_streams;
|
long num_streams;
|
||||||
long cur_stream;
|
long cur_stream;
|
||||||
|
IPin *cur_pin;
|
||||||
} MediaDetImpl;
|
} MediaDetImpl;
|
||||||
|
|
||||||
static void MD_cleanup(MediaDetImpl *This)
|
static void MD_cleanup(MediaDetImpl *This)
|
||||||
{
|
{
|
||||||
|
if (This->cur_pin) IPin_Release(This->cur_pin);
|
||||||
|
This->cur_pin = NULL;
|
||||||
if (This->source) IBaseFilter_Release(This->source);
|
if (This->source) IBaseFilter_Release(This->source);
|
||||||
This->source = NULL;
|
This->source = NULL;
|
||||||
if (This->splitter) IBaseFilter_Release(This->splitter);
|
if (This->splitter) IBaseFilter_Release(This->splitter);
|
||||||
@ -164,6 +168,47 @@ static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, long *pVal)
|
|||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT SetCurPin(MediaDetImpl *This, long strm)
|
||||||
|
{
|
||||||
|
IEnumPins *pins;
|
||||||
|
IPin *pin;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
assert(This->splitter);
|
||||||
|
assert(0 <= strm && strm < This->num_streams);
|
||||||
|
|
||||||
|
if (This->cur_pin)
|
||||||
|
{
|
||||||
|
IPin_Release(This->cur_pin);
|
||||||
|
This->cur_pin = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IBaseFilter_EnumPins(This->splitter, &pins);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
while (IEnumPins_Next(pins, 1, &pin, NULL) == S_OK && !This->cur_pin)
|
||||||
|
{
|
||||||
|
PIN_DIRECTION dir;
|
||||||
|
hr = IPin_QueryDirection(pin, &dir);
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
IPin_Release(pin);
|
||||||
|
IEnumPins_Release(pins);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir == PINDIR_OUTPUT && strm-- == 0)
|
||||||
|
This->cur_pin = pin;
|
||||||
|
else
|
||||||
|
IPin_Release(pin);
|
||||||
|
}
|
||||||
|
IEnumPins_Release(pins);
|
||||||
|
|
||||||
|
assert(This->cur_pin);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal)
|
static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal)
|
||||||
{
|
{
|
||||||
MediaDetImpl *This = (MediaDetImpl *)iface;
|
MediaDetImpl *This = (MediaDetImpl *)iface;
|
||||||
@ -182,6 +227,10 @@ static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal)
|
|||||||
if (newVal < 0 || This->num_streams <= newVal)
|
if (newVal < 0 || This->num_streams <= newVal)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
hr = SetCurPin(This, newVal);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
This->cur_stream = newVal;
|
This->cur_stream = newVal;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
@ -403,7 +452,11 @@ static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal)
|
|||||||
|
|
||||||
This->graph = gb;
|
This->graph = gb;
|
||||||
This->source = bf;
|
This->source = bf;
|
||||||
return GetSplitter(This);
|
hr = GetSplitter(This);
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
return MediaDet_put_CurrentStream(iface, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI MediaDet_GetBitmapBits(IMediaDet* iface,
|
static HRESULT WINAPI MediaDet_GetBitmapBits(IMediaDet* iface,
|
||||||
@ -430,8 +483,34 @@ static HRESULT WINAPI MediaDet_get_StreamMediaType(IMediaDet* iface,
|
|||||||
AM_MEDIA_TYPE *pVal)
|
AM_MEDIA_TYPE *pVal)
|
||||||
{
|
{
|
||||||
MediaDetImpl *This = (MediaDetImpl *)iface;
|
MediaDetImpl *This = (MediaDetImpl *)iface;
|
||||||
FIXME("(%p)->(%p): not implemented!\n", This, pVal);
|
IEnumMediaTypes *types;
|
||||||
return E_NOTIMPL;
|
AM_MEDIA_TYPE *pmt;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%p)\n", This);
|
||||||
|
|
||||||
|
if (!pVal)
|
||||||
|
return E_POINTER;
|
||||||
|
|
||||||
|
if (!This->cur_pin)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
hr = IPin_EnumMediaTypes(This->cur_pin, &types);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
hr = (IEnumMediaTypes_Next(types, 1, &pmt, NULL) == S_OK
|
||||||
|
? S_OK
|
||||||
|
: E_NOINTERFACE);
|
||||||
|
IEnumMediaTypes_Release(types);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
*pVal = *pmt;
|
||||||
|
CoTaskMemFree(pmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI MediaDet_GetSampleGrabber(IMediaDet* iface,
|
static HRESULT WINAPI MediaDet_GetSampleGrabber(IMediaDet* iface,
|
||||||
@ -500,6 +579,7 @@ HRESULT MediaDet_create(IUnknown * pUnkOuter, LPVOID * ppv) {
|
|||||||
obj->graph = NULL;
|
obj->graph = NULL;
|
||||||
obj->source = NULL;
|
obj->source = NULL;
|
||||||
obj->splitter = NULL;
|
obj->splitter = NULL;
|
||||||
|
obj->cur_pin = NULL;
|
||||||
obj->num_streams = -1;
|
obj->num_streams = -1;
|
||||||
obj->cur_stream = 0;
|
obj->cur_stream = 0;
|
||||||
*ppv = obj;
|
*ppv = obj;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Unit tests for Media Detector
|
* Unit tests for Media Detector
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008 Google (Lei Zhang)
|
* Copyright (C) 2008 Google (Lei Zhang, Dan Hipschman)
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -136,6 +136,12 @@ static void test_mediadet(void)
|
|||||||
hr = IMediaDet_put_CurrentStream(pM, -1);
|
hr = IMediaDet_put_CurrentStream(pM, -1);
|
||||||
ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
|
ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
|
||||||
|
|
||||||
|
hr = IMediaDet_get_StreamMediaType(pM, &mt);
|
||||||
|
ok(hr == E_INVALIDARG, "IMediaDet_get_StreamMediaType\n");
|
||||||
|
|
||||||
|
hr = IMediaDet_get_StreamMediaType(pM, NULL);
|
||||||
|
ok(hr == E_POINTER, "IMediaDet_get_StreamMediaType\n");
|
||||||
|
|
||||||
filename = SysAllocString(test_avi_filename);
|
filename = SysAllocString(test_avi_filename);
|
||||||
hr = IMediaDet_put_Filename(pM, filename);
|
hr = IMediaDet_put_Filename(pM, filename);
|
||||||
ok(hr == S_OK, "IMediaDet_put_Filename -> %x\n", hr);
|
ok(hr == S_OK, "IMediaDet_put_Filename -> %x\n", hr);
|
||||||
@ -147,6 +153,11 @@ static void test_mediadet(void)
|
|||||||
ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
|
ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
|
||||||
ok(strm == 0, "IMediaDet_get_CurrentStream\n");
|
ok(strm == 0, "IMediaDet_get_CurrentStream\n");
|
||||||
|
|
||||||
|
ZeroMemory(&mt, sizeof mt);
|
||||||
|
hr = IMediaDet_get_StreamMediaType(pM, &mt);
|
||||||
|
ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
|
||||||
|
CoTaskMemFree(mt.pbFormat);
|
||||||
|
|
||||||
/* Even before get_OutputStreams. */
|
/* Even before get_OutputStreams. */
|
||||||
hr = IMediaDet_put_CurrentStream(pM, 1);
|
hr = IMediaDet_put_CurrentStream(pM, 1);
|
||||||
ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
|
ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
|
||||||
@ -195,9 +206,10 @@ static void test_mediadet(void)
|
|||||||
|
|
||||||
ZeroMemory(&mt, sizeof mt);
|
ZeroMemory(&mt, sizeof mt);
|
||||||
hr = IMediaDet_get_StreamMediaType(pM, &mt);
|
hr = IMediaDet_get_StreamMediaType(pM, &mt);
|
||||||
todo_wine ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
|
ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
|
||||||
todo_wine ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Video),
|
ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Video),
|
||||||
"IMediaDet_get_StreamMediaType\n");
|
"IMediaDet_get_StreamMediaType\n");
|
||||||
|
CoTaskMemFree(mt.pbFormat);
|
||||||
|
|
||||||
hr = IMediaDet_Release(pM);
|
hr = IMediaDet_Release(pM);
|
||||||
ok(hr == 0, "IMediaDet_Release returned: %x\n", hr);
|
ok(hr == 0, "IMediaDet_Release returned: %x\n", hr);
|
||||||
@ -235,12 +247,13 @@ static void test_mediadet(void)
|
|||||||
|
|
||||||
ZeroMemory(&mt, sizeof mt);
|
ZeroMemory(&mt, sizeof mt);
|
||||||
hr = IMediaDet_get_StreamMediaType(pM, &mt);
|
hr = IMediaDet_get_StreamMediaType(pM, &mt);
|
||||||
todo_wine ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
|
ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
|
||||||
flags += (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video)
|
flags += (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video)
|
||||||
? 1
|
? 1
|
||||||
: (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio)
|
: (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio)
|
||||||
? 2
|
? 2
|
||||||
: 0));
|
: 0));
|
||||||
|
CoTaskMemFree(mt.pbFormat);
|
||||||
|
|
||||||
hr = IMediaDet_put_CurrentStream(pM, 1);
|
hr = IMediaDet_put_CurrentStream(pM, 1);
|
||||||
ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
|
ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
|
||||||
@ -252,14 +265,15 @@ static void test_mediadet(void)
|
|||||||
|
|
||||||
ZeroMemory(&mt, sizeof mt);
|
ZeroMemory(&mt, sizeof mt);
|
||||||
hr = IMediaDet_get_StreamMediaType(pM, &mt);
|
hr = IMediaDet_get_StreamMediaType(pM, &mt);
|
||||||
todo_wine ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
|
ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
|
||||||
flags += (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video)
|
flags += (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video)
|
||||||
? 1
|
? 1
|
||||||
: (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio)
|
: (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio)
|
||||||
? 2
|
? 2
|
||||||
: 0));
|
: 0));
|
||||||
|
CoTaskMemFree(mt.pbFormat);
|
||||||
|
|
||||||
todo_wine ok(flags == 3, "IMediaDet_get_StreamMediaType\n");
|
ok(flags == 3, "IMediaDet_get_StreamMediaType\n");
|
||||||
|
|
||||||
hr = IMediaDet_put_CurrentStream(pM, 2);
|
hr = IMediaDet_put_CurrentStream(pM, 2);
|
||||||
ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
|
ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user