return caps;
}
+static GstCaps *__get_caps_from_encoded_audio_media_type(const char *media_type, int channels, int samplerate)
+{
+ RET_VAL_IF(media_type == NULL, NULL, "media_type is NULL");
+
+ if (!strcmp(media_type, MEDIA_TYPE_AUDIO_OPUS) ||
+ !strcmp(media_type, MEDIA_TYPE_AUDIO_VORBIS))
+ return gst_caps_new_simple(media_type, NULL, NULL);
+
+ LOG_ERROR_IF_REACHED("invalid media_type(%s)", media_type);
+
+ return NULL;
+}
+
+static GstCaps *__get_caps_from_encoded_video_media_type(const char *media_type, int width, int height)
+{
+ RET_VAL_IF(media_type == NULL, NULL, "media_type is NULL");
+
+ if (!strcmp(media_type, MEDIA_TYPE_VIDEO_H264) ||
+ !strcmp(media_type, MEDIA_TYPE_VIDEO_H265))
+ return gst_caps_new_simple(media_type,
+ "stream-format", G_TYPE_STRING, "byte-stream",
+ "alignment", G_TYPE_STRING, "au",
+ "width", G_TYPE_INT, width,
+ "height", G_TYPE_INT, height,
+ NULL);
+
+ if (!strcmp(media_type, MEDIA_TYPE_VIDEO_VP8) ||
+ !strcmp(media_type, MEDIA_TYPE_VIDEO_VP9) ||
+ !strcmp(media_type, MEDIA_TYPE_VIDEO_THEORA))
+ return gst_caps_new_simple(media_type, NULL, NULL); /* NOTE: need to verify these codecs */
+
+ if (!strcmp(media_type, MEDIA_TYPE_VIDEO_JPEG))
+ return gst_caps_new_simple(media_type,
+ "width", G_TYPE_INT, width,
+ "height", G_TYPE_INT, height,
+ NULL);
+
+ LOG_ERROR_IF_REACHED("invalid media_type(%s)", media_type);
+
+ return NULL;
+}
+
/* Use g_free() to free the media_type parameter. */
static GstCaps *__make_default_encoded_caps(webrtc_gst_slot_s *source, webrtc_ini_s *ini, gchar **media_type)
{
case WEBRTC_MEDIA_SOURCE_TYPE_CUSTOM_VIDEO:
_media_type = __get_video_media_type(ini_source->v_codec);
RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL");
+ caps = __get_caps_from_encoded_video_media_type(_media_type, ini_source->v_width, ini_source->v_height);
- caps = gst_caps_new_simple(_media_type,
- "framerate", GST_TYPE_FRACTION, ini_source->v_framerate, 1,
- "width", G_TYPE_INT, ini_source->v_width,
- "height", G_TYPE_INT, ini_source->v_height,
- NULL);
source->video_info.width = ini_source->v_width;
source->video_info.height = ini_source->v_height;
break;
case WEBRTC_MEDIA_SOURCE_TYPE_CUSTOM_AUDIO:
_media_type = __get_audio_media_type(ini_source->a_codec);
RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL");
-
- caps = gst_caps_new_simple(_media_type,
- "channels", G_TYPE_INT, ini_source->a_channels,
- "rate", G_TYPE_INT, ini_source->a_samplerate,
- NULL);
+ caps = __get_caps_from_encoded_audio_media_type(_media_type, ini_source->a_channels, ini_source->a_samplerate);
break;
- case WEBRTC_MEDIA_SOURCE_TYPE_MEDIA_PACKET: {
+ case WEBRTC_MEDIA_SOURCE_TYPE_MEDIA_PACKET:
if (source->media_types == MEDIA_TYPE_AUDIO) {
_media_type = __get_audio_media_type(ini_source->a_codec);
- caps = gst_caps_new_simple(_media_type,
- "channels", G_TYPE_INT, ini_source->a_channels,
- "rate", G_TYPE_INT, ini_source->a_samplerate,
- NULL);
-
+ RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL");
+ caps = __get_caps_from_encoded_audio_media_type(_media_type, ini_source->a_channels, ini_source->a_samplerate);
} else if (source->media_types == MEDIA_TYPE_VIDEO) {
_media_type = __get_video_media_type(ini_source->v_codec);
- caps = gst_caps_new_simple(_media_type,
- "framerate", GST_TYPE_FRACTION, ini_source->v_framerate, 1,
- "width", G_TYPE_INT, ini_source->v_width,
- "height", G_TYPE_INT, ini_source->v_height,
- NULL);
-
+ RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL");
+ caps = __get_caps_from_encoded_video_media_type(_media_type, ini_source->v_width, ini_source->v_height);
} else {
LOG_ERROR_IF_REACHED("source->media_types(0x%x)", source->media_types);
return NULL;
}
break;
- }
default:
LOG_ERROR_IF_REACHED("type(%d)", source->type);
_media_type = __get_audio_media_type(__get_format_name(mime_type, source->zerocopy_enabled));
RET_VAL_IF(_media_type == NULL, NULL, "media_type is NULL");
- caps = gst_caps_new_simple(_media_type,
- "channels", G_TYPE_INT, channels,
- "rate", G_TYPE_INT, samplerate,
- NULL);
+ caps = __get_caps_from_encoded_audio_media_type(_media_type, channels, samplerate);
} else if (source->media_types == MEDIA_TYPE_VIDEO) {
int width;
_media_type = __get_video_media_type(__get_format_name(mime_type, source->zerocopy_enabled));
RET_VAL_IF(_media_type == NULL, NULL, "media_type is NULL");
- caps = gst_caps_new_simple(_media_type,
- "framerate", GST_TYPE_FRACTION, framerate, 1,
- "width", G_TYPE_INT, width,
- "height", G_TYPE_INT, height,
- NULL);
+ caps = __get_caps_from_encoded_video_media_type(_media_type, width, height);
} else {
LOG_ERROR_IF_REACHED("source->media_types(0x%x)", source->media_types);
RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
RET_VAL_IF(element_list == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "element_list is NULL");
+ if (source->media_types == MEDIA_TYPE_VIDEO) {
+ encoder_klass_name = GST_KLASS_NAME_ENCODER_VIDEO;
+ } else if (source->media_types == MEDIA_TYPE_AUDIO) {
+ encoder_klass_name = GST_KLASS_NAME_ENCODER_AUDIO;
+ } else {
+ LOG_ERROR("not ready for this media_types[0x%x]", source->media_types);
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
+
if (need_capsfilter) {
if (!(capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_FIRST_CAPSFILTER)))
return WEBRTC_ERROR_INVALID_OPERATION;
+ APPEND_ELEMENT(*element_list, capsfilter);
if (__is_encoded_format_supported(source->type, &webrtc->ini)) {
if ((sink_caps = __make_default_encoded_caps(source, &webrtc->ini, NULL))) {
}
}
- if (source->media_types == MEDIA_TYPE_VIDEO) {
- encoder_klass_name = GST_KLASS_NAME_ENCODER_VIDEO;
- } else if (source->media_types == MEDIA_TYPE_AUDIO) {
- encoder_klass_name = GST_KLASS_NAME_ENCODER_AUDIO;
- } else {
- LOG_ERROR("not ready for this media_types[0x%x]", source->media_types);
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
-
if (source->zerocopy_enabled)
encoder = __get_hw_encoder_element(webrtc, source);
else
encoder);
if (encoder == NULL)
return WEBRTC_ERROR_INVALID_OPERATION;
+ APPEND_ELEMENT(*element_list, encoder);
encoder_name = gst_element_get_name(encoder);
if (encoder_name && (!g_strcmp0(encoder_name, "vp8enc") || !g_strcmp0(encoder_name, "vp9enc"))) {
g_free(media_type);
return WEBRTC_ERROR_INVALID_OPERATION;
}
+ APPEND_ELEMENT(*element_list, payloader);
if (!(queue = _create_element(DEFAULT_ELEMENT_QUEUE, NULL))) {
g_free(media_type);
return WEBRTC_ERROR_INVALID_OPERATION;
}
+ APPEND_ELEMENT(*element_list, queue);
if (!(capsfilter2 = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_RTP_CAPSFILTER))) {
g_free(media_type);
return WEBRTC_ERROR_INVALID_OPERATION;
}
+ APPEND_ELEMENT(*element_list, capsfilter2);
payload_id = __get_available_payload_id(webrtc);
if (payload_id == 0) {
g_free(media_type);
- APPEND_ELEMENT(*element_list, capsfilter);
- APPEND_ELEMENT(*element_list, encoder);
- APPEND_ELEMENT(*element_list, payloader);
- APPEND_ELEMENT(*element_list, queue);
- APPEND_ELEMENT(*element_list, capsfilter2);
-
return WEBRTC_ERROR_NONE;
}
static GstCaps *__make_encoded_caps_for_appsrc(webrtc_gst_slot_s *source)
{
- GstCaps *caps;
media_format_mimetype_e mime_type;
const char *_media_type;
_media_type = __get_video_media_type(__get_format_name(mime_type, source->zerocopy_enabled));
RET_VAL_IF(g_strcmp0(_media_type, MEDIA_TYPE_VIDEO_H264), NULL, "not supported type(%s)", _media_type);
- /* FIXME: prepare other types */
- caps = gst_caps_new_simple(_media_type,
- "stream-format", G_TYPE_STRING, "byte-stream",
- "alignment", G_TYPE_STRING, "au",
- NULL);
-
- return caps;
+ return __make_encoded_caps_from_media_format(source, NULL);
}
static int __complete_mediapacketsrc_from_encoded_format(webrtc_s *webrtc, webrtc_gst_slot_s *source)