[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