示例#1
0
static GstElement *
kms_av_muxer_add_src (KmsBaseMediaMuxer * obj, KmsMediaType type,
    const gchar * id)
{
  KmsAVMuxer *self = KMS_AV_MUXER (obj);
  GstElement *sink = NULL, *appsrc = NULL;

  KMS_BASE_MEDIA_MUXER_LOCK (self);

  switch (type) {
    case KMS_MEDIA_TYPE_AUDIO:
      appsrc = self->priv->audiosrc;
      break;
    case KMS_MEDIA_TYPE_VIDEO:
      appsrc = self->priv->videosrc;
      break;
    default:
      GST_WARNING_OBJECT (obj, "Unsupported media type %u", type);
  }

  if (appsrc != NULL && !self->priv->sink_signaled) {
    sink = g_object_ref (self->priv->sink);
    self->priv->sink_signaled = TRUE;
  }

  KMS_BASE_MEDIA_MUXER_UNLOCK (self);

  if (sink != NULL) {
    KMS_BASE_MEDIA_MUXER_GET_CLASS (self)->emit_on_sink_added
        (KMS_BASE_MEDIA_MUXER (self), sink);
    g_object_unref (sink);
  }

  return appsrc;
}
static void
kms_recorder_endpoint_create_base_media_muxer (KmsRecorderEndpoint * self)
{
  KmsBaseMediaMuxer *mux;

  if (self->priv->profile == KMS_RECORDING_PROFILE_KSR) {
    mux = KMS_BASE_MEDIA_MUXER (kms_ksr_muxer_new
        (KMS_BASE_MEDIA_MUXER_PROFILE, self->priv->profile,
            KMS_BASE_MEDIA_MUXER_URI, KMS_URI_ENDPOINT (self)->uri, NULL));
  } else {
    mux = KMS_BASE_MEDIA_MUXER (kms_av_muxer_new
        (KMS_BASE_MEDIA_MUXER_PROFILE, self->priv->profile,
            KMS_BASE_MEDIA_MUXER_URI, KMS_URI_ENDPOINT (self)->uri, NULL));
  }

  self->priv->mux = mux;
}
示例#3
0
static void
kms_av_muxer_prepare_pipeline (KmsAVMuxer * self)
{
  self->priv->videosrc = gst_element_factory_make ("appsrc", "videoSrc");
  self->priv->audiosrc = gst_element_factory_make ("appsrc", "audioSrc");

  self->priv->sink =
      KMS_BASE_MEDIA_MUXER_GET_CLASS (self)->create_sink (KMS_BASE_MEDIA_MUXER
      (self), KMS_BASE_MEDIA_MUXER_GET_URI (self));

  g_object_set (self->priv->videosrc, "format", 3 /* GST_FORMAT_TIME */ , NULL);
  g_object_set (self->priv->audiosrc, "format", 3 /* GST_FORMAT_TIME */ , NULL);

  kms_av_muxer_add_injector_probe (self, self->priv->videosrc);
  kms_av_muxer_add_injector_probe (self, self->priv->audiosrc);

  self->priv->mux = kms_av_muxer_create_muxer (self);

  gst_bin_add_many (GST_BIN (KMS_BASE_MEDIA_MUXER_GET_PIPELINE (self)),
      self->priv->videosrc, self->priv->audiosrc, self->priv->mux,
      self->priv->sink, NULL);

  if (!gst_element_link (self->priv->mux, self->priv->sink)) {
    GST_ERROR_OBJECT (self, "Could not link elements: %"
        GST_PTR_FORMAT ", %" GST_PTR_FORMAT, self->priv->mux, self->priv->sink);
  }

  if (kms_recording_profile_supports_type (KMS_BASE_MEDIA_MUXER_GET_PROFILE
          (self), KMS_ELEMENT_PAD_TYPE_VIDEO)) {
    const gchar *pad_name =
        kms_av_muxer_get_sink_pad_name (KMS_BASE_MEDIA_MUXER_GET_PROFILE (self),
        KMS_ELEMENT_PAD_TYPE_VIDEO);

    if (pad_name == NULL) {
      GST_ERROR_OBJECT (self, "Unsupported pad for recording");
      return;
    }

    if (!gst_element_link_pads (self->priv->videosrc, "src", self->priv->mux,
            pad_name)) {
      GST_ERROR_OBJECT (self,
          "Could not link elements: %" GST_PTR_FORMAT ", %" GST_PTR_FORMAT,
          self->priv->videosrc, self->priv->mux);
    }
  }

  if (kms_recording_profile_supports_type (KMS_BASE_MEDIA_MUXER_GET_PROFILE
          (self), KMS_ELEMENT_PAD_TYPE_AUDIO)) {
    const gchar *pad_name =
        kms_av_muxer_get_sink_pad_name (KMS_BASE_MEDIA_MUXER_GET_PROFILE (self),
        KMS_ELEMENT_PAD_TYPE_AUDIO);

    if (pad_name == NULL) {
      GST_ERROR_OBJECT (self, "Unsupported pad for recording");
      return;
    }

    if (!gst_element_link_pads (self->priv->audiosrc, "src", self->priv->mux,
            pad_name)) {
      GST_ERROR_OBJECT (self,
          "Could not link elements: %" GST_PTR_FORMAT ", %" GST_PTR_FORMAT,
          self->priv->audiosrc, self->priv->mux);
    }
  }
}