#define GST_KLASS_NAME_DEPAYLOADER_RTP "Codec/Depayloader/Network/RTP"
+#define DEFAULT_ELEMENT_CAPSFILTER "capsfilter"
#define DEFAULT_ELEMENT_VIDEOCONVERT "videoconvert"
#define DEFAULT_ELEMENT_AUDIOCONVERT "audioconvert"
#define DEFAULT_ELEMENT_AUDIORESAMPLE "audioresample"
RET_VAL_IF(mime == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "mime is NULL");
RET_VAL_IF(media_format_mime == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "media_format_mime is NULL");
- if (!g_strcmp0(mime, "audio/x-opus")) {
+ if (!g_strcmp0(mime, MEDIA_TYPE_AUDIO_OPUS)) {
*media_format_mime = MEDIA_FORMAT_OPUS;
- } else if (!g_strcmp0(mime, "audio/x-vorbis")) {
+ } else if (!g_strcmp0(mime, MEDIA_TYPE_AUDIO_VORBIS)) {
*media_format_mime = MEDIA_FORMAT_VORBIS;
- } else if (!g_strcmp0(mime, "video/x-vp8")) {
+ } else if (!g_strcmp0(mime, MEDIA_TYPE_VIDEO_VP8)) {
*media_format_mime = MEDIA_FORMAT_VP8;
- } else if (!g_strcmp0(mime, "video/x-vp9")) {
+ } else if (!g_strcmp0(mime, MEDIA_TYPE_VIDEO_VP9)) {
*media_format_mime = MEDIA_FORMAT_VP9;
- } else if (!g_strcmp0(mime, "video/x-h264")) {
+ } else if (!g_strcmp0(mime, MEDIA_TYPE_VIDEO_H264)) {
*media_format_mime = MEDIA_FORMAT_H264_HP;
} else {
LOG_ERROR("not supported mime[%s]", mime);
LOG_DEBUG("<<< end of the callback");
}
+static GstCaps* __make_caps_if_h264_or_h265(GstPad *pad)
+{
+ GstCaps *caps;
+ GstStructure *structure;
+ const gchar *encoding_name;
+ const gchar *media_type;
+ GstCaps *new_caps;
+
+ RET_VAL_IF(pad == NULL, NULL, "pad is NULL");
+
+ caps = gst_pad_get_current_caps(pad);
+ structure = gst_caps_get_structure(caps, 0);
+ encoding_name = gst_structure_get_string(structure, "encoding-name");
+
+ LOG_INFO("encoding-name[%s]", encoding_name);
+
+ if (!g_strcmp0(encoding_name, "H264") || !g_strcmp0(encoding_name, "h264")) {
+ media_type = MEDIA_TYPE_VIDEO_H264;
+ } else if (!g_strcmp0(encoding_name, "H265") || !g_strcmp0(encoding_name, "h265")) {
+ media_type = MEDIA_TYPE_VIDEO_H265;
+ } else {
+ gst_caps_unref(caps);
+ return NULL;
+ }
+
+ /* FIXME: get value of stream-format, alignment from ini file */
+ new_caps = gst_caps_new_simple(media_type,
+ "stream-format", G_TYPE_STRING, "byte-stream",
+ "alignment", G_TYPE_STRING, "au",
+ NULL);
+
+ gst_caps_unref(caps);
+
+ return new_caps;
+}
+
int _add_forwarding_sink_bin(webrtc_s *webrtc, GstPad *src_pad, bool is_video)
{
int ret = WEBRTC_ERROR_NONE;
gchar *track_name;
element_info_s elem_info;
GstElement *depayloader = NULL;
+ GstElement *capsfilter = NULL;
GstElement *fakesink = NULL;
+ GstCaps *sink_caps;
webrtc_gst_slot_s *sink;
GstPad *sink_pad = NULL;
g_object_set(fakesink, "signal-handoffs", TRUE, NULL);
_connect_and_append_signal(&sink->signals, (GObject *)fakesink, "handoff", G_CALLBACK(__encoded_stream_cb), sink);
- gst_bin_add_many(GST_BIN(sink->bin), depayloader, fakesink, NULL);
+ capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, NULL);
+ if (!capsfilter)
+ goto error_before_insert;
+
+ if ((sink_caps = __make_caps_if_h264_or_h265(src_pad))) {
+ 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);
+ }
+
+ gst_bin_add_many(GST_BIN(sink->bin), depayloader, capsfilter, fakesink, NULL);
ret = _add_no_target_ghostpad_to_slot(sink, false, &sink_pad);
if (ret != WEBRTC_ERROR_NONE)
if (ret != WEBRTC_ERROR_NONE)
goto error_before_insert;
- if (!gst_element_link_many(depayloader, fakesink, NULL)) {
+ if (!gst_element_link_many(depayloader, capsfilter, fakesink, NULL)) {
LOG_ERROR("failed to gst_element_link_many()");
goto error_before_insert;
}