From 6fceb7b1aa3d798c22ffc7b1cb13403976b1c034 Mon Sep 17 00:00:00 2001 From: Oleksandr Popov Date: Tue, 27 Dec 2016 19:00:21 +0200 Subject: [PATCH 01/16] Add platform check before resource manager initialization Change-Id: I001fbd14fe4589db030a69e6fd985a32460ac6da Signed-off-by: Oleksandr Popov --- include/media_streamer_resource.h | 2 +- src/media_streamer_node_resources.c | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/include/media_streamer_resource.h b/include/media_streamer_resource.h index 27da5ca..2cefdc8 100644 --- a/include/media_streamer_resource.h +++ b/include/media_streamer_resource.h @@ -52,7 +52,7 @@ typedef enum { } media_streamer_resource_state_e; typedef struct _media_streamer_resource_manager_s media_streamer_resource_manager_s; -typedef gboolean (*resource_relese_cb) (media_streamer_resource_manager_s *resource_manager, void *user_data); +typedef gboolean (*resource_relese_cb)(media_streamer_resource_manager_s *resource_manager, void *user_data); struct _media_streamer_resource_manager_s { mrp_mainloop_t *mloop; diff --git a/src/media_streamer_node_resources.c b/src/media_streamer_node_resources.c index 3c1545a..5e96813 100644 --- a/src/media_streamer_node_resources.c +++ b/src/media_streamer_node_resources.c @@ -16,6 +16,8 @@ #include +#include + #include #include #include @@ -61,6 +63,41 @@ static gboolean __ms_resource_relese_cb( return TRUE; } +static gboolean __ms_node_resources_is_needed_by_platform(media_streamer_node_s *node) +{ + media_streamer_node_type_e type = node->type; + int subtype = node->subtype; + char *model_name, *platform_processor; + gboolean ret = FALSE; + + /* Checking for model_name and processor because some resources + are platform dependent */ + system_info_get_platform_string("http://tizen.org/system/model_name", &model_name); + system_info_get_platform_string("http://tizen.org/system/platform.processor", &platform_processor); + ms_info("Check for resources for model_name %s, platform.processor %s", model_name, platform_processor); + + switch (type) { + case MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER: + case MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER: + if (!g_strcmp0(model_name, "Emulator") || + !g_strcmp0(platform_processor, "Emulator")) + ret = FALSE; + break; + case MEDIA_STREAMER_NODE_TYPE_SRC: + if (MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA == subtype) + ret = TRUE; + break; + case MEDIA_STREAMER_NODE_TYPE_SINK: + if (MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY == subtype) + ret = TRUE; + break; + default: + break; + } + + return ret; +} + static void __ms_node_get_resources_needed(media_streamer_node_s *node, media_streamer_resource_type_e *resource) { media_streamer_node_type_e type = node->type; @@ -101,6 +138,13 @@ int __ms_node_resouces_init(media_streamer_node_s *node) return MEDIA_STREAMER_ERROR_NONE; } + /* Check if platform requires resource (e.g. Emulator) */ + if (!__ms_node_resources_is_needed_by_platform(node)) { + ms_info("Platform doesn't require resource for %p node type [%d] subtype [%d]", + node, node->type, node->subtype); + return MEDIA_STREAMER_ERROR_NONE; + } + /* Initialize resource manager */ ret = _ms_resource_manager_init(&node->resource_manager, __ms_resource_relese_cb, node); @@ -125,6 +169,13 @@ int __ms_node_resouces_deinit(media_streamer_node_s *node) return MEDIA_STREAMER_ERROR_NONE; } + /* Check if platform requires resource (e.g. Emulator) */ + if (!__ms_node_resources_is_needed_by_platform(node)) { + ms_info("Platform doesn't require resource for %p node type [%d] subtype [%d]", + node, node->type, node->subtype); + return MEDIA_STREAMER_ERROR_NONE; + } + /* Deinitialize resource manager */ ret = _ms_resource_manager_deinit(&node->resource_manager); if (ret != MEDIA_STREAMER_ERROR_NONE) { @@ -196,6 +247,13 @@ int _ms_node_resource_aquire(media_streamer_node_s *node) return MEDIA_STREAMER_ERROR_NONE; } + /* Check if platform requires resource (e.g. Emulator) */ + if (!__ms_node_resources_is_needed_by_platform(node)) { + ms_info("Platform doesn't require resource for %p node type [%d] subtype [%d]", + node, node->type, node->subtype); + return MEDIA_STREAMER_ERROR_NONE; + } + if (MEDIA_STREAMER_ERROR_NONE != __ms_node_resouces_prepare(node, resource)) { ms_error("Failed to prepare resources for Node [%p]", node); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; -- 2.7.4 From 81d4e447b82db4346069405ecfcfaeaf1fc0b388 Mon Sep 17 00:00:00 2001 From: Oleksandr Popov Date: Tue, 27 Dec 2016 19:00:21 +0200 Subject: [PATCH 02/16] Add platform check before resource manager initialization Change-Id: I001fbd14fe4589db030a69e6fd985a32460ac6da Signed-off-by: Oleksandr Popov --- include/media_streamer_resource.h | 2 +- src/media_streamer_node_resources.c | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/include/media_streamer_resource.h b/include/media_streamer_resource.h index 27da5ca..2cefdc8 100644 --- a/include/media_streamer_resource.h +++ b/include/media_streamer_resource.h @@ -52,7 +52,7 @@ typedef enum { } media_streamer_resource_state_e; typedef struct _media_streamer_resource_manager_s media_streamer_resource_manager_s; -typedef gboolean (*resource_relese_cb) (media_streamer_resource_manager_s *resource_manager, void *user_data); +typedef gboolean (*resource_relese_cb)(media_streamer_resource_manager_s *resource_manager, void *user_data); struct _media_streamer_resource_manager_s { mrp_mainloop_t *mloop; diff --git a/src/media_streamer_node_resources.c b/src/media_streamer_node_resources.c index 3c1545a..5e96813 100644 --- a/src/media_streamer_node_resources.c +++ b/src/media_streamer_node_resources.c @@ -16,6 +16,8 @@ #include +#include + #include #include #include @@ -61,6 +63,41 @@ static gboolean __ms_resource_relese_cb( return TRUE; } +static gboolean __ms_node_resources_is_needed_by_platform(media_streamer_node_s *node) +{ + media_streamer_node_type_e type = node->type; + int subtype = node->subtype; + char *model_name, *platform_processor; + gboolean ret = FALSE; + + /* Checking for model_name and processor because some resources + are platform dependent */ + system_info_get_platform_string("http://tizen.org/system/model_name", &model_name); + system_info_get_platform_string("http://tizen.org/system/platform.processor", &platform_processor); + ms_info("Check for resources for model_name %s, platform.processor %s", model_name, platform_processor); + + switch (type) { + case MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER: + case MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER: + if (!g_strcmp0(model_name, "Emulator") || + !g_strcmp0(platform_processor, "Emulator")) + ret = FALSE; + break; + case MEDIA_STREAMER_NODE_TYPE_SRC: + if (MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA == subtype) + ret = TRUE; + break; + case MEDIA_STREAMER_NODE_TYPE_SINK: + if (MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY == subtype) + ret = TRUE; + break; + default: + break; + } + + return ret; +} + static void __ms_node_get_resources_needed(media_streamer_node_s *node, media_streamer_resource_type_e *resource) { media_streamer_node_type_e type = node->type; @@ -101,6 +138,13 @@ int __ms_node_resouces_init(media_streamer_node_s *node) return MEDIA_STREAMER_ERROR_NONE; } + /* Check if platform requires resource (e.g. Emulator) */ + if (!__ms_node_resources_is_needed_by_platform(node)) { + ms_info("Platform doesn't require resource for %p node type [%d] subtype [%d]", + node, node->type, node->subtype); + return MEDIA_STREAMER_ERROR_NONE; + } + /* Initialize resource manager */ ret = _ms_resource_manager_init(&node->resource_manager, __ms_resource_relese_cb, node); @@ -125,6 +169,13 @@ int __ms_node_resouces_deinit(media_streamer_node_s *node) return MEDIA_STREAMER_ERROR_NONE; } + /* Check if platform requires resource (e.g. Emulator) */ + if (!__ms_node_resources_is_needed_by_platform(node)) { + ms_info("Platform doesn't require resource for %p node type [%d] subtype [%d]", + node, node->type, node->subtype); + return MEDIA_STREAMER_ERROR_NONE; + } + /* Deinitialize resource manager */ ret = _ms_resource_manager_deinit(&node->resource_manager); if (ret != MEDIA_STREAMER_ERROR_NONE) { @@ -196,6 +247,13 @@ int _ms_node_resource_aquire(media_streamer_node_s *node) return MEDIA_STREAMER_ERROR_NONE; } + /* Check if platform requires resource (e.g. Emulator) */ + if (!__ms_node_resources_is_needed_by_platform(node)) { + ms_info("Platform doesn't require resource for %p node type [%d] subtype [%d]", + node, node->type, node->subtype); + return MEDIA_STREAMER_ERROR_NONE; + } + if (MEDIA_STREAMER_ERROR_NONE != __ms_node_resouces_prepare(node, resource)) { ms_error("Failed to prepare resources for Node [%p]", node); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; -- 2.7.4 From 0a187c0051812dbe8e6c2f12c189cac7c2b239ae Mon Sep 17 00:00:00 2001 From: Oleksandr Popov Date: Tue, 27 Dec 2016 19:39:48 +0200 Subject: [PATCH 03/16] Added missing condition for resource management check Signed-off-by: Oleksandr Popov Change-Id: I700bad3752224583d04762081689b48188a5ec74 --- src/media_streamer_node_resources.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/media_streamer_node_resources.c b/src/media_streamer_node_resources.c index 5e96813..2f69001 100644 --- a/src/media_streamer_node_resources.c +++ b/src/media_streamer_node_resources.c @@ -82,6 +82,8 @@ static gboolean __ms_node_resources_is_needed_by_platform(media_streamer_node_s if (!g_strcmp0(model_name, "Emulator") || !g_strcmp0(platform_processor, "Emulator")) ret = FALSE; + else + ret = TRUE; break; case MEDIA_STREAMER_NODE_TYPE_SRC: if (MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA == subtype) -- 2.7.4 From 4b988c903016df04335ca09a98ed9ddf9cf544a1 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Mon, 9 Jan 2017 21:52:24 +0900 Subject: [PATCH 04/16] [v0.1.12] init mrp after create pipeline and add missed unlock Change-Id: Icd662f3ce720ed2863a05dc0045b52459ff90717 (cherry picked from commit 1603f61104ec15d3adb42edfc4a694c21e1788d7) --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer.c | 1 + src/media_streamer_gst.c | 10 +++++----- src/media_streamer_node_policy.c | 16 ++++++++-------- src/media_streamer_priv.c | 6 +++++- src/media_streamer_resource.c | 34 ++++++++++++++++++++-------------- 6 files changed, 40 insertions(+), 29 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 317b737..89c0c35 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.11 +Version: 0.1.12 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer.c b/src/media_streamer.c index 73ba7dc..a17c699 100644 --- a/src/media_streamer.c +++ b/src/media_streamer.c @@ -256,6 +256,7 @@ int media_streamer_create(media_streamer_h *streamer) ret = __ms_create(ms_streamer); if (ret != MEDIA_STREAMER_ERROR_NONE) { ms_error("Error creating Media Streamer"); + g_mutex_unlock(&ms_streamer->mutex_lock); __ms_streamer_destroy(ms_streamer); return ret; diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index f3961d4..c592087 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -2068,15 +2068,15 @@ static void __demux_nomore_pads_combine(GstPad *src_pad, media_streamer_s *ms_st { GstElement *found_element = gst_pad_get_parent_element(src_pad); const gchar *new_pad_type = __ms_get_pad_type(src_pad); - if (MS_ELEMENT_IS_VIDEO(new_pad_type)) { + if (MS_ELEMENT_IS_VIDEO(new_pad_type)) found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER); - } else if (MS_ELEMENT_IS_AUDIO(new_pad_type)) { + else if (MS_ELEMENT_IS_AUDIO(new_pad_type)) found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER); - } else if (MS_ELEMENT_IS_TEXT(new_pad_type)) { + else if (MS_ELEMENT_IS_TEXT(new_pad_type)) found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->topology_bin, MEDIA_STREAMER_NODE_TYPE_TEXT_OVERLAY); - } else { + else ms_error("Unsupported pad type [%s]!", new_pad_type); - } + __ms_generate_dots(ms_streamer->pipeline, "after_demux_linked"); gst_object_unref(found_element); } diff --git a/src/media_streamer_node_policy.c b/src/media_streamer_node_policy.c index 90628b9..3c4f6ec 100644 --- a/src/media_streamer_node_policy.c +++ b/src/media_streamer_node_policy.c @@ -145,11 +145,11 @@ int __ms_node_policy_deinit(media_streamer_node_s *node) } if (node->dpm_handle) { - if (node->policy_changed_cb_id > 0) { + if (node->policy_changed_cb_id > 0) dpm_remove_policy_changed_cb(node->dpm_handle, node->policy_changed_cb_id); - } else { + else ms_info("invalid dpm cb id"); - } + ms_debug("DPM released"); } @@ -191,11 +191,11 @@ int _ms_node_policy_check(media_streamer_node_s *node) } if (dpm_ret == DPM_ERROR_NONE) { - ms_info("DPM state - %d", dpm_state); - if (dpm_state == DPM_DISALLOWED) { - ms_error("Policy disallowed by DPM"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; - } + ms_info("DPM state - %d", dpm_state); + if (dpm_state == DPM_DISALLOWED) { + ms_error("Policy disallowed by DPM"); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } } else { ms_info("get DPM state failed, continue too work"); } diff --git a/src/media_streamer_priv.c b/src/media_streamer_priv.c index a6b995d..c3825dc 100644 --- a/src/media_streamer_priv.c +++ b/src/media_streamer_priv.c @@ -91,11 +91,14 @@ int __ms_state_change(media_streamer_s *ms_streamer, media_streamer_state_e stat int __ms_create(media_streamer_s *ms_streamer) { + int ret = MEDIA_STREAMER_ERROR_NONE; __ms_load_ini_settings(&ms_streamer->ini); ms_streamer->nodes_table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, __ms_node_remove_from_table); ms_retvm_if(ms_streamer->nodes_table == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error creating hash table"); + ret = __ms_pipeline_create(ms_streamer); + if (MEDIA_STREAMER_ERROR_NONE != _ms_resource_manager_init( &ms_streamer->resource_manager, media_streamer_resource_relese_cb, @@ -104,7 +107,7 @@ int __ms_create(media_streamer_s *ms_streamer) return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } - return __ms_pipeline_create(ms_streamer); + return ret; } int __ms_get_position(media_streamer_s *ms_streamer, int *time) @@ -189,6 +192,7 @@ int __ms_streamer_destroy(media_streamer_s *ms_streamer) if (MEDIA_STREAMER_ERROR_NONE != _ms_resource_manager_deinit(&ms_streamer->resource_manager)) { ms_error("Failed to deinit resource manager for media streamer"); + g_mutex_unlock(&ms_streamer->mutex_lock); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } diff --git a/src/media_streamer_resource.c b/src/media_streamer_resource.c index 6f99048..bce054d 100644 --- a/src/media_streamer_resource.c +++ b/src/media_streamer_resource.c @@ -64,9 +64,9 @@ static int __ms_resource_manager_wait_connection(media_streamer_resource_manager MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; } else { - if (resource_manager->is_connected) + if (resource_manager->is_connected) { ms_debug("Successfully connected to resource server!"); - else { + } else { ms_error("Failed to connect to resource server"); MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; @@ -119,7 +119,7 @@ static void mrp_state_callback(mrp_res_context_t *context, mrp_res_error_t err, if (err != MRP_RES_ERROR_NONE) { ms_error(" - error message received from Murphy, err(0x%x)", err); g_cond_signal(&resource_manager->cond); - MEDIA_STREAMER_RESOURCE_LOCK(resource_manager); + MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); return; } @@ -131,6 +131,7 @@ static void mrp_state_callback(mrp_res_context_t *context, mrp_res_error_t err, resource_names = mrp_res_list_resource_names(rset); if (!resource_names) { ms_error(" - no resources available"); + MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); return; } for (i = 0; i < resource_names->num_strings; i++) { @@ -219,6 +220,7 @@ static void mrp_resource_release_cb(mrp_res_context_t *cx, const mrp_res_resourc if (!mrp_res_equal_resource_set(rs, resource_manager->rset)) { ms_info("- resource set(%p) is not same as this resource_manager handle's(%p)", rs, resource_manager->rset); + MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); return; } @@ -234,11 +236,10 @@ static void mrp_resource_release_cb(mrp_res_context_t *cx, const mrp_res_resourc } if (resource_manager->release_cb) { - if (!resource_manager->release_cb(resource_manager, resource_manager->user_data)) { + if (!resource_manager->release_cb(resource_manager, resource_manager->user_data)) ms_error("release_cb failed"); - } else { + else ms_info("release_cb is fine"); - } } else { ms_error("release cb is NULL. Something wrong happens..."); } @@ -316,6 +317,7 @@ static int set_resource_release_cb(media_streamer_resource_manager_s *resource_m int _ms_resource_manager_init(media_streamer_resource_manager_s *resource_manager, resource_relese_cb release_cb, void *user_data) { + int ret = MEDIA_STREAMER_ERROR_NONE; MEDIA_STREAMER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); ms_retvm_if(release_cb == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "release_cb is NULL"); @@ -328,14 +330,16 @@ int _ms_resource_manager_init(media_streamer_resource_manager_s *resource_manage GMainContext *mrp_ctx = g_main_context_new(); if (!mrp_ctx) { ms_error("- could not create main context for resource manager"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; + goto EXIT; } GMainLoop *mrp_loop = g_main_loop_new(mrp_ctx, TRUE); g_main_context_unref(mrp_ctx); if (!mrp_loop) { ms_error("- could not create glib mainloop for resource manager"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; + goto EXIT; } resource_manager->mloop = mrp_mainloop_glib_get(mrp_loop); @@ -348,20 +352,23 @@ int _ms_resource_manager_init(media_streamer_resource_manager_s *resource_manage ms_error(" - could not get context for resource manager"); mrp_mainloop_destroy(resource_manager->mloop); resource_manager->mloop = NULL; - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; + goto EXIT; } resource_manager->user_data = user_data; } else { ms_error("- could not get mainloop for resource manager"); - return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + ret = MEDIA_STREAMER_ERROR_INVALID_OPERATION; + goto EXIT; } resource_manager->release_cb = release_cb; resource_manager->state = RESOURCE_STATE_INITIALIZED; +EXIT: MEDIA_STREAMER_RESOURCE_UNLOCK(resource_manager); - return MEDIA_STREAMER_ERROR_NONE; + return ret; } int _ms_resource_manager_prepare(media_streamer_resource_manager_s *resource_manager, media_streamer_resource_type_e resource_type) @@ -392,11 +399,10 @@ int _ms_resource_manager_prepare(media_streamer_resource_manager_s *resource_man } } - if (MEDIA_STREAMER_ERROR_NONE == ret) { + if (MEDIA_STREAMER_ERROR_NONE == ret) resource_manager->state = RESOURCE_STATE_PREPARED; - } else { + else resource_manager->state = RESOURCE_STATE_ERROR; - } return ret; } -- 2.7.4 From f0f288ba44517a92a4a27603e708ff01203d8b96 Mon Sep 17 00:00:00 2001 From: Volodymyr Brynza Date: Thu, 2 Feb 2017 13:26:20 +0200 Subject: [PATCH 05/16] fix memory leak Change-Id: I4687b9f4949ecaac16e44bdd210a5ed4d1964b6a Signed-off-by: Volodymyr Brynza --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_gst.c | 5 ++++- src/media_streamer_node.c | 13 +++++++++++++ src/media_streamer_node_resources.c | 9 +++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 89c0c35..646ff93 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.12 +Version: 0.1.13 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index c592087..3ac83fc 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -1172,6 +1172,7 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_streamer_node_type_e type) { GstCaps *enc_caps = plug_info->src_caps; + gchar *encoder_name = NULL; if (!enc_caps) { enc_caps = gst_caps_from_string(MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT); ms_debug("No Audio encoding format is set! Deafault will be: [%s]", MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT); @@ -1192,8 +1193,10 @@ GstElement *__ms_audio_encoder_element_create(node_plug_s *plug_info, media_stre if (!audio_encoder) audio_encoder = __ms_element_create_by_registry(&plug_info_encoder, type); - if (g_strrstr(gst_element_get_name(audio_encoder), "aac")) + encoder_name = gst_element_get_name(audio_encoder); + if (encoder_name && g_strrstr(encoder_name, "aac")) g_object_set(audio_encoder, "compliance", -2, NULL); + MS_SAFE_GFREE(encoder_name); /* Creating bin - Audio Encoder */ GstElement *audio_enc_bin = gst_bin_new("audio_encoder"); diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index ced5323..0f69deb 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -657,6 +657,7 @@ int __ms_sink_node_create(media_streamer_node_s *node) case MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY: plugin_name = __ms_ini_get_string("node type 2:overlay", DEFAULT_VIDEO_SINK); node->gst_element = __ms_element_create(plugin_name, NULL); + g_object_set(node->gst_element, "use-tbm", FALSE, NULL); break; case MEDIA_STREAMER_NODE_SINK_TYPE_FAKE: plugin_name = __ms_ini_get_string("node type 2:fake", DEFAULT_FAKE_SINK); @@ -1567,16 +1568,20 @@ gboolean _ms_node_resouces_acquire_iter(const GValue *item, GValue *ret, gpointe then apprently this element doesn't require resources */ ms_info("Failed to found corresonding node [%s] inside streamer", GST_ELEMENT_NAME(element)); g_value_set_boolean(ret, TRUE); + g_object_unref(element); return TRUE; } if (MEDIA_STREAMER_ERROR_NONE != _ms_node_resource_aquire(node)) { ms_error("Failed to acquire resource for node [%s]", node->name); + g_object_unref(element); return FALSE; } g_value_set_boolean(ret, TRUE); + g_object_unref(element); + return TRUE; } @@ -1597,16 +1602,20 @@ gboolean _ms_node_resouces_release_iter(const GValue *item, GValue *ret, gpointe then apprently this element doesn't require resources. */ ms_debug("Failed to found corresonding node [%s] inside streamer", GST_ELEMENT_NAME(element)); g_value_set_boolean(ret, TRUE); + g_object_unref(element); return TRUE; } if (MEDIA_STREAMER_ERROR_NONE != _ms_node_resource_release(node)) { ms_error("Failed to release resource for node [%s]", node->name); + g_object_unref(element); return FALSE; } g_value_set_boolean(ret, TRUE); + g_object_unref(element); + return TRUE; } @@ -1627,15 +1636,19 @@ gboolean _ms_node_policy_check_iter(const GValue *item, GValue *ret, gpointer us then apprently this element doesn't require resources */ ms_info("Failed to found corresonding node [%s] inside streamer", GST_ELEMENT_NAME(element)); g_value_set_boolean(ret, TRUE); + g_object_unref(element); return TRUE; } if (MEDIA_STREAMER_ERROR_NONE != _ms_node_policy_check(node)) { ms_error("Failed to check policy for node [%s]", node->name); + g_object_unref(element); return FALSE; } g_value_set_boolean(ret, TRUE); + g_object_unref(element); + return TRUE; } diff --git a/src/media_streamer_node_resources.c b/src/media_streamer_node_resources.c index 2f69001..dbf8c54 100644 --- a/src/media_streamer_node_resources.c +++ b/src/media_streamer_node_resources.c @@ -74,6 +74,12 @@ static gboolean __ms_node_resources_is_needed_by_platform(media_streamer_node_s are platform dependent */ system_info_get_platform_string("http://tizen.org/system/model_name", &model_name); system_info_get_platform_string("http://tizen.org/system/platform.processor", &platform_processor); + if (!model_name || ! platform_processor) { + ms_error("Failed to get information about platform check resources"); + MS_SAFE_FREE(model_name); + MS_SAFE_FREE(platform_processor); + return TRUE; + } ms_info("Check for resources for model_name %s, platform.processor %s", model_name, platform_processor); switch (type) { @@ -97,6 +103,9 @@ static gboolean __ms_node_resources_is_needed_by_platform(media_streamer_node_s break; } + MS_SAFE_FREE(model_name); + MS_SAFE_FREE(platform_processor); + return ret; } -- 2.7.4 From 9094f0c3465c389223ddc8f930ea296fb46e3a9a Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Thu, 16 Feb 2017 19:45:43 +0900 Subject: [PATCH 06/16] [0.1.14] fix svace issue Change-Id: I7e05d5b5cb6dab7fb21bda14b2988ef0f9b7db9d (cherry picked from commit 74dc3e6ba4dade3c52216587d31c3e984dac3f7a) --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_gst.c | 22 +++++++++++++++++----- src/media_streamer_node.c | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 646ff93..cab5a44 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.13 +Version: 0.1.14 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index 3ac83fc..d10c954 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -817,11 +817,22 @@ static GstElement *__ms_manifest_src_create(media_streamer_node_s *ms_node) } } g_free(protocol); - ms_retvm_if(manifest_src_name == NULL, NULL, - "Error empty manifest source name for adaprive source"); + + if (manifest_src_name == NULL) { + LOGE("Error empty manifest source name for adaptive source"); + g_free(location); + return NULL; + } + manifest_src = gst_element_factory_make(manifest_src_name, NULL); - ms_retvm_if(manifest_src == NULL, NULL, - "Error creating manifest source for adaptive source"); + g_free(manifest_src_name); + + if (manifest_src == NULL) { + LOGE("Error creating manifest source for adaptive source"); + g_free(location); + return NULL; + } + g_object_set(manifest_src, "location", location, NULL); g_free(location); @@ -843,8 +854,9 @@ int __ms_adaptive_element_prepare(media_streamer_node_s *ms_node, bool auto_plug ms_retvm_if(plugin_name == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Error empty plugin name for adaprive source"); ms_info("Creating [%s] element", plugin_name); plugin_elem = gst_element_factory_make(plugin_name, NULL); + g_free(plugin_name); ms_retvm_if(plugin_elem == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, - "Error creating element [%s] for adaptive source", plugin_name); + "Error creating element for adaptive source"); res = gst_bin_add(GST_BIN(ms_node->gst_element), plugin_elem); ms_retvm_if(res == FALSE, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 0f69deb..ddc60e5 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -343,7 +343,7 @@ static int __ms_node_check_priveleges(media_streamer_node_s *node) char smackLabel[SMACK_LABEL_LEN + 1]; char uid[10]; - cynara *cynara_h; + cynara *cynara_h = NULL; if (CYNARA_API_SUCCESS != cynara_initialize(&cynara_h, NULL)) { ms_error("Failed to initialize cynara structure\n"); -- 2.7.4 From 340e505a7c067e5c68ecc5324856e874348ea0a9 Mon Sep 17 00:00:00 2001 From: Oleksandr Popov Date: Mon, 20 Feb 2017 18:08:39 +0000 Subject: [PATCH 07/16] Added http server feature Change-Id: I286acf360eae667868d1ee17372e4930f82e719f Signed-off-by: Oleksandr Popov --- CMakeLists.txt | 4 +- include/media_streamer_http_server.h | 42 ++++++ include/media_streamer_net_util.h | 31 +++++ include/media_streamer_priv.h | 3 + include/media_streamer_util.h | 2 +- packaging/capi-media-streamer.spec | 7 +- src/media_streamer.c | 4 + src/media_streamer_gst.c | 4 +- src/media_streamer_http_server.c | 262 +++++++++++++++++++++++++++++++++++ src/media_streamer_net_util.c | 49 +++++++ src/media_streamer_node.c | 40 +++++- src/media_streamer_util.c | 4 +- test/media_streamer_test.c | 2 +- 13 files changed, 443 insertions(+), 11 deletions(-) create mode 100644 include/media_streamer_http_server.h create mode 100644 include/media_streamer_net_util.h mode change 100755 => 100644 include/media_streamer_priv.h create mode 100644 src/media_streamer_http_server.c create mode 100644 src/media_streamer_net_util.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 04a307d..2a05d39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser bundle libtbm gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore elementary murphy-resource murphy-glib dpm") -SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore evas elementary murphy-resource murphy-glib dpm") +SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser bundle libtbm gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore elementary murphy-resource murphy-glib dpm capi-network-connection capi-content-mime-type libsoup-2.4") +SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 gstreamer-video-1.0 cynara-client capi-system-info ecore evas elementary murphy-resource murphy-glib dpm capi-system-info capi-network-connection capi-content-mime-type libsoup-2.4") INCLUDE(FindPkgConfig) pkg_check_modules(${fw_name} REQUIRED ${dependents}) diff --git a/include/media_streamer_http_server.h b/include/media_streamer_http_server.h new file mode 100644 index 0000000..29c565c --- /dev/null +++ b/include/media_streamer_http_server.h @@ -0,0 +1,42 @@ + +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MEDIA_STREAMER_HTTP_H__ +#define __MEDIA_STREAMER_HTTP_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *media_streamer_http_server_h; + +int __ms_http_server_create(media_streamer_http_server_h *server, char *ip_address, char *port); +int __ms_http_server_destroy(media_streamer_http_server_h server); + +int __ms_http_server_start(media_streamer_http_server_h server); +int __ms_http_server_stop(media_streamer_http_server_h server); + +int __ms_http_server_register_uri(media_streamer_http_server_h server, char *uri, char *file_path); +int __ms_http_server_unregister_uri(media_streamer_http_server_h server, char *uri); + +#ifdef __cplusplus +} +#endif + +#endif /* __MEDIA_STREAMER_HTTP_H__ */ diff --git a/include/media_streamer_net_util.h b/include/media_streamer_net_util.h new file mode 100644 index 0000000..76f72e9 --- /dev/null +++ b/include/media_streamer_net_util.h @@ -0,0 +1,31 @@ + +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MEDIA_STREAMER_NET_UTIL_H__ +#define __MEDIA_STREAMER_NET_UTIL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +int __ms_get_local_network_address(char **ip_address); + +#ifdef __cplusplus +} +#endif + +#endif /* __MEDIA_STREAMER_NET_UTIL_H__ */ diff --git a/include/media_streamer_priv.h b/include/media_streamer_priv.h old mode 100755 new mode 100644 index bbfd37b..9ba66a0 --- a/include/media_streamer_priv.h +++ b/include/media_streamer_priv.h @@ -29,6 +29,7 @@ extern "C" { #include #include #include +#include struct media_streamer_node_s; @@ -116,6 +117,8 @@ typedef struct { gboolean is_interrupted; media_streamer_resource_manager_s resource_manager; + + media_streamer_http_server_h http_server; } media_streamer_s; /** diff --git a/include/media_streamer_util.h b/include/media_streamer_util.h index 2b44cdf..5c85853 100644 --- a/include/media_streamer_util.h +++ b/include/media_streamer_util.h @@ -332,7 +332,7 @@ void __ms_param_value_destroy(gpointer data); * * @since_tizen 3.0 */ -int __ms_node_uri_path_check(const char *file_uri); +int __ms_util_uri_path_check(const char *file_uri); /** * @brief Iterates func over all elements contained within a bin. diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index cab5a44..d413ffb 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.14 +Version: 0.1.15 Release: 0 Group: Multimedia/API License: Apache-2.0 @@ -32,6 +32,9 @@ BuildRequires: pkgconfig(appcore-efl) BuildRequires: pkgconfig(murphy-resource) BuildRequires: pkgconfig(murphy-glib) BuildRequires: pkgconfig(dpm) +BuildRequires: pkgconfig(capi-network-connection) +BuildRequires: pkgconfig(libsoup-2.4) +BuildRequires: pkgconfig(capi-content-mime-type) %description A MediaStreamer library in Tizen Native API. @@ -51,7 +54,7 @@ cp %{SOURCE1001} . %define ini_path %{_sysconfdir}/multimedia/mmfw_media_streamer.ini %build -flags="-DMEDIA_STREAMER_INI_PATH=\\\"%{ini_path}\\\"" +flags="-DMEDIA_STREAMER_INI_PATH=\\\"%{ini_path}\\\" -D_FILE_OFFSET_BITS=64" %if 0%{?sec_build_binary_debug_enable} flags="$flags -DTIZEN_DEBUG_ENABLE" diff --git a/src/media_streamer.c b/src/media_streamer.c index a17c699..a2eb3ff 100644 --- a/src/media_streamer.c +++ b/src/media_streamer.c @@ -213,6 +213,8 @@ int media_streamer_unprepare(media_streamer_h streamer) ret = __ms_pipeline_unprepare(ms_streamer); + __ms_http_server_destroy(ms_streamer->http_server); + __ms_generate_dots(ms_streamer->pipeline, "after_unprepare"); g_mutex_unlock(&ms_streamer->mutex_lock); @@ -477,6 +479,8 @@ int media_streamer_stop(media_streamer_h streamer) else ret = __ms_state_change(ms_streamer, MEDIA_STREAMER_STATE_PAUSED); + __ms_http_server_stop(ms_streamer->http_server); + g_mutex_unlock(&ms_streamer->mutex_lock); __ms_get_state(ms_streamer); diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index d10c954..5171d3d 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -752,7 +752,7 @@ static int __ms_adaptive_sink_prepare(media_streamer_s * ms_streamer) {"Codec/Muxer", "mpegtsmux"}, /* MEDIA_STREAMER_NODE_TYPE_MUXER */ }; - GstCaps *video_enc_src_caps = gst_caps_new_empty_simple("video/mpeg"); + GstCaps *video_enc_src_caps = gst_caps_new_simple("video/mpeg", "mpegversion", G_TYPE_INT, 4, NULL); GstCaps *video_enc_sink_caps = gst_caps_new_empty_simple("video/x-raw"); node_plug_s video_enc_plug_info = {&(nodes_info[0]), video_enc_src_caps, video_enc_sink_caps, NULL}; GstElement *video_enc = __ms_node_element_create(&video_enc_plug_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER); @@ -807,7 +807,7 @@ static GstElement *__ms_manifest_src_create(media_streamer_node_s *ms_node) location = gst_uri_get_location(uri); } else { ms_error("Unsupported URI protocol... Check URI is file path"); - if (__ms_node_uri_path_check(uri) == MEDIA_STREAMER_ERROR_NONE) { + if (__ms_util_uri_path_check(uri) == MEDIA_STREAMER_ERROR_NONE) { manifest_src_name = __ms_ini_get_string("node type 1:file", DEFAULT_FILE_SOURCE); location = g_strdup(uri); } else { diff --git a/src/media_streamer_http_server.c b/src/media_streamer_http_server.c new file mode 100644 index 0000000..0179559 --- /dev/null +++ b/src/media_streamer_http_server.c @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#define HTTP_SERVER_LOG_LEVEL AD_LOG_DEBUG + +typedef struct { + SoupServer *server; /* Soup HTTP server */ + + GHashTable *uri_table; +} _ms_http_server_s; + +static int __ms_http_server_file_read_contents(const char *file_path, char **content, gsize *size); +static void __ms_http_server_connection_handle_cb(SoupServer *server, SoupMessage *msg, + const char *path, GHashTable *query, SoupClientContext *client, gpointer user_data); + +int __ms_http_server_create(media_streamer_http_server_h *server, char *ip_address, char *port) +{ + ms_retvm_if(server == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + //ms_retvm_if(ip_address == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "IP address is NULL"); + ms_retvm_if(port == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Port is NULL"); + + _ms_http_server_s *ms_server = (_ms_http_server_s *) calloc(1, sizeof(_ms_http_server_s)); + ms_retvm_if(ms_server == NULL, MEDIA_STREAMER_ERROR_INVALID_OPERATION, "Error allocation memory"); + + const int iport = atoi(port); + ms_server->server = soup_server_new(SOUP_SERVER_PORT, iport, NULL); + + if (!ms_server->server) { + ms_error("Failed to create http server"); + __ms_http_server_destroy(ms_server); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + /* Create hash table for URIs */ + ms_server->uri_table = g_hash_table_new(g_str_hash, g_str_equal); + if (!ms_server->uri_table) { + ms_error("Failed to URIs hash table"); + __ms_http_server_destroy(ms_server); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + *server = ms_server; + + ms_info("http server created successfully"); + + return MEDIA_STREAMER_ERROR_NONE; +} + +int __ms_http_server_destroy(media_streamer_http_server_h server) +{ + ms_retvm_if(server == NULL, MEDIA_STREAMER_ERROR_NONE, "Handle is NULL"); + _ms_http_server_s *hserver = (_ms_http_server_s *) server; + + /* Stop server first */ + __ms_http_server_stop(server); + + /* Destroy URIs hash table */ + g_hash_table_destroy(hserver->uri_table); + + if (hserver->server) + g_object_unref(hserver->server); + + MS_SAFE_GFREE(hserver); + + return MEDIA_STREAMER_ERROR_NONE; +} + +int __ms_http_server_start(media_streamer_http_server_h server) +{ + ms_retvm_if(server == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + + _ms_http_server_s *hserver = (_ms_http_server_s *) server; + + soup_server_add_handler(hserver->server, NULL, + __ms_http_server_connection_handle_cb, hserver, NULL); + + soup_server_run_async(hserver->server); + + return MEDIA_STREAMER_ERROR_NONE; +} + +int __ms_http_server_stop(media_streamer_http_server_h server) +{ + ms_retvm_if(server == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + _ms_http_server_s *hserver = (_ms_http_server_s *) server; + + soup_server_disconnect(hserver->server); + + return MEDIA_STREAMER_ERROR_NONE; +} + +int __ms_http_server_register_uri(media_streamer_http_server_h server, char *uri, char *file_path) +{ + ms_retvm_if(server == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + ms_retvm_if(uri == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "URI address is NULL"); + ms_retvm_if(file_path == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "File path is NULL"); + + _ms_http_server_s *hserver = (_ms_http_server_s *) server; + + if (!hserver->uri_table) { + ms_error("Failed to register URI. Table is NULL"); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + g_hash_table_insert(hserver->uri_table, uri, file_path); + + return MEDIA_STREAMER_ERROR_NONE; +} + +int __ms_http_server_unregister_uri(media_streamer_http_server_h server, char *uri) +{ + ms_retvm_if(server == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + ms_retvm_if(uri == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "URI address is NULL"); + + _ms_http_server_s *hserver = (_ms_http_server_s *) server; + + if (!hserver->uri_table) { + ms_error("Failed to unregister URI. Table is NULL"); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + /* Return if URI is not registered */ + if (!g_hash_table_contains(hserver->uri_table, uri)) + return MEDIA_STREAMER_ERROR_NONE; + + if (!g_hash_table_remove(hserver->uri_table, uri)) { + ms_error("Failed to remove URI %s from table", uri); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + return MEDIA_STREAMER_ERROR_NONE; +} + +static const char *get_filename_ext(const char *file_path) +{ + const char *dot = strrchr(file_path, '.'); + + if (!dot || dot == file_path) return ""; + return dot + 1; +} + +static int __ms_http_server_file_read_contents(const char *file_path, char **content, gsize *size) +{ + int ret = MEDIA_STREAMER_ERROR_NONE; + struct stat stat_results = {0, }; + int file_open = 0; + + if (!file_path || !strlen(file_path)) + return MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + + ret = __ms_util_uri_path_check(file_path); + if (MEDIA_STREAMER_ERROR_NONE != ret) + return ret; + + file_open = open(file_path, O_RDONLY); + if (file_open < 0) { + char mes_error[256]; + strerror_r(errno, mes_error, sizeof(mes_error)); + ms_error("Couldn`t open file [%s] according to [%s]. Error N [%d]", file_path, mes_error, errno); + + return MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + } + + if (fstat(file_open, &stat_results) < 0) { + ms_error("Couldn`t get status of the file [%s]", file_path); + } else if (stat_results.st_size == 0) { + ms_error("The size of file is 0"); + close(file_open); + return MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + } else { + ms_debug("Size of file [%lld] bytes", (long long)stat_results.st_size); + } + + *content = malloc((size_t)stat_results.st_size); + if (read(file_open, *content, (size_t)stat_results.st_size) < (size_t)stat_results.st_size) + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + *size = (gsize)stat_results.st_size; + + close(file_open); + + return MEDIA_STREAMER_ERROR_NONE; +} + +static void __ms_http_server_connection_handle_cb(SoupServer *server, SoupMessage *msg, + const char *path, GHashTable *query, SoupClientContext *client, gpointer user_data) +{ + _ms_http_server_s *hserver = (_ms_http_server_s *) user_data; + + /* Close connetion if handle is NULL */ + ms_retm_if(hserver == NULL, "Handle is NULL"); + + SoupMessageHeadersIter iter; + const char *name, *value; + + ms_debug("%s %s HTTP/1.%d", msg->method, path, + soup_message_get_http_version(msg)); + soup_message_headers_iter_init(&iter, msg->request_headers); + while (soup_message_headers_iter_next(&iter, &name, &value)) + ms_debug("%s: %s", name, value); + if (msg->request_body->length) + ms_debug("%s", msg->request_body->data); + + if (msg->method == SOUP_METHOD_GET || msg->method == SOUP_METHOD_HEAD) { + ms_info("Received read event"); + + /* Extract file path with URI. First symbol is '/' */ + char *fs_dir = (char *)g_hash_table_lookup(hserver->uri_table, "adaptive_path"); + char *file_path = g_strjoin(NULL, fs_dir, path+1, NULL); + const char *extension = get_filename_ext(path+1); + char *content = NULL; + gsize size = 0; + char *mime_type = NULL; + + mime_type_get_mime_type(extension, &mime_type); + + ms_info("Recieved URI %s", path + 1); + ms_info("mime-type: %s", mime_type); + + if (MEDIA_STREAMER_ERROR_NONE != + __ms_http_server_file_read_contents(file_path, &content, &size)) { + + soup_message_set_status(msg, SOUP_STATUS_BAD_REQUEST); + } else { + ms_info("Sending response"); + soup_message_set_response(msg, mime_type, SOUP_MEMORY_TAKE, content, size); + soup_message_set_status(msg, SOUP_STATUS_OK); + } + + g_free(file_path); + g_free(mime_type); + } else { + soup_message_set_status(msg, SOUP_STATUS_NOT_IMPLEMENTED); + soup_message_set_status(msg, SOUP_STATUS_OK); + } +} diff --git a/src/media_streamer_net_util.c b/src/media_streamer_net_util.c new file mode 100644 index 0000000..71a92e0 --- /dev/null +++ b/src/media_streamer_net_util.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include + +int __ms_get_local_network_address(char **ip_address) +{ + connection_h conn = NULL; + connection_type_e conn_type = CONNECTION_TYPE_DISCONNECTED; + + if (CONNECTION_ERROR_NONE != connection_create(&conn)) { + ms_error("Failed to create connection"); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + if (CONNECTION_ERROR_NONE != connection_get_type(conn, &conn_type)) { + ms_error("Failed to acquire connection type"); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + if (conn_type != CONNECTION_TYPE_WIFI) { + ms_error("Wrong connection type"); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + if (CONNECTION_ERROR_NONE != connection_get_ip_address(conn, CONNECTION_ADDRESS_FAMILY_IPV4, ip_address)) { + ms_error("Failed to acquire connection ip address"); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } + + return MEDIA_STREAMER_ERROR_NONE; +} diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index ddc60e5..5bd70c1 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -29,6 +30,7 @@ #define SMACK_LABEL_LEN 255 #define DEFAULT_URI_SCHEME_LENGTH 10 +#define DEFAULT_HTTP_PORT "8888" param_s param_table[] = { {MEDIA_STREAMER_PARAM_CAMERA_ID, "camera-id"}, @@ -855,6 +857,38 @@ static gboolean demux_find(gpointer key, gpointer value, gpointer user_data) return g_strrstr((char *)key, "demux") != NULL; } +static int __ms_adaptive_sink_http_server_prepare(media_streamer_s * ms_streamer, media_streamer_node_s *node) +{ + int err_code = MEDIA_STREAMER_ERROR_NONE; + char *playlist_location = NULL; + char *playlist_dir = NULL; + char *split = NULL; + + /* Create and start http server */ + err_code = __ms_http_server_create(&ms_streamer->http_server, NULL, DEFAULT_HTTP_PORT); + if (MEDIA_STREAMER_ERROR_NONE != err_code) { + ms_error("Failed to create http server during prepare"); + } else { + ms_info("Starting http server"); + /* FIXME: find out how to set default port */ + err_code = __ms_http_server_start(ms_streamer->http_server); + if (MEDIA_STREAMER_ERROR_NONE != err_code) { + ms_error("Failed to start http server during prepare. Destroying http server"); + __ms_http_server_destroy(ms_streamer->http_server); + } + } + + g_object_get(node->gst_element, MEDIA_STREAMER_PARAM_PLAYLIST_LOCATION, &playlist_location, NULL); + split = strrchr(playlist_location, '/'); + playlist_dir = g_strndup(playlist_location, split - playlist_location + 1); + + __ms_http_server_register_uri(ms_streamer->http_server, "adaptive_path", playlist_dir); + + MS_SAFE_GFREE(playlist_location); + + return err_code; +} + int __ms_pipeline_prepare(media_streamer_s *ms_streamer) { ms_retvm_if(ms_streamer == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); @@ -863,6 +897,7 @@ int __ms_pipeline_prepare(media_streamer_s *ms_streamer) media_streamer_node_s *rtp_node = (media_streamer_node_s *)g_hash_table_lookup(ms_streamer->nodes_table, "rtp_container"); media_streamer_node_s *demux = (media_streamer_node_s *)g_hash_table_find(ms_streamer->nodes_table, (GHRFunc)demux_find, NULL); media_streamer_node_s *adaptive_src = (media_streamer_node_s *)g_hash_table_lookup(ms_streamer->nodes_table, "adaptive_src"); + media_streamer_node_s *adaptive_sink = (media_streamer_node_s *)g_hash_table_lookup(ms_streamer->nodes_table, "adaptive_sink"); if (rtp_node) { ret = __ms_rtp_element_prepare(rtp_node) ? MEDIA_STREAMER_ERROR_NONE : MEDIA_STREAMER_ERROR_INVALID_PARAMETER; } else if (demux) { @@ -889,6 +924,9 @@ int __ms_pipeline_prepare(media_streamer_s *ms_streamer) ret = __ms_adaptive_element_prepare(adaptive_src, false); } + if (adaptive_sink) + __ms_adaptive_sink_http_server_prepare(ms_streamer, adaptive_sink); + if (ret != MEDIA_STREAMER_ERROR_NONE) goto prepare_fail; @@ -1477,7 +1515,7 @@ int __ms_node_set_param_value(media_streamer_node_s *ms_node, param_s *param, co else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM)) 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_URI)) { - ret = __ms_node_uri_path_check(param_value); + ret = __ms_util_uri_path_check(param_value); if (ret == MEDIA_STREAMER_ERROR_NONE) g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_USER_AGENT)) diff --git a/src/media_streamer_util.c b/src/media_streamer_util.c index 4ea599f..7f55672 100644 --- a/src/media_streamer_util.c +++ b/src/media_streamer_util.c @@ -296,7 +296,7 @@ void __ms_param_value_destroy(gpointer data) MS_SAFE_GFREE(val); } -int __ms_node_uri_path_check(const char *file_uri) +int __ms_util_uri_path_check(const char *file_uri) { struct stat stat_results = {0, }; int file_open = 0; @@ -308,7 +308,7 @@ int __ms_node_uri_path_check(const char *file_uri) if (file_open < 0) { char mes_error[256]; strerror_r(errno, mes_error, sizeof(mes_error)); - ms_error("Couldn`t open file according to [%s]. Error N [%d]", mes_error, errno); + ms_error("Couldn`t open file [%s] according to [%s]. Error N [%d]", file_uri, mes_error, errno); if (EACCES == errno) return MEDIA_STREAMER_ERROR_PERMISSION_DENIED; diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index 3c8d834..11eafcc 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -1557,7 +1557,7 @@ void _interpret_getting_uri_menu(char *cmd) return; } - g_print("_interpret_getting_uri_menu %d %d %d\n", g_menu_state, g_sub_menu_state, g_scenario_mode); + g_print("_interpret_getting_uri_menu %d %d %d", g_menu_state, g_sub_menu_state, g_scenario_mode); if (g_menu_state == MENU_STATE_PLAYING_MENU) { if (g_scenario_mode == SCENARIO_MODE_FILE_SUBTITLE_VIDEO_AUDIO) { g_sub_menu_state = SUBMENU_STATE_GETTING_SUBFILE_URI; -- 2.7.4 From 7fcbd1e606a124ae6ee1c24e4f88a52b5bc1bb49 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Wed, 22 Mar 2017 19:21:06 +0900 Subject: [PATCH 08/16] [0.1.15] Use %license macro to copy license Change-Id: I292746121fab2da101ba4a2f9c226565c368ecc7 --- packaging/capi-media-streamer.spec | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index d413ffb..e30cddc 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -71,10 +71,8 @@ make %{?jobs:-j%jobs} %install rm -rf %{buildroot} -mkdir -p %{buildroot}%{_datadir}/license -mkdir -p %{buildroot}/usr/bin -cp LICENSE.APLv2 %{buildroot}%{_datadir}/license/%{name} -cp test/media_streamer_test %{buildroot}/usr/bin +mkdir -p %{buildroot}%{_bindir} +cp test/media_streamer_test %{buildroot}%{_bindir} mkdir -p %{buildroot}/usr/etc @@ -90,7 +88,7 @@ mkdir -p %{buildroot}/usr/etc %manifest %{name}.manifest %license LICENSE.APLv2 %{_libdir}/lib%{name}.so.* -%{_datadir}/license/%{name} +%license LICENSE.APLv2 %{_bindir}/* %files devel -- 2.7.4 From a8fe84c312f9607a87ec2fb38593465b2d38d2e4 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Wed, 5 Apr 2017 16:41:03 +0900 Subject: [PATCH 09/16] doc: update featuring doc path Change-Id: Icb0a69d20fe0f71b9dc8dc9b8da62d889b48a1e1 (cherry picked from commit 5431cd6d88366f21e0b44c8748f4edf923bc5930) --- doc/mediastreamer_doc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mediastreamer_doc.h b/doc/mediastreamer_doc.h index 117e05b..289d684 100755 --- a/doc/mediastreamer_doc.h +++ b/doc/mediastreamer_doc.h @@ -53,7 +53,7 @@ * It is recommended to design feature related codes in your application for reliability.\n * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n - * More details on featuring your application can be found from Feature Element. + * More details on featuring your application can be found from Feature List. * */ -- 2.7.4 From 56c3360271da3de3478d3968b4aca3112c75e847 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Mon, 17 Apr 2017 16:46:40 +0900 Subject: [PATCH 10/16] [0.1.16] fix svace issue Change-Id: I71289af8dae084733fd99b98429adc75da1bc211 --- LICENSE.APLv2 => LICENSE.Apache-2.0 | 0 packaging/capi-media-streamer.spec | 5 ++--- src/media_streamer_http_server.c | 4 +++- src/media_streamer_node.c | 27 +++++++++++++++++++-------- 4 files changed, 24 insertions(+), 12 deletions(-) rename LICENSE.APLv2 => LICENSE.Apache-2.0 (100%) mode change 100755 => 100644 diff --git a/LICENSE.APLv2 b/LICENSE.Apache-2.0 old mode 100755 new mode 100644 similarity index 100% rename from LICENSE.APLv2 rename to LICENSE.Apache-2.0 diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index e30cddc..9e8832c 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.15 +Version: 0.1.16 Release: 0 Group: Multimedia/API License: Apache-2.0 @@ -86,9 +86,8 @@ mkdir -p %{buildroot}/usr/etc %files %manifest %{name}.manifest -%license LICENSE.APLv2 +%license LICENSE.Apache-2.0 %{_libdir}/lib%{name}.so.* -%license LICENSE.APLv2 %{_bindir}/* %files devel diff --git a/src/media_streamer_http_server.c b/src/media_streamer_http_server.c index 0179559..5d35bc2 100644 --- a/src/media_streamer_http_server.c +++ b/src/media_streamer_http_server.c @@ -199,8 +199,10 @@ static int __ms_http_server_file_read_contents(const char *file_path, char **con } *content = malloc((size_t)stat_results.st_size); - if (read(file_open, *content, (size_t)stat_results.st_size) < (size_t)stat_results.st_size) + if (read(file_open, *content, (size_t)stat_results.st_size) < (size_t)stat_results.st_size) { + close(file_open); return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } *size = (gsize)stat_results.st_size; close(file_open); diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 5bd70c1..33afa5b 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -868,17 +868,26 @@ static int __ms_adaptive_sink_http_server_prepare(media_streamer_s * ms_streamer err_code = __ms_http_server_create(&ms_streamer->http_server, NULL, DEFAULT_HTTP_PORT); if (MEDIA_STREAMER_ERROR_NONE != err_code) { ms_error("Failed to create http server during prepare"); - } else { - ms_info("Starting http server"); - /* FIXME: find out how to set default port */ - err_code = __ms_http_server_start(ms_streamer->http_server); - if (MEDIA_STREAMER_ERROR_NONE != err_code) { - ms_error("Failed to start http server during prepare. Destroying http server"); - __ms_http_server_destroy(ms_streamer->http_server); - } + goto _DONE; + } + + ms_info("Starting http server"); + /* FIXME: find out how to set default port */ + err_code = __ms_http_server_start(ms_streamer->http_server); + if (MEDIA_STREAMER_ERROR_NONE != err_code) { + ms_error("Failed to start http server during prepare. Destroying http server"); + __ms_http_server_destroy(ms_streamer->http_server); + goto _DONE; } g_object_get(node->gst_element, MEDIA_STREAMER_PARAM_PLAYLIST_LOCATION, &playlist_location, NULL); + if (!playlist_location) { + err_code = MEDIA_STREAMER_ERROR_INVALID_OPERATION; + ms_error("Failed to get playlist location"); + __ms_http_server_destroy(ms_streamer->http_server); + goto _DONE; + } + split = strrchr(playlist_location, '/'); playlist_dir = g_strndup(playlist_location, split - playlist_location + 1); @@ -886,6 +895,8 @@ static int __ms_adaptive_sink_http_server_prepare(media_streamer_s * ms_streamer MS_SAFE_GFREE(playlist_location); +_DONE: + return err_code; } -- 2.7.4 From c41e5f861f18cd4c844e7a73fef331764b70649b Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Mon, 22 May 2017 20:01:53 +0900 Subject: [PATCH 11/16] [0.1.16] modify doc Change-Id: I53bd6ea1e8714432ff1f721444a3b31a8d4231ef --- doc/mediastreamer_doc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mediastreamer_doc.h b/doc/mediastreamer_doc.h index 289d684..e97184c 100755 --- a/doc/mediastreamer_doc.h +++ b/doc/mediastreamer_doc.h @@ -53,7 +53,7 @@ * It is recommended to design feature related codes in your application for reliability.\n * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n - * More details on featuring your application can be found from Feature List. + * More details on featuring your application can be found from Feature Element. * */ -- 2.7.4 From 1fedfbdeeb432a1b204c8cea8f6e4cf03ca96dcf Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Wed, 14 Jun 2017 21:47:56 +0900 Subject: [PATCH 12/16] [0.1.17] fix svace issue Change-Id: Ie1572cedafa46e69b129467f57b58e790d36357a --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_node.c | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 9e8832c..b72d961 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.16 +Version: 0.1.17 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 33afa5b..8c57112 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -149,8 +149,10 @@ static int __ms_rtp_node_set_property(media_streamer_node_s *ms_node, param_s *p int ret = MEDIA_STREAMER_ERROR_NONE; GValue *val = (GValue *)g_object_get_data(G_OBJECT(ms_node->gst_element), param->param_name); - if (!val) - ret = MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + if (!val) { + ms_error("fail to get [%s] val from [%s]", param->param_name, GST_ELEMENT_NAME(ms_node->gst_element)); + return MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + } if (!strcmp(param->param_name, MEDIA_STREAMER_PARAM_VIDEO_IN_PORT) || !strcmp(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_IN_PORT) || @@ -170,10 +172,12 @@ static int __ms_rtp_node_set_property(media_streamer_node_s *ms_node, param_s *p g_value_unset(val); g_value_init(val, GST_TYPE_CAPS); gst_value_set_caps(val, caps); - } else + } else { ret = MEDIA_STREAMER_ERROR_INVALID_PARAMETER; - } else + } + } else { ret = MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + } return ret; } @@ -221,15 +225,18 @@ static int __ms_adaptive_src_node_set_property(media_streamer_node_s *ms_node, p int ret = MEDIA_STREAMER_ERROR_NONE; GValue *val = (GValue *)g_object_get_data(G_OBJECT(ms_node->gst_element), param->param_name); - if (!val) - ret = MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + if (!val) { + ms_error("fail to get [%s] val from [%s]", param->param_name, GST_ELEMENT_NAME(ms_node->gst_element)); + return MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + } if (!strcmp(param->param_name, MEDIA_STREAMER_PARAM_URI)) { g_value_unset(val); g_value_init(val, G_TYPE_STRING); g_value_set_string(val, param_value); - } else + } else { ret = MEDIA_STREAMER_ERROR_INVALID_PARAMETER; + } return ret; } -- 2.7.4 From 7ae6d303c52462a4356fa84b81282bf59cad0ab7 Mon Sep 17 00:00:00 2001 From: Volodymyr Brynza Date: Tue, 25 Jul 2017 15:15:41 +0300 Subject: [PATCH 13/16] Check URI path only for local files Change-Id: I5b78e6c4ec80daab549fd70bfd174710efe1d16a Signed-off-by: Volodymyr Brynza --- src/media_streamer_node.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 8c57112..28c5f66 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1533,9 +1533,14 @@ int __ms_node_set_param_value(media_streamer_node_s *ms_node, param_s *param, co else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM)) 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_URI)) { - ret = __ms_util_uri_path_check(param_value); - if (ret == MEDIA_STREAMER_ERROR_NONE) + if (ms_node->type == MEDIA_STREAMER_NODE_TYPE_SRC && + ms_node->subtype == MEDIA_STREAMER_NODE_SRC_TYPE_FILE) { + ret = __ms_util_uri_path_check(param_value); + if (ret == MEDIA_STREAMER_ERROR_NONE) + g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); + } else { g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); + } } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_USER_AGENT)) g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_STREAM_TYPE)) -- 2.7.4 From 44fcd174b0ffa44366cbbec33df6cc12e79040f9 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Thu, 27 Jul 2017 16:37:19 +0900 Subject: [PATCH 14/16] [0.1.17] code refactoring Change-Id: Ibad1428406d878aedf3ec101498e6c0243cf56b8 --- src/media_streamer_node.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 28c5f66..31d0fc2 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1533,14 +1533,12 @@ int __ms_node_set_param_value(media_streamer_node_s *ms_node, param_s *param, co else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM)) 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_URI)) { - if (ms_node->type == MEDIA_STREAMER_NODE_TYPE_SRC && - ms_node->subtype == MEDIA_STREAMER_NODE_SRC_TYPE_FILE) { + if (ms_node->type == MEDIA_STREAMER_NODE_TYPE_SRC && ms_node->subtype == MEDIA_STREAMER_NODE_SRC_TYPE_FILE) { ret = __ms_util_uri_path_check(param_value); - if (ret == MEDIA_STREAMER_ERROR_NONE) - g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); - } else { - g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); + if (ret != MEDIA_STREAMER_ERROR_NONE) + return ret; } + g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_USER_AGENT)) g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_STREAM_TYPE)) -- 2.7.4 From f28cc877ff1c40a0cbce25fd9e44c33f587a0008 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Wed, 6 Sep 2017 11:45:25 +0900 Subject: [PATCH 15/16] [0.1.18] set video_has flag for display window Change-Id: Ie53b07e9cc6888030b32ce82c3571636c35e56a1 (cherry picked from commit 56db6dd3eb561d0d81f05aee45842d8a25d8b56c) --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_node.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index b72d961..f777503 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.17 +Version: 0.1.18 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 31d0fc2..0e2b2c3 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1360,6 +1360,9 @@ int _media_streamer_get_wl_info(Evas_Object *obj, media_streamer_wl_info_s *wl_i goto _DONE; } + /* set video_has flag to a video application window */ + ecore_wl_window_video_has(window, EINA_TRUE); + display_wrapper = wl_proxy_create_wrapper(display); if (!display_wrapper) { LOGE("failed to create wl display wrapper"); -- 2.7.4 From c1003aa82ff58ba186a3b075c03c8cfb5dbc0f6d Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Tue, 12 Sep 2017 20:47:31 +0900 Subject: [PATCH 16/16] [0.1.19] fix the wl bind ver current tizen_surface_interface ver is 1. if the ver is not matched, it can cause crash after. Change-Id: I2d03389ebb7fa3ccbc78ab6f5387c0e1ee7f97c9 (cherry picked from commit a447f98e54a36fcf66b35754391896001aa69cbb) --- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_node.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index f777503..5a5793b 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -1,6 +1,6 @@ Name: capi-media-streamer Summary: A Media Streamer API -Version: 0.1.18 +Version: 0.1.19 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 0e2b2c3..bbeba0c 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1283,7 +1283,7 @@ static void __global(void *data, struct wl_registry *registry, if (strcmp(interface, "tizen_surface") == 0) { LOGD("binding tizen surface for wayland"); - *tz_surface = wl_registry_bind(registry, name, &tizen_surface_interface, version); + *tz_surface = wl_registry_bind(registry, name, &tizen_surface_interface, 1); if (*tz_surface == NULL) LOGE("failed to bind"); -- 2.7.4