static gboolean gst_decklink_sink_start (GstDecklinkSink * decklinksink) { HRESULT ret; const GstDecklinkMode *mode; BMDAudioSampleType sample_depth; decklinksink->decklink = gst_decklink_get_nth_device (decklinksink->device); if (!decklinksink->decklink) { GST_WARNING ("failed to get device %d", decklinksink->device); return FALSE; } decklinksink->output = gst_decklink_get_nth_output (decklinksink->device); decklinksink->output->SetAudioCallback (decklinksink->callback); mode = gst_decklink_get_mode (decklinksink->mode); ret = decklinksink->output->EnableVideoOutput (mode->mode, bmdVideoOutputFlagDefault); if (ret != S_OK) { GST_WARNING ("failed to enable video output"); return FALSE; } //decklinksink->video_enabled = TRUE; decklinksink->output->SetScheduledFrameCompletionCallback (decklinksink-> callback); sample_depth = bmdAudioSampleType16bitInteger; ret = decklinksink->output->EnableAudioOutput (bmdAudioSampleRate48kHz, sample_depth, 2, bmdAudioOutputStreamContinuous); if (ret != S_OK) { GST_WARNING ("failed to enable audio output"); return FALSE; } decklinksink->audio_adapter = gst_adapter_new (); decklinksink->num_frames = 0; return TRUE; }
/* FIXME: post error messages for the misc. failures */ static gboolean gst_decklink_src_start (GstElement * element) { GstDecklinkSrc *decklinksrc = GST_DECKLINK_SRC (element); DeckLinkCaptureDelegate *delegate; BMDAudioSampleType sample_depth; int channels; HRESULT ret; const GstDecklinkMode *mode; IDeckLinkConfiguration *config; BMDVideoConnection conn; BMDAudioConnection aconn; GST_DEBUG_OBJECT (decklinksrc, "start"); decklinksrc->decklink = gst_decklink_get_nth_device (decklinksrc->device); if (decklinksrc->decklink == NULL) { return FALSE; } decklinksrc->input = gst_decklink_get_nth_input (decklinksrc->device); delegate = new DeckLinkCaptureDelegate (); delegate->priv = decklinksrc; ret = decklinksrc->input->SetCallback (delegate); if (ret != S_OK) { GST_ERROR ("set callback failed (input source)"); return FALSE; } decklinksrc->config = gst_decklink_get_nth_config (decklinksrc->device); config = decklinksrc->config; switch (decklinksrc->connection) { default: case GST_DECKLINK_CONNECTION_SDI: conn = bmdVideoConnectionSDI; aconn = bmdAudioConnectionEmbedded; break; case GST_DECKLINK_CONNECTION_HDMI: conn = bmdVideoConnectionHDMI; aconn = bmdAudioConnectionEmbedded; break; case GST_DECKLINK_CONNECTION_OPTICAL_SDI: conn = bmdVideoConnectionOpticalSDI; aconn = bmdAudioConnectionEmbedded; break; case GST_DECKLINK_CONNECTION_COMPONENT: conn = bmdVideoConnectionComponent; aconn = bmdAudioConnectionAnalog; break; case GST_DECKLINK_CONNECTION_COMPOSITE: conn = bmdVideoConnectionComposite; aconn = bmdAudioConnectionAnalog; break; case GST_DECKLINK_CONNECTION_SVIDEO: conn = bmdVideoConnectionSVideo; aconn = bmdAudioConnectionAnalog; break; } ret = config->SetInt (bmdDeckLinkConfigVideoInputConnection, conn); if (ret != S_OK) { GST_ERROR ("set configuration (input source)"); return FALSE; } if (decklinksrc->connection == GST_DECKLINK_CONNECTION_COMPOSITE) { ret = config->SetInt (bmdDeckLinkConfigAnalogVideoInputFlags, bmdAnalogVideoFlagCompositeSetup75); if (ret != S_OK) { GST_ERROR ("set configuration (composite setup)"); return FALSE; } } switch (decklinksrc->audio_connection) { default: case GST_DECKLINK_AUDIO_CONNECTION_AUTO: /* set above */ break; case GST_DECKLINK_AUDIO_CONNECTION_EMBEDDED: aconn = bmdAudioConnectionEmbedded; break; case GST_DECKLINK_AUDIO_CONNECTION_AES_EBU: aconn = bmdAudioConnectionAESEBU; break; case GST_DECKLINK_AUDIO_CONNECTION_ANALOG: aconn = bmdAudioConnectionAnalog; break; } ret = config->SetInt (bmdDeckLinkConfigAudioInputConnection, aconn); if (ret != S_OK) { GST_ERROR ("set configuration (audio input connection)"); return FALSE; } mode = gst_decklink_get_mode (decklinksrc->mode); ret = decklinksrc->input->EnableVideoInput (mode->mode, bmdFormat8BitYUV, 0); if (ret != S_OK) { GST_ERROR ("enable video input failed"); return FALSE; } sample_depth = bmdAudioSampleType16bitInteger; channels = 2; ret = decklinksrc->input->EnableAudioInput (bmdAudioSampleRate48kHz, sample_depth, channels); if (ret != S_OK) { GST_ERROR ("enable video input failed"); return FALSE; } ret = decklinksrc->input->StartStreams (); if (ret != S_OK) { GST_ERROR ("start streams failed"); return FALSE; } g_rec_mutex_lock (&decklinksrc->task_mutex); gst_task_start (decklinksrc->task); g_rec_mutex_unlock (&decklinksrc->task_mutex); return TRUE; }
static gboolean gst_decklink_src_start (GstElement * element) { GstDecklinkSrc *decklinksrc = GST_DECKLINK_SRC (element); DeckLinkCaptureDelegate *delegate; //IDeckLinkDisplayModeIterator *mode_iterator; //IDeckLinkDisplayMode *mode; BMDAudioSampleType sample_depth; int channels; HRESULT ret; const GstDecklinkMode *mode; IDeckLinkConfiguration *config; BMDVideoConnection conn; BMDAudioConnection aconn; GST_DEBUG_OBJECT (decklinksrc, "start"); decklinksrc->decklink = gst_decklink_get_nth_device (decklinksrc->device); if (decklinksrc->decklink == NULL) { return FALSE; } ret = decklinksrc->decklink->QueryInterface (IID_IDeckLinkInput, (void **) &decklinksrc->input); if (ret != S_OK) { GST_ERROR ("selected device does not have input interface"); return FALSE; } delegate = new DeckLinkCaptureDelegate (); delegate->priv = decklinksrc; decklinksrc->input->SetCallback (delegate); ret = decklinksrc->decklink->QueryInterface (IID_IDeckLinkConfiguration, (void **) &config); if (ret != S_OK) { GST_ERROR ("query interface failed"); return FALSE; } switch (decklinksrc->connection) { default: case GST_DECKLINK_CONNECTION_SDI: conn = bmdVideoConnectionSDI; aconn = bmdAudioConnectionEmbedded; break; case GST_DECKLINK_CONNECTION_HDMI: conn = bmdVideoConnectionHDMI; aconn = bmdAudioConnectionEmbedded; break; case GST_DECKLINK_CONNECTION_OPTICAL_SDI: conn = bmdVideoConnectionOpticalSDI; aconn = bmdAudioConnectionEmbedded; break; case GST_DECKLINK_CONNECTION_COMPONENT: conn = bmdVideoConnectionComponent; aconn = bmdAudioConnectionAnalog; break; case GST_DECKLINK_CONNECTION_COMPOSITE: conn = bmdVideoConnectionComposite; aconn = bmdAudioConnectionAnalog; break; case GST_DECKLINK_CONNECTION_SVIDEO: conn = bmdVideoConnectionSVideo; aconn = bmdAudioConnectionAnalog; break; } ret = config->SetInt (bmdDeckLinkConfigVideoInputConnection, conn); if (ret != S_OK) { GST_ERROR ("set configuration (input source)"); return FALSE; } if (decklinksrc->connection == GST_DECKLINK_CONNECTION_COMPOSITE) { ret = config->SetInt (bmdDeckLinkConfigAnalogVideoInputFlags, bmdAnalogVideoFlagCompositeSetup75); if (ret != S_OK) { GST_ERROR ("set configuration (composite setup)"); return FALSE; } } switch (decklinksrc->audio_connection) { default: case GST_DECKLINK_AUDIO_CONNECTION_AUTO: break; case GST_DECKLINK_AUDIO_CONNECTION_EMBEDDED: aconn = bmdAudioConnectionEmbedded; break; case GST_DECKLINK_AUDIO_CONNECTION_AES_EBU: aconn = bmdAudioConnectionAESEBU; break; case GST_DECKLINK_AUDIO_CONNECTION_ANALOG: aconn = bmdAudioConnectionAnalog; break; } ret = config->SetInt (bmdDeckLinkConfigAudioInputConnection, aconn); if (ret != S_OK) { GST_ERROR ("set configuration (audio input connection)"); return FALSE; } #if 0 ret = decklinksrc->input->GetDisplayModeIterator (&mode_iterator); if (ret != S_OK) { GST_ERROR ("failed to get display mode iterator"); return FALSE; } i = 0; while (mode_iterator->Next (&mode) == S_OK) { const char *mode_name; mode->GetName (&mode_name); GST_DEBUG ("%d: mode name: %s", i, mode_name); mode->Release (); i++; } #endif mode = gst_decklink_get_mode (decklinksrc->mode); ret = decklinksrc->input->EnableVideoInput (mode->mode, bmdFormat8BitYUV, 0); if (ret != S_OK) { GST_ERROR ("enable video input failed"); return FALSE; } sample_depth = bmdAudioSampleType16bitInteger; channels = 2; ret = decklinksrc->input->EnableAudioInput (bmdAudioSampleRate48kHz, sample_depth, channels); if (ret != S_OK) { GST_ERROR ("enable video input failed"); return FALSE; } ret = decklinksrc->input->StartStreams (); if (ret != S_OK) { GST_ERROR ("start streams failed"); return FALSE; } g_static_rec_mutex_lock (&decklinksrc->task_mutex); gst_task_start (decklinksrc->task); g_static_rec_mutex_unlock (&decklinksrc->task_mutex); return TRUE; }