return encoder;
}
+static GstElement *__prepare_first_capsfilter(webrtc_s *webrtc, webrtc_gst_slot_s *source, int av_idx, GList **element_list, bool *encoded_support, GstCaps **caps_for_render)
+{
+ GstElement *capsfilter;
+ GstCaps *sink_caps;
+
+ RET_VAL_IF(webrtc == NULL, NULL, "webrtc is NULL");
+ RET_VAL_IF(source == NULL, NULL, "source is NULL");
+ RET_VAL_IF(encoded_support == NULL, NULL, "encoded_support is NULL");
+ RET_VAL_IF(caps_for_render == NULL, NULL, "caps_for_render is NULL");
+
+ if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_FIRST_CAPSFILTER)))
+ return NULL;
+ APPEND_ELEMENT(*element_list, capsfilter);
+
+ _get_video_encoded_support_from_ini(&webrtc->ini, source->type, encoded_support);
+
+ if (*encoded_support) {
+ if ((sink_caps = __make_default_encoded_caps(source, &webrtc->ini, NULL))) {
+ PRINT_CAPS(sink_caps, "capsfilter");
+ g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL);
+
+ *caps_for_render = sink_caps;
+ }
+
+ _set_need_decoding_for_loopback(source, av_idx, true);
+
+ return capsfilter;
+ }
+
+ if ((sink_caps = __make_default_raw_caps(source, &webrtc->ini))) {
+ PRINT_CAPS(sink_caps, "capsfilter");
+ g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL);
+
+ *caps_for_render = sink_caps;
+ }
+
+ return capsfilter;
+}
+
static bool __is_videoscale_needed(webrtc_s *webrtc, webrtc_gst_slot_s *source)
{
bool drc_support;
return true;
}
+static GstElement *__prepare_videoscale(webrtc_gst_slot_s *source, GList **element_list)
+{
+ GstElement *videoscale;
+ GstElement *videoscaleCapsfilter;
+ GstCaps *caps;
+
+ RET_VAL_IF(source == NULL, NULL, "source is NULL");
+ RET_VAL_IF(element_list == NULL, NULL, "element_list is NULL");
+
+ if (!(videoscale = _create_element(DEFAULT_ELEMENT_VIDEOSCALE, NULL)))
+ return NULL;
+ APPEND_ELEMENT(*element_list, videoscale);
+
+ if (!(videoscaleCapsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_VIDEOSCALE_CAPSFILTER)))
+ return NULL;
+ APPEND_ELEMENT(*element_list, videoscaleCapsfilter);
+
+ caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW,
+ "width", G_TYPE_INT, source->video_info.width,
+ "height", G_TYPE_INT, source->video_info.height,
+ NULL);
+
+ PRINT_CAPS(caps, ELEMENT_NAME_VIDEOSCALE_CAPSFILTER);
+ g_object_set(G_OBJECT(videoscaleCapsfilter), "caps", caps, NULL);
+ gst_caps_unref(caps);
+
+ return videoscaleCapsfilter;
+}
+
static bool __is_videorate_needed(webrtc_s *webrtc, webrtc_gst_slot_s *source)
{
bool encoded_support;
return true;
}
+static GstElement *__prepare_videorate(webrtc_gst_slot_s *source, GList **element_list)
+{
+ GstElement *videorate;
+ GstElement *videorateCapsfilter;
+ GstCaps *caps;
+
+ if (!(videorate = _create_element(DEFAULT_ELEMENT_VIDEORATE, NULL)))
+ return NULL;
+ APPEND_ELEMENT(*element_list, videorate);
+
+ if (!(videorateCapsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_VIDEORATE_CAPSFILTER)))
+ return NULL;
+ APPEND_ELEMENT(*element_list, videorateCapsfilter);
+
+ caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW,
+ "framerate", GST_TYPE_FRACTION, source->video_info.framerate, 1,
+ NULL);
+
+ PRINT_CAPS(caps, ELEMENT_NAME_VIDEORATE_CAPSFILTER);
+ g_object_set(G_OBJECT(videorateCapsfilter), "caps", caps, NULL);
+ gst_caps_unref(caps);
+
+ return videorateCapsfilter;
+}
+
int _create_rest_of_elements(webrtc_s *webrtc, webrtc_gst_slot_s *source, bool need_capsfilter, GList **element_list, bool is_audio)
{
GstElement *encoder = NULL;
idx = GET_AV_IDX(is_audio);
if (need_capsfilter) {
+ GstElement *capsfilter;
bool encoded_support;
- GstElement *capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_FIRST_CAPSFILTER);
- if (!capsfilter)
- return WEBRTC_ERROR_INVALID_OPERATION;
- APPEND_ELEMENT(*element_list, capsfilter);
-
- _get_video_encoded_support_from_ini(&webrtc->ini, source->type, &encoded_support);
- if (encoded_support) {
- if ((sink_caps = __make_default_encoded_caps(source, &webrtc->ini, NULL))) {
- PRINT_CAPS(sink_caps, "capsfilter");
- g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL);
- caps_for_render = sink_caps;
- }
+ if(!(capsfilter = __prepare_first_capsfilter(webrtc, source, idx, element_list, &encoded_support, &caps_for_render)))
+ return WEBRTC_ERROR_INVALID_OPERATION;
- _set_need_decoding_for_loopback(source, idx, true);
- pad_for_render = gst_element_get_static_pad(capsfilter, "src");
+ pad_for_render = gst_element_get_static_pad(capsfilter, "src");
+ if (encoded_support)
goto skip_encoder;
- }
-
- if ((sink_caps = __make_default_raw_caps(source, &webrtc->ini))) {
- PRINT_CAPS(sink_caps, "capsfilter");
- g_object_set(G_OBJECT(capsfilter), "caps", sink_caps, NULL);
-
- caps_for_render = sink_caps;
- }
-
- pad_for_render = gst_element_get_static_pad(capsfilter, "src");
}
if (__is_videoscale_needed(webrtc, source)) {
- GstElement *videoscale;
GstElement *videoscaleCapsfilter;
- GstCaps *caps;
-
- if (!(videoscale = _create_element(DEFAULT_ELEMENT_VIDEOSCALE, NULL)))
- goto error;
- APPEND_ELEMENT(*element_list, videoscale);
- if (!(videoscaleCapsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_VIDEOSCALE_CAPSFILTER)))
+ if(!(videoscaleCapsfilter = __prepare_videoscale(source, element_list)))
goto error;
- APPEND_ELEMENT(*element_list, videoscaleCapsfilter);
-
- caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW,
- "width", G_TYPE_INT, source->video_info.width,
- "height", G_TYPE_INT, source->video_info.height,
- NULL);
-
- PRINT_CAPS(caps, ELEMENT_NAME_VIDEOSCALE_CAPSFILTER);
- g_object_set(G_OBJECT(videoscaleCapsfilter), "caps", caps, NULL);
- gst_caps_unref(caps);
gst_object_unref(pad_for_render);
pad_for_render = gst_element_get_static_pad(videoscaleCapsfilter, "src");
}
if (__is_videorate_needed(webrtc, source)) {
- GstElement *videorate;
GstElement *videorateCapsfilter;
- GstCaps *caps;
- if (!(videorate = _create_element(DEFAULT_ELEMENT_VIDEORATE, NULL)))
+ if(!(videorateCapsfilter = __prepare_videorate(source, element_list)))
goto error;
- APPEND_ELEMENT(*element_list, videorate);
-
- if (!(videorateCapsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_VIDEORATE_CAPSFILTER)))
- goto error;
- APPEND_ELEMENT(*element_list, videorateCapsfilter);
-
- caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW,
- "framerate", GST_TYPE_FRACTION, source->video_info.framerate, 1,
- NULL);
-
- PRINT_CAPS(caps, ELEMENT_NAME_VIDEORATE_CAPSFILTER);
- g_object_set(G_OBJECT(videorateCapsfilter), "caps", caps, NULL);
- gst_caps_unref(caps);
gst_object_unref(pad_for_render);
pad_for_render = gst_element_get_static_pad(videorateCapsfilter, "src");
pad_for_render = gst_element_get_static_pad(videocrop, "src");
}
- encoder = __prepare_encoder(webrtc, source, is_audio);
- if (encoder == NULL)
+ if (!(encoder = __prepare_encoder(webrtc, source, is_audio)))
goto error;
APPEND_ELEMENT(*element_list, encoder);