[PATCH 5/5] winegstreamer: Use CONTAINING_RECORD instead of casting.

Zebediah Figura z.figura12 at gmail.com
Mon May 13 22:17:58 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/winegstreamer/gstdemux.c | 98 +++++++++++++++++++----------------
 1 file changed, 52 insertions(+), 46 deletions(-)

diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index e6c7da8b15..8e9278dca9 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -90,6 +90,11 @@ struct GSTOutPin {
     SourceSeeking seek;
 };
 
+static inline GSTImpl *impl_from_IBaseFilter(IBaseFilter *iface)
+{
+    return CONTAINING_RECORD(iface, GSTImpl, filter.IBaseFilter_iface);
+}
+
 const char* media_quark_string = "media-sample";
 
 static const WCHAR wcsInputPinName[] = {'i','n','p','u','t',' ','p','i','n',0};
@@ -288,7 +293,7 @@ static gboolean accept_caps_sink(GstPad *pad, GstCaps *caps)
 static gboolean setcaps_sink(GstPad *pad, GstCaps *caps)
 {
     GSTOutPin *pin = gst_pad_get_element_private(pad);
-    GSTImpl *This = (GSTImpl *)pin->pin.pin.pinInfo.pFilter;
+    GSTImpl *This = impl_from_IBaseFilter(pin->pin.pin.pinInfo.pFilter);
     AM_MEDIA_TYPE amt;
     GstStructure *arg;
     const char *typename;
@@ -466,7 +471,7 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event)
                 IPin_EndOfStream(pin->pin.pin.pConnectedTo);
             return TRUE;
         case GST_EVENT_FLUSH_START:
