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);
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}