Piotr Caban : qcap: Add support for FORMAT_VideoInfo pins in AviMuxIn:: ReceiveConnection.

Alexandre Julliard julliard at winehq.org
Tue Feb 25 16:58:15 CST 2014


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Feb 25 12:22:30 2014 +0100

qcap: Add support for FORMAT_VideoInfo pins in AviMuxIn::ReceiveConnection.

---

 dlls/qcap/avimux.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 2 deletions(-)

diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c
index 4b3a443..20f830a 100644
--- a/dlls/qcap/avimux.c
+++ b/dlls/qcap/avimux.c
@@ -25,6 +25,7 @@
 #include "winbase.h"
 #include "wtypes.h"
 #include "dshow.h"
+#include "aviriff.h"
 
 #include "qcap_main.h"
 
@@ -33,6 +34,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(qcap);
 
 #define MAX_PIN_NO 128
+#define ALIGN(x) ((x+1)/2*2)
 
 typedef struct {
     BaseOutputPin pin;
@@ -44,6 +46,14 @@ typedef struct {
     IAMStreamControl IAMStreamControl_iface;
     IPropertyBag IPropertyBag_iface;
     IQualityControl IQualityControl_iface;
+
+    /* strl chunk */
+    AVISTREAMHEADER strh;
+    struct {
+        FOURCC fcc;
+        DWORD cb;
+        BYTE data[1];
+    } *strf;
 } AviMuxIn;
 
 typedef struct {
@@ -1017,7 +1027,7 @@ static const IQualityControlVtbl AviMuxOut_QualityControlVtbl = {
 
 static HRESULT WINAPI AviMuxIn_CheckMediaType(BasePin *base, const AM_MEDIA_TYPE *pmt)
 {
-    FIXME("(%p:%s)->(AM_MEDIA_TYPE(%p))\n", base, debugstr_w(base->pinInfo.achName), pmt);
+    TRACE("(%p:%s)->(AM_MEDIA_TYPE(%p))\n", base, debugstr_w(base->pinInfo.achName), pmt);
     dump_AM_MEDIA_TYPE(pmt);
 
     if(IsEqualIID(&pmt->majortype, &MEDIATYPE_Audio) &&
@@ -1143,6 +1153,32 @@ static HRESULT WINAPI AviMuxIn_ReceiveConnection(IPin *iface,
     if(FAILED(hr))
         return hr;
 
+    if(IsEqualIID(&pmt->majortype, &MEDIATYPE_Video) &&
+            IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) {
+        VIDEOINFOHEADER *vih;
+        int size;
+
+        vih = (VIDEOINFOHEADER*)pmt->pbFormat;
+        avimuxin->strh.fcc = ckidSTREAMHEADER;
+        avimuxin->strh.cb = sizeof(AVISTREAMHEADER) - FIELD_OFFSET(AVISTREAMHEADER, fccType);
+        avimuxin->strh.fccType = streamtypeVIDEO;
+        /* FIXME: fccHandler should be set differently */
+        avimuxin->strh.fccHandler = vih->bmiHeader.biCompression ?
+            vih->bmiHeader.biCompression : FCC('D','I','B',' ');
+
+        size = pmt->cbFormat - FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader);
+        avimuxin->strf = CoTaskMemAlloc(sizeof(RIFFCHUNK) + ALIGN(FIELD_OFFSET(BITMAPINFO, bmiColors[iPALETTE_COLORS])));
+        avimuxin->strf->fcc = ckidSTREAMFORMAT;
+        avimuxin->strf->cb = FIELD_OFFSET(BITMAPINFO, bmiColors[iPALETTE_COLORS]);
+        if(size > avimuxin->strf->cb)
+            size = avimuxin->strf->cb;
+        memcpy(avimuxin->strf->data, &vih->bmiHeader, size);
+    }else {
+        FIXME("format not supported: %s %s\n", debugstr_guid(&pmt->majortype),
+                debugstr_guid(&pmt->formattype));
+        return E_NOTIMPL;
+    }
+
     return create_input_pin(This);
 }
 
@@ -1150,8 +1186,17 @@ static HRESULT WINAPI AviMuxIn_Disconnect(IPin *iface)
 {
     AviMux *This = impl_from_in_IPin(iface);
     AviMuxIn *avimuxin = AviMuxIn_from_IPin(iface);
+    HRESULT hr;
+
     TRACE("(%p:%s)\n", This, debugstr_w(avimuxin->pin.pin.pinInfo.achName));
-    return BasePinImpl_Disconnect(iface);
+
+    hr = BasePinImpl_Disconnect(iface);
+    if(FAILED(hr))
+        return hr;
+
+    CoTaskMemFree(avimuxin->strf);
+    avimuxin->strf = NULL;
+    return hr;
 }
 
 static HRESULT WINAPI AviMuxIn_ConnectedTo(IPin *iface, IPin **pPin)
@@ -1606,6 +1651,9 @@ static HRESULT create_input_pin(AviMux *avimux)
         return hr;
     }
 
+    memset(&avimux->in[avimux->input_pin_no]->strh, 0, sizeof(avimux->in[avimux->input_pin_no]->strh));
+    avimux->in[avimux->input_pin_no]->strf = NULL;
+
     avimux->input_pin_no++;
     return S_OK;
 }




More information about the wine-cvs mailing list