From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/quartz/avidec.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c index bcd9dd217bd..e4ff86599ab 100644 --- a/dlls/quartz/avidec.c +++ b/dlls/quartz/avidec.c @@ -53,17 +53,27 @@ struct avi_decompressor REFERENCE_TIME late; };
-static BITMAPINFOHEADER *copy_bitmap_header(const AM_MEDIA_TYPE *mt) +static const BITMAPINFOHEADER *get_bitmap_header(const AM_MEDIA_TYPE *mt) { - const BITMAPINFOHEADER *src; - BITMAPINFOHEADER *header; - size_t size; - if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo)) - src = &((const VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader; + return &((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader; + else + return &((VIDEOINFOHEADER2 *)mt->pbFormat)->bmiHeader; +} + +static size_t get_bitmap_info_size(const BITMAPINFOHEADER *header) +{ + if (header->biCompression == BI_BITFIELDS) + return header->biSize + 3 * sizeof(DWORD); else - src = &((const VIDEOINFOHEADER2 *)mt->pbFormat)->bmiHeader; - size = src->biSize + src->biClrUsed * sizeof(RGBQUAD); + return header->biSize + header->biClrUsed * sizeof(RGBQUAD); +} + +static BITMAPINFOHEADER *copy_bitmap_header(const AM_MEDIA_TYPE *mt) +{ + const BITMAPINFOHEADER *src = get_bitmap_header(mt); + size_t size = get_bitmap_info_size(src); + BITMAPINFOHEADER *header;
if ((header = malloc(size))) memcpy(header, src, size);