Dmitry Timoshkov : windowscodecs: Make sure that stream is not reused once the decoder is initialized.
Alexandre Julliard
julliard at winehq.org
Thu Jun 28 13:55:18 CDT 2012
Module: wine
Branch: master
Commit: 39f80e56fb15858e1d057facae56fa7f8527bd80
URL: http://source.winehq.org/git/wine.git/?a=commit;h=39f80e56fb15858e1d057facae56fa7f8527bd80
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Thu Jun 28 15:08:06 2012 +0900
windowscodecs: Make sure that stream is not reused once the decoder is initialized.
---
dlls/windowscodecs/imgfactory.c | 77 ++++++++++++++++++++-------------------
1 files changed, 39 insertions(+), 38 deletions(-)
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c
index d70c223..c9bba2b 100644
--- a/dlls/windowscodecs/imgfactory.c
+++ b/dlls/windowscodecs/imgfactory.c
@@ -121,26 +121,22 @@ static HRESULT WINAPI ComponentFactory_CreateDecoderFromFilename(
return hr;
}
-static HRESULT WINAPI ComponentFactory_CreateDecoderFromStream(
- IWICComponentFactory *iface, IStream *pIStream, const GUID *pguidVendor,
- WICDecodeOptions metadataOptions, IWICBitmapDecoder **ppIDecoder)
+static IWICBitmapDecoder *find_decoder(IStream *pIStream, const GUID *pguidVendor,
+ WICDecodeOptions metadataOptions)
{
IEnumUnknown *enumdecoders;
IUnknown *unkdecoderinfo;
IWICBitmapDecoderInfo *decoderinfo;
- IWICBitmapDecoder *decoder = NULL, *preferred_decoder = NULL;
+ IWICBitmapDecoder *decoder = NULL;
GUID vendor;
- HRESULT res=S_OK;
+ HRESULT res;
ULONG num_fetched;
BOOL matches;
- TRACE("(%p,%p,%s,%u,%p)\n", iface, pIStream, debugstr_guid(pguidVendor),
- metadataOptions, ppIDecoder);
-
res = CreateComponentEnumerator(WICDecoder, WICComponentEnumerateDefault, &enumdecoders);
- if (FAILED(res)) return res;
+ if (FAILED(res)) return NULL;
- while (!preferred_decoder)
+ while (!decoder)
{
res = IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched);
@@ -150,40 +146,34 @@ static HRESULT WINAPI ComponentFactory_CreateDecoderFromStream(
if (SUCCEEDED(res))
{
+ if (pguidVendor)
+ {
+ res = IWICBitmapDecoderInfo_GetVendorGUID(decoderinfo, &vendor);
+ if (FAILED(res) || !IsEqualIID(&vendor, pguidVendor))
+ {
+ IWICBitmapDecoderInfo_Release(decoderinfo);
+ IUnknown_Release(unkdecoderinfo);
+ continue;
+ }
+ }
+
res = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, pIStream, &matches);
if (SUCCEEDED(res) && matches)
{
- IWICBitmapDecoder *new_decoder;
-
- res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &new_decoder);
+ res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, &decoder);
/* FIXME: should use QueryCapability to choose a decoder */
if (SUCCEEDED(res))
{
- res = IWICBitmapDecoder_Initialize(new_decoder, pIStream, metadataOptions);
+ res = IWICBitmapDecoder_Initialize(decoder, pIStream, metadataOptions);
- if (SUCCEEDED(res))
+ if (FAILED(res))
{
- if (pguidVendor)
- {
- res = IWICBitmapDecoderInfo_GetVendorGUID(decoderinfo, &vendor);
- if (SUCCEEDED(res) && IsEqualIID(&vendor, pguidVendor))
- {
- preferred_decoder = new_decoder;
- new_decoder = NULL;
- }
- }
-
- if (new_decoder && !decoder)
- {
- decoder = new_decoder;
- new_decoder = NULL;
- }
+ IWICBitmapDecoder_Release(decoder);
+ decoder = NULL;
}
-
- if (new_decoder) IWICBitmapDecoder_Release(new_decoder);
}
}
@@ -198,12 +188,23 @@ static HRESULT WINAPI ComponentFactory_CreateDecoderFromStream(
IEnumUnknown_Release(enumdecoders);
- if (preferred_decoder)
- {
- *ppIDecoder = preferred_decoder;
- if (decoder) IWICBitmapDecoder_Release(decoder);
- return S_OK;
- }
+ return decoder;
+}
+
+static HRESULT WINAPI ComponentFactory_CreateDecoderFromStream(
+ IWICComponentFactory *iface, IStream *pIStream, const GUID *pguidVendor,
+ WICDecodeOptions metadataOptions, IWICBitmapDecoder **ppIDecoder)
+{
+ HRESULT res;
+ IWICBitmapDecoder *decoder = NULL;
+
+ TRACE("(%p,%p,%s,%u,%p)\n", iface, pIStream, debugstr_guid(pguidVendor),
+ metadataOptions, ppIDecoder);
+
+ if (pguidVendor)
+ decoder = find_decoder(pIStream, pguidVendor, metadataOptions);
+ if (!decoder)
+ decoder = find_decoder(pIStream, NULL, metadataOptions);
if (decoder)
{
More information about the wine-cvs
mailing list