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_;
};
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 );
}