From 2a0123d79a86b4d22a147cebf5cdb9c80158ef87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 28 Nov 2014 14:46:06 +0100 Subject: [PATCH] decklinksink: Don't crash when going to READY another time We have to handle the callback object a bit different: a) it needs a virtual destructor b) we need to set the callback to NULL when we're done with the output c) create a new one every time https://bugzilla.gnome.org/show_bug.cgi?id=740616 --- sys/decklink/gstdecklinksink.cpp | 19 ++++++++++++------- sys/decklink/gstdecklinksink.h | 2 ++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/sys/decklink/gstdecklinksink.cpp b/sys/decklink/gstdecklinksink.cpp index df77d0205e..96c627bef8 100644 --- a/sys/decklink/gstdecklinksink.cpp +++ b/sys/decklink/gstdecklinksink.cpp @@ -179,9 +179,6 @@ gst_decklink_sink_init (GstDecklinkSink * decklinksink) decklinksink->mode = GST_DECKLINK_MODE_NTSC; decklinksink->device_number = 0; - decklinksink->callback = new Output; - decklinksink->callback->decklinksink = decklinksink; - #ifdef _MSC_VER g_mutex_init (&decklinksink->com_init_lock); g_mutex_init (&decklinksink->com_deinit_lock); @@ -297,8 +294,6 @@ gst_decklink_sink_finalize (GObject * object) g_cond_clear (&decklinksink->audio_cond); g_mutex_clear (&decklinksink->audio_mutex); - delete decklinksink->callback; - #ifdef _MSC_VER /* signal the COM thread that it should uninitialize COM */ if (decklinksink->comInitialized) { @@ -341,6 +336,9 @@ gst_decklink_sink_start (GstDecklinkSink * decklinksink) return FALSE; } + decklinksink->callback = new Output; + decklinksink->callback->decklinksink = decklinksink; + decklinksink->output->SetAudioCallback (decklinksink->callback); mode = gst_decklink_get_mode (decklinksink->mode); @@ -353,8 +351,7 @@ gst_decklink_sink_start (GstDecklinkSink * decklinksink) } //decklinksink->video_enabled = TRUE; - decklinksink->output->SetScheduledFrameCompletionCallback (decklinksink-> - callback); + decklinksink->output->SetScheduledFrameCompletionCallback (decklinksink->callback); sample_depth = bmdAudioSampleType16bitInteger; ret = decklinksink->output->EnableAudioOutput (bmdAudioSampleRate48kHz, @@ -392,6 +389,11 @@ gst_decklink_sink_stop (GstDecklinkSink * decklinksink) decklinksink->output->DisableAudioOutput (); decklinksink->output->DisableVideoOutput (); + decklinksink->output->SetAudioCallback (NULL); + decklinksink->output->SetScheduledFrameCompletionCallback (NULL); + delete decklinksink->callback; + decklinksink->callback = NULL; + return TRUE; } @@ -753,3 +755,6 @@ Output::RenderAudioSamples (bool preroll) return S_OK; } + +Output::~Output() { +} diff --git a/sys/decklink/gstdecklinksink.h b/sys/decklink/gstdecklinksink.h index 47ca22f536..3560be8f33 100644 --- a/sys/decklink/gstdecklinksink.h +++ b/sys/decklink/gstdecklinksink.h @@ -48,6 +48,8 @@ public IDeckLinkAudioOutputCallback virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted (IDeckLinkVideoFrame* completedFrame, BMDOutputFrameCompletionResult result); virtual HRESULT STDMETHODCALLTYPE ScheduledPlaybackHasStopped (); virtual HRESULT STDMETHODCALLTYPE RenderAudioSamples (bool preroll); + + virtual ~Output(); }; struct _GstDecklinkSink