Jacek Caban : qcap: Added AVICompressorIn_Receive implementation.

Alexandre Julliard julliard at winehq.org
Thu Jan 2 13:13:48 CST 2014


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jan  2 15:29:01 2014 +0100

qcap: Added AVICompressorIn_Receive implementation.

---

 dlls/qcap/avico.c |   83 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 81 insertions(+), 2 deletions(-)

diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c
index 4720ae3..2e44282 100644
--- a/dlls/qcap/avico.c
+++ b/dlls/qcap/avico.c
@@ -489,8 +489,87 @@ static const BasePinFuncTable AVICompressorInputBasePinVtbl = {
 static HRESULT WINAPI AVICompressorIn_Receive(BaseInputPin *base, IMediaSample *pSample)
 {
     AVICompressor *This = impl_from_BasePin(&base->pin);
-    FIXME("(%p)->(%p)\n", This, pSample);
-    return E_NOTIMPL;
+    VIDEOINFOHEADER *src_videoinfo;
+    REFERENCE_TIME start, stop;
+    IMediaSample *out_sample;
+    AM_MEDIA_TYPE *mt;
+    IMediaSample2 *sample2;
+    DWORD comp_flags = 0;
+    BOOL is_preroll;
+    BOOL sync_point;
+    BYTE *ptr, *buf;
+    DWORD res;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p)\n", base, pSample);
+
+    if(!This->hic) {
+        FIXME("Driver not loaded\n");
+        return E_UNEXPECTED;
+    }
+
+    hres = IMediaSample_QueryInterface(pSample, &IID_IMediaSample2, (void**)&sample2);
+    if(SUCCEEDED(hres)) {
+        FIXME("Use IMediaSample2\n");
+        IMediaSample2_Release(sample2);
+    }
+
+    is_preroll = IMediaSample_IsPreroll(pSample) == S_OK;
+    sync_point = IMediaSample_IsSyncPoint(pSample) == S_OK;
+
+    hres = IMediaSample_GetTime(pSample, &start, &stop);
+    if(FAILED(hres)) {
+        WARN("GetTime failed: %08x\n", hres);
+        return hres;
+    }
+
+    hres = IMediaSample_GetMediaType(pSample, &mt);
+    if(FAILED(hres))
+        return hres;
+
+    hres = IMediaSample_GetPointer(pSample, &ptr);
+    if(FAILED(hres)) {
+        WARN("GetPointer failed: %08x\n", hres);
+        return hres;
+    }
+
+    hres = BaseOutputPinImpl_GetDeliveryBuffer(This->out, &out_sample, &start, &stop, 0);
+    if(FAILED(hres))
+        return hres;
+
+    hres = IMediaSample_GetPointer(out_sample, &buf);
+    if(FAILED(hres))
+        return hres;
+
+    if((This->driver_flags & VIDCF_TEMPORAL) && !(This->driver_flags & VIDCF_FASTTEMPORALC))
+        FIXME("Unsupported temporal compression\n");
+
+    src_videoinfo = (VIDEOINFOHEADER*)This->in->pin.mtCurrent.pbFormat;
+    res = ICCompress(This->hic, sync_point ? ICCOMPRESS_KEYFRAME : 0, &This->videoinfo->bmiHeader, buf,
+            &src_videoinfo->bmiHeader, ptr, 0, &comp_flags, This->frame_cnt, 0, 0, NULL, NULL);
+    if(res != ICERR_OK) {
+        WARN("ICCompress failed: %d\n", res);
+        IMediaSample_Release(out_sample);
+        return E_FAIL;
+    }
+
+    IMediaSample_SetActualDataLength(out_sample, This->videoinfo->bmiHeader.biSizeImage);
+    IMediaSample_SetPreroll(out_sample, is_preroll);
+    IMediaSample_SetSyncPoint(out_sample, (comp_flags&AVIIF_KEYFRAME) != 0);
+    IMediaSample_SetDiscontinuity(out_sample, (IMediaSample_IsDiscontinuity(pSample) == S_OK));
+
+    if (IMediaSample_GetMediaTime(pSample, &start, &stop) == S_OK)
+        IMediaSample_SetMediaTime(out_sample, &start, &stop);
+    else
+        IMediaSample_SetMediaTime(out_sample, NULL, NULL);
+
+    hres = BaseOutputPinImpl_Deliver(This->out, out_sample);
+    if(FAILED(hres))
+        WARN("Deliver failed: %08x\n", hres);
+
+    IMediaSample_Release(out_sample);
+    This->frame_cnt++;
+    return hres;
 }
 
 static const BaseInputPinFuncTable AVICompressorBaseInputPinVtbl = {




More information about the wine-cvs mailing list