Nikolay Sivov : mfmediaengine: Implement GetVideoAspectRatio().
Alexandre Julliard
julliard at winehq.org
Thu Nov 5 15:37:15 CST 2020
Module: wine
Branch: master
Commit: ef8bf642c716983317badb799e20eb6419be374c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ef8bf642c716983317badb799e20eb6419be374c
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu Nov 5 19:04:55 2020 +0300
mfmediaengine: Implement GetVideoAspectRatio().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mfmediaengine/main.c | 69 +++++++++++++++++++++++++++-----
dlls/mfmediaengine/tests/mfmediaengine.c | 1 -
2 files changed, 59 insertions(+), 11 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index cbea4263702..27f6a26d6b7 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -74,7 +74,8 @@ enum media_engine_flags
struct video_frame
{
LONGLONG pts;
- UINT64 size;
+ SIZE size;
+ SIZE ratio;
TOPOID node_id;
};
@@ -252,15 +253,34 @@ static struct media_engine *impl_from_IMFSampleGrabberSinkCallback(IMFSampleGrab
return CONTAINING_RECORD(iface, struct media_engine, grabber_callback);
}
+static unsigned int get_gcd(unsigned int a, unsigned int b)
+{
+ unsigned int m;
+
+ while (b)
+ {
+ m = a % b;
+ a = b;
+ b = m;
+ }
+
+ return a;
+}
+
static void media_engine_get_frame_size(struct media_engine *engine, IMFTopology *topology)
{
IMFMediaTypeHandler *handler;
IMFMediaType *media_type;
IMFStreamDescriptor *sd;
IMFTopologyNode *node;
+ unsigned int gcd;
+ UINT64 size;
HRESULT hr;
- engine->video_frame.size = 0;
+ engine->video_frame.size.cx = 0;
+ engine->video_frame.size.cy = 0;
+ engine->video_frame.ratio.cx = 1;
+ engine->video_frame.ratio.cy = 1;
if (FAILED(IMFTopology_GetNodeByID(topology, engine->video_frame.node_id, &node)))
return;
@@ -284,7 +304,17 @@ static void media_engine_get_frame_size(struct media_engine *engine, IMFTopology
return;
}
- IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &engine->video_frame.size);
+ IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &size);
+
+ engine->video_frame.size.cx = size >> 32;
+ engine->video_frame.size.cy = size;
+
+ if ((gcd = get_gcd(engine->video_frame.size.cx, engine->video_frame.size.cy)))
+ {
+ engine->video_frame.ratio.cx = engine->video_frame.size.cx / gcd;
+ engine->video_frame.ratio.cy = engine->video_frame.size.cy / gcd;
+ }
+
IMFMediaType_Release(media_type);
}
@@ -533,8 +563,7 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi
UINT64 duration;
HRESULT hr;
- engine->video_frame.node_id = 0;
- engine->video_frame.size = 0;
+ memset(&engine->video_frame, 0, sizeof(engine->video_frame));
if (FAILED(hr = IMFMediaSource_CreatePresentationDescriptor(source, &pd)))
return hr;
@@ -1309,12 +1338,12 @@ static HRESULT WINAPI media_engine_GetNativeVideoSize(IMFMediaEngine *iface, DWO
EnterCriticalSection(&engine->cs);
- if (!engine->video_frame.size)
+ if (!engine->video_frame.size.cx && !engine->video_frame.size.cy)
hr = E_FAIL;
else
{
- if (cx) *cx = engine->video_frame.size >> 32;
- if (cy) *cy = engine->video_frame.size;
+ if (cx) *cx = engine->video_frame.size.cx;
+ if (cy) *cy = engine->video_frame.size.cy;
}
LeaveCriticalSection(&engine->cs);
@@ -1324,9 +1353,29 @@ static HRESULT WINAPI media_engine_GetNativeVideoSize(IMFMediaEngine *iface, DWO
static HRESULT WINAPI media_engine_GetVideoAspectRatio(IMFMediaEngine *iface, DWORD *cx, DWORD *cy)
{
- FIXME("(%p, %p, %p): stub.\n", iface, cx, cy);
+ struct media_engine *engine = impl_from_IMFMediaEngine(iface);
+ HRESULT hr = S_OK;
- return E_NOTIMPL;
+ TRACE("%p, %p, %p.\n", iface, cx, cy);
+
+ if (!cx && !cy)
+ return E_INVALIDARG;
+
+ EnterCriticalSection(&engine->cs);
+
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+ else if (!engine->video_frame.size.cx && !engine->video_frame.size.cy)
+ hr = E_FAIL;
+ else
+ {
+ if (cx) *cx = engine->video_frame.ratio.cx;
+ if (cy) *cy = engine->video_frame.ratio.cy;
+ }
+
+ LeaveCriticalSection(&engine->cs);
+
+ return hr;
}
static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngine *iface)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index 21ead1b0afa..2f062741f60 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -383,7 +383,6 @@ todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
hr = IMFMediaEngine_GetVideoAspectRatio(media_engine, &cx, &cy);
-todo_wine
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
IMFMediaEngine_Release(media_engine);
More information about the wine-cvs
mailing list