typedef struct _ini_item_rendering_sink_s {
const char *a_sink_element;
const char *v_sink_element;
+ const char *v_hw_handoff_sink_element;
const char *evas_native_surface_tbm_format;
+ const char *v_hw_sink_element_configuration;
+ const char *v_hw_handoff_sink_element_configuration;
+ const char *v_hw_decoder_element_configuration;
GStrv a_hw_decoder_elements;
GStrv v_hw_decoder_elements;
bool v_overlay_resource_required;
/* items for rendering sink */
#define INI_ITEM_AUDIO_SINK_ELEMENT "audio sink element"
#define INI_ITEM_VIDEO_SINK_ELEMENT "video sink element"
+#define INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT "video hw handoff sink element"
+#define INI_ITEM_VIDEO_HW_SINK_ELEMENT_CONFIGURATION "video hw sink element configuration"
+#define INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_CONFIGURATION "video hw handoff sink element configuration"
+#define INI_ITEM_VIDEO_HW_DECODER_ELEMENT_CONFIGURATION "video hw decoder element configuration"
#define INI_ITEM_AUDIO_HW_DECODER_ELEMENTS "audio hw decoder elements"
#define INI_ITEM_VIDEO_HW_DECODER_ELEMENTS "video hw decoder elements"
#define INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT "evas native surface tbm format"
LOG_INFO("[%s]", INI_CATEGORY_RENDERING_SINK);
__dump_item(INI_ITEM_AUDIO_SINK_ELEMENT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.a_sink_element);
__dump_item(INI_ITEM_VIDEO_SINK_ELEMENT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_sink_element);
+ __dump_item(INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_hw_handoff_sink_element);
+ __dump_item(INI_ITEM_VIDEO_HW_SINK_ELEMENT_CONFIGURATION, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_hw_sink_element_configuration);
+ __dump_item(INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_CONFIGURATION, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_hw_handoff_sink_element_configuration);
+ __dump_item(INI_ITEM_VIDEO_HW_DECODER_ELEMENT_CONFIGURATION, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.v_hw_decoder_element_configuration);
__dump_item(INI_ITEM_AUDIO_HW_DECODER_ELEMENTS, INI_ITEM_TYPE_STRINGS, ini->rendering_sink.a_hw_decoder_elements);
__dump_item(INI_ITEM_VIDEO_HW_DECODER_ELEMENTS, INI_ITEM_TYPE_STRINGS, ini->rendering_sink.v_hw_decoder_elements);
__dump_item(INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT, INI_ITEM_TYPE_STRING, (void *)ini->rendering_sink.evas_native_surface_tbm_format);
ini->rendering_sink.a_sink_element = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_AUDIO_SINK_ELEMENT, DEFAULT_AUDIO_SINK_ELEMENT);
ini->rendering_sink.v_sink_element = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_SINK_ELEMENT, DEFAULT_VIDEO_SINK_ELEMENT);
+ ini->rendering_sink.v_hw_handoff_sink_element = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT, DEFAULT_ELEMENT_FAKESINK);
+ ini->rendering_sink.v_hw_sink_element_configuration = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_SINK_ELEMENT_CONFIGURATION, NULL);
+ ini->rendering_sink.v_hw_handoff_sink_element_configuration = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_HANDOFF_SINK_ELEMENT_CONFIGURATION, NULL);
+ ini->rendering_sink.v_hw_decoder_element_configuration = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_DECODER_ELEMENT_CONFIGURATION, NULL);
__ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_AUDIO_HW_DECODER_ELEMENTS, &ini->rendering_sink.a_hw_decoder_elements, NULL);
__ini_read_list(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_VIDEO_HW_DECODER_ELEMENTS, &ini->rendering_sink.v_hw_decoder_elements, NULL);
ini->rendering_sink.evas_native_surface_tbm_format = __ini_get_string(ini->dict, INI_CATEGORY_RENDERING_SINK, INI_ITEM_EVAS_NATIVE_SURFACE_TBM_FORMAT, DEFAULT_VIDEO_RAW_FORMAT);
return sink;
}
+/* Set an element properties described by string "name1=value1 name2=value2 ..." */
+static void
+__parse_and_set_property(GstElement *element, const gchar *parameters)
+{
+ if (!parameters)
+ return;
+
+ LOGD("Parsing configuration: '%s'", parameters);
+ gchar **tokens = g_strsplit_set(parameters, "= ", -1);
+ gchar *name = NULL;
+ for (int i = 0, j = 0; tokens[i] != NULL; i++) {
+ if (tokens[i][0] == '\0') {
+ } else if (++j % 2) {
+ name = tokens[i];
+ } else {
+ LOGD("Sets '%s'='%s'", name, tokens[i]);
+ gst_util_set_object_arg (G_OBJECT(element), name, tokens[i]);
+ }
+ }
+ g_strfreev(tokens);
+}
+
static const char *__get_videosink_factory_name(webrtc_display_s *display, webrtc_ini_s *ini)
{
const char *factory_name;
factory_name = ini->rendering_sink.v_sink_element;
break;
case WEBRTC_DISPLAY_TYPE_EVAS:
- factory_name = display->zerocopy ? "mesonvideosink" : DEFAULT_ELEMENT_FAKESINK;
+ factory_name = display->zerocopy ? ini->rendering_sink.v_hw_handoff_sink_element : DEFAULT_ELEMENT_FAKESINK;
break;
default:
LOG_ERROR_IF_REACHED("invalid type(%d)", display->type);
"qos", (gboolean)sink->display->qos,
NULL);
- if (sink->display->zerocopy) {
- g_object_set(G_OBJECT(videosink),
- "use-drm", TRUE,
- "use-tizen-video-object", FALSE,
- NULL);
- }
+ if (sink->display->zerocopy)
+ __parse_and_set_property(videosink, sink->webrtc->ini.rendering_sink.v_hw_sink_element_configuration);
/* FIXME: The order of setting property and display is important when 'use-tbm' is true. The reverse does not work */
gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(videosink), sink->display->overlay_surface_id);
g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
gst_caps_unref(caps);
} else {
- g_object_set(G_OBJECT(videosink),
- "convert-mode", 1,
- NULL);
+ __parse_and_set_property(videosink, sink->webrtc->ini.rendering_sink.v_hw_handoff_sink_element_configuration);
}
}
/* send SPS and PPS Insertion Interval every second */
g_object_set(G_OBJECT(element), "config-interval", 1, NULL);
_add_probe_to_pad_for_dump(sink, element, _depayloaded_data_probe_cb);
- } else if (g_strrstr(factory_name, "v4l2")) {
- LOG_INFO("[%s] set capture-io-mode to dmabuf-import", factory_name);
- g_object_set(G_OBJECT(element), "capture-io-mode", 5, NULL);
+ } else if (g_strv_contains((const gchar * const *)sink->webrtc->ini.rendering_sink.v_hw_decoder_elements, factory_name)) {
+ __parse_and_set_property(element, sink->webrtc->ini.rendering_sink.v_hw_decoder_element_configuration);
}
/* all other depayloaders except h264 */