From ee8766b342a9feb68f1e1ed4947db1f3ca5660b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 28 Nov 2014 14:50:18 +0100 Subject: [PATCH] decklinksrc: Handle callback/delegate object the same way as in the sink Potentially fixes crashes. --- sys/decklink/capture.h | 2 +- sys/decklink/gstdecklinksrc.cpp | 11 +++++++---- sys/decklink/gstdecklinksrc.h | 2 ++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sys/decklink/capture.h b/sys/decklink/capture.h index 029500f2cf..e6c5846486 100644 --- a/sys/decklink/capture.h +++ b/sys/decklink/capture.h @@ -7,7 +7,7 @@ class DeckLinkCaptureDelegate : public IDeckLinkInputCallback { public: DeckLinkCaptureDelegate(); - ~DeckLinkCaptureDelegate(); + virtual ~DeckLinkCaptureDelegate(); virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv) { return E_NOINTERFACE; } virtual ULONG STDMETHODCALLTYPE AddRef(void); diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index 5769c174a8..939fb8b8eb 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -408,7 +408,6 @@ static gboolean gst_decklink_src_start (GstElement * element) { GstDecklinkSrc *decklinksrc = GST_DECKLINK_SRC (element); - DeckLinkCaptureDelegate *delegate; BMDAudioSampleType sample_depth; int channels; HRESULT ret; @@ -431,9 +430,9 @@ gst_decklink_src_start (GstElement * element) return FALSE; } - delegate = new DeckLinkCaptureDelegate (); - delegate->priv = decklinksrc; - ret = decklinksrc->input->SetCallback (delegate); + decklinksrc->delegate = new DeckLinkCaptureDelegate (); + decklinksrc->delegate->priv = decklinksrc; + ret = decklinksrc->input->SetCallback (decklinksrc->delegate); if (ret != S_OK) { GST_ERROR ("set callback failed (input source)"); return FALSE; @@ -559,6 +558,10 @@ gst_decklink_src_stop (GstElement * element) decklinksrc->input->DisableVideoInput (); decklinksrc->input->DisableAudioInput (); + decklinksrc->input->SetCallback (NULL); + delete decklinksrc->delegate; + decklinksrc->delegate = NULL; + g_list_free_full (decklinksrc->pending_events, (GDestroyNotify) gst_mini_object_unref); decklinksrc->pending_events = NULL; diff --git a/sys/decklink/gstdecklinksrc.h b/sys/decklink/gstdecklinksrc.h index f071b662b2..eb7a252c28 100644 --- a/sys/decklink/gstdecklinksrc.h +++ b/sys/decklink/gstdecklinksrc.h @@ -22,6 +22,7 @@ #include #include "gstdecklink.h" +#include "capture.h" G_BEGIN_DECLS @@ -52,6 +53,7 @@ struct _GstDecklinkSrc IDeckLink *decklink; IDeckLinkInput *input; IDeckLinkConfiguration *config; + DeckLinkCaptureDelegate *delegate; GMutex mutex; GCond cond;