-            if (((GSTImpl *)pin->pin.pin.pinInfo.pFilter)->ignore_flush) {
+            if (impl_from_IBaseFilter(pin->pin.pin.pinInfo.pFilter)->ignore_flush) {
                 /* gst-plugins-base prior to 1.7 contains a bug which causes
                  * our sink pins to receive a flush-start event when the
                  * decodebin changes from PAUSED to READY (including
@@ -601,7 +606,7 @@ static DWORD CALLBACK push_data(LPVOID iface)
 static GstFlowReturn got_data_sink(GstPad *pad, GstObject *parent, GstBuffer *buf)
 {
     GSTOutPin *pin = gst_pad_get_element_private(pad);
-    GSTImpl *This = (GSTImpl *)pin->pin.pin.pinInfo.pFilter;
+    GSTImpl *This = impl_from_IBaseFilter(pin->pin.pin.pinInfo.pFilter);
     HRESULT hr;
     BYTE *ptr = NULL;
     IMediaSample *sample;
@@ -1093,7 +1098,7 @@ static void unknown_type(GstElement *bin, GstPad *pad, GstCaps *caps, gpointer u
 
 static HRESULT GST_Connect(GSTInPin *pPin, IPin *pConnectPin, ALLOCATOR_PROPERTIES *props)
 {
-    GSTImpl *This = (GSTImpl*)pPin->pin.pinInfo.pFilter;
+    GSTImpl *This = impl_from_IBaseFilter(pPin->pin.pinInfo.pFilter);
     int ret, i;
     LONGLONG avail, duration;
     GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE(
@@ -1187,9 +1192,9 @@ static inline GSTOutPin *impl_from_IMediaSeeking( IMediaSeeking *iface )
     return CONTAINING_RECORD(iface, GSTOutPin, seek.IMediaSeeking_iface);
 }
 
-static IPin* WINAPI GST_GetPin(BaseFilter *iface, int pos)
+static IPin* WINAPI GST_GetPin(BaseFilter *base, int pos)
 {
-    GSTImpl *This = (GSTImpl *)iface;
+    GSTImpl *This = impl_from_IBaseFilter(&base->IBaseFilter_iface);
     IPin *pin;
 
     TRACE("%p: Asking for pos %x\n", This, pos);
@@ -1299,7 +1304,7 @@ static void GST_Destroy(GSTImpl *This)
 
 static HRESULT WINAPI GST_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
 {
-    GSTImpl *This = (GSTImpl *)iface;
+    GSTImpl *This = impl_from_IBaseFilter(iface);
 
     TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
 
@@ -1327,7 +1332,7 @@ static HRESULT WINAPI GST_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID
 
 static ULONG WINAPI GST_Release(IBaseFilter *iface)
 {
-    GSTImpl *This = (GSTImpl *)iface;
+    GSTImpl *This = impl_from_IBaseFilter(iface);
     ULONG refCount = InterlockedDecrement(&This->filter.refCount);
 
     TRACE("(%p)->() Release from %d\n", This, refCount + 1);
@@ -1340,7 +1345,7 @@ static ULONG WINAPI GST_Release(IBaseFilter *iface)
 
 static HRESULT WINAPI GST_Stop(IBaseFilter *iface)
 {
-    GSTImpl *This = (GSTImpl *)iface;
+    GSTImpl *This = impl_from_IBaseFilter(iface);
 
     TRACE("(%p)\n", This);
 
@@ -1357,8 +1362,8 @@ static HRESULT WINAPI GST_Stop(IBaseFilter *iface)
 
 static HRESULT WINAPI GST_Pause(IBaseFilter *iface)
 {
+    GSTImpl *This = impl_from_IBaseFilter(iface);
     HRESULT hr = S_OK;
-    GSTImpl *This = (GSTImpl *)iface;
     GstState now;
     GstStateChangeReturn ret;
 
@@ -1384,8 +1389,8 @@ static HRESULT WINAPI GST_Pause(IBaseFilter *iface)
 
 static HRESULT WINAPI GST_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
 {
+    GSTImpl *This = impl_from_IBaseFilter(iface);
     HRESULT hr = S_OK;
-    GSTImpl *This = (GSTImpl *)iface;
     ULONG i;
     GstState now;
     HRESULT hr_any = VFW_E_NOT_CONNECTED;
@@ -1430,7 +1435,7 @@ static HRESULT WINAPI GST_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
 
 static HRESULT WINAPI GST_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
 {
-    GSTImpl *This = (GSTImpl *)iface;
+    GSTImpl *This = impl_from_IBaseFilter(iface);
     HRESULT hr = S_OK;
     GstState now, pending;
     GstStateChangeReturn ret;
@@ -1700,9 +1705,14 @@ static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl = {
     GST_QualityControl_SetSink
 };
 
+static inline GSTOutPin *impl_source_from_IPin(IPin *iface)
+{
+    return CONTAINING_RECORD(iface, GSTOutPin, pin.pin.IPin_iface);
+}
+
 static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void **ppv)
 {
-    GSTOutPin *This = (GSTOutPin *)iface;
+    GSTOutPin *This = impl_source_from_IPin(iface);
 
     TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
 
@@ -1727,7 +1737,7 @@ static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void **
 
 static ULONG WINAPI GSTOutPin_Release(IPin *iface)
 {
-    GSTOutPin *This = (GSTOutPin *)iface;
+    GSTOutPin *This = impl_source_from_IPin(iface);
     ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
 
     TRACE("(%p)->() Release from %d\n", This, refCount + 1);
@@ -1770,7 +1780,7 @@ static HRESULT WINAPI GSTOutPin_CheckMediaType(BasePin *base, const AM_MEDIA_TYP
 
 static HRESULT WINAPI GSTOutPin_GetMediaType(BasePin *iface, int iPosition, AM_MEDIA_TYPE *pmt)
 {
-    GSTOutPin *This = (GSTOutPin *)iface;
+    GSTOutPin *This = impl_source_from_IPin(&iface->IPin_iface);
 
     TRACE("(%p)->(%i, %p)\n", This, iPosition, pmt);
 
@@ -1787,19 +1797,19 @@ static HRESULT WINAPI GSTOutPin_GetMediaType(BasePin *iface, int iPosition, AM_M
 
 static HRESULT WINAPI GSTOutPin_DecideBufferSize(BaseOutputPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
 {
-    GSTOutPin *This = (GSTOutPin *)iface;
+    GSTOutPin *This = impl_source_from_IPin(&iface->pin.IPin_iface);
     TRACE("(%p)->(%p, %p)\n", This, pAlloc, ppropInputRequest);
     /* Unused */
     return S_OK;
 }
 
-static HRESULT WINAPI GSTOutPin_DecideAllocator(BaseOutputPin *iface, IMemInputPin *pPin, IMemAllocator **pAlloc)
+static HRESULT WINAPI GSTOutPin_DecideAllocator(BaseOutputPin *base, IMemInputPin *pPin, IMemAllocator **pAlloc)
 {
+    GSTOutPin *pin = impl_source_from_IPin(&base->pin.IPin_iface);
+    GSTImpl *GSTfilter = impl_from_IBaseFilter(pin->pin.pin.pinInfo.pFilter);
     HRESULT hr;
-    GSTOutPin *This = (GSTOutPin *)iface;
-    GSTImpl *GSTfilter = (GSTImpl*)This->pin.pin.pinInfo.pFilter;
 
-    TRACE("(%p)->(%p, %p)\n", This, pPin, pAlloc);
+    TRACE("pin %p, peer %p, allocator %p.\n", pin, pPin, pAlloc);
 
     *pAlloc = NULL;
     if (GSTfilter->pInputPin.pAlloc)
@@ -1923,9 +1933,14 @@ static HRESULT GST_RemoveOutputPins(GSTImpl *This)
     return S_OK;
 }
 
+static inline GSTInPin *impl_sink_from_IPin(IPin *iface)
+{
+    return CONTAINING_RECORD(iface, GSTInPin, pin.IPin_iface);
+}
+
 static ULONG WINAPI GSTInPin_Release(IPin *iface)
 {
-    GSTInPin *This = (GSTInPin*)iface;
+    GSTInPin *This = impl_sink_from_IPin(iface);
     ULONG refCount = InterlockedDecrement(&This->pin.refCount);
 
     TRACE("(%p)->() Release from %d\n", iface, refCount + 1);
@@ -1945,9 +1960,9 @@ static ULONG WINAPI GSTInPin_Release(IPin *iface)
 
 static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
 {
+    GSTInPin *This = impl_sink_from_IPin(iface);
     PIN_DIRECTION pindirReceive;
     HRESULT hr = S_OK;
-    GSTInPin *This = (GSTInPin*)iface;
 
     TRACE("(%p/%p)->(%p, %p)\n", This, iface, pReceivePin, pmt);
     dump_AM_MEDIA_TYPE(pmt);
@@ -1977,7 +1992,7 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin,
 
         This->pReader = NULL;
         This->pAlloc = NULL;
-        ResetEvent(((GSTImpl *)This->pin.pinInfo.pFilter)->push_event);
+        ResetEvent(impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->push_event);
         if (SUCCEEDED(hr))
             hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&This->pReader);
         if (SUCCEEDED(hr))
@@ -2000,9 +2015,9 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin,
             This->pin.pConnectedTo = pReceivePin;
             IPin_AddRef(pReceivePin);
             hr = IMemAllocator_Commit(This->pAlloc);
-            SetEvent(((GSTImpl*)This->pin.pinInfo.pFilter)->push_event);
+            SetEvent(impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->push_event);
         } else {
-            GST_RemoveOutputPins((GSTImpl *)This->pin.pinInfo.pFilter);
+            GST_RemoveOutputPins(impl_from_IBaseFilter(This->pin.pinInfo.pFilter));
             if (This->pReader)
                 IAsyncReader_Release(This->pReader);
             This->pReader = NULL;
@@ -2019,8 +2034,8 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin,
 
 static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface)
 {
+    GSTInPin *This = impl_sink_from_IPin(iface);
     HRESULT hr;
-    GSTInPin *This = (GSTInPin*)iface;
     FILTER_STATE state;
 
     TRACE("(%p)\n", This);
@@ -2030,7 +2045,7 @@ static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface)
     hr = IBaseFilter_GetState(This->pin.pinInfo.pFilter, INFINITE, &state);
     EnterCriticalSection(This->pin.pCritSec);
     if (This->pin.pConnectedTo) {
-        GSTImpl *Parser = (GSTImpl *)This->pin.pinInfo.pFilter;
+        GSTImpl *Parser = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
 
         if (SUCCEEDED(hr) && state == State_Stopped) {
             IMemAllocator_Decommit(This->pAlloc);
@@ -2048,7 +2063,7 @@ static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface)
 
 static HRESULT WINAPI GSTInPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt)
 {
-    GSTInPin *This = (GSTInPin*)iface;
+    GSTInPin *This = impl_sink_from_IPin(iface);
 
     TRACE("(%p)->(%p)\n", This, pmt);
     dump_AM_MEDIA_TYPE(pmt);
@@ -2060,44 +2075,35 @@ static HRESULT WINAPI GSTInPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt
 
 static HRESULT WINAPI GSTInPin_EndOfStream(IPin *iface)
 {
-    GSTInPin *pin = (GSTInPin*)iface;
-    GSTImpl *This = (GSTImpl*)pin->pin.pinInfo.pFilter;
-
-    FIXME("Propagate message on %p\n", This);
+    FIXME("iface %p, stub!\n", iface);
     return S_OK;
 }
 
 static HRESULT WINAPI GSTInPin_BeginFlush(IPin *iface)
 {
-    GSTInPin *pin = (GSTInPin*)iface;
-    GSTImpl *This = (GSTImpl*)pin->pin.pinInfo.pFilter;
-
-    FIXME("Propagate message on %p\n", This);
+    FIXME("iface %p, stub!\n", iface);
     return S_OK;
 }
 
 static HRESULT WINAPI GSTInPin_EndFlush(IPin *iface)
 {
-    GSTInPin *pin = (GSTInPin*)iface;
-    GSTImpl *This = (GSTImpl*)pin->pin.pinInfo.pFilter;
-
-    FIXME("Propagate message on %p\n", This);
+    FIXME("iface %p, stub!\n", iface);
     return S_OK;
 }
 
-static HRESULT WINAPI GSTInPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
+static HRESULT WINAPI GSTInPin_NewSegment(IPin *iface, REFERENCE_TIME start,
+        REFERENCE_TIME stop, double rate)
 {
-    GSTInPin *pin = (GSTInPin*)iface;
-    GSTImpl *This = (GSTImpl*)pin->pin.pinInfo.pFilter;
+    FIXME("iface %p, start %s, stop %s, rate %.16e, stub!\n",
+            iface, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop), rate);
 
-    BasePinImpl_NewSegment(iface, tStart, tStop, dRate);
-    FIXME("Propagate message on %p\n", This);
+    BasePinImpl_NewSegment(iface, start, stop, rate);
     return S_OK;
 }
 
 static HRESULT WINAPI GSTInPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
 {
-    GSTInPin *This = (GSTInPin*)iface;
+    GSTInPin *This = impl_sink_from_IPin(iface);
 
     TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
 
-- 
2.21.0




More information about the wine-devel mailing list