From e16735f3064403c6281fecc84f2d41686dd3085c Mon Sep 17 00:00:00 2001 From: Hyunil Date: Tue, 27 Aug 2019 15:54:52 +0900 Subject: [PATCH 01/16] Remove cyclomatic complexity of get/set param value function Change-Id: I7b756ce2e17193e3f49dc007252cf1d791c05e38 Signed-off-by: Hyunil --- src/media_streamer_node.c | 116 +++++++++++++++++----------------------------- 1 file changed, 43 insertions(+), 73 deletions(-) diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index e4d8750..961fbc2 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1403,7 +1403,7 @@ int __ms_node_get_param_value(media_streamer_node_s *node, param_s *param, char if (node->type == MEDIA_STREAMER_NODE_TYPE_RTP) ret = __ms_rtp_node_get_property(node, param, &value); else if (node->type == MEDIA_STREAMER_NODE_TYPE_SRC && - node->subtype == MEDIA_STREAMER_NODE_SRC_TYPE_ADAPTIVE) + node->subtype == MEDIA_STREAMER_NODE_SRC_TYPE_ADAPTIVE) ret = __ms_adaptive_src_node_get_property(node, param, &value); else { param_spec = g_object_class_find_property(G_OBJECT_GET_CLASS(node->gst_element), param->origin_name); @@ -1418,53 +1418,36 @@ int __ms_node_get_param_value(media_streamer_node_s *node, param_s *param, char } } - if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAMERA_ID)) + if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAMERA_ID) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAPTURE_WIDTH) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAPTURE_HEIGHT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_PORT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_VIDEO_IN_PORT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_IN_PORT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_VIDEO_OUT_PORT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_OUT_PORT)) { if (G_VALUE_HOLDS_INT(&value)) string_val = g_strdup_printf("%d", g_value_get_int(&value)); else string_val = g_strdup_printf("%u", g_value_get_uint(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAPTURE_WIDTH)) - string_val = g_strdup_printf("%d", g_value_get_int(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAPTURE_HEIGHT)) - string_val = g_strdup_printf("%d", g_value_get_int(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM)) + } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CLOCK_SYNCHRONIZED) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_VISIBLE)) { string_val = g_strdup(g_value_get_boolean(&value) ? "true" : "false"); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_URI)) + } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_URI) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_USER_AGENT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IP_ADDRESS) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_DEVICE) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_HOST) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_SEGMENT_LOCATION)|| + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_PLAYLIST_LOCATION)) { string_val = g_value_dup_string(&value); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_USER_AGENT)) - string_val = g_value_dup_string(&value); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_STREAM_TYPE)) - string_val = g_strdup_printf("%d", g_value_get_enum(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_PORT)) - string_val = g_strdup_printf("%d", g_value_get_int(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_VIDEO_IN_PORT)) - string_val = g_strdup_printf("%d", g_value_get_int(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_IN_PORT)) - string_val = g_strdup_printf("%d", g_value_get_int(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_VIDEO_OUT_PORT)) - string_val = g_strdup_printf("%d", g_value_get_int(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_OUT_PORT)) - string_val = g_strdup_printf("%d", g_value_get_int(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IP_ADDRESS)) - string_val = g_value_dup_string(&value); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_DEVICE)) - string_val = g_value_dup_string(&value); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CLOCK_SYNCHRONIZED)) - string_val = g_strdup(g_value_get_boolean(&value) ? "true" : "false"); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_ROTATE)) - string_val = g_strdup_printf("%d", g_value_get_enum(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_FLIP)) - string_val = g_strdup_printf("%d", g_value_get_enum(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD)) + } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_STREAM_TYPE) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_ROTATE) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_FLIP) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD)) { string_val = g_strdup_printf("%d", g_value_get_enum(&value)); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_VISIBLE)) - string_val = g_strdup(g_value_get_boolean(&value) ? "true" : "false"); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_HOST)) - string_val = g_value_dup_string(&value); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_SEGMENT_LOCATION)) - string_val = g_value_dup_string(&value); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_PLAYLIST_LOCATION)) - string_val = g_value_dup_string(&value); + } *string_value = string_val; @@ -1738,48 +1721,35 @@ int __ms_node_set_param_value(media_streamer_node_s *ms_node, param_s *param, co int camera_id = (int)strtol(param_value, NULL, 10); ms_retvm_if(camera_id == -1, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Invalid %s value", param->param_name); g_object_set(ms_node->gst_element, param->origin_name, camera_id, NULL); - } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAPTURE_WIDTH)) - 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_CAPTURE_HEIGHT)) + } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAPTURE_WIDTH) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CAPTURE_HEIGHT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_STREAM_TYPE) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_PORT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_ROTATE) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_FLIP) || + !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_IS_LIVE_STREAM)) + } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CLOCK_SYNCHRONIZED) || + !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_URI)) { + } 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) { ret = __ms_util_uri_path_check(param_value); 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)) + } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_USER_AGENT) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IP_ADDRESS) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_DEVICE) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_HOST) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_SEGMENT_LOCATION) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_PLAYLIST_LOCATION)) { 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)) - 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_PORT)) - 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_IP_ADDRESS)) - g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_AUDIO_DEVICE)) - g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CLOCK_SYNCHRONIZED)) - 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_ROTATE)) - 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_FLIP)) - 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)) + } 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)) - g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_SEGMENT_LOCATION)) - g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); - else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_PLAYLIST_LOCATION)) - g_object_set(ms_node->gst_element, param->origin_name, param_value, NULL); - else { + } else { ms_info("Can not set parameter [%s] in the node [%s]", param->param_name, ms_node->name); ret = MEDIA_STREAMER_ERROR_INVALID_PARAMETER; } -- 2.7.4 From a63cd6e51c49f3b918e953bfe3071b29378ab281 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Wed, 28 Aug 2019 14:44:43 +0900 Subject: [PATCH 02/16] Remove SAM Violation GV(global variable) Change-Id: Ia84e9e15e148c1fc96e076e0f9006747ddf26d69 Signed-off-by: Hyunil --- src/media_streamer_gst.c | 2 +- src/media_streamer_node.c | 4 ++-- src/media_streamer_node_policy.c | 5 +---- src/media_streamer_util.c | 2 +- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index 0e7e7bb..f75adaa 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -963,7 +963,7 @@ static void __hlsdemux_pad_added_cb(GstElement *demux, GstPad *pad, gpointer dat static int __ms_adaptive_sink_prepare(media_streamer_s * ms_streamer) { - node_info_s nodes_info[] = { + static node_info_s nodes_info[] = { {"Codec/Encoder/Video", "video_encoder"}, /* MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER */ {"Codec/Encoder/Audio", "audio_encoder"}, /* MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER */ {"Codec/Muxer", "mpegtsmux"}, /* MEDIA_STREAMER_NODE_TYPE_MUXER */ diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 961fbc2..03e2f8c 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -37,7 +37,7 @@ #define _FEATURE_NAME_CAMERA "http://tizen.org/feature/camera" #define _FEATURE_NAME_MICROPHONE "http://tizen.org/feature/microphone" -param_s param_table[] = { +static param_s param_table[] = { {MEDIA_STREAMER_PARAM_CAMERA_ID, "camera-id"}, {MEDIA_STREAMER_PARAM_CAPTURE_WIDTH, "capture-width"}, {MEDIA_STREAMER_PARAM_CAPTURE_HEIGHT, "capture-height"}, @@ -66,7 +66,7 @@ param_s param_table[] = { {NULL, NULL} }; -node_info_s nodes_info[] = { +static node_info_s nodes_info[] = { {"Generic", "none"}, /* MEDIA_STREAMER_NODE_TYPE_NONE */ {"Source", "source"}, /* MEDIA_STREAMER_NODE_TYPE_SRC */ {"Sink", "sink"}, /* MEDIA_STREAMER_NODE_TYPE_SINK */ diff --git a/src/media_streamer_node_policy.c b/src/media_streamer_node_policy.c index 45cfcc2..4fe851e 100644 --- a/src/media_streamer_node_policy.c +++ b/src/media_streamer_node_policy.c @@ -30,10 +30,6 @@ enum { DPM_POLICY_FOR_MIC, DPM_POLICY_MAX, }; -const char* policy_str[DPM_POLICY_MAX] = { - "camera", - "microphone", -}; static void __ms_node_get_dpm_check_needed(media_streamer_node_s *node, media_streamer_policy_type_e *policy) { @@ -112,6 +108,7 @@ int __ms_node_policy_init(media_streamer_node_s *node) media_streamer_policy_type_e policy = POLICY_TYPE_NONE; int ret = MEDIA_STREAMER_ERROR_NONE; const char *policy_name = NULL; + static const char* policy_str[DPM_POLICY_MAX] = {"camera", "microphone"}; ms_debug_fenter(); diff --git a/src/media_streamer_util.c b/src/media_streamer_util.c index 147b160..8bb04ac 100644 --- a/src/media_streamer_util.c +++ b/src/media_streamer_util.c @@ -23,7 +23,7 @@ #include #include -format_s format_table[] = { +static const format_s format_table[] = { /* Audio - ENCODED */ {MEDIA_FORMAT_L16, "audio/x-raw"}, {MEDIA_FORMAT_ALAW, "audio/x-alaw"}, -- 2.7.4 From d7e2c64d2a75e9186ce43cbcde346b5e43f52c8c Mon Sep 17 00:00:00 2001 From: Hyunil Date: Thu, 29 Aug 2019 13:54:48 +0900 Subject: [PATCH 03/16] Add setting false to specify usage Change-Id: I8f393a7f8d77db73d1b87b520e309466d58275a6 Signed-off-by: Hyunil --- src/media_streamer_node.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 03e2f8c..a4975f8 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -768,6 +768,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); -- 2.7.4 From 0eaa4c7b5b82c696c93fcb08e1ea3b64eaf994d9 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Thu, 26 Sep 2019 17:06:45 +0900 Subject: [PATCH 04/16] Add test case for videotestsrc and videosink Change-Id: I131b0a0befdfbe166bf63f34db821af3eece191e Signed-off-by: Hyunil --- test/media_streamer_test.c | 72 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index bdd8b98..ae386bb 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -37,6 +37,7 @@ typedef enum { MENU_STATE_VOIP_MENU, MENU_STATE_AUTOPLUG_PLAYING_MENU, MENU_STATE_STATIC_LINK_PLAYING_MENU, + MENU_STATE_VIDEO_TEST_MENU, MENU_STATE_PRESET_MENU, MENU_STATE_ADAPTIVE_MENU, } menu_state_e; @@ -51,6 +52,7 @@ typedef enum { SUBMENU_STATE_SCENARIO, SUBMENU_STATE_AUTOPLUG_PLAYING_SCENARIO, SUBMENU_STATE_STATIC_LINK_PLAYING_SCENARIO, + SUBMENU_STATE_VIDEO_TEST_SCENARIO, SUBMENU_STATE_FORMAT, SUBMENU_STATE_ADAPTIVE_SCENARIO, } submenu_state_e; @@ -88,7 +90,8 @@ typedef enum { SCENARIO_MODE_ADAPTIVE_CLIENT_AUTO, SCENARIO_MODE_ADAPTIVE_CLIENT_MANUAL, SCENARIO_MODE_FILE_PLAY_AAC_AUDIO, - SCENARIO_MODE_FILE_PLAY_MP3_AUDIO + SCENARIO_MODE_FILE_PLAY_MP3_AUDIO, + SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK } scenario_mode_e; #define PACKAGE "media_streamer_test" @@ -512,6 +515,23 @@ static void _create_static_audio_mp3_playing(void) media_streamer_node_link(audio_decoder, "src", audiosink, "sink"); } +static void _create_videotestsrc_videosink(void) +{ + media_streamer_node_h videotestsrc = NULL; + media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_VIDEO_TEST, &videotestsrc); + media_streamer_node_add(current_media_streamer, videotestsrc); + APPEND_NODE(videotestsrc); + + 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); + media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD, "1"); + APPEND_NODE(video_sink); + + media_streamer_node_link(videotestsrc, "src", video_sink, "sink"); +} + static void _create_file_sub_playing(void) { media_streamer_node_h file_sub_src = NULL; @@ -1156,6 +1176,21 @@ static void display_adaptive_scenario_select_menu(void) g_print("====================================================\n"); } +static void display_video_test_scenario_select_menu(void) +{ + g_print("\n"); + g_print("====================================================\n"); + g_print(" media streamer test: Video test menu v0.3\n"); + g_print("----------------------------------------------------\n"); + g_print("\n"); + g_print("Please select Videotest Scenario mode\n"); + g_print("By default will be used [%d] mode\n", g_scenario_mode); + g_print("1. Videotestsrc -> Videosink\n"); + g_print("b. back \n"); + g_print("----------------------------------------------------\n"); + g_print("====================================================\n"); +} + static void display_preset_menu(void) { g_print("\n"); @@ -1217,6 +1252,7 @@ static void display_main_menu(void) g_print("3. Local Playing (link: Autoplug) \n"); g_print("4. Local Playing (link: static) \n"); g_print("5. Adaptive \n"); + g_print("6. Video test \n"); g_print("q. quit \n"); g_print("----------------------------------------------------\n"); g_print("====================================================\n"); @@ -1239,6 +1275,7 @@ static void display_menu(void) case MENU_STATE_STATIC_LINK_PLAYING_MENU: case MENU_STATE_PRESET_MENU: case MENU_STATE_ADAPTIVE_MENU: + case MENU_STATE_VIDEO_TEST_MENU: display_preset_menu(); break; default: @@ -1274,6 +1311,9 @@ static void display_menu(void) case SUBMENU_STATE_ADAPTIVE_SCENARIO: display_adaptive_scenario_select_menu(); break; + case SUBMENU_STATE_VIDEO_TEST_SCENARIO: + display_video_test_scenario_select_menu(); + break; default: g_print("*** Unknown Submenu state.\n"); break; @@ -1343,6 +1383,14 @@ static void run_preset(void) } } +void run_video_test_preset(void) +{ + if ((g_scenario_mode == SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK)) + _create_videotestsrc_videosink(); + else + g_print("Invalid playing menu preset was selected!"); +} + void run_playing_preset(void) { create_formats(); @@ -1396,6 +1444,8 @@ void _interpret_main_menu(char *cmd) g_menu_state = MENU_STATE_STATIC_LINK_PLAYING_MENU; else if (!strncmp(cmd, "5", len)) g_menu_state = MENU_STATE_ADAPTIVE_MENU; + else if (!strncmp(cmd, "6", len)) + g_menu_state = MENU_STATE_VIDEO_TEST_MENU; else if (!strncmp(cmd, "q", len)) quit(); } else { @@ -1532,6 +1582,20 @@ void _interpret_static_link_playing_scenario_menu(char *cmd) g_sub_menu_state = SUBMENU_STATE_UNKNOWN; } +void _interpret_video_test_scenario_menu(char *cmd) +{ + int len = strlen(cmd); + + if (len == 1) { + if (!strncmp(cmd, "1", len)) { + g_scenario_mode = SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK; + g_printf("g_sub_menu_state (%d)\n", g_sub_menu_state); + } + } + run_video_test_preset(); + g_sub_menu_state = SUBMENU_STATE_UNKNOWN; +} + void _interpret_scenario_menu(char *cmd) { int len = strlen(cmd); @@ -1726,6 +1790,8 @@ void _interpret_preset_menu(char *cmd) g_sub_menu_state = SUBMENU_STATE_STATIC_LINK_PLAYING_SCENARIO; else if (g_menu_state == MENU_STATE_ADAPTIVE_MENU) g_sub_menu_state = SUBMENU_STATE_ADAPTIVE_SCENARIO; + else if (g_menu_state == MENU_STATE_VIDEO_TEST_MENU) + g_sub_menu_state = SUBMENU_STATE_VIDEO_TEST_SCENARIO; else g_sub_menu_state = SUBMENU_STATE_AUTOPLUG; } else if (!strncmp(cmd, "3", len)) { @@ -1774,6 +1840,7 @@ static void interpret_cmd(char *cmd) break; case MENU_STATE_AUTOPLUG_PLAYING_MENU: case MENU_STATE_STATIC_LINK_PLAYING_MENU: + case MENU_STATE_VIDEO_TEST_MENU: case MENU_STATE_PRESET_MENU: case MENU_STATE_ADAPTIVE_MENU: _interpret_preset_menu(cmd); @@ -1812,6 +1879,9 @@ static void interpret_cmd(char *cmd) case SUBMENU_STATE_ADAPTIVE_SCENARIO: _interpret_adaptive_scenario_menu(cmd); break; + case SUBMENU_STATE_VIDEO_TEST_SCENARIO: + _interpret_video_test_scenario_menu(cmd); + break; default: g_print("*** Unknown Submenu state.\n"); break; -- 2.7.4 From 19457aec6f4670955f5c7f5e4ee71b59f73ebf21 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Mon, 30 Sep 2019 14:49:45 +0900 Subject: [PATCH 05/16] Add test case for capsfilter Change-Id: I296554d31487965cde6756adf45cab29a636796b Signed-off-by: Hyunil --- test/media_streamer_test.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index ae386bb..a961fd1 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -91,7 +91,8 @@ typedef enum { SCENARIO_MODE_ADAPTIVE_CLIENT_MANUAL, SCENARIO_MODE_FILE_PLAY_AAC_AUDIO, SCENARIO_MODE_FILE_PLAY_MP3_AUDIO, - SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK + SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK, + SCENARIO_MODE_VIDEOTESTSRC_CAPSFILTER_VIDEOSINK } scenario_mode_e; #define PACKAGE "media_streamer_test" @@ -532,6 +533,36 @@ static void _create_videotestsrc_videosink(void) media_streamer_node_link(videotestsrc, "src", video_sink, "sink"); } +static void _create_videotestsrc_capsfilter_videosink(void) +{ + media_streamer_node_h videotestsrc = NULL; + media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_VIDEO_TEST, &videotestsrc); + media_streamer_node_add(current_media_streamer, videotestsrc); + APPEND_NODE(videotestsrc); + + media_streamer_node_h videofilter = NULL; + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_FILTER, NULL, vfmt_i420, &videofilter); + media_streamer_node_add(current_media_streamer, videofilter); + APPEND_NODE(videofilter); + + /* convert I420 to BGRx */ + media_streamer_node_h videoconverter = NULL; + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_CONVERTER, NULL, NULL, &videoconverter); + media_streamer_node_add(current_media_streamer, videoconverter); + APPEND_NODE(videoconverter); + + 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); + media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD, "1"); + APPEND_NODE(video_sink); + + media_streamer_node_link(videotestsrc, "src", videofilter, "sink"); + media_streamer_node_link(videofilter, "src", videoconverter, "sink"); + media_streamer_node_link(videoconverter, "src", video_sink, "sink"); +} + static void _create_file_sub_playing(void) { media_streamer_node_h file_sub_src = NULL; @@ -1186,6 +1217,7 @@ static void display_video_test_scenario_select_menu(void) g_print("Please select Videotest Scenario mode\n"); g_print("By default will be used [%d] mode\n", g_scenario_mode); g_print("1. Videotestsrc -> Videosink\n"); + g_print("2. Videotestsrc -> Capsfilter -> Videosink\n"); g_print("b. back \n"); g_print("----------------------------------------------------\n"); g_print("====================================================\n"); @@ -1385,10 +1417,14 @@ static void run_preset(void) void run_video_test_preset(void) { - if ((g_scenario_mode == SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK)) + if ((g_scenario_mode == SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK)) { _create_videotestsrc_videosink(); - else + } else if ((SCENARIO_MODE_VIDEOTESTSRC_CAPSFILTER_VIDEOSINK)) { + create_formats(); + _create_videotestsrc_capsfilter_videosink(); + } else { g_print("Invalid playing menu preset was selected!"); + } } void run_playing_preset(void) @@ -1590,6 +1626,9 @@ void _interpret_video_test_scenario_menu(char *cmd) if (!strncmp(cmd, "1", len)) { g_scenario_mode = SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK; g_printf("g_sub_menu_state (%d)\n", g_sub_menu_state); + } else if (!strncmp(cmd, "2", len)) { + g_scenario_mode = SCENARIO_MODE_VIDEOTESTSRC_CAPSFILTER_VIDEOSINK; + g_printf("g_sub_menu_state (%d)\n", g_sub_menu_state); } } run_video_test_preset(); -- 2.7.4 From 69e74b8cc339568de23fdf0d467978aac12d6357 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Fri, 4 Oct 2019 12:53:16 +0900 Subject: [PATCH 06/16] Support Zero copy(tbm) in auto plugging mode Change-Id: I704a24082c148e3bd9c34086f0a680aa1cbb8cf0 Signed-off-by: Hyunil --- src/media_streamer_gst.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index f75adaa..214c180 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -674,6 +674,8 @@ static void __decodebin_nomore_pads_combine(GstPad *src_pad, media_streamer_s *m { GstElement *found_element = NULL; const gchar *new_pad_type = NULL; + GstCaps *caps = NULL; + gchar *caps_str = NULL; ms_debug_fenter(); @@ -697,8 +699,17 @@ static void __decodebin_nomore_pads_combine(GstPad *src_pad, media_streamer_s *m found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_MUXER); found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); } else { - found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_CONVERTER); - found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); + caps = gst_pad_query_caps (src_pad, NULL); + caps_str = gst_caps_to_string(caps); + if (caps_str && (g_strrstr(caps_str, "ST12") || g_strrstr(caps_str, "SN12") || + g_strrstr(caps_str, "SN21") || g_strrstr(caps_str, "S420") || g_strrstr(caps_str, "SR32"))){ + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); + } else { + found_element = __ms_combine_next_element(found_element, src_pad, ms_streamer->transform_bin, MEDIA_STREAMER_NODE_TYPE_VIDEO_CONVERTER); + found_element = __ms_combine_next_element(found_element, NULL, ms_streamer->sink_bin, MEDIA_STREAMER_NODE_TYPE_SINK); + } + MS_SAFE_GFREE(caps_str); + gst_caps_unref(caps); } } else if (MS_ELEMENT_IS_AUDIO(new_pad_type)) { if (sink_bin_type == MEDIA_STREAMER_SINK_BIN_RTP_SERVER) { -- 2.7.4 From e9fa811971ccd5fb1968d93f88a924685f3145c4 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Fri, 4 Oct 2019 14:59:50 +0900 Subject: [PATCH 07/16] [ACR-1469] Add definition for use-tbm Change-Id: Ib9f108c2197e25af144c5c1f5863d777d29cd0c1 Signed-off-by: Hyunil --- include/media_streamer.h | 45 ++++++++++++++++++++++++++++----------------- src/media_streamer_node.c | 4 +++- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/include/media_streamer.h b/include/media_streamer.h index 6bd7c6a..76a7e04 100644 --- a/include/media_streamer.h +++ b/include/media_streamer.h @@ -366,6 +366,17 @@ typedef enum { #define MEDIA_STREAMER_PARAM_VISIBLE "visible" /** + * @brief Definition for use-tbm parameter of sink node. + * @details Use Tizen Buffer Memory instead of Shared Memory. + * The sink node must receive the tbm-buffer created by the previous node. + * The value is changeable only in the #MEDIA_STREAMER_STATE_IDLE state. + * Data type is boolean and default value is false. + * @since_tizen 5.5 + * @see media_streamer_node_get_params() + */ +#define MEDIA_STREAMER_PARAM_USE_TBM "use-tbm" + +/** * @brief Definition for host parameter of sink node. * @details The host/IP/Multicast group to send the packets to. * Data type is string and default value is "localhost". @@ -547,7 +558,7 @@ int media_streamer_unset_error_cb(media_streamer_h streamer); * @pre Create a media streamer handle by calling media_streamer_create() function * @post media_streamer_state_changed_cb() will be invoked. * @see media_streamer_unset_state_change_cb() - * @see media_streamer_state_change_cb() + * @see media_streamer_state_changed_cb() */ int media_streamer_set_state_change_cb(media_streamer_h streamer, media_streamer_state_changed_cb callback, void *user_data); @@ -903,9 +914,9 @@ int media_streamer_get_state(media_streamer_h streamer, media_streamer_state_e * /** * @brief Creates media streamer source node. * @since_tizen 3.0 - * @remarks The internet privilege(http://tizen.org/privilege/internet) should be added if any URIs are used to play from network. - * The camera privilege(http://tizen.org/privilege/camera) should be added if the src node handle the camera device. - * The recorder privilege(http://tizen.org/privilege/recorder) should be added if the src node handle the recorder device. + * @remarks The internet privilege(%http://tizen.org/privilege/internet) should be added if any URIs are used to play from network. + * The camera privilege(%http://tizen.org/privilege/camera) should be added if the src node handle the camera device. + * The recorder privilege(%http://tizen.org/privilege/recorder) should be added if the src node handle the recorder device. * You can release source node using media_streamer_node_destroy() function. * @param[in] type Media streamer source node type * @param[out] src Media streamer source node handle @@ -941,7 +952,7 @@ int media_streamer_node_push_packet(media_streamer_node_h src, media_packet_h pa /** * @brief Creates media streamer sink node. * @since_tizen 3.0 - * @remarks The internet privilege(http://tizen.org/privilege/internet) should be added if any URIs are used to transmit the output data. + * @remarks The internet privilege(%http://tizen.org/privilege/internet) should be added if any URIs are used to transmit the output data. * You can release @a sink node using media_streamer_node_destroy() * @remarks If @a type is #MEDIA_STREAMER_NODE_SINK_TYPE_ADAPTIVE, the HTTP server will be started and the server will be able to transmit the output data to the other device. * The application must have an authentication responsibility between a server and client because the data transmission is not secure. @@ -972,7 +983,7 @@ int media_streamer_node_create_sink(media_streamer_node_sink_type_e type, media_ * @retval #MEDIA_STREAMER_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MEDIA_STREAMER_ERROR_INVALID_OPERATION Invalid operation * @pre Create a sink node handle by calling media_streamer_node_create_sink() function - * @pre Set media_streamer_data_ready_cb by calling media_streamer_set_data_ready_cb() function. + * @pre Set media_streamer_sink_data_ready_cb by calling media_streamer_sink_set_data_ready_cb() function. * @see #media_packet_h * @see media_streamer_node_create_sink() */ @@ -984,7 +995,7 @@ int media_streamer_node_pull_packet(media_streamer_node_h sink, media_packet_h * * and output data. * @since_tizen 3.0 * @remarks The node type should not be #MEDIA_STREAMER_NODE_TYPE_SRC and #MEDIA_STREAMER_NODE_TYPE_SINK. - * To create src/sink type node, media_streamer_node_create_src()/media_streamer_node_create_sink() should be called. + * To create src / sink type node, media_streamer_node_create_src() / media_streamer_node_create_sink() should be called. * You can release @a node using media_streamer_node_destroy() function * @param[in] type Created node type * @param[in] in_fmt Media format handle for input data @@ -1154,8 +1165,8 @@ int media_streamer_node_get_pad_name(media_streamer_node_h node, char ***src_pad * @brief Sets parameters of node. * @details Many parameters can be set at one time all together by using bundle. * @since_tizen 3.0 - * @remarks The mediastorage privilege(http://tizen.org/privilege/mediastorage) should be added if any video/audio files are written in the internal storage devices. - * The externalstorage privilege(http://tizen.org/privilege/externalstorage) should be added if any video/audio files are written in the external storage devices. + * @remarks The mediastorage privilege(%http://tizen.org/privilege/mediastorage) should be added if any video/audio files are written in the internal storage devices. + * The externalstorage privilege(%http://tizen.org/privilege/externalstorage) should be added if any video/audio files are written in the external storage devices. * @param[in] node Media streamer node handle * @param[in] param_list Key value array of media streamer node parameters * @return @c 0 on success, @@ -1189,8 +1200,8 @@ int media_streamer_node_set_params(media_streamer_node_h node, bundle *param_lis * @pre Create a node handle by calling media_streamer_node_createXXX() function * @post Set params which are needed to set by calling media_streamer_node_set_params() or media_streamer_node_set_param() function. * @see media_streamer_node_create() - * @see media_streamer_src_create() - * @see media_streamer_sink_create() + * @see media_streamer_node_create_src() + * @see media_streamer_node_create_sink() * @see media_streamer_node_set_params() * @see media_streamer_node_set_param() */ @@ -1200,8 +1211,8 @@ int media_streamer_node_get_params(media_streamer_node_h node, bundle **param_li * @brief Sets single parameter of node. * @details Sets parameter one by one without creating param bundle. * @since_tizen 3.0 - * @remarks The mediastorage privilege(http://tizen.org/privilege/mediastorage) should be added if any video/audio files are written in the internal storage devices. - * The externalstorage privilege(http://tizen.org/privilege/externalstorage) should be added if any video/audio files are written in the external storage devices. + * @remarks The mediastorage privilege(%http://tizen.org/privilege/mediastorage) should be added if any video/audio files are written in the internal storage devices. + * The externalstorage privilege(%http://tizen.org/privilege/externalstorage) should be added if any video/audio files are written in the external storage devices. * @param[in] node Media streamer node handle * @param[in] param_name Param name of node * @param[in] param_value Param value of node @@ -1215,8 +1226,8 @@ int media_streamer_node_get_params(media_streamer_node_h node, bundle **param_li * @pre Create a node handle by calling media_streamer_node_createXXX() function. * @pre Get param list to set by calling media_streamer_node_get_params() function. * @see media_streamer_node_create() - * @see media_streamer_src_create() - * @see media_streamer_sink_create() + * @see media_streamer_node_create_src() + * @see media_streamer_node_create_sink() * @see media_streamer_node_get_params() * @see media_streamer_node_get_param() */ @@ -1240,8 +1251,8 @@ int media_streamer_node_set_param(media_streamer_node_h node, * @pre Create a node handle by calling media_streamer_node_createXXX() function. * @pre Get param list to know the param name by calling media_streamer_node_get_params() function. * @see media_streamer_node_create() - * @see media_streamer_src_create() - * @see media_streamer_sink_create() + * @see media_streamer_node_create_src() + * @see media_streamer_node_create_sink() * @see media_streamer_node_get_params() * @see media_streamer_node_set_param() */ diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index a4975f8..917ef96 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -60,6 +60,7 @@ static param_s param_table[] = { {MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD, "display-geometry-method"}, {MEDIA_STREAMER_PARAM_DISPLAY, "display"}, {MEDIA_STREAMER_PARAM_VISIBLE, "visible"}, + {MEDIA_STREAMER_PARAM_USE_TBM, "use-tbm"}, {MEDIA_STREAMER_PARAM_HOST, "host"}, {MEDIA_STREAMER_PARAM_SEGMENT_LOCATION, "location"}, {MEDIA_STREAMER_PARAM_PLAYLIST_LOCATION, "playlist-location"}, @@ -768,7 +769,6 @@ 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); @@ -1433,6 +1433,7 @@ int __ms_node_get_param_value(media_streamer_node_s *node, param_s *param, char string_val = g_strdup_printf("%u", g_value_get_uint(&value)); } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_IS_LIVE_STREAM) || !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CLOCK_SYNCHRONIZED) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_USE_TBM) || !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_VISIBLE)) { string_val = g_strdup(g_value_get_boolean(&value) ? "true" : "false"); } else if (!g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_URI) || @@ -1732,6 +1733,7 @@ int __ms_node_set_param_value(media_streamer_node_s *ms_node, param_s *param, co 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_IS_LIVE_STREAM) || !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_CLOCK_SYNCHRONIZED) || + !g_strcmp0(param->param_name, MEDIA_STREAMER_PARAM_USE_TBM) || !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_URI)) { -- 2.7.4 From 69a4d565c8e59128a5525c9dddceb97e9ce8915b Mon Sep 17 00:00:00 2001 From: Hyunil Date: Wed, 23 Oct 2019 14:50:07 +0900 Subject: [PATCH 08/16] Add use-tbm test case for playing with H/W codec Change-Id: I068821378dc8fd554c1507ba476676024f61e4ab Signed-off-by: Hyunil --- test/media_streamer_test.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index a961fd1..7966273 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -140,6 +140,7 @@ submenu_state_e g_sub_menu_state = SUBMENU_STATE_UNKNOWN; preset_type_e g_menu_preset = PRESET_UNKNOWN; scenario_mode_e g_scenario_mode = SCENARIO_MODE_UNKNOWN; +gboolean use_tbm = FALSE; gboolean g_autoplug_mode = FALSE; gboolean g_video_is_on = FALSE; gboolean g_audio_is_on = FALSE; @@ -321,6 +322,7 @@ static void _destroy(media_streamer_h streamer) g_media_streamer_2 = NULL; current_media_streamer = NULL; + use_tbm = FALSE; g_print("== success destroy \n"); } @@ -461,6 +463,10 @@ static void _create_file_playing(void) /*********************** videosink *********************************** */ media_streamer_node_h video_sink = NULL; media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink); + if (use_tbm) + media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_USE_TBM, "true"); + else + media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_USE_TBM, "false"); 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); @@ -1276,18 +1282,19 @@ static void display_broadcast_menu(void) static void display_main_menu(void) { g_print("\n"); - g_print("====================================================\n"); + g_print("===========================================================================\n"); g_print(" media streamer test: Main menu v0.3\n"); - g_print("----------------------------------------------------\n"); + g_print("---------------------------------------------------------------------------\n"); g_print("1. Broadcast \n"); g_print("2. VOIP \n"); g_print("3. Local Playing (link: Autoplug) \n"); g_print("4. Local Playing (link: static) \n"); g_print("5. Adaptive \n"); g_print("6. Video test \n"); + g_print("t. Use TBM (select to test 3 and 4 with TBM, change ini to use H/W codec.)\n"); g_print("q. quit \n"); - g_print("----------------------------------------------------\n"); - g_print("====================================================\n"); + g_print("---------------------------------------------------------------------------\n"); + g_print("===========================================================================\n"); } static void display_menu(void) @@ -1482,7 +1489,10 @@ void _interpret_main_menu(char *cmd) g_menu_state = MENU_STATE_ADAPTIVE_MENU; else if (!strncmp(cmd, "6", len)) g_menu_state = MENU_STATE_VIDEO_TEST_MENU; - else if (!strncmp(cmd, "q", len)) + else if (!strncmp(cmd, "t", len)) { + use_tbm = TRUE; + g_menu_state = MENU_STATE_MAIN_MENU; + } else if (!strncmp(cmd, "q", len)) quit(); } else { g_print("wrong command\n"); -- 2.7.4 From 4cfcc1f7797a4dda72b3bbfe68f3cbf6c92757af Mon Sep 17 00:00:00 2001 From: Hyunil Date: Thu, 24 Oct 2019 11:21:05 +0900 Subject: [PATCH 09/16] Add static link test case for mp4 Change-Id: Ic7cbb30a8db7f16352670727637a1f0a0f2fa89c Signed-off-by: Hyunil --- test/media_streamer_test.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index 7966273..848b73e 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -91,6 +91,7 @@ typedef enum { SCENARIO_MODE_ADAPTIVE_CLIENT_MANUAL, SCENARIO_MODE_FILE_PLAY_AAC_AUDIO, SCENARIO_MODE_FILE_PLAY_MP3_AUDIO, + SCENARIO_MODE_FILE_PLAY_MP4_VIDEO, SCENARIO_MODE_VIDEOTESTSRC_VIDEOSINK, SCENARIO_MODE_VIDEOTESTSRC_CAPSFILTER_VIDEOSINK } scenario_mode_e; @@ -522,6 +523,33 @@ static void _create_static_audio_mp3_playing(void) media_streamer_node_link(audio_decoder, "src", audiosink, "sink"); } +static void _create_static_video_mp4_playing(void) +{ + media_streamer_node_h filesrc = NULL; + media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_FILE, &filesrc); + media_streamer_node_set_param(filesrc, MEDIA_STREAMER_PARAM_URI, g_uri); + media_streamer_node_add(current_media_streamer, filesrc); + APPEND_NODE(filesrc); + + media_streamer_node_h video_decoder = NULL; + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, cfmt_mp4, NULL, &video_decoder); + media_streamer_node_add(current_media_streamer, video_decoder); + APPEND_NODE(video_decoder); + + media_streamer_node_h video_sink = NULL; + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink); + if (use_tbm) + media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_USE_TBM, "true"); + else + media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_USE_TBM, "false"); + 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); + + media_streamer_node_link(filesrc, "src", video_decoder, "sink"); + media_streamer_node_link(video_decoder, "src", video_sink, "sink"); +} + static void _create_videotestsrc_videosink(void) { media_streamer_node_h videotestsrc = NULL; @@ -1190,6 +1218,7 @@ static void display_static_link_playing_scenario_select_menu(void) g_print("1. Appsrc -> Appsink\n"); g_print("2. Audio File(aac) playing\n"); g_print("3. Audio File(mp3) playing\n"); + g_print("4. Video File(mp4) playing\n"); g_print("b. back \n"); g_print("----------------------------------------------------\n"); g_print("====================================================\n"); @@ -1444,6 +1473,8 @@ void run_playing_preset(void) _create_static_audio_aac_playing(); else if (g_scenario_mode == SCENARIO_MODE_FILE_PLAY_MP3_AUDIO) _create_static_audio_mp3_playing(); + else if (g_scenario_mode == SCENARIO_MODE_FILE_PLAY_MP4_VIDEO) + _create_static_video_mp4_playing(); else if (g_scenario_mode == SCENARIO_MODE_FILE_SUBTITLE_VIDEO_AUDIO) _create_file_sub_playing(); else if (g_scenario_mode == SCENARIO_MODE_HTTP_VIDEO_AUDIO) @@ -1623,6 +1654,11 @@ void _interpret_static_link_playing_scenario_menu(char *cmd) g_sub_menu_state = SUBMENU_STATE_GETTING_FILE_URI; g_printf("g_sub_menu_state (%d)\n", g_sub_menu_state); return; + } else if (!strncmp(cmd, "4", len)) { + g_scenario_mode = SCENARIO_MODE_FILE_PLAY_MP4_VIDEO; + g_sub_menu_state = SUBMENU_STATE_GETTING_FILE_URI; + g_printf("g_sub_menu_state (%d)\n", g_sub_menu_state); + return; } } g_sub_menu_state = SUBMENU_STATE_UNKNOWN; -- 2.7.4 From d1b4f42dc225d1dd7bba50497f06e39781d91111 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Fri, 25 Oct 2019 16:04:22 +0900 Subject: [PATCH 10/16] bug fix for using H/W codec Change-Id: I6e351c1b35d5ad954d9d7d2be3ab7306e14a6056 Signed-off-by: Hyunil --- src/media_streamer_gst.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index 214c180..c915d32 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -1469,6 +1469,7 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre gboolean gst_ret = FALSE; const gchar *sink_type = NULL; GstCaps *dec_caps = NULL; + gchar *codec_name = NULL; ms_debug_fenter(); @@ -1506,9 +1507,6 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre if (decoder_type == MEDIA_FORMAT_H264_SP) g_object_set(G_OBJECT(decoder_parser), "config-interval", H264_PARSER_CONFIG_INTERVAL, NULL); - if (g_strrstr(plug_info->info->default_name, "omx") || g_strrstr(plug_info->info->default_name, "sprd")) - is_hw_codec = TRUE; - /* Creating bin - Video Decoder */ decoder_queue = __ms_element_create("queue", NULL); decoder_bin = gst_bin_new("video_decoder"); @@ -1518,6 +1516,10 @@ GstElement *__ms_video_decoder_element_create(node_plug_s *plug_info, media_stre goto ERROR; } + codec_name = GST_OBJECT_NAME(decoder_elem); + if (g_strrstr(codec_name, "omx") || g_strrstr(codec_name, "sprd")) + is_hw_codec = TRUE; + /* Adding elements to bin Audio Encoder */ gst_bin_add_many(GST_BIN(decoder_bin), decoder_queue, decoder_elem, decoder_parser, NULL); gst_ret = gst_element_link_many(decoder_queue, decoder_parser, decoder_elem, NULL); -- 2.7.4 From 9ef61a844faab4b53df8d365237ba478d11da933 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Mon, 28 Oct 2019 13:11:05 +0900 Subject: [PATCH 11/16] Modify static link test case for mp4 Change-Id: I57740991bd3bfce88e133982787f73f1e520b80c Signed-off-by: Hyunil --- test/media_streamer_test.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index 848b73e..6c7a92e 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -531,8 +531,13 @@ static void _create_static_video_mp4_playing(void) media_streamer_node_add(current_media_streamer, filesrc); APPEND_NODE(filesrc); + media_streamer_node_h qt_demux = NULL; + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_DEMUXER, cfmt_mp4, NULL, &qt_demux); + media_streamer_node_add(current_media_streamer, qt_demux); + APPEND_NODE(qt_demux); + media_streamer_node_h video_decoder = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, cfmt_mp4, NULL, &video_decoder); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, vfmt_h264, NULL, &video_decoder); media_streamer_node_add(current_media_streamer, video_decoder); APPEND_NODE(video_decoder); @@ -546,8 +551,20 @@ static void _create_static_video_mp4_playing(void) media_streamer_node_set_param(video_sink, MEDIA_STREAMER_PARAM_DISPLAY, (void*)ad.win); APPEND_NODE(video_sink); - media_streamer_node_link(filesrc, "src", video_decoder, "sink"); + media_streamer_node_h audio_decoder = NULL; + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER, afmt_aac, NULL, &audio_decoder); + media_streamer_node_add(current_media_streamer, audio_decoder); + APPEND_NODE(audio_decoder); + + media_streamer_node_h audio_sink = NULL; + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_AUDIO, &audio_sink); + media_streamer_node_add(current_media_streamer, audio_sink); + APPEND_NODE(audio_sink); + + media_streamer_node_link(filesrc, "src", qt_demux, "sink"); + /* mediastreamer link demux to video_decoder and audio_decoder automatically. so we don't need to link. */ media_streamer_node_link(video_decoder, "src", video_sink, "sink"); + media_streamer_node_link(audio_decoder, "src", audio_sink, "sink"); } static void _create_videotestsrc_videosink(void) -- 2.7.4 From 6139e03cecbd6e54c1311ed6284ba62ef8b28bbe Mon Sep 17 00:00:00 2001 From: Hyunil Date: Wed, 13 Nov 2019 13:33:13 +0900 Subject: [PATCH 12/16] Add MEDIA_FORMAT_ARGB to RAW format for rtp video encoding-name Change-Id: Id31b44ebcc5690effe384c96b34892262dc5a2ed Signed-off-by: Hyunil --- src/media_streamer_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/media_streamer_util.c b/src/media_streamer_util.c index 8bb04ac..8cd5cd5 100644 --- a/src/media_streamer_util.c +++ b/src/media_streamer_util.c @@ -250,6 +250,7 @@ const gchar *__ms_convert_mime_to_rtp_format(media_format_mimetype_e mime) switch (mime) { case MEDIA_FORMAT_I420: case MEDIA_FORMAT_YV12: + case MEDIA_FORMAT_ARGB: return "RAW"; case MEDIA_FORMAT_H263: return "H263"; -- 2.7.4 From 5bc44d3ccdc916cc0f28490eec46fe8aebaf19cd Mon Sep 17 00:00:00 2001 From: Hyunil Date: Tue, 2 Jul 2019 15:39:54 +0900 Subject: [PATCH 13/16] Add exception code for measuring line coverage Change-Id: Ia59bfbda48e4340cc1cee5f651e0de8e141c68be Signed-off-by: Hyunil --- src/media_streamer.c | 2 ++ src/media_streamer_gst.c | 6 ++++++ src/media_streamer_http_server.c | 2 ++ src/media_streamer_node.c | 4 ++++ src/media_streamer_node_policy.c | 2 ++ src/media_streamer_priv.c | 2 ++ src/media_streamer_util.c | 2 ++ 7 files changed, 20 insertions(+) diff --git a/src/media_streamer.c b/src/media_streamer.c index f728561..8b09f29 100644 --- a/src/media_streamer.c +++ b/src/media_streamer.c @@ -624,6 +624,7 @@ int media_streamer_get_state(media_streamer_h streamer, media_streamer_state_e * return MEDIA_STREAMER_ERROR_NONE; } +//LCOV_EXCL_START int media_streamer_set_play_position(media_streamer_h streamer, int time, bool accurate, media_streamer_position_changed_cb callback, void *user_data) { int ret = MEDIA_STREAMER_ERROR_NONE; @@ -656,6 +657,7 @@ int media_streamer_set_play_position(media_streamer_h streamer, int time, bool a return ret; } +//LCOV_EXCL_STOP int media_streamer_get_play_position(media_streamer_h streamer, int *time) { diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index c915d32..076e198 100644 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -810,6 +810,7 @@ GstElement *__ms_decodebin_create(media_streamer_s * ms_streamer, char * name) return decodebin; } +//LCOV_EXCL_START static gboolean __ms_sink_bin_prepare(media_streamer_s * ms_streamer, GstPad * source_pad, const gchar * src_pad_type) { GstElement *decoder_element = NULL; @@ -921,6 +922,7 @@ static void __ms_rtpbin_pad_added_cb(GstElement * src, GstPad * new_pad, gpointe ms_debug_fleave(); } +//LCOV_EXCL_STOP int __ms_element_set_state(GstElement * gst_element, GstState gst_state) { @@ -1782,6 +1784,7 @@ GstElement *__ms_rtp_element_create(void) return rtp_container; } +//LCOV_EXCL_START gboolean __ms_rtp_element_prepare(media_streamer_node_s *ms_node) { GstElement *rtpbin = NULL; @@ -1922,6 +1925,7 @@ gboolean __ms_rtp_element_prepare(media_streamer_node_s *ms_node) return ret; } +//LCOV_EXCL_STOP int __ms_add_node_into_bin(media_streamer_s *ms_streamer, media_streamer_node_s *ms_node) { @@ -1958,6 +1962,7 @@ int __ms_add_node_into_bin(media_streamer_s *ms_streamer, media_streamer_node_s return ret; } +//LCOV_EXCL_START static gboolean __ms_parse_gst_error(media_streamer_s *ms_streamer, GstMessage *message, GError *error) { media_streamer_error_e ret_error = MEDIA_STREAMER_ERROR_NONE; @@ -1989,6 +1994,7 @@ static gboolean __ms_parse_gst_error(media_streamer_s *ms_streamer, GstMessage * return TRUE; } +//LCOV_EXCL_STOP static GstPadProbeReturn __ms_element_event_probe(GstPad * pad, GstPadProbeInfo *info, gpointer user_data) { diff --git a/src/media_streamer_http_server.c b/src/media_streamer_http_server.c index f8f6f6e..c53a567 100644 --- a/src/media_streamer_http_server.c +++ b/src/media_streamer_http_server.c @@ -163,6 +163,7 @@ int __ms_http_server_register_uri(media_streamer_http_server_h server, char *uri return MEDIA_STREAMER_ERROR_NONE; } +//LCOV_EXCL_START int __ms_http_server_unregister_uri(media_streamer_http_server_h server, char *uri) { _ms_http_server_s *hserver = (_ms_http_server_s *) server; @@ -309,3 +310,4 @@ static void __ms_http_server_connection_handle_cb(SoupServer *server, SoupMessag ms_debug_fleave(); } +//LCOV_EXCL_STOP diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 917ef96..e8e41a5 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -707,6 +707,7 @@ static void __ms_sink_new_buffer_cb(GstElement *sink, gpointer *data) ms_debug_fleave(); } +//LCOV_EXCL_START /* The appsink has got eos */ static void sink_eos(GstElement *sink, gpointer *data) { @@ -728,6 +729,7 @@ static void sink_eos(GstElement *sink, gpointer *data) ms_debug_fleave(); } +//LCOV_EXCL_STOP int __ms_sink_node_create(media_streamer_node_s *node) { @@ -1461,6 +1463,7 @@ int __ms_node_get_param_value(media_streamer_node_s *node, param_s *param, char return ret; } +//LCOV_EXCL_START static void __global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { @@ -1694,6 +1697,7 @@ int __ms_node_set_display(media_streamer_node_s *ms_node, const char *param_valu return ret; } +//LCOV_EXCL_STOP int __ms_node_set_param_value(media_streamer_node_s *ms_node, param_s *param, const char *param_value) { diff --git a/src/media_streamer_node_policy.c b/src/media_streamer_node_policy.c index 4fe851e..0556dd7 100644 --- a/src/media_streamer_node_policy.c +++ b/src/media_streamer_node_policy.c @@ -61,6 +61,7 @@ static void __ms_node_get_dpm_check_needed(media_streamer_node_s *node, media_st } +//LCOV_EXCL_START static void __ms_node_policy_changed_cb(const char *name, const char *value, void *user_data) { media_streamer_node_s *node; @@ -102,6 +103,7 @@ static void __ms_node_policy_changed_cb(const char *name, const char *value, voi ms_debug_fleave(); } +//LCOV_EXCL_STOP int __ms_node_policy_init(media_streamer_node_s *node) { diff --git a/src/media_streamer_priv.c b/src/media_streamer_priv.c index 3fe5ded..9f558dc 100644 --- a/src/media_streamer_priv.c +++ b/src/media_streamer_priv.c @@ -359,6 +359,7 @@ int __ms_change_resources_state(media_streamer_s *ms_streamer, media_streamer_st return ret; } +//LCOV_EXCL_START static gboolean __ms_resource_node_find(gpointer key, gpointer value, gpointer user_data) { ms_debug_fenter(); @@ -428,6 +429,7 @@ static int __ms_resource_release_cb(mm_resource_manager_h rm, return FALSE; } +//LCOV_EXCL_STOP int __ms_check_policy(media_streamer_s *ms_streamer) { diff --git a/src/media_streamer_util.c b/src/media_streamer_util.c index 8cd5cd5..3969ba9 100644 --- a/src/media_streamer_util.c +++ b/src/media_streamer_util.c @@ -245,6 +245,7 @@ const gchar *__ms_convert_mime_to_string_format(media_format_mimetype_e mime) return format_name; } +//LCOV_EXCL_START const gchar *__ms_convert_mime_to_rtp_format(media_format_mimetype_e mime) { switch (mime) { @@ -265,6 +266,7 @@ const gchar *__ms_convert_mime_to_rtp_format(media_format_mimetype_e mime) return NULL; } } +//LCOV_EXCL_STOP media_format_mimetype_e __ms_convert_string_format_to_media_format(const char *format_type) { -- 2.7.4 From b4fdea9aa871a69ff2785efaab824ae1bd6de083 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Wed, 18 Dec 2019 14:47:01 +0900 Subject: [PATCH 14/16] Change URL of Native API Reference Change-Id: Ibfd77b17042c390290448509cf01549854b820b4 Signed-off-by: Hyunil --- 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 4b43219..88cbd81 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 Element. * */ -- 2.7.4 From a4bbbe325dba74169dbd339e8a39cc761e94b83d Mon Sep 17 00:00:00 2001 From: Hyunil Date: Thu, 19 Dec 2019 10:25:33 +0900 Subject: [PATCH 15/16] Remove line coverage exception code for media_streamer_set_play_position Change-Id: I0638aa89ad41877aa964388cbcbc59b6ff97078a Signed-off-by: Hyunil --- src/media_streamer.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/media_streamer.c b/src/media_streamer.c index 8b09f29..f728561 100644 --- a/src/media_streamer.c +++ b/src/media_streamer.c @@ -624,7 +624,6 @@ int media_streamer_get_state(media_streamer_h streamer, media_streamer_state_e * return MEDIA_STREAMER_ERROR_NONE; } -//LCOV_EXCL_START int media_streamer_set_play_position(media_streamer_h streamer, int time, bool accurate, media_streamer_position_changed_cb callback, void *user_data) { int ret = MEDIA_STREAMER_ERROR_NONE; @@ -657,7 +656,6 @@ int media_streamer_set_play_position(media_streamer_h streamer, int time, bool a return ret; } -//LCOV_EXCL_STOP int media_streamer_get_play_position(media_streamer_h streamer, int *time) { -- 2.7.4 From b0acd560f73d5951c9280f61fd204f80fd6c8bb2 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Fri, 20 Dec 2019 16:44:10 +0900 Subject: [PATCH 16/16] Change deprecated libsoup API SOUP_SERVER_PORT and soup_server_run_async are deprecated Change-Id: Ibda64e873fec8c5aeeb858a4b1ad1a94147dc60b Signed-off-by: Hyunil --- include/media_streamer_http_server.h | 4 ++-- packaging/capi-media-streamer.spec | 2 +- src/media_streamer_http_server.c | 18 +++++++++++------- src/media_streamer_node.c | 6 +++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/include/media_streamer_http_server.h b/include/media_streamer_http_server.h index 29c565c..32d3ebc 100644 --- a/include/media_streamer_http_server.h +++ b/include/media_streamer_http_server.h @@ -26,10 +26,10 @@ extern "C" { 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_create(media_streamer_http_server_h *server); 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_start(media_streamer_http_server_h server, int port); 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); diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 09c989c..e20326f 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.23 +Version: 0.1.24 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_streamer_http_server.c b/src/media_streamer_http_server.c index c53a567..fe171aa 100644 --- a/src/media_streamer_http_server.c +++ b/src/media_streamer_http_server.c @@ -39,21 +39,18 @@ static int __ms_http_server_file_read_contents(const char *file_path, char **con 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) +int __ms_http_server_create(media_streamer_http_server_h *server) { _ms_http_server_s *ms_server; - int iport; ms_debug_fenter(); ms_retvm_if(server == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "server is NULL"); - ms_retvm_if(port == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Port is NULL"); 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"); - iport = atoi(port); - ms_server->server = soup_server_new(SOUP_SERVER_PORT, iport, NULL); + ms_server->server = soup_server_new(NULL, NULL); if (!ms_server->server) { ms_error("Failed to create http server"); @@ -106,9 +103,10 @@ int __ms_http_server_destroy(media_streamer_http_server_h server) return MEDIA_STREAMER_ERROR_NONE; } -int __ms_http_server_start(media_streamer_http_server_h server) +int __ms_http_server_start(media_streamer_http_server_h server, int port) { _ms_http_server_s *hserver = (_ms_http_server_s *) server; + GError *error = NULL; ms_debug_fenter(); @@ -118,7 +116,13 @@ int __ms_http_server_start(media_streamer_http_server_h server) soup_server_add_handler(hserver->server, NULL, __ms_http_server_connection_handle_cb, hserver, NULL); - soup_server_run_async(hserver->server); + soup_server_listen_all(hserver->server, port, 0, &error); + if (error) { + ms_error("Failed to start: '%s'", error->message); + g_error_free (error); + + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } ms_debug_fleave(); diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index e8e41a5..359b5d3 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -29,7 +29,7 @@ #define SMACK_LABEL_LEN 255 #define DEFAULT_URI_SCHEME_LENGTH 10 -#define DEFAULT_HTTP_PORT "8888" +#define DEFAULT_HTTP_PORT 8888 #define _FEATURE_NAME_WIFI "http://tizen.org/feature/network.wifi" #define _FEATURE_NAME_TELEPHONY "http://tizen.org/feature/network.telephony" @@ -1029,7 +1029,7 @@ static int __ms_adaptive_sink_http_server_prepare(media_streamer_s * ms_streamer ms_retvm_if(node->gst_element == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node->gst_element is NULL"); /* Create and start http server */ - err_code = __ms_http_server_create(&ms_streamer->http_server, NULL, DEFAULT_HTTP_PORT); + err_code = __ms_http_server_create(&ms_streamer->http_server); if (MEDIA_STREAMER_ERROR_NONE != err_code) { ms_error("Failed to create http server during prepare"); goto _DONE; @@ -1037,7 +1037,7 @@ static int __ms_adaptive_sink_http_server_prepare(media_streamer_s * ms_streamer ms_info("Starting http server"); /* FIXME: find out how to set default port */ - err_code = __ms_http_server_start(ms_streamer->http_server); + err_code = __ms_http_server_start(ms_streamer->http_server, DEFAULT_HTTP_PORT); 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); -- 2.7.4