From da0f196c9348a80f04461d708b26db0f108dead6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Thu, 2 May 2019 02:43:03 +0200 Subject: [PATCH] avifil32: Correctly handle compressed frames when desired format is specified. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Michael Müller Signed-off-by: Vijay Kiran Kamuju Signed-off-by: Alexandre Julliard --- dlls/avifil32/getframe.c | 116 +++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 59 deletions(-) diff --git a/dlls/avifil32/getframe.c b/dlls/avifil32/getframe.c index be4a2a9abff..2e6156806d3 100644 --- a/dlls/avifil32/getframe.c +++ b/dlls/avifil32/getframe.c @@ -405,8 +405,6 @@ static HRESULT WINAPI IGetFrame_fnSetFormat(IGetFrame *iface, lpbi->biSize + lpbi->biClrUsed * sizeof(RGBQUAD)); if (lpbi->biBitCount <= 8) ICDecompressGetPalette(This->hic, This->lpInFormat, This->lpOutFormat); - - return AVIERR_OK; } else { if (bBestDisplay) { ICGetDisplayFormat(This->hic, This->lpInFormat, @@ -416,64 +414,64 @@ static HRESULT WINAPI IGetFrame_fnSetFormat(IGetFrame *iface, AVIFILE_CloseCompressor(This); return AVIERR_NOCOMPRESSOR; } - - /* check output format */ - if (This->lpOutFormat->biClrUsed == 0 && - This->lpOutFormat->biBitCount <= 8) - This->lpOutFormat->biClrUsed = 1u << This->lpOutFormat->biBitCount; - if (This->lpOutFormat->biSizeImage == 0 && - This->lpOutFormat->biCompression == BI_RGB) { - This->lpOutFormat->biSizeImage = - DIBWIDTHBYTES(*This->lpOutFormat) * This->lpOutFormat->biHeight; - } - - if (lpBits == NULL) { - DWORD size = This->lpOutFormat->biClrUsed * sizeof(RGBQUAD); - - size += This->lpOutFormat->biSize + This->lpOutFormat->biSizeImage; - This->lpOutFormat = HeapReAlloc(GetProcessHeap(), 0, This->lpOutFormat, size); - if (This->lpOutFormat == NULL) { - AVIFILE_CloseCompressor(This); - return AVIERR_MEMORY; - } - This->lpOutBuffer = DIBPTR(This->lpOutFormat); - } else - This->lpOutBuffer = lpBits; - - /* for user size was irrelevant */ - if (dx == -1) - dx = This->lpOutFormat->biWidth; - if (dy == -1) - dy = This->lpOutFormat->biHeight; - - /* need to resize? */ - if (x != 0 || y != 0) { - if (dy == This->lpOutFormat->biHeight && - dx == This->lpOutFormat->biWidth) - This->bResize = FALSE; - else - This->bResize = TRUE; - } - - if (This->bResize) { - This->x = x; - This->y = y; - This->dx = dx; - This->dy = dy; - - if (ICDecompressExBegin(This->hic,0,This->lpInFormat,This->lpInBuffer,0, - 0,This->lpInFormat->biWidth, - This->lpInFormat->biHeight,This->lpOutFormat, - This->lpOutBuffer, x, y, dx, dy) == ICERR_OK) - return AVIERR_OK; - } else if (ICDecompressBegin(This->hic, This->lpInFormat, - This->lpOutFormat) == ICERR_OK) - return AVIERR_OK; - - AVIFILE_CloseCompressor(This); - - return AVIERR_COMPRESSOR; } + + /* check output format */ + if (This->lpOutFormat->biClrUsed == 0 && + This->lpOutFormat->biBitCount <= 8) + This->lpOutFormat->biClrUsed = 1u << This->lpOutFormat->biBitCount; + if (This->lpOutFormat->biSizeImage == 0 && + This->lpOutFormat->biCompression == BI_RGB) { + This->lpOutFormat->biSizeImage = + DIBWIDTHBYTES(*This->lpOutFormat) * This->lpOutFormat->biHeight; + } + + if (lpBits == NULL) { + DWORD size = This->lpOutFormat->biClrUsed * sizeof(RGBQUAD); + + size += This->lpOutFormat->biSize + This->lpOutFormat->biSizeImage; + This->lpOutFormat = HeapReAlloc(GetProcessHeap(), 0, This->lpOutFormat, size); + if (This->lpOutFormat == NULL) { + AVIFILE_CloseCompressor(This); + return AVIERR_MEMORY; + } + This->lpOutBuffer = DIBPTR(This->lpOutFormat); + } else + This->lpOutBuffer = lpBits; + + /* for user size was irrelevant */ + if (dx == -1) + dx = This->lpOutFormat->biWidth; + if (dy == -1) + dy = This->lpOutFormat->biHeight; + + /* need to resize? */ + if (x != 0 || y != 0) { + if (dy == This->lpOutFormat->biHeight && + dx == This->lpOutFormat->biWidth) + This->bResize = FALSE; + else + This->bResize = TRUE; + } + + if (This->bResize) { + This->x = x; + This->y = y; + This->dx = dx; + This->dy = dy; + + if (ICDecompressExBegin(This->hic,0,This->lpInFormat,This->lpInBuffer,0, + 0,This->lpInFormat->biWidth, + This->lpInFormat->biHeight,This->lpOutFormat, + This->lpOutBuffer, x, y, dx, dy) == ICERR_OK) + return AVIERR_OK; + } else if (ICDecompressBegin(This->hic, This->lpInFormat, + This->lpOutFormat) == ICERR_OK) + return AVIERR_OK; + + AVIFILE_CloseCompressor(This); + + return AVIERR_COMPRESSOR; } static const struct IGetFrameVtbl igetframeVtbl = {