static GstCaps *__make_default_raw_caps(webrtc_media_source_type_e type, webrtc_ini_s *ini)
{
GstCaps *caps = NULL;
+ ini_item_media_source_s *source;
RET_VAL_IF(ini == NULL, NULL, "ini is NULL");
+ source = _ini_get_source_by_type(ini, type);
+ if (source == NULL)
+ source = &ini->media_source;
+
switch (type) {
case WEBRTC_MEDIA_SOURCE_TYPE_CAMERA:
case WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST:
caps = gst_caps_new_simple(MEDIA_TYPE_VIDEO_RAW,
- "format", G_TYPE_STRING, ini->media_source.v_raw_format,
- "framerate", GST_TYPE_FRACTION, ini->media_source.v_framerate, 1,
- "width", G_TYPE_INT, ini->media_source.v_width,
- "height", G_TYPE_INT, ini->media_source.v_height,
+ "format", G_TYPE_STRING, source->v_raw_format,
+ "framerate", GST_TYPE_FRACTION, source->v_framerate, 1,
+ "width", G_TYPE_INT, source->v_width,
+ "height", G_TYPE_INT, source->v_height,
NULL);
break;
case WEBRTC_MEDIA_SOURCE_TYPE_MIC:
case WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST:
caps = gst_caps_new_simple(MEDIA_TYPE_AUDIO_RAW,
- "format", G_TYPE_STRING, ini->media_source.a_raw_format,
- "channels", G_TYPE_INT, ini->media_source.a_channels,
- "rate", G_TYPE_INT, ini->media_source.a_samplerate,
+ "format", G_TYPE_STRING, source->a_raw_format,
+ "channels", G_TYPE_INT, source->a_channels,
+ "rate", G_TYPE_INT, source->a_samplerate,
NULL);
break;
static GstCaps *__make_default_encoded_caps(webrtc_media_source_type_e type, webrtc_ini_s *ini, gchar **media_type)
{
GstCaps *caps;
+ ini_item_media_source_s *source;
const char *_media_type;
RET_VAL_IF(ini == NULL, NULL, "ini is NULL");
+ source = _ini_get_source_by_type(ini, type);
+ if (source == NULL)
+ source = &ini->media_source;
+
switch (type) {
case WEBRTC_MEDIA_SOURCE_TYPE_CAMERA:
case WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST:
- _media_type = __get_video_media_type(ini->media_source.v_codec);
+ _media_type = __get_video_media_type(source->v_codec);
caps = gst_caps_new_simple(_media_type,
- "framerate", GST_TYPE_FRACTION, ini->media_source.v_framerate, 1,
- "width", G_TYPE_INT, ini->media_source.v_width,
- "height", G_TYPE_INT, ini->media_source.v_height,
+ "framerate", GST_TYPE_FRACTION, source->v_framerate, 1,
+ "width", G_TYPE_INT, source->v_width,
+ "height", G_TYPE_INT, source->v_height,
NULL);
break;
case WEBRTC_MEDIA_SOURCE_TYPE_MIC:
case WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST:
- _media_type = __get_audio_media_type(ini->media_source.a_codec);
+ _media_type = __get_audio_media_type(source->a_codec);
caps = gst_caps_new_simple(_media_type,
- "channels", G_TYPE_INT, ini->media_source.a_channels,
- "rate", G_TYPE_INT, ini->media_source.a_samplerate,
+ "channels", G_TYPE_INT, source->a_channels,
+ "rate", G_TYPE_INT, source->a_samplerate,
NULL);
break;
return caps;
}
+static GstElement *__get_hw_encoder_element(webrtc_s *webrtc, webrtc_media_source_type_e type)
+{
+ ini_item_media_source_s *source;
+
+ RET_VAL_IF(webrtc == NULL, NULL, "webrtc is NULL");
+
+ source = _ini_get_source_by_type(&webrtc->ini, type);
+
+ if (type == WEBRTC_MEDIA_SOURCE_TYPE_CAMERA || type == WEBRTC_MEDIA_SOURCE_TYPE_VIDEOTEST) {
+ if (source && source->v_hw_encoder_element)
+ return _create_element(source->v_hw_encoder_element, NULL);
+ if (webrtc->ini.media_source.v_hw_encoder_element)
+ return _create_element(webrtc->ini.media_source.v_hw_encoder_element, NULL);
+
+ } else if (type == WEBRTC_MEDIA_SOURCE_TYPE_MIC || type == WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST) {
+ if (source && source->a_hw_encoder_element)
+ return _create_element(source->a_hw_encoder_element, NULL);
+ if (webrtc->ini.media_source.a_hw_encoder_element)
+ return _create_element(webrtc->ini.media_source.a_hw_encoder_element, NULL);
+ }
+
+ LOG_DEBUG("no hw encoder is requested, type(%d)", type);
+ return NULL;
+}
+
static int __create_rest_of_elements(webrtc_s *webrtc, webrtc_gst_slot_s *source, webrtc_media_source_type_e type,
GstElement **capsfilter, GstElement **encoder, GstElement **payloader, GstElement **queue, GstElement **capsfilter2)
{
return WEBRTC_ERROR_INVALID_OPERATION;
}
if ((sink_caps = __make_default_raw_caps(type, &webrtc->ini))) {
+ gchar *caps_str = gst_caps_to_string(sink_caps);
+ LOG_INFO("capsfilter caps[%s]", caps_str);
+ g_free(caps_str);
+
g_object_set(G_OBJECT(*capsfilter), "caps", sink_caps, NULL);
gst_caps_unref(sink_caps);
}
else
encoder_klass_name = GST_KLASS_NAME_ENCODER_AUDIO;
- CREATE_ELEMENT_FROM_REGISTRY(elem_info, encoder_klass_name,
- __make_default_raw_caps(type, &webrtc->ini),
- __make_default_encoded_caps(type, &webrtc->ini, NULL),
- *encoder);
- if (*encoder == NULL)
- return WEBRTC_ERROR_INVALID_OPERATION;
+ *encoder = __get_hw_encoder_element(webrtc, type);
+ if (*encoder == NULL) {
+ CREATE_ELEMENT_FROM_REGISTRY(elem_info, encoder_klass_name,
+ __make_default_raw_caps(type, &webrtc->ini),
+ __make_default_encoded_caps(type, &webrtc->ini, NULL),
+ *encoder);
+ if (*encoder == NULL)
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
CREATE_ELEMENT_FROM_REGISTRY(elem_info, GST_KLASS_NAME_PAYLOADER_RTP,
__make_default_encoded_caps(type, &webrtc->ini, &media_type),