#include <vlc_picture.h>
#include <vlc_charset.h>
#include <vlc_fs.h>
+#include <vlc_atomic.h>
#include <arpa/inet.h>
class DeckLinkCaptureDelegate : public IDeckLinkInputCallback
{
public:
- DeckLinkCaptureDelegate( demux_t *p_demux ) : m_ref_(1), p_demux_(p_demux) {}
+ DeckLinkCaptureDelegate( demux_t *p_demux ) : p_demux_(p_demux)
+ {
+ vlc_atomic_set( &m_ref_, 1 );
+ }
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv) { return E_NOINTERFACE; }
- /* Note: AddRef() and Release() here are not thread safe. */
-
virtual ULONG STDMETHODCALLTYPE AddRef(void)
{
- return ++m_ref_;
+ return vlc_atomic_inc( &m_ref_ );
}
virtual ULONG STDMETHODCALLTYPE Release(void)
{
- if ( --m_ref_ == 0 )
- {
+ uintptr_t new_ref = vlc_atomic_dec( &m_ref_ );
+ if ( new_ref == 0 )
delete this;
- return 0;
- }
- return m_ref_;
+ return new_ref;
}
virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged(BMDVideoInputFormatChangedEvents, IDeckLinkDisplayMode*, BMDDetectedVideoInputFormatFlags);
virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived(IDeckLinkVideoInputFrame*, IDeckLinkAudioInputPacket*);
private:
- int m_ref_;
+ vlc_atomic_t m_ref_;
demux_t *p_demux_;
};