From 83dab833098630f15c5299673367d611b383c688 Mon Sep 17 00:00:00 2001 From: Steinar Gunderson Date: Sat, 25 Sep 2010 19:33:44 +0200 Subject: [PATCH] Implement semi-proper AddRef and Release. --- modules/access/sdi.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/modules/access/sdi.cpp b/modules/access/sdi.cpp index 84b3b4dad4..aae8cb6c27 100644 --- a/modules/access/sdi.cpp +++ b/modules/access/sdi.cpp @@ -125,17 +125,32 @@ struct demux_sys_t class DeckLinkCaptureDelegate : public IDeckLinkInputCallback { public: - DeckLinkCaptureDelegate( demux_t *p_demux ) : p_demux_(p_demux) {} + DeckLinkCaptureDelegate( demux_t *p_demux ) : m_ref_(1), p_demux_(p_demux) {} - // FIXME: These leak. virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv) { return E_NOINTERFACE; } - virtual ULONG STDMETHODCALLTYPE AddRef(void) { return 1; } - virtual ULONG STDMETHODCALLTYPE Release(void) { return 1; } + + // Note: AddRef() and Release() here are not thread safe. + + virtual ULONG STDMETHODCALLTYPE AddRef(void) + { + return ++m_ref_; + } + + virtual ULONG STDMETHODCALLTYPE Release(void) + { + if ( --m_ref_ == 0 ) + { + delete this; + return 0; + } + return m_ref_; + } virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged(BMDVideoInputFormatChangedEvents, IDeckLinkDisplayMode*, BMDDetectedVideoInputFormatFlags); virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived(IDeckLinkVideoInputFrame*, IDeckLinkAudioInputPacket*); private: + int m_ref_; demux_t *p_demux_; }; @@ -592,7 +607,9 @@ static void Close( vlc_object_t *p_this ) if( p_sys->p_card ) p_sys->p_card->Release(); - delete p_sys->p_delegate; + if( p_sys->p_delegate ) + p_sys->p_delegate->Release(); + free( p_sys ); } -- 2.39.2