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