return GST_PAD_PROBE_REMOVE;
}
-static int __create_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source, GstElement *payloader, bool is_audio)
+static GstElement * __prepare_capsfilter_for_filesrc_pipeline(webrtc_gst_slot_s *source, bool is_audio)
{
- GstBin *bin = NULL;
GstElement *capsfilter = NULL;
- GstElement *fakesink = NULL;
GstCaps *sink_caps = NULL;
- unsigned int payload_id;
- GstPad *sink_pad = NULL;
+ unsigned int payload_id = 0;
- RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
- RET_VAL_IF(payloader == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "payloader is NULL");
- RET_VAL_IF(source->filesrc_pipeline == NULL, WEBRTC_ERROR_INVALID_OPERATION, "filesrc_pipeline is NULL");
-
- bin = GST_BIN(source->filesrc_pipeline);
+ RET_VAL_IF(source == NULL, NULL, "source is NULL");
if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, is_audio ? DEFAULT_NAME_AUDIO_CAPSFILTER : DEFAULT_NAME_VIDEO_CAPSFILTER)))
- return WEBRTC_ERROR_INVALID_OPERATION;
+ return NULL;
payload_id = __get_available_payload_id(source->webrtc);
if (payload_id == 0) {
SAFE_GST_OBJECT_UNREF(capsfilter);
- return WEBRTC_ERROR_INVALID_OPERATION;
+ return NULL;
}
source->av[is_audio ? AV_IDX_AUDIO : AV_IDX_VIDEO].payload_id = payload_id;
gst_caps_unref(sink_caps);
}
- if (!(fakesink = _create_element("fakesink", is_audio ? DEFAULT_NAME_AUDIO_FAKESINK : DEFAULT_NAME_VIDEO_FAKESINK))) {
- SAFE_GST_OBJECT_UNREF(capsfilter);
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
+ return capsfilter;
+}
+
+static GstElement * __prepare_fakesink_for_filesrc_pipeline(webrtc_gst_slot_s *source, bool is_audio)
+{
+ GstElement *fakesink = NULL;
+ GstPad *sink_pad = NULL;
+
+ RET_VAL_IF(source == NULL, NULL, "source is NULL");
+
+ if (!(fakesink = _create_element("fakesink", is_audio ? DEFAULT_NAME_AUDIO_FAKESINK : DEFAULT_NAME_VIDEO_FAKESINK)))
+ return NULL;
sink_pad = gst_element_get_static_pad(fakesink, "sink");
gst_pad_add_probe(sink_pad, GST_PAD_PROBE_TYPE_BUFFER, __fakesink_probe_cb, source, NULL);
gst_object_unref(sink_pad);
- g_object_set(G_OBJECT(fakesink), "sync", true, NULL);
- g_object_set(fakesink, "signal-handoffs", TRUE, NULL);
+ g_object_set(G_OBJECT(fakesink),
+ "sync", TRUE,
+ "signal-handoffs", TRUE,
+ NULL);
+
g_signal_connect(fakesink, "handoff", is_audio ? G_CALLBACK(__filesrc_pipeline_audio_stream_handoff_cb) : G_CALLBACK(__filesrc_pipeline_video_stream_handoff_cb), (gpointer)source);
- gst_bin_add_many(GST_BIN(source->filesrc_pipeline), capsfilter, fakesink, NULL);
+ return fakesink;
+}
+
+static int __create_rest_of_elements_for_filesrc_pipeline(webrtc_gst_slot_s *source, GstElement *payloader, bool is_audio)
+{
+ GstBin *bin = NULL;
+ GstElement *capsfilter = NULL;
+ GstElement *fakesink = NULL;
+
+ RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
+ RET_VAL_IF(payloader == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "payloader is NULL");
+ RET_VAL_IF(source->filesrc_pipeline == NULL, WEBRTC_ERROR_INVALID_OPERATION, "filesrc_pipeline is NULL");
+
+ bin = GST_BIN(source->filesrc_pipeline);
+
+ if (!(capsfilter = __prepare_capsfilter_for_filesrc_pipeline(source, is_audio)))
+ return WEBRTC_ERROR_INVALID_OPERATION;
+
+ if (!(fakesink = __prepare_fakesink_for_filesrc_pipeline(source, is_audio))) {
+ SAFE_GST_OBJECT_UNREF(capsfilter);
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
+
+ gst_bin_add_many(bin, capsfilter, fakesink, NULL);
if (!gst_element_link_many(payloader, capsfilter, fakesink, NULL)) {
LOG_ERROR("failed to gst_element_link_many()");
- gst_bin_remove_many(bin, capsfilter, fakesink, NULL);
- return WEBRTC_ERROR_INVALID_OPERATION;
+ goto error;
}
if (!gst_element_sync_state_with_parent(capsfilter)) {
LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(capsfilter));
- gst_bin_remove_many(bin, capsfilter, fakesink, NULL);
- return WEBRTC_ERROR_INVALID_OPERATION;
+ goto error;
}
if (!gst_element_sync_state_with_parent(fakesink)) {
LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(fakesink));
- gst_bin_remove_many(bin, capsfilter, fakesink, NULL);
- return WEBRTC_ERROR_INVALID_OPERATION;
+ goto error;
}
return WEBRTC_ERROR_NONE;
+
+error:
+ gst_bin_remove_many(bin, capsfilter, fakesink, NULL);
+ return WEBRTC_ERROR_INVALID_OPERATION;
}
static GstElement * __link_decodebin_with_payload(GstPad *pad, webrtc_gst_slot_s *source, bool is_audio, bool create)