[PATCH 1/5] quartz/videorenderer: Factor out get_bitmap_header().

Zebediah Figura z.figura12 at gmail.com
Tue May 5 19:03:41 CDT 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/videorenderer.c | 85 +++++++++++++------------------------
 1 file changed, 30 insertions(+), 55 deletions(-)

diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c
index 54a646fbc04..77afc9fcef5 100644
--- a/dlls/quartz/videorenderer.c
+++ b/dlls/quartz/videorenderer.c
@@ -79,6 +79,14 @@ static inline struct video_renderer *impl_from_BaseControlVideo(BaseControlVideo
     return CONTAINING_RECORD(iface, struct video_renderer, baseControlVideo);
 }
 
+static const BITMAPINFOHEADER *get_bitmap_header(const AM_MEDIA_TYPE *mt)
+{
+    if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
+        return &((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader;
+    else
+        return &((VIDEOINFOHEADER2 *)mt->pbFormat)->bmiHeader;
+}
+
 static void VideoRenderer_AutoShowWindow(struct video_renderer *This)
 {
     if (!This->init && (!This->WindowPos.right || !This->WindowPos.top))
@@ -144,9 +152,7 @@ static HRESULT WINAPI VideoRenderer_ShouldDrawSampleNow(struct strmbase_renderer
 static HRESULT WINAPI VideoRenderer_DoRenderSample(struct strmbase_renderer *iface, IMediaSample *pSample)
 {
     struct video_renderer *filter = impl_from_strmbase_renderer(iface);
-    const AM_MEDIA_TYPE *mt = &filter->renderer.sink.pin.mt;
     LPBYTE pbSrcStream = NULL;
-    BITMAPINFOHEADER *bih;
     HRESULT hr;
     HDC dc;
 
@@ -159,11 +165,6 @@ static HRESULT WINAPI VideoRenderer_DoRenderSample(struct strmbase_renderer *ifa
         return hr;
     }
 
-    if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
-        bih = &((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader;
-    else
-        bih = &((VIDEOINFOHEADER2 *)mt->pbFormat)->bmiHeader;
-
     dc = GetDC(filter->baseControlWindow.hwnd);
     StretchDIBits(dc, filter->DestRect.left, filter->DestRect.top,
             filter->DestRect.right - filter->DestRect.left,
@@ -171,7 +172,7 @@ static HRESULT WINAPI VideoRenderer_DoRenderSample(struct strmbase_renderer *ifa
             filter->SourceRect.left, filter->SourceRect.top,
             filter->SourceRect.right - filter->SourceRect.left,
             filter->SourceRect.bottom - filter->SourceRect.top,
-            pbSrcStream, (BITMAPINFO *)bih, DIB_RGB_COLORS, SRCCOPY);
+            pbSrcStream, (BITMAPINFO *)get_bitmap_header(&filter->renderer.sink.pin.mt), DIB_RGB_COLORS, SRCCOPY);
     ReleaseDC(filter->baseControlWindow.hwnd, dc);
 
     if (filter->renderer.filter.state == State_Paused)
@@ -190,53 +191,31 @@ static HRESULT WINAPI VideoRenderer_DoRenderSample(struct strmbase_renderer *ifa
     return S_OK;
 }
 
-static HRESULT WINAPI VideoRenderer_CheckMediaType(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *pmt)
+static HRESULT WINAPI VideoRenderer_CheckMediaType(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt)
 {
-    struct video_renderer *This = impl_from_strmbase_renderer(iface);
+    struct video_renderer *filter = impl_from_strmbase_renderer(iface);
+    const BITMAPINFOHEADER *bitmap_header;
 
-    if (!IsEqualIID(&pmt->majortype, &MEDIATYPE_Video))
+    if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Video))
         return S_FALSE;
 
-    if (IsEqualIID(&pmt->subtype, &MEDIASUBTYPE_RGB32) ||
-        IsEqualIID(&pmt->subtype, &MEDIASUBTYPE_RGB24) ||
-        IsEqualIID(&pmt->subtype, &MEDIASUBTYPE_RGB565) ||
-        IsEqualIID(&pmt->subtype, &MEDIASUBTYPE_RGB8))
-    {
-        LONG height;
+    if (!IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB32)
+            && !IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB24)
+            && !IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB565)
+            && !IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_RGB8))
+        return S_FALSE;
 
-        if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
-        {
-            VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)pmt->pbFormat;
-            This->SourceRect.left = 0;
-            This->SourceRect.top = 0;
-            This->SourceRect.right = This->VideoWidth = format->bmiHeader.biWidth;
-            height = format->bmiHeader.biHeight;
-            if (height < 0)
-                This->SourceRect.bottom = This->VideoHeight = -height;
-            else
-                This->SourceRect.bottom = This->VideoHeight = height;
-        }
-        else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2))
-        {
-            VIDEOINFOHEADER2 *format2 = (VIDEOINFOHEADER2 *)pmt->pbFormat;
-
-            This->SourceRect.left = 0;
-            This->SourceRect.top = 0;
-            This->SourceRect.right = This->VideoWidth = format2->bmiHeader.biWidth;
-            height = format2->bmiHeader.biHeight;
-            if (height < 0)
-                This->SourceRect.bottom = This->VideoHeight = -height;
-            else
-                This->SourceRect.bottom = This->VideoHeight = height;
-        }
-        else
-        {
-            WARN("Format type %s not supported\n", debugstr_guid(&pmt->formattype));
-            return S_FALSE;
-        }
-        return S_OK;
-    }
-    return S_FALSE;
+    if (!IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo)
+            && !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo2))
+        return S_FALSE;
+
+    bitmap_header = get_bitmap_header(mt);
+
+    filter->VideoWidth = bitmap_header->biWidth;
+    filter->VideoHeight = abs(bitmap_header->biHeight);
+    SetRect(&filter->SourceRect, 0, 0, filter->VideoWidth, filter->VideoHeight);
+
+    return S_OK;
 }
 
 static void video_renderer_destroy(struct strmbase_renderer *iface)
@@ -360,7 +339,6 @@ static HRESULT WINAPI VideoRenderer_GetSourceRect(BaseControlVideo* iface, RECT
 static HRESULT WINAPI VideoRenderer_GetStaticImage(BaseControlVideo *iface, LONG *size, LONG *image)
 {
     struct video_renderer *filter = impl_from_BaseControlVideo(iface);
-    const AM_MEDIA_TYPE *mt = &filter->renderer.sink.pin.mt;
     const BITMAPINFOHEADER *bih;
     size_t image_size;
     BYTE *sample_data;
@@ -369,10 +347,7 @@ static HRESULT WINAPI VideoRenderer_GetStaticImage(BaseControlVideo *iface, LONG
 
     EnterCriticalSection(&filter->renderer.csRenderLock);
 
-    if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
-        bih = &((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader;
-    else /* if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo2)) */
-        bih = &((VIDEOINFOHEADER2 *)mt->pbFormat)->bmiHeader;
+    bih = get_bitmap_header(&filter->renderer.sink.pin.mt);
     image_size = bih->biWidth * bih->biHeight * bih->biBitCount / 8;
 
     if (!image)
-- 
2.26.2




More information about the wine-devel mailing list