[PATCH v2 13/13] qedit: Implement MediaDet_get_StreamLength.

Zebediah Figura zfigura at codeweavers.com
Thu Apr 16 11:52:34 CDT 2020


On 4/16/20 10:25 AM, Gabriel Ivăncescu wrote:
> Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
> ---
>  dlls/qedit/mediadet.c       | 39 +++++++++++++++++++++++++++++++++++--
>  dlls/qedit/tests/mediadet.c | 19 ++++++++++++++++++
>  2 files changed, 56 insertions(+), 2 deletions(-)
> 

I think adding the IMediaPosition and IMediaSeeking interfaces to
testfilter should be part of this patch rather than 12/13.

> diff --git a/dlls/qedit/mediadet.c b/dlls/qedit/mediadet.c
> index 9903238..4990dbe 100644
> --- a/dlls/qedit/mediadet.c
> +++ b/dlls/qedit/mediadet.c
> @@ -569,8 +569,43 @@ static HRESULT WINAPI MediaDet_get_StreamTypeB(IMediaDet* iface, BSTR *pVal)
>  static HRESULT WINAPI MediaDet_get_StreamLength(IMediaDet* iface, double *pVal)
>  {
>      MediaDetImpl *This = impl_from_IMediaDet(iface);
> -    FIXME("(%p): stub!\n", This);
> -    return VFW_E_INVALIDMEDIATYPE;
> +    IMediaSeeking *seeking;
> +    IMediaPosition *pos;
> +    HRESULT hr;
> +
> +    TRACE("(%p)\n", This);
> +
> +    if (!pVal)
> +        return E_POINTER;
> +
> +    if (!This->cur_pin)
> +        return E_INVALIDARG;
> +
> +    hr = IPin_QueryInterface(This->cur_pin, &IID_IMediaPosition, (void **) &pos);
> +    if (SUCCEEDED(hr))
> +    {
> +        hr = IMediaPosition_get_Duration(pos, pVal);
> +        IMediaPosition_Release(pos);
> +        return hr;
> +    }
> +
> +    hr = IPin_QueryInterface(This->cur_pin, &IID_IMediaSeeking, (void **) &seeking);
> +    if (SUCCEEDED(hr))
> +    {
> +        LONGLONG duration;
> +
> +        hr = IMediaSeeking_GetDuration(seeking, &duration);
> +        if (SUCCEEDED(hr))
> +        {
> +            hr = IMediaSeeking_ConvertTimeFormat(seeking, &duration, &TIME_FORMAT_MEDIA_TIME, duration, NULL);
> +            if (SUCCEEDED(hr))
> +                *pVal = (REFTIME)duration / 10000000;
> +        }
> +        IMediaSeeking_Release(seeking);
> +        return hr;
> +    }

You're not really testing this, and for that matter, IMediaSeeking is
essentially unused in your tests.

> +
> +    return hr;
>  }
>  
>  static HRESULT WINAPI MediaDet_get_Filename(IMediaDet* iface, BSTR *pVal)
> diff --git a/dlls/qedit/tests/mediadet.c b/dlls/qedit/tests/mediadet.c
> index 10127cf..14c99e8 100644
> --- a/dlls/qedit/tests/mediadet.c
> +++ b/dlls/qedit/tests/mediadet.c
> @@ -1060,6 +1060,7 @@ static void test_mediadet(void)
>      GUID guid;
>      BSTR bstr;
>      AM_MEDIA_TYPE mt;
> +    double duration;
>      IUnknown *unk;
>      double fps;
>      int flags;
> @@ -1122,6 +1123,12 @@ static void test_mediadet(void)
>      hr = IMediaDet_get_StreamTypeB(pM, NULL);
>      ok(hr == E_INVALIDARG, "IMediaDet_get_StreamTypeB failed: %08x\n", hr);
>  
> +    hr = IMediaDet_get_StreamLength(pM, &duration);
> +    ok(hr == E_INVALIDARG, "IMediaDet_get_StreamLength failed: %08x\n", hr);
> +
> +    hr = IMediaDet_get_StreamLength(pM, NULL);
> +    ok(hr == E_POINTER, "IMediaDet_get_StreamLength failed: %08x\n", hr);
> +
>      hr = IMediaDet_get_Filter(pM, NULL);
>      ok(hr == E_POINTER, "IMediaDet_get_Filter failed: %08x\n", hr);
>  
> @@ -1202,6 +1209,10 @@ static void test_mediadet(void)
>      ok(!wcscmp(bstr, L"{73646976-0000-0010-8000-00AA00389B71}"), "Wrong GUID %s\n", wine_dbgstr_w(bstr));
>      SysFreeString(bstr);
>  
> +    hr = IMediaDet_get_StreamLength(pM, &duration);
> +    ok(hr == S_OK, "IMediaDet_get_StreamLength failed: %08x\n", hr);
> +    ok(duration >= 0.1 && duration < 0.10000001, "Wrong duration %.17g\n", duration);

%.16e.

I'm also not sure that I particularly care about adding these tests; as
mentioned in 12/13, I'd rather see the AVI parts go away entirely.

> +
>      /* Even before get_OutputStreams.  */
>      hr = IMediaDet_put_CurrentStream(pM, 1);
>      ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream failed: %08x\n", hr);
> @@ -1264,6 +1275,10 @@ static void test_mediadet(void)
>      ok(!wcscmp(bstr, L"{73646976-0000-0010-8000-00AA00389B71}"), "Wrong GUID %s\n", wine_dbgstr_w(bstr));
>      SysFreeString(bstr);
>  
> +    hr = IMediaDet_get_StreamLength(pM, &duration);
> +    ok(hr == S_OK, "IMediaDet_get_StreamLength failed: %08x\n", hr);
> +    ok(duration >= 0.1 && duration < 0.10000001, "Wrong duration %.17g\n", duration);
> +
>      hr = IMediaDet_get_FrameRate(pM, NULL);
>      ok(hr == E_POINTER, "IMediaDet_get_FrameRate failed: %08x\n", hr);
>  
> @@ -1392,6 +1407,10 @@ static void test_mediadet(void)
>      ok(hr == S_OK, "IMediaDet_get_OutputStreams failed: %08x\n", hr);
>      ok(nstrms == 1, "IMediaDet_get_OutputStreams: nstrms is %i\n", nstrms);
>  
> +    hr = IMediaDet_get_StreamLength(pM, &duration);
> +    ok(hr == S_OK, "IMediaDet_get_StreamLength failed: %08x\n", hr);
> +    ok(duration >= 4.2 && duration < 4.20000001, "Wrong duration %.17g\n", duration);
> +

Surely we can at least compare this to 4.2 exactly? That's the double
that we return.

>      hr = IMediaDet_Release(pM);
>      ok(hr == 0, "IMediaDet_Release returned: %x\n", hr);
>  
> 



More information about the wine-devel mailing list