void gst_decklink_src_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GstDecklinkSrc *decklinksrc; g_return_if_fail (GST_IS_DECKLINK_SRC (object)); decklinksrc = GST_DECKLINK_SRC (object); switch (property_id) { case PROP_MODE: g_value_set_enum (value, decklinksrc->mode); break; case PROP_CONNECTION: g_value_set_enum (value, decklinksrc->connection); break; case PROP_AUDIO_INPUT: g_value_set_enum (value, decklinksrc->audio_connection); break; case PROP_SUBDEVICE: g_value_set_int (value, decklinksrc->subdevice); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }
void gst_decklink_src_finalize (GObject * object) { GstDecklinkSrc *decklinksrc; g_return_if_fail (GST_IS_DECKLINK_SRC (object)); decklinksrc = GST_DECKLINK_SRC (object); /* clean up object here */ g_cond_clear (&decklinksrc->cond); g_mutex_clear (&decklinksrc->mutex); gst_task_set_lock (decklinksrc->task, NULL); g_object_unref (decklinksrc->task); #ifdef _MSC_VER /* signal the COM thread that it should uninitialize COM */ if (decklinksrc->comInitialized) { g_mutex_lock (&decklinksrc->com_deinit_lock); g_cond_signal (&decklinksrc->com_uninitialize); g_cond_wait (&decklinksrc->com_uninitialized, &decklinksrc->com_deinit_lock); g_mutex_unlock (&decklinksrc->com_deinit_lock); } g_mutex_clear (&decklinksrc->com_init_lock); g_mutex_clear (&decklinksrc->com_deinit_lock); g_cond_clear (&decklinksrc->com_initialized); g_cond_clear (&decklinksrc->com_uninitialize); g_cond_clear (&decklinksrc->com_uninitialized); #endif /* _MSC_VER */ g_rec_mutex_clear (&decklinksrc->task_mutex); G_OBJECT_CLASS (parent_class)->finalize (object); }
void gst_decklink_src_dispose (GObject * object) { g_return_if_fail (GST_IS_DECKLINK_SRC (object)); /* clean up as possible. may be called multiple times */ G_OBJECT_CLASS (parent_class)->dispose (object); }
HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived (IDeckLinkVideoInputFrame * videoFrame, IDeckLinkAudioInputPacket * audioFrame) { GstDecklinkSrc *decklinksrc; g_return_val_if_fail (priv != NULL, S_OK); g_return_val_if_fail (GST_IS_DECKLINK_SRC (priv), S_OK); decklinksrc = GST_DECKLINK_SRC (priv); // Handle Video Frame if (videoFrame) { if (videoFrame->GetFlags () & bmdFrameHasNoInputSource) { GST_DEBUG ("Frame received - No input signal detected"); } else { const char *timecodeString = NULL; if (g_timecodeFormat != 0) { IDeckLinkTimecode *timecode; if (videoFrame->GetTimecode (g_timecodeFormat, &timecode) == S_OK) { timecode->GetString (&timecodeString); CONVERT_COM_STRING (timecodeString); } } GST_DEBUG ("Frame received [%s] - %s - Size: %li bytes", timecodeString != NULL ? timecodeString : "No timecode", "Valid Frame", videoFrame->GetRowBytes () * videoFrame->GetHeight ()); if (timecodeString) FREE_COM_STRING (timecodeString); g_mutex_lock (decklinksrc->mutex); if (decklinksrc->video_frame != NULL) { decklinksrc->dropped_frames++; } else { videoFrame->AddRef (); decklinksrc->video_frame = videoFrame; if (audioFrame) { audioFrame->AddRef (); decklinksrc->audio_frame = audioFrame; } } /* increment regardless whether frame was dropped or not */ decklinksrc->frame_num++; g_cond_signal (decklinksrc->cond); g_mutex_unlock (decklinksrc->mutex); } } return S_OK; }
HRESULT DeckLinkCaptureDelegate::VideoInputFormatChanged ( BMDVideoInputFormatChangedEvents events, IDeckLinkDisplayMode * mode, BMDDetectedVideoInputFormatFlags) { GstDecklinkSrc *decklinksrc; g_return_val_if_fail (priv != NULL, S_OK); g_return_val_if_fail (GST_IS_DECKLINK_SRC (priv), S_OK); decklinksrc = GST_DECKLINK_SRC (priv); GST_ERROR_OBJECT (decklinksrc, "unimplemented: video input format changed"); return S_OK; }
static GstStateChangeReturn gst_decklink_src_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; gboolean no_preroll = FALSE; g_return_val_if_fail (GST_IS_DECKLINK_SRC (element), GST_STATE_CHANGE_FAILURE); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!gst_decklink_src_start (element)) { ret = GST_STATE_CHANGE_FAILURE; goto out; } break; case GST_STATE_CHANGE_READY_TO_PAUSED: no_preroll = TRUE; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: no_preroll = TRUE; break; case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: gst_decklink_src_stop (element); break; default: break; } if (no_preroll && ret == GST_STATE_CHANGE_SUCCESS) ret = GST_STATE_CHANGE_NO_PREROLL; out: return ret; }