#include <media_streamer_gst.h>
#include <cynara-client.h>
#include <system_info.h>
+#include <Elementary.h>
+#include <Evas.h>
+#include <Ecore_Wayland.h>
+#include <tizen-extension-client-protocol.h>
+#include <gst/video/videooverlay.h>
#define SMACK_LABEL_LEN 255
#define DEFAULT_URI_SCHEME_LENGTH 10
{MEDIA_STREAMER_PARAM_ROTATE, "rotate"},
{MEDIA_STREAMER_PARAM_FLIP, "flip"},
{MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD, "display-geometry-method"},
+ {MEDIA_STREAMER_PARAM_DISPLAY, "display"},
{MEDIA_STREAMER_PARAM_VISIBLE, "visible"},
{MEDIA_STREAMER_PARAM_HOST, "host"},
{MEDIA_STREAMER_PARAM_SEGMENT_LOCATION, "location"},
GstElement *found_element = NULL;
if (__ms_src_need_typefind(src_pad)) {
- __ms_find_type(ms_streamer, src_element);
+ __ms_find_type(ms_streamer,src_element);
MS_SAFE_UNREF(src_element);
} else {
/* Check the source element`s pad type */
MS_SAFE_UNREF(src_pad);
}
-static gboolean demux_find(gpointer key, gpointer value, gpointer user_data)
-{
+static gboolean demux_find(gpointer key, gpointer value, gpointer user_data) {
return g_strrstr((char *)key, "demux") != NULL;
}
return ret;
}
+static void __global(void *data, struct wl_registry *registry,
+ uint32_t name, const char *interface, uint32_t version)
+{
+ struct tizen_surface **tz_surface = NULL;
+
+ if (!data) {
+ LOGE("NULL data");
+ return;
+ }
+
+ tz_surface = (struct tizen_surface **)data;
+
+ if (!interface) {
+ LOGW("NULL interface");
+ return;
+ }
+
+ if (strcmp(interface, "tizen_surface") == 0) {
+ LOGD("binding tizen surface for wayland");
+
+ *tz_surface = wl_registry_bind(registry, name, &tizen_surface_interface, version);
+ if (*tz_surface == NULL)
+ LOGE("failed to bind");
+
+ LOGD("done");
+ }
+
+ return;
+}
+
+static void __global_remove(void *data, struct wl_registry *wl_registry, uint32_t name)
+{
+ LOGD("enter");
+ return;
+}
+
+static const struct wl_registry_listener _media_streamer_wl_registry_listener = {
+ __global,
+ __global_remove
+};
+
+void __parent_id_getter(void *data, struct tizen_resource *tizen_resource, uint32_t id)
+{
+ if (!data) {
+ LOGE("NULL data");
+ return;
+ }
+
+ *((unsigned int *)data) = id;
+
+ LOGD("[CLIENT] got parent_id [%u] from server", id);
+
+ return;
+}
+
+static const struct tizen_resource_listener _media_streamer_tz_resource_listener = {
+ __parent_id_getter
+};
+
+int _media_streamer_get_wl_info(Evas_Object *obj, media_streamer_wl_info_s *wl_info)
+{
+ int ret = MEDIA_STREAMER_ERROR_NONE;
+ Ecore_Wl_Window *window = NULL;
+ struct wl_display *display = NULL;
+ struct wl_display *display_wrapper = NULL;
+ struct wl_surface *surface = NULL;
+ struct wl_registry *registry = NULL;
+ struct wl_event_queue *queue = NULL;
+ struct tizen_surface *tz_surface = NULL;
+ struct tizen_resource *tz_resource = NULL;
+
+ if (!obj || !wl_info) {
+ LOGE("NULL parameter %p %p", obj, wl_info);
+ return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ }
+
+ window = elm_win_wl_window_get(obj);
+ if (!window) {
+ LOGE("failed to get wayland window");
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ goto _DONE;
+ }
+
+ surface = (struct wl_surface *)ecore_wl_window_surface_get(window);
+ if (!surface) {
+ LOGE("failed to get wayland surface");
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ goto _DONE;
+ }
+
+ display = (struct wl_display *)ecore_wl_display_get();
+ if (!display) {
+ LOGE("failed to get wayland display");
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ goto _DONE;
+ }
+
+ display_wrapper = wl_proxy_create_wrapper(display);
+ if (!display_wrapper) {
+ LOGE("failed to create wl display wrapper");
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ goto _DONE;
+ }
+
+ queue = wl_display_create_queue(display);
+ if (!queue) {
+ LOGE("failed to create wl display queue");
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ goto _DONE;
+ }
+
+ wl_proxy_set_queue((struct wl_proxy *)display_wrapper, queue);
+
+ registry = wl_display_get_registry(display_wrapper);
+ if (!registry) {
+ LOGE("failed to get wayland registry");
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ goto _DONE;
+ }
+
+ wl_registry_add_listener(registry, &_media_streamer_wl_registry_listener, &tz_surface);
+
+ wl_display_dispatch_queue(display, queue);
+ wl_display_roundtrip_queue(display, queue);
+
+ if (!tz_surface) {
+ LOGE("failed to get tizen surface");
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ goto _DONE;
+ }
+
+ /* Get parent_id which is unique in a entire systemw. */
+ tz_resource = tizen_surface_get_tizen_resource(tz_surface, surface);
+ if (!tz_resource) {
+ LOGE("failed to get tizen resurce");
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ goto _DONE;
+ }
+
+ wl_info->parent_id = 0;
+
+ tizen_resource_add_listener(tz_resource, &_media_streamer_tz_resource_listener, &wl_info->parent_id);
+
+ wl_display_roundtrip_queue(display, queue);
+
+ if (wl_info->parent_id > 0) {
+ int rotation = 0;
+ Ecore_Evas *ecore_evas = NULL;
+ ret = MEDIA_STREAMER_ERROR_NONE;
+
+ wl_info->evas_obj = obj;
+
+ evas_object_geometry_get(obj, &wl_info->window_x, &wl_info->window_y,
+ &wl_info->window_width, &wl_info->window_height);
+
+ ecore_evas = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
+ if (ecore_evas) {
+ rotation = ecore_evas_rotation_get(ecore_evas);
+ if (rotation == 90 || rotation == 270) {
+ int temp = wl_info->window_width;
+
+ LOGD("swap width and height %d, %d", wl_info->window_width, wl_info->window_height);
+
+ wl_info->window_width = wl_info->window_height;
+ wl_info->window_height = temp;
+ }
+ } else {
+ LOGW("failed to get ecore_evas.. skip rotation check");
+ }
+
+ LOGD("evas object : %p, rotation : %d, parent id : %u, window : %d,%d,%dx%d",
+ wl_info->evas_obj, rotation, wl_info->parent_id,
+ wl_info->window_x, wl_info->window_y,
+ wl_info->window_width, wl_info->window_height);
+ } else {
+ ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ LOGE("failed to get parent id");
+ }
+
+_DONE:
+ if (tz_surface) {
+ tizen_surface_destroy(tz_surface);
+ tz_surface = NULL;
+ }
+
+ if (tz_resource) {
+ tizen_resource_destroy(tz_resource);
+ tz_resource = NULL;
+ }
+
+ if (registry) {
+ wl_registry_destroy(registry);
+ registry = NULL;
+ }
+
+ if (queue) {
+ wl_event_queue_destroy(queue);
+ queue = NULL;
+ }
+
+ if (display_wrapper) {
+ wl_proxy_wrapper_destroy(display_wrapper);
+ display_wrapper = NULL;
+ }
+
+ return ret;
+}
+
+/**
+ * @brief Set display for video sink.
+ *
+ * @sinse_tizen 3.0
+ */
+int __ms_node_set_display(media_streamer_node_s *ms_node, const char *param_value)
+{
+ int ret = MEDIA_STREAMER_ERROR_NONE;
+ Evas_Object *obj = NULL;
+ media_streamer_wl_info_s wl_info;
+
+ obj = (Evas_Object *)param_value;
+
+ /* get wayland parent id */
+ if (_media_streamer_get_wl_info(obj, &wl_info) != MEDIA_STREAMER_ERROR_NONE) {
+ LOGE("failed to get wayland info");
+ return MEDIA_STREAMER_ERROR_INVALID_OPERATION;
+ }
+
+ LOGD("wayland global surface id : %d", wl_info.parent_id);
+
+ gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(ms_node->gst_element), (guintptr)wl_info.parent_id);
+ gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(ms_node->gst_element),
+ wl_info.window_x, wl_info.window_y, wl_info.window_width, wl_info.window_height);
+
+ return ret;
+}
+
int __ms_node_set_param_value(media_streamer_node_s *ms_node, param_s *param, const char *param_value)
{
ms_retvm_if(!ms_node || !param || !param_value, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL");
g_object_set(ms_node->gst_element, param->origin_name, (int)strtol(param_value, NULL, 10), NULL);
else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD))
g_object_set(ms_node->gst_element, param->origin_name, (int)strtol(param_value, NULL, 10), NULL);
+ else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_DISPLAY))
+ ret = __ms_node_set_display(ms_node, param_value);
else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_VISIBLE))
g_object_set(ms_node->gst_element, param->origin_name, !g_ascii_strcasecmp(param_value, "true"), NULL);
else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_HOST))
#include <glib.h>
#include <glib/gprintf.h>
+#include <Ecore.h>
+#include <Elementary.h>
+#include <appcore-efl.h>
#include <media_streamer.h>
+#ifdef PACKAGE
+#undef PACKAGE
+#endif
+#define PACKAGE "media_streamer_test"
+
typedef enum {
MENU_STATE_UNKNOWN = 0,
MENU_STATE_MAIN_MENU,
int g_node_counter = 0;
#define APPEND_NODE(x) {g_nodes[g_node_counter++] = x; }
-GMainLoop *g_loop;
-
gchar *g_broadcast_address = NULL;
int g_seek_pos = 0;
int g_time = 0;
media_format_h tsfmt = NULL;
media_format_h qtfmt = NULL;
+static int app_create(void *data);
+static int app_terminate(void *data);
+
+struct _appdata {
+ Evas_Object *win;
+ Evas_Object *eo;
+ Evas_Object *bg;
+ Evas_Object *rect;
+};
+typedef struct _appdata appdata;
+
+struct appcore_ops ops = {
+ .create = app_create,
+ .terminate = app_terminate,
+};
+
+appdata ad;
+
static void streamer_error_cb(media_streamer_h streamer, media_streamer_error_e error, void *user_data)
{
g_print("Media Streamer posted error [%d] \n", error);
media_streamer_node_h video_sink = NULL;
media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink);
media_streamer_node_add(current_media_streamer, video_sink);
+ media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY, (void*)ad.win);
APPEND_NODE(video_sink);
/*********************** audiosink *********************************** */
media_streamer_node_h video_sink = NULL;
media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink);
media_streamer_node_add(current_media_streamer, video_sink);
+ media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY, (void*)ad.win);
APPEND_NODE(video_sink);
/*********************** audiosink *********************************** */
media_streamer_node_h video_sink = NULL;
media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink);
media_streamer_node_add(current_media_streamer, video_sink);
+ media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY, (void*)ad.win);
APPEND_NODE(video_sink);
/*********************** audiosink *********************************** */
media_streamer_node_h video_sink = NULL;
media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink);
media_streamer_node_add(current_media_streamer, video_sink);
+ media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY, (void*)ad.win);
APPEND_NODE(video_sink);
/* ====================Linking Video Client=========================== */
media_streamer_node_h video_sink = NULL;
media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink);
media_streamer_node_add(current_media_streamer, video_sink);
+ media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY, (void*)ad.win);
APPEND_NODE(video_sink);
g_print("== success client_autoplug video part \n");
media_streamer_node_h video_sink = NULL;
media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink);
media_streamer_node_add(current_media_streamer, video_sink);
+ media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY, (void*)ad.win);
APPEND_NODE(video_sink);
/*********************** audiosink *********************************** */
media_streamer_node_h video_sink = NULL;
media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink);
media_streamer_node_add(current_media_streamer, video_sink);
+ media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY, (void*)ad.win);
APPEND_NODE(video_sink);
/*********************** audiosink *********************************** */
void quit()
{
reset_current_menu_state();
- g_main_loop_quit(g_loop);
+ elm_exit();
}
static void display_getting_ip_menu(void)
return TRUE;
}
+static int app_create(void *data)
+{
+ appdata *app_data = data;
+ int w = 0;
+ int h = 0;
+ Evas_Object *win = NULL;
+ Evas_Object *eo = NULL;
+ Evas_Object *bg = NULL;
+ Evas_Object *rect = NULL;
+
+ if (app_data == NULL) {
+ g_print("\t\nappdata is NULL\n");
+ return 0;
+ }
+
+ /* use gl backend */
+ elm_config_accel_preference_set("opengl");
+
+ win = elm_win_add(NULL, PACKAGE, ELM_WIN_BASIC);
+ if (win) {
+ elm_win_title_set(win, PACKAGE);
+ elm_win_borderless_set(win, EINA_TRUE);
+ elm_win_screen_size_get(win, NULL, NULL, &w, &h);
+ g_print("\n\tscreen size %dx%d\n\n", w, h);
+ evas_object_resize(win, w, h);
+ elm_win_autodel_set(win, EINA_TRUE);
+ elm_win_alpha_set(win, EINA_TRUE);
+ } else {
+ g_print("\n\tfailed to get window\n\n");
+ return 1;
+ }
+
+ bg = elm_bg_add(win);
+ if (bg) {
+ elm_win_resize_object_add(win, bg);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bg);
+ } else {
+ g_print("\n\tfailed to get elm bg\n\n");
+ return 1;
+ }
+
+ rect = evas_object_rectangle_add(evas_object_evas_get(win));
+ if (rect) {
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_render_op_set(rect, EVAS_RENDER_COPY);
+ } else {
+ g_print("\n\tfailed to get rectangle\n\n");
+ return 1;
+ }
+
+ elm_win_resize_object_add(win, rect);
+ evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(rect);
+
+ /* Create evas image object for EVAS surface */
+ eo = evas_object_image_add(evas_object_evas_get(win));
+ evas_object_image_size_set(eo, w, h);
+ evas_object_image_fill_set(eo, 0, 0, w, h);
+ evas_object_resize(eo, w, h);
+ evas_object_show(eo);
+
+ elm_win_activate(win);
+ evas_object_show(win);
+
+ app_data->win = win;
+ app_data->eo = eo;
+
+ display_menu();
+
+ return 0;
+}
+
+static int app_terminate(void *data)
+{
+ appdata *app_data = data;
+
+ if (app_data == NULL) {
+ g_print("\n\tappdata is NULL\n");
+ return 0;
+ }
+
+ return 0;
+}
+
int main(int argc, char **argv)
{
+ int bret;
+
GIOChannel *stdin_channel;
stdin_channel = g_io_channel_unix_new(0);
g_io_channel_set_flags(stdin_channel, G_IO_FLAG_NONBLOCK, NULL);
g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc) input, NULL);
- display_menu();
+ memset(&ad, 0x0, sizeof(appdata));
+ ops.data = &ad;
+
+ bret = appcore_efl_main(PACKAGE, &argc, &argv, &ops);
- g_loop = g_main_loop_new(NULL, FALSE);
- g_main_loop_run(g_loop);
+ g_print("\n\treturn appcore_efl : %d\n\n", bret);
- g_main_loop_unref(g_loop);
g_io_channel_unref(stdin_channel);
return 0;
}