Nikolay Sivov : mfplay: Keep start/stop positions for items.

Alexandre Julliard julliard at winehq.org
Mon Jun 21 16:14:55 CDT 2021


Module: wine
Branch: master
Commit: 53446a219db92980e50111ecf7c0cb257ae58411
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=53446a219db92980e50111ecf7c0cb257ae58411

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Jun 21 11:43:13 2021 +0300

mfplay: Keep start/stop positions for items.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfplay/player.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 77 insertions(+), 4 deletions(-)

diff --git a/dlls/mfplay/player.c b/dlls/mfplay/player.c
index c4913134901..0e41656f0c8 100644
--- a/dlls/mfplay/player.c
+++ b/dlls/mfplay/player.c
@@ -63,6 +63,8 @@ struct media_item
     DWORD_PTR user_data;
     WCHAR *url;
     IUnknown *object;
+    LONGLONG start_position;
+    LONGLONG stop_position;
 };
 
 struct media_player
@@ -418,21 +420,92 @@ static HRESULT WINAPI media_item_SetUserData(IMFPMediaItem *iface, DWORD_PTR use
     return S_OK;
 }
 
+static HRESULT media_item_set_position(const GUID *format, const PROPVARIANT *position, LARGE_INTEGER *ret)
+{
+    ret->QuadPart = 0;
+
+    if (format && !IsEqualGUID(format, &MFP_POSITIONTYPE_100NS))
+        return E_INVALIDARG;
+
+    if ((format != NULL) ^ (position != NULL))
+        return E_POINTER;
+
+    if (position && position->vt != VT_EMPTY && position->vt != VT_I8)
+        return E_INVALIDARG;
+
+    if ((!format && !position) || position->vt == VT_EMPTY)
+        return S_OK;
+
+    if (position->hVal.QuadPart == 0)
+        return MF_E_OUT_OF_RANGE;
+
+    ret->QuadPart = position->hVal.QuadPart;
+
+    return S_OK;
+}
+
+static void media_item_get_position(LONGLONG value, GUID *format, PROPVARIANT *position)
+{
+    if (!format)
+        return;
+
+    memcpy(format, &MFP_POSITIONTYPE_100NS, sizeof(*format));
+
+    if (value)
+    {
+        position->vt = VT_I8;
+        position->hVal.QuadPart = value;
+    }
+}
+
 static HRESULT WINAPI media_item_GetStartStopPosition(IMFPMediaItem *iface, GUID *start_format,
         PROPVARIANT *start_position, GUID *stop_format, PROPVARIANT *stop_position)
 {
-    FIXME("%p, %p, %p, %p, %p.\n", iface, start_format, start_position, stop_format, stop_position);
+    struct media_item *item = impl_from_IMFPMediaItem(iface);
 
-    return E_NOTIMPL;
+    TRACE("%p, %p, %p, %p, %p.\n", iface, start_format, start_position, stop_format, stop_position);
+
+    if (start_position)
+        start_position->vt = VT_EMPTY;
+    if (stop_position)
+        stop_position->vt = VT_EMPTY;
+
+    if (((start_format != NULL) ^ (start_position != NULL)) ||
+            ((stop_format != NULL) ^ (stop_position != NULL)))
+    {
+        return E_POINTER;
+    }
+
+    media_item_get_position(item->start_position, start_format, start_position);
+    media_item_get_position(item->stop_position, stop_format, stop_position);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI media_item_SetStartStopPosition(IMFPMediaItem *iface, const GUID *start_format,
         const PROPVARIANT *start_position, const GUID *stop_format, const PROPVARIANT *stop_position)
 {
-    FIXME("%p, %s, %p, %s, %p.\n", iface, debugstr_guid(start_format), start_position,
+    struct media_item *item = impl_from_IMFPMediaItem(iface);
+    LARGE_INTEGER start, stop;
+    HRESULT hr;
+
+    TRACE("%p, %s, %p, %s, %p.\n", iface, debugstr_guid(start_format), start_position,
             debugstr_guid(stop_format), stop_position);
 
-    return E_NOTIMPL;
+    hr = media_item_set_position(start_format, start_position, &start);
+    if (SUCCEEDED(hr))
+        hr = media_item_set_position(stop_format, stop_position, &stop);
+
+    if (FAILED(hr))
+        return hr;
+
+    if (start.QuadPart > stop.QuadPart)
+        return MF_E_OUT_OF_RANGE;
+
+    item->start_position = start.QuadPart;
+    item->stop_position = stop.QuadPart;
+
+    return hr;
 }
 
 static HRESULT media_item_get_stream_type(IMFStreamDescriptor *sd, GUID *major)




More information about the wine-cvs mailing list