Maarten Lankhorst : quartz: Add support for VideoInfoHeader2 to AVI Decompressor.

Alexandre Julliard julliard at winehq.org
Tue Jun 24 06:44:13 CDT 2008


Module: wine
Branch: master
Commit: 9009e68c5b4aa7ff3dc592e8563e53591735916a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9009e68c5b4aa7ff3dc592e8563e53591735916a

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Thu Jun 19 21:17:08 2008 -0700

quartz: Add support for VideoInfoHeader2 to AVI Decompressor.

---

 dlls/quartz/avidec.c |   46 +++++++++++++++++++++++++++++++---------------
 1 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c
index e35f144..79fd4d8 100644
--- a/dlls/quartz/avidec.c
+++ b/dlls/quartz/avidec.c
@@ -31,6 +31,7 @@
 #include "strmif.h"
 #include "vfwmsgs.h"
 #include "vfw.h"
+#include "dvdmedia.h"
 
 #include <assert.h>
 
@@ -179,35 +180,44 @@ static HRESULT AVIDec_ConnectInput(TransformFilterImpl* pTransformFilter, const
 
     /* Check root (GUID w/o FOURCC) */
     if ((IsEqualIID(&pmt->majortype, &MEDIATYPE_Video)) &&
-        (!memcmp(((const char *)&pmt->subtype)+4, ((const char *)&MEDIATYPE_Video)+4, sizeof(GUID)-4)) &&
-        (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)))
+        (!memcmp(((const char *)&pmt->subtype)+4, ((const char *)&MEDIATYPE_Video)+4, sizeof(GUID)-4)))
     {
-        VIDEOINFOHEADER* format = (VIDEOINFOHEADER*)pmt->pbFormat;
-
-        This->hvid = ICLocate(pmt->majortype.Data1, pmt->subtype.Data1, &format->bmiHeader, NULL, ICMODE_DECOMPRESS);
+        VIDEOINFOHEADER *format1 = (VIDEOINFOHEADER *)pmt->pbFormat;
+        VIDEOINFOHEADER2 *format2 = (VIDEOINFOHEADER2 *)pmt->pbFormat;
+        BITMAPINFOHEADER *bmi;
+
+        if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
+            bmi = &format1->bmiHeader;
+        else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2))
+            bmi = &format2->bmiHeader;
+        else
+            goto failed;
+        TRACE("Fourcc: %s\n", debugstr_an((char *)&pmt->subtype.Data1, 4));
+
+        This->hvid = ICLocate(pmt->majortype.Data1, pmt->subtype.Data1, bmi, NULL, ICMODE_DECOMPRESS);
         if (This->hvid)
         {
             AM_MEDIA_TYPE* outpmt = &((OutputPin*)This->tf.ppPins[1])->pin.mtCurrent;
             const CLSID* outsubtype;
             DWORD bih_size;
-            DWORD output_depth = format->bmiHeader.biBitCount;
+            DWORD output_depth = bmi->biBitCount;
             DWORD result;
 
-            switch(format->bmiHeader.biBitCount)
+            switch(bmi->biBitCount)
             {
                 case 32: outsubtype = &MEDIASUBTYPE_RGB32; break;
                 case 24: outsubtype = &MEDIASUBTYPE_RGB24; break;
                 case 16: outsubtype = &MEDIASUBTYPE_RGB565; break;
                 case 8:  outsubtype = &MEDIASUBTYPE_RGB8; break;
                 default:
-                    TRACE("Non standard input depth %d, forced ouptut depth to 32\n", format->bmiHeader.biBitCount);
+                    WARN("Non standard input depth %d, forced output depth to 32\n", bmi->biBitCount);
                     outsubtype = &MEDIASUBTYPE_RGB32;
                     output_depth = 32;
                     break;
             }
 
             /* Copy bitmap header from media type to 1 for input and 1 for output */
-            bih_size = format->bmiHeader.biSize + format->bmiHeader.biClrUsed * 4;
+            bih_size = bmi->biSize + bmi->biClrUsed * 4;
             This->pBihIn = CoTaskMemAlloc(bih_size);
             if (!This->pBihIn)
             {
@@ -220,25 +230,31 @@ static HRESULT AVIDec_ConnectInput(TransformFilterImpl* pTransformFilter, const
                 hr = E_OUTOFMEMORY;
                 goto failed;
             }
-            memcpy(This->pBihIn, &format->bmiHeader, bih_size);
-            memcpy(This->pBihOut, &format->bmiHeader, bih_size);
+            memcpy(This->pBihIn, bmi, bih_size);
+            memcpy(This->pBihOut, bmi, bih_size);
 
             /* Update output format as non compressed bitmap */
             This->pBihOut->biCompression = 0;
             This->pBihOut->biBitCount = output_depth;
             This->pBihOut->biSizeImage = This->pBihOut->biWidth * This->pBihOut->biHeight * This->pBihOut->biBitCount / 8;
-
+            TRACE("Size: %u\n", This->pBihIn->biSize);
             result = ICDecompressQuery(This->hvid, This->pBihIn, This->pBihOut);
             if (result != ICERR_OK)
             {
-                TRACE("Unable to found a suitable output format (%d)\n", result);
+                ERR("Unable to found a suitable output format (%d)\n", result);
                 goto failed;
             }
 
             /* Update output media type */
             CopyMediaType(outpmt, pmt);
             outpmt->subtype = *outsubtype;
-            memcpy(&(((VIDEOINFOHEADER*)outpmt->pbFormat)->bmiHeader), This->pBihOut, This->pBihOut->biSize);
+
+            if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
+                memcpy(&(((VIDEOINFOHEADER *)outpmt->pbFormat)->bmiHeader), This->pBihOut, This->pBihOut->biSize);
+            else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2))
+                memcpy(&(((VIDEOINFOHEADER2 *)outpmt->pbFormat)->bmiHeader), This->pBihOut, This->pBihOut->biSize);
+            else
+                assert(0);
 
             /* Update buffer size of media samples in output */
             ((OutputPin*)This->tf.ppPins[1])->allocProps.cbBuffer = This->pBihOut->biSizeImage;
@@ -251,7 +267,7 @@ static HRESULT AVIDec_ConnectInput(TransformFilterImpl* pTransformFilter, const
 
 failed:
     AVIDec_Cleanup(pTransformFilter);
-    
+
     TRACE("Connection refused\n");
     return hr;
 }




More information about the wine-cvs mailing list