Ziqing Hui : windowscodecs: Use IWICWineDecoder_Initialize() to initialize decoders in find_decoder().

Alexandre Julliard julliard at winehq.org
Fri Jul 17 16:30:45 CDT 2020


Module: wine
Branch: master
Commit: 81405aa86d736c52afbc12919428ffa2d8634e93
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=81405aa86d736c52afbc12919428ffa2d8634e93

Author: Ziqing Hui <zhui at codeweavers.com>
Date:   Wed Jul 15 22:00:55 2020 +0800

windowscodecs: Use IWICWineDecoder_Initialize() to initialize decoders in find_decoder().

Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/windowscodecs/imgfactory.c | 94 ++++++++++++++++++++---------------------
 1 file changed, 46 insertions(+), 48 deletions(-)

diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c
index e7c61cff70..0ad8bc6ee1 100644
--- a/dlls/windowscodecs/imgfactory.c
+++ b/dlls/windowscodecs/imgfactory.c
@@ -134,76 +134,74 @@ static HRESULT WINAPI ImagingFactory_CreateDecoderFromFilename(
 static HRESULT find_decoder(IStream *pIStream, const GUID *pguidVendor,
                             WICDecodeOptions metadataOptions, IWICBitmapDecoder **decoder)
 {
-    IEnumUnknown *enumdecoders;
-    IUnknown *unkdecoderinfo;
-    IWICBitmapDecoderInfo *decoderinfo;
+    IEnumUnknown *enumdecoders = NULL;
+    IUnknown *unkdecoderinfo = NULL;
     GUID vendor;
-    HRESULT res;
+    HRESULT res, res_wine;
     ULONG num_fetched;
-    BOOL matches;
+    BOOL matches, found;
 
     *decoder = NULL;
 
     res = CreateComponentEnumerator(WICDecoder, WICComponentEnumerateDefault, &enumdecoders);
     if (FAILED(res)) return res;
 
-    while (!*decoder)
+    found = FALSE;
+    while (IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched) == S_OK)
     {
-        res = IEnumUnknown_Next(enumdecoders, 1, &unkdecoderinfo, &num_fetched);
+        IWICBitmapDecoderInfo *decoderinfo = NULL;
+        IWICWineDecoder *wine_decoder = NULL;
 
-        if (res == S_OK)
-        {
-            res = IUnknown_QueryInterface(unkdecoderinfo, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo);
+        res = IUnknown_QueryInterface(unkdecoderinfo, &IID_IWICBitmapDecoderInfo, (void**)&decoderinfo);
+        if (FAILED(res)) goto next;
 
-            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 (pguidVendor)
+        {
+            res = IWICBitmapDecoderInfo_GetVendorGUID(decoderinfo, &vendor);
+            if (FAILED(res) || !IsEqualIID(&vendor, pguidVendor)) goto next;
+        }
 
-                if (SUCCEEDED(res) && matches)
-                {
-                    res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, decoder);
+        res = IWICBitmapDecoderInfo_MatchesPattern(decoderinfo, pIStream, &matches);
+        if (FAILED(res) || !matches) goto next;
 
-                    /* FIXME: should use QueryCapability to choose a decoder */
+        res = IWICBitmapDecoderInfo_CreateInstance(decoderinfo, decoder);
+        if (FAILED(res)) goto next;
 
-                    if (SUCCEEDED(res))
-                    {
-                        res = IWICBitmapDecoder_Initialize(*decoder, pIStream, metadataOptions);
+        /* FIXME: should use QueryCapability to choose a decoder */
 
-                        if (FAILED(res))
-                        {
-                            IWICBitmapDecoder_Release(*decoder);
-                            IWICBitmapDecoderInfo_Release(decoderinfo);
-                            IUnknown_Release(unkdecoderinfo);
-                            IEnumUnknown_Release(enumdecoders);
-                            *decoder = NULL;
-                            return res;
-                        }
-                    }
-                }
+        found = TRUE;
+        res = IWICBitmapDecoder_Initialize(*decoder, pIStream, metadataOptions);
+        if (FAILED(res))
+        {
+            res_wine = IWICBitmapDecoder_QueryInterface(*decoder, &IID_IWICWineDecoder, (void **)&wine_decoder);
+            if (FAILED(res_wine))
+            {
+                IWICBitmapDecoder_Release(*decoder);
+                *decoder = NULL;
+                goto next;
+            }
 
-                IWICBitmapDecoderInfo_Release(decoderinfo);
+            res_wine = IWICWineDecoder_Initialize(wine_decoder, pIStream, metadataOptions);
+            if (FAILED(res_wine))
+            {
+                IWICBitmapDecoder_Release(*decoder);
+                *decoder = NULL;
+                goto next;
             }
 
-            IUnknown_Release(unkdecoderinfo);
+            res = res_wine;
         }
-        else
-            break;
+
+    next:
+        if (wine_decoder) IWICWineDecoder_Release(wine_decoder);
+        if (decoderinfo) IWICBitmapDecoderInfo_Release(decoderinfo);
+        IUnknown_Release(unkdecoderinfo);
+        if (found) break;
     }
 
     IEnumUnknown_Release(enumdecoders);
-
-    return WINCODEC_ERR_COMPONENTNOTFOUND;
+    if (!found) res = WINCODEC_ERR_COMPONENTNOTFOUND;
+    return res;
 }
 
 static HRESULT WINAPI ImagingFactory_CreateDecoderFromStream(




More information about the wine-cvs mailing list