From 9f5cdc5f28ea86a1b3f87d891c5d61f5beb91a9f Mon Sep 17 00:00:00 2001 From: Hyunil Date: Thu, 4 Jul 2019 14:14:11 +0900 Subject: [PATCH 01/16] Specify the audio, video and container format in detail. Change-Id: Ia40c7d9da016345c0ebe536615a8f5a23eb529b9 Signed-off-by: Hyunil --- test/media_streamer_test.c | 100 ++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index 2194337..fa23dc3 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -138,15 +138,15 @@ gboolean g_autoplug_mode = FALSE; gboolean g_video_is_on = FALSE; gboolean g_audio_is_on = FALSE; -media_format_h vfmt_raw = NULL; +media_format_h vfmt_i420 = NULL; media_format_h vfmt_encoded = NULL; -media_format_h vfmt_aenc = NULL; -media_format_h afmt_raw = NULL; -media_format_h afmt_araw = NULL; +media_format_h vfmt_h264 = NULL; +media_format_h afmt_pcm = NULL; +media_format_h afmt_f32le = NULL; media_format_h afmt_encoded = NULL; -media_format_h afmt_aenc = NULL; -media_format_h tsfmt = NULL; -media_format_h qtfmt = NULL; +media_format_h afmt_aac = NULL; +media_format_h cfmt_mpeg2ts = NULL; +media_format_h cfmt_mp4 = NULL; static int app_create(void *data); static int app_terminate(void *data); @@ -320,18 +320,18 @@ static void _destroy(media_streamer_h streamer) static void create_formats(void) { - if (!vfmt_raw || !vfmt_encoded || !afmt_raw) + if (!vfmt_i420 || !vfmt_encoded || !afmt_pcm) g_print("Formats already created!\n"); /* Define video raw format */ - media_format_create(&vfmt_raw); - if (media_format_set_video_mime(vfmt_raw, MEDIA_FORMAT_I420) != MEDIA_FORMAT_ERROR_NONE) + media_format_create(&vfmt_i420); + if (media_format_set_video_mime(vfmt_i420, MEDIA_FORMAT_I420) != MEDIA_FORMAT_ERROR_NONE) g_print("media_format_set_video_mime failed!"); - media_format_set_video_width(vfmt_raw, VIDEO_WIDTH); - media_format_set_video_height(vfmt_raw, VIDEO_HIGHT); - media_format_set_video_avg_bps(vfmt_raw, VIDEO_AVG_BPS); - media_format_set_video_max_bps(vfmt_raw, VIDEO_MAX_BPS); + media_format_set_video_width(vfmt_i420, VIDEO_WIDTH); + media_format_set_video_height(vfmt_i420, VIDEO_HIGHT); + media_format_set_video_avg_bps(vfmt_i420, VIDEO_AVG_BPS); + media_format_set_video_max_bps(vfmt_i420, VIDEO_MAX_BPS); /* Define encoded video format */ media_format_create(&vfmt_encoded); @@ -344,30 +344,30 @@ static void create_formats(void) media_format_set_video_max_bps(vfmt_encoded, VIDEO_MAX_BPS); /* Define encoded video format for adaptive stream */ - media_format_create(&vfmt_aenc); - if (media_format_set_video_mime(vfmt_aenc, MEDIA_FORMAT_H264_SP) != MEDIA_FORMAT_ERROR_NONE) + media_format_create(&vfmt_h264); + if (media_format_set_video_mime(vfmt_h264, MEDIA_FORMAT_H264_SP) != MEDIA_FORMAT_ERROR_NONE) g_print("media_format_set_video_mime failed!"); - media_format_set_video_width(vfmt_aenc, VIDEO_WIDTH); - media_format_set_video_height(vfmt_aenc, VIDEO_HIGHT); - media_format_set_video_avg_bps(vfmt_aenc, VIDEO_AVG_BPS); - media_format_set_video_max_bps(vfmt_aenc, VIDEO_MAX_BPS); + media_format_set_video_width(vfmt_h264, VIDEO_WIDTH); + media_format_set_video_height(vfmt_h264, VIDEO_HIGHT); + media_format_set_video_avg_bps(vfmt_h264, VIDEO_AVG_BPS); + media_format_set_video_max_bps(vfmt_h264, VIDEO_MAX_BPS); /* Define audio raw format */ - media_format_create(&afmt_raw); - if (media_format_set_audio_mime(afmt_raw, MEDIA_FORMAT_PCM) != MEDIA_FORMAT_ERROR_NONE) + media_format_create(&afmt_pcm); + if (media_format_set_audio_mime(afmt_pcm, MEDIA_FORMAT_PCM) != MEDIA_FORMAT_ERROR_NONE) g_print("media_format_set_audio_mime failed!"); - media_format_set_audio_channel(afmt_raw, AUDIO_CHANNEL); - media_format_set_audio_samplerate(afmt_raw, AUDIO_SAMPLERATE); + media_format_set_audio_channel(afmt_pcm, AUDIO_CHANNEL); + media_format_set_audio_samplerate(afmt_pcm, AUDIO_SAMPLERATE); /* Define audio raw format for adaptive streaming */ - media_format_create(&afmt_araw); - if (media_format_set_audio_mime(afmt_araw, MEDIA_FORMAT_PCM_F32LE) != MEDIA_FORMAT_ERROR_NONE) + media_format_create(&afmt_f32le); + if (media_format_set_audio_mime(afmt_f32le, MEDIA_FORMAT_PCM_F32LE) != MEDIA_FORMAT_ERROR_NONE) g_print("media_format_set_audio_mime failed!"); - media_format_set_audio_channel(afmt_araw, AUDIO_CHANNEL); - media_format_set_audio_samplerate(afmt_araw, AUDIO_SAMPLERATE); + media_format_set_audio_channel(afmt_f32le, AUDIO_CHANNEL); + media_format_set_audio_samplerate(afmt_f32le, AUDIO_SAMPLERATE); /* Define audio encoded format */ media_format_create(&afmt_encoded); @@ -378,21 +378,21 @@ static void create_formats(void) media_format_set_audio_samplerate(afmt_encoded, AUDIO_SAMPLERATE); /* Define audio encoded format for adaptive stream */ - media_format_create(&afmt_aenc); - if (media_format_set_audio_mime(afmt_aenc, MEDIA_FORMAT_AAC) != MEDIA_FORMAT_ERROR_NONE) + media_format_create(&afmt_aac); + if (media_format_set_audio_mime(afmt_aac, MEDIA_FORMAT_AAC) != MEDIA_FORMAT_ERROR_NONE) g_print("media_format_set_audio_mime failed!"); - media_format_set_audio_channel(afmt_aenc, AUDIO_CHANNEL); - media_format_set_audio_samplerate(afmt_aenc, AUDIO_SAMPLERATE); - media_format_set_audio_aac_type(afmt_aenc, TRUE); + media_format_set_audio_channel(afmt_aac, AUDIO_CHANNEL); + media_format_set_audio_samplerate(afmt_aac, AUDIO_SAMPLERATE); + media_format_set_audio_aac_type(afmt_aac, TRUE); /* Define mpegts stream format */ - media_format_create(&tsfmt); - if (media_format_set_container_mime(tsfmt, MEDIA_FORMAT_CONTAINER_MPEG2TS) != MEDIA_FORMAT_ERROR_NONE) + media_format_create(&cfmt_mpeg2ts); + if (media_format_set_container_mime(cfmt_mpeg2ts, MEDIA_FORMAT_CONTAINER_MPEG2TS) != MEDIA_FORMAT_ERROR_NONE) g_print("media_format_set_container_mime failed!"); /* Define MP4 stream format */ - media_format_create(&qtfmt); - if (media_format_set_container_mime(qtfmt, MEDIA_FORMAT_CONTAINER_MP4) != MEDIA_FORMAT_ERROR_NONE) + media_format_create(&cfmt_mp4); + if (media_format_set_container_mime(cfmt_mp4, MEDIA_FORMAT_CONTAINER_MP4) != MEDIA_FORMAT_ERROR_NONE) g_print("media_format_set_container_mime failed!"); } @@ -537,7 +537,7 @@ static void _create_rtp_streamer(media_streamer_node_h rtp_bin) /*********************** encoder **************************************** */ media_streamer_node_h video_enc = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER, vfmt_raw, vfmt_encoded, &video_enc); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER, vfmt_i420, vfmt_encoded, &video_enc); media_streamer_node_add(current_media_streamer, video_enc); APPEND_NODE(video_enc); @@ -570,7 +570,7 @@ static void _create_rtp_streamer(media_streamer_node_h rtp_bin) /*********************** audioencoder *********************************** */ media_streamer_node_h audio_enc = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER, afmt_raw, afmt_encoded, &audio_enc); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER, afmt_pcm, afmt_encoded, &audio_enc); media_streamer_node_add(current_media_streamer, audio_enc); APPEND_NODE(audio_enc); @@ -639,7 +639,7 @@ static void _create_rtp_client(media_streamer_node_h rtp_bin) /* ********************** videodec ************************************ */ media_streamer_node_h video_dec = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, vfmt_encoded, vfmt_raw, &video_dec); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, vfmt_encoded, vfmt_i420, &video_dec); media_streamer_node_add(current_media_streamer, video_dec); APPEND_NODE(video_dec); @@ -755,32 +755,32 @@ static void _create_adaptive_server_manual() APPEND_NODE(file_src); media_streamer_node_h qt_demux = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_DEMUXER, qtfmt, NULL, &qt_demux); + 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_dec = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, vfmt_aenc, vfmt_raw, &video_dec); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, vfmt_h264, vfmt_i420, &video_dec); media_streamer_node_add(current_media_streamer, video_dec); APPEND_NODE(video_dec); media_streamer_node_h audio_dec = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER, afmt_aenc, afmt_araw, &audio_dec); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER, afmt_aac, afmt_f32le, &audio_dec); media_streamer_node_add(current_media_streamer, audio_dec); APPEND_NODE(audio_dec); media_streamer_node_h video_enc = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER, vfmt_raw, vfmt_aenc, &video_enc); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER, vfmt_i420, vfmt_h264, &video_enc); media_streamer_node_add(current_media_streamer, video_enc); APPEND_NODE(video_enc); media_streamer_node_h audio_enc = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER, afmt_araw, afmt_aenc, &audio_enc); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_ENCODER, afmt_f32le, afmt_aac, &audio_enc); media_streamer_node_add(current_media_streamer, audio_enc); APPEND_NODE(audio_enc); media_streamer_node_h ts_mux = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_MUXER, NULL, tsfmt, &ts_mux); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_MUXER, NULL, cfmt_mpeg2ts, &ts_mux); media_streamer_node_add(current_media_streamer, ts_mux); APPEND_NODE(ts_mux); @@ -832,17 +832,17 @@ static void _create_adaptive_playing_manual() APPEND_NODE(adaptive_src); media_streamer_node_h ts_demux = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_DEMUXER, tsfmt, NULL, &ts_demux); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_DEMUXER, cfmt_mpeg2ts, NULL, &ts_demux); media_streamer_node_add(current_media_streamer, ts_demux); APPEND_NODE(ts_demux); media_streamer_node_h video_dec = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, vfmt_aenc, vfmt_raw, &video_dec); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_VIDEO_DECODER, vfmt_h264, vfmt_i420, &video_dec); media_streamer_node_add(current_media_streamer, video_dec); APPEND_NODE(video_dec); media_streamer_node_h audio_dec = NULL; - media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER, afmt_aenc, afmt_araw, &audio_dec); + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER, afmt_aac, afmt_f32le, &audio_dec); media_streamer_node_add(current_media_streamer, audio_dec); APPEND_NODE(audio_dec); @@ -923,7 +923,7 @@ static void _create_app_test() /* ********************** app_sink *********************************** */ media_streamer_node_h app_sink = NULL; media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_CUSTOM, &app_sink); - media_streamer_node_set_pad_format(app_sink, "sink", vfmt_raw); + media_streamer_node_set_pad_format(app_sink, "sink", vfmt_i420); media_streamer_node_add(current_media_streamer, app_sink); APPEND_NODE(app_sink); -- 2.7.4 From 31dcf1aa8f005b12872f186a86f011204c9f0339 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Fri, 5 Jul 2019 11:38:46 +0900 Subject: [PATCH 02/16] Add static link test for aac file playing Change-Id: I10691e3ff5e68edb24e7b224231927461d35197e Signed-off-by: Hyunil --- test/media_streamer_test.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index fa23dc3..70c8f7f 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -87,6 +87,7 @@ typedef enum { SCENARIO_MODE_ADAPTIVE_SERVER_MANUAL, SCENARIO_MODE_ADAPTIVE_CLIENT_AUTO, SCENARIO_MODE_ADAPTIVE_CLIENT_MANUAL, + SCENARIO_MODE_FILE_PLAY_AAC_AUDIO } scenario_mode_e; #define PACKAGE "media_streamer_test" @@ -459,6 +460,28 @@ static void _create_file_playing() APPEND_NODE(audio_sink); } +static void _create_static_audio_aac_playing() +{ + 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 audio_decoder = NULL; + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER, afmt_aac, afmt_pcm, &audio_decoder); + media_streamer_node_add(current_media_streamer, audio_decoder); + APPEND_NODE(audio_decoder); + + media_streamer_node_h audiosink = NULL; + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_AUDIO, &audiosink); + media_streamer_node_add(current_media_streamer, audiosink); + APPEND_NODE(audiosink); + + media_streamer_node_link(filesrc, "src", audio_decoder, "sink"); + media_streamer_node_link(audio_decoder, "src", audiosink, "sink"); +} + static void _create_file_sub_playing() { media_streamer_node_h file_sub_src = NULL; @@ -1077,7 +1100,8 @@ static void display_static_link_playing_scenario_select_menu(void) g_print("\n"); g_print("Please select Playing Scenario mode\n"); g_print("By default will be used [%d] mode\n", g_scenario_mode); - g_print("1. Appsrc -> Appsink \n"); + g_print("1. Appsrc -> Appsink\n"); + g_print("2. Audio File(aac) playing\n"); g_print("b. back \n"); g_print("----------------------------------------------------\n"); g_print("====================================================\n"); @@ -1294,6 +1318,8 @@ void run_playing_preset(void) if (g_scenario_mode == SCENARIO_MODE_FILE_PLAY_VIDEO_AUDIO) _create_file_playing(); + else if (g_scenario_mode == SCENARIO_MODE_FILE_PLAY_AAC_AUDIO) + _create_static_audio_aac_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) @@ -1456,10 +1482,15 @@ void _interpret_static_link_playing_scenario_menu(char *cmd) if (len == 1) { if (!strncmp(cmd, "1", len)) { g_scenario_mode = SCENARIO_MODE_APPSRC_APPSINK; - g_sub_menu_state = SUBMENU_STATE_UNKNOWN; + } + else if (!strncmp(cmd, "2", len)) { + g_scenario_mode = SCENARIO_MODE_FILE_PLAY_AAC_AUDIO; + 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; } void _interpret_scenario_menu(char *cmd) -- 2.7.4 From 3cccc28920a72c03d4cb1d828a1b6d78a14fda25 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Mon, 8 Jul 2019 15:34:24 +0900 Subject: [PATCH 03/16] Add void to empty param function Change-Id: I2fda06f2f813f5cb7e8443c5e9bf6e7303a6a704 Signed-off-by: Hyunil --- test/media_streamer_test.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index 70c8f7f..953e213 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -438,7 +438,7 @@ static void set_rtp_params(media_streamer_node_h rtp_node, const char *ip, int v bundle_free(params); } -static void _create_file_playing() +static void _create_file_playing(void) { media_streamer_node_h file_src = NULL; media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_FILE, &file_src); @@ -460,7 +460,7 @@ static void _create_file_playing() APPEND_NODE(audio_sink); } -static void _create_static_audio_aac_playing() +static void _create_static_audio_aac_playing(void) { media_streamer_node_h filesrc = NULL; media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_FILE, &filesrc); @@ -482,7 +482,7 @@ static void _create_static_audio_aac_playing() media_streamer_node_link(audio_decoder, "src", audiosink, "sink"); } -static void _create_file_sub_playing() +static void _create_file_sub_playing(void) { media_streamer_node_h file_sub_src = NULL; media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_FILE, &file_sub_src); @@ -510,7 +510,7 @@ static void _create_file_sub_playing() APPEND_NODE(audio_sink); } -static void _create_file_streaming() +static void _create_file_streaming(void) { g_print("\n _create_file_playing \n"); media_streamer_node_h file_src = NULL; @@ -520,7 +520,7 @@ static void _create_file_streaming() APPEND_NODE(file_src); } -static void _create_http_playing() +static void _create_http_playing(void) { media_streamer_node_h http_src = NULL; media_streamer_node_create_src(MEDIA_STREAMER_NODE_SRC_TYPE_HTTP, &http_src); @@ -750,7 +750,7 @@ static media_streamer_node_h _create_rtp(int video_port, int audio_port, gboolea return rtp_bin; } -static void _create_adaptive_server() +static void _create_adaptive_server(void) { g_print("\n _create_adaptive_server \n"); media_streamer_node_h file_src = NULL; @@ -768,7 +768,7 @@ static void _create_adaptive_server() APPEND_NODE(adaptive_sink); } -static void _create_adaptive_server_manual() +static void _create_adaptive_server_manual(void) { g_print("\n _create_adaptive_server manual \n"); media_streamer_node_h file_src = NULL; @@ -822,7 +822,7 @@ static void _create_adaptive_server_manual() media_streamer_node_link(ts_mux, "src", adaptive_sink, "sink"); } -static void _create_adaptive_playing() +static void _create_adaptive_playing(void) { g_print("\n _create_adaptive_playing \n"); media_streamer_node_h adaptive_src = NULL; @@ -845,7 +845,7 @@ static void _create_adaptive_playing() APPEND_NODE(audio_sink); } -static void _create_adaptive_playing_manual() +static void _create_adaptive_playing_manual(void) { g_print("\n _create_adaptive_playing_manual \n"); media_streamer_node_h adaptive_src = NULL; @@ -933,7 +933,7 @@ static void eos_cb(media_streamer_node_h node, void *user_data) g_print("Got EOS cb from appsink\n"); } -static void _create_app_test() +static void _create_app_test(void) { g_print("== _create_appsrc \n"); @@ -1009,7 +1009,7 @@ void reset_current_menu_state(void) g_node_counter = 0; } -void quit() +void quit(void) { reset_current_menu_state(); elm_exit(); -- 2.7.4 From 6c9a59073c0863bfab88cb37bbb67f9b3d03e035 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Mon, 15 Jul 2019 14:49:07 +0900 Subject: [PATCH 04/16] Add static link test for mp3 file playing Change-Id: Id9ede22ad11c9233d47ed63663c7d73698005cd1 Signed-off-by: Hyunil --- test/media_streamer_test.c | 53 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index 953e213..bdd8b98 100644 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -87,7 +87,8 @@ typedef enum { SCENARIO_MODE_ADAPTIVE_SERVER_MANUAL, SCENARIO_MODE_ADAPTIVE_CLIENT_AUTO, SCENARIO_MODE_ADAPTIVE_CLIENT_MANUAL, - SCENARIO_MODE_FILE_PLAY_AAC_AUDIO + SCENARIO_MODE_FILE_PLAY_AAC_AUDIO, + SCENARIO_MODE_FILE_PLAY_MP3_AUDIO } scenario_mode_e; #define PACKAGE "media_streamer_test" @@ -146,6 +147,7 @@ media_format_h afmt_pcm = NULL; media_format_h afmt_f32le = NULL; media_format_h afmt_encoded = NULL; media_format_h afmt_aac = NULL; +media_format_h afmt_mp3 = NULL; media_format_h cfmt_mpeg2ts = NULL; media_format_h cfmt_mp4 = NULL; @@ -357,7 +359,7 @@ static void create_formats(void) /* Define audio raw format */ media_format_create(&afmt_pcm); if (media_format_set_audio_mime(afmt_pcm, MEDIA_FORMAT_PCM) != MEDIA_FORMAT_ERROR_NONE) - g_print("media_format_set_audio_mime failed!"); + g_print("media_format_set_audio_mime failed!\n"); media_format_set_audio_channel(afmt_pcm, AUDIO_CHANNEL); media_format_set_audio_samplerate(afmt_pcm, AUDIO_SAMPLERATE); @@ -365,7 +367,7 @@ static void create_formats(void) /* Define audio raw format for adaptive streaming */ media_format_create(&afmt_f32le); if (media_format_set_audio_mime(afmt_f32le, MEDIA_FORMAT_PCM_F32LE) != MEDIA_FORMAT_ERROR_NONE) - g_print("media_format_set_audio_mime failed!"); + g_print("media_format_set_audio_mime failed!\n"); media_format_set_audio_channel(afmt_f32le, AUDIO_CHANNEL); media_format_set_audio_samplerate(afmt_f32le, AUDIO_SAMPLERATE); @@ -373,15 +375,20 @@ static void create_formats(void) /* Define audio encoded format */ media_format_create(&afmt_encoded); if (media_format_set_audio_mime(afmt_encoded, MEDIA_FORMAT_AMR_NB) != MEDIA_FORMAT_ERROR_NONE) - g_print("media_format_set_audio_mime failed!"); + g_print("media_format_set_audio_mime failed!\n"); media_format_set_audio_channel(afmt_encoded, AUDIO_CHANNEL); media_format_set_audio_samplerate(afmt_encoded, AUDIO_SAMPLERATE); + /* Define audio mp3 format */ + media_format_create(&afmt_mp3); + if (media_format_set_audio_mime(afmt_mp3, MEDIA_FORMAT_MP3) != MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_audio_mime failed!\n"); + /* Define audio encoded format for adaptive stream */ media_format_create(&afmt_aac); if (media_format_set_audio_mime(afmt_aac, MEDIA_FORMAT_AAC) != MEDIA_FORMAT_ERROR_NONE) - g_print("media_format_set_audio_mime failed!"); + g_print("media_format_set_audio_mime failed!\n"); media_format_set_audio_channel(afmt_aac, AUDIO_CHANNEL); media_format_set_audio_samplerate(afmt_aac, AUDIO_SAMPLERATE); @@ -390,11 +397,12 @@ static void create_formats(void) /* Define mpegts stream format */ media_format_create(&cfmt_mpeg2ts); if (media_format_set_container_mime(cfmt_mpeg2ts, MEDIA_FORMAT_CONTAINER_MPEG2TS) != MEDIA_FORMAT_ERROR_NONE) - g_print("media_format_set_container_mime failed!"); + g_print("media_format_set_container_mime failed!\n"); + /* Define MP4 stream format */ media_format_create(&cfmt_mp4); if (media_format_set_container_mime(cfmt_mp4, MEDIA_FORMAT_CONTAINER_MP4) != MEDIA_FORMAT_ERROR_NONE) - g_print("media_format_set_container_mime failed!"); + g_print("media_format_set_container_mime failed!\n"); } static void set_rtp_params(media_streamer_node_h rtp_node, const char *ip, int video_port, int audio_port, gboolean port_reverse) @@ -482,6 +490,28 @@ static void _create_static_audio_aac_playing(void) media_streamer_node_link(audio_decoder, "src", audiosink, "sink"); } +static void _create_static_audio_mp3_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 audio_decoder = NULL; + media_streamer_node_create(MEDIA_STREAMER_NODE_TYPE_AUDIO_DECODER, afmt_mp3, afmt_pcm, &audio_decoder); + media_streamer_node_add(current_media_streamer, audio_decoder); + APPEND_NODE(audio_decoder); + + media_streamer_node_h audiosink = NULL; + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_AUDIO, &audiosink); + media_streamer_node_add(current_media_streamer, audiosink); + APPEND_NODE(audiosink); + + media_streamer_node_link(filesrc, "src", audio_decoder, "sink"); + media_streamer_node_link(audio_decoder, "src", audiosink, "sink"); +} + static void _create_file_sub_playing(void) { media_streamer_node_h file_sub_src = NULL; @@ -1102,6 +1132,7 @@ static void display_static_link_playing_scenario_select_menu(void) g_print("By default will be used [%d] mode\n", g_scenario_mode); g_print("1. Appsrc -> Appsink\n"); g_print("2. Audio File(aac) playing\n"); + g_print("3. Audio File(mp3) playing\n"); g_print("b. back \n"); g_print("----------------------------------------------------\n"); g_print("====================================================\n"); @@ -1320,6 +1351,8 @@ void run_playing_preset(void) _create_file_playing(); else if (g_scenario_mode == SCENARIO_MODE_FILE_PLAY_AAC_AUDIO) _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_SUBTITLE_VIDEO_AUDIO) _create_file_sub_playing(); else if (g_scenario_mode == SCENARIO_MODE_HTTP_VIDEO_AUDIO) @@ -1489,6 +1522,12 @@ void _interpret_static_link_playing_scenario_menu(char *cmd) g_printf("g_sub_menu_state (%d)\n", g_sub_menu_state); return; } + else if (!strncmp(cmd, "3", len)) { + g_scenario_mode = SCENARIO_MODE_FILE_PLAY_MP3_AUDIO; + 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 5e4a622ed6931b543e77e1abdf4bfc1a51168e68 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Tue, 23 Jul 2019 12:44:10 +0900 Subject: [PATCH 05/16] Change input value type for parent_id Change-Id: I2e3d6a3285d97a056c9495d935fc545e48848924 Signed-off-by: Hyunil --- include/media_streamer_priv.h | 2 +- src/media_streamer_node.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/media_streamer_priv.h b/include/media_streamer_priv.h index a2a49ce..8c3c2e4 100644 --- a/include/media_streamer_priv.h +++ b/include/media_streamer_priv.h @@ -147,7 +147,7 @@ typedef struct { } media_streamer_node_s; typedef struct _media_streamer_wl_info_s { - int parent_id; + gint parent_id; } media_streamer_wl_info_s; /* Private functions definition */ diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index beda130..9528930 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -1695,7 +1695,7 @@ int __ms_node_set_display(media_streamer_node_s *ms_node, const char *param_valu LOGD("wayland global surface id : %d", wl_info.parent_id); - gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(ms_node->gst_element), (guintptr)wl_info.parent_id); + gst_video_overlay_set_wl_window_wl_surface_id(GST_VIDEO_OVERLAY(ms_node->gst_element), wl_info.parent_id); return ret; } -- 2.7.4 From 2f677ea22cbc24fef3e25981fdde27d776255250 Mon Sep 17 00:00:00 2001 From: Hyunil Date: Tue, 30 Jul 2019 11:53:59 +0900 Subject: [PATCH 06/16] Add gcov environment Change-Id: I088bd23496518c01c4e82e23555119cba0834acd Signed-off-by: Hyunil --- packaging/capi-media-streamer.spec | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 7419ef7..0ba92b7 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -70,6 +70,12 @@ flags="$flags -DTIZEN_DEBUG_ENABLE" export CFLAGS="$CFLAGS $flags" export CXXFLAGS="$CXXFLAGS $flags" export FFLAGS="$FFLAGS $flags" +%if 0%{?gcov:1} +export CFLAGS+=" -fprofile-arcs -ftest-coverage" +export CXXFLAGS+=" -fprofile-arcs -ftest-coverage" +export FFLAGS+=" -fprofile-arcs -ftest-coverage" +export LDFLAGS+=" -lgcov" +%endif MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` %cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} -- 2.7.4 From 8c9abbc4bb25fa63b0951a19ba62fa0233dfd28c Mon Sep 17 00:00:00 2001 From: Hyunil Date: Fri, 23 Aug 2019 16:05:04 +0900 Subject: [PATCH 07/16] remove setting use-tbm because default value is false Change-Id: I469c83b8cf4ae2b5b76e3e309c271f7f1111f598 Signed-off-by: Hyunil --- src/media_streamer_node.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 9528930..449fd96 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -757,7 +757,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); -- 2.7.4 From a0b8224517bf5fe11f30d5bd66ca18b280604f4b Mon Sep 17 00:00:00 2001 From: Hyunil Date: Mon, 26 Aug 2019 12:16:27 +0900 Subject: [PATCH 08/16] Define SYSCONFDIR and remove unused ini path Change-Id: I395fa674ecedd6f5a4b294eab2b642430cf96923 Signed-off-by: Hyunil --- include/media_streamer_util.h | 5 ++--- packaging/capi-media-streamer.spec | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/include/media_streamer_util.h b/include/media_streamer_util.h index 1003fd0..369dea9 100644 --- a/include/media_streamer_util.h +++ b/include/media_streamer_util.h @@ -94,9 +94,8 @@ extern "C" { #define MS_TIME_NONE ((int)-1) /* Ini Utils */ -#ifndef MEDIA_STREAMER_INI_PATH - #define MEDIA_STREAMER_INI_PATH "/etc/media_streamer.ini" -#endif +/* SYSCONFDIR is defined at spec file */ +#define MEDIA_STREAMER_INI_PATH SYSCONFDIR"/multimedia/mmfw_media_streamer.ini" #define INI_MAX_STRLEN (100) #define RTP_STREAM_DISABLED (0) diff --git a/packaging/capi-media-streamer.spec b/packaging/capi-media-streamer.spec index 0ba92b7..09c989c 100644 --- a/packaging/capi-media-streamer.spec +++ b/packaging/capi-media-streamer.spec @@ -58,10 +58,8 @@ Collection of files related to Line Coverage. It is teseted as gcov for a MediaS %setup -q cp %{SOURCE1001} . -%define ini_path %{_sysconfdir}/multimedia/mmfw_media_streamer.ini - %build -flags="-DMEDIA_STREAMER_INI_PATH=\\\"%{ini_path}\\\" -D_FILE_OFFSET_BITS=64 -DEFL_BETA_API_SUPPORT" +flags="-DSYSCONFDIR=\\\"%{_sysconfdir}\\\" -D_FILE_OFFSET_BITS=64 -DEFL_BETA_API_SUPPORT" %if 0%{?sec_build_binary_debug_enable} flags="$flags -DTIZEN_DEBUG_ENABLE" -- 2.7.4 From 091dc5257b125d9d8f85275493c294f1d3aec75a Mon Sep 17 00:00:00 2001 From: Hyunil Date: Mon, 26 Aug 2019 16:19:01 +0900 Subject: [PATCH 09/16] node check is separated into src node check and sink node check Change-Id: I57a4f48e6db9132f2aeffa1550b1882b71a0b6ce Signed-off-by: Hyunil --- src/media_streamer_node.c | 203 ++++++++++++++++++++++++---------------------- 1 file changed, 107 insertions(+), 96 deletions(-) diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 449fd96..e4d8750 100644 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -31,6 +31,12 @@ #define DEFAULT_URI_SCHEME_LENGTH 10 #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" +#define _FEATURE_NAME_ETHERNET "http://tizen.org/feature/network.ethernet" +#define _FEATURE_NAME_CAMERA "http://tizen.org/feature/camera" +#define _FEATURE_NAME_MICROPHONE "http://tizen.org/feature/microphone" + param_s param_table[] = { {MEDIA_STREAMER_PARAM_CAMERA_ID, "camera-id"}, {MEDIA_STREAMER_PARAM_CAPTURE_WIDTH, "capture-width"}, @@ -468,14 +474,8 @@ static int __ms_node_check_priveleges(media_streamer_node_s *node) return ret; } -static int __ms_node_check_feature(media_streamer_node_s *node) +static int __ms_src_node_check_feature(media_streamer_node_s *node) { -#define _FEATURE_NAME_WIFI "http://tizen.org/feature/network.wifi" -#define _FEATURE_NAME_TELEPHONY "http://tizen.org/feature/network.telephony" -#define _FEATURE_NAME_ETHERNET "http://tizen.org/feature/network.ethernet" -#define _FEATURE_NAME_CAMERA "http://tizen.org/feature/camera" -#define _FEATURE_NAME_MICROPHONE "http://tizen.org/feature/microphone" - int ret = MEDIA_STREAMER_ERROR_NONE; bool enabled = FALSE; bool supported = FALSE; @@ -484,101 +484,112 @@ static int __ms_node_check_feature(media_streamer_node_s *node) ms_retvm_if(node == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node is NULL"); - if (node->type == MEDIA_STREAMER_NODE_TYPE_SRC) { - switch (node->subtype) { - case MEDIA_STREAMER_NODE_SRC_TYPE_HTTP: - case MEDIA_STREAMER_NODE_SRC_TYPE_RTSP: - case MEDIA_STREAMER_NODE_SRC_TYPE_ADAPTIVE: - if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_WIFI, &enabled)) { - ms_info("wifi status = %d", enabled); - if (enabled) - supported = TRUE; - } else { - ms_error("SYSTEM_INFO_ERROR"); - } + switch (node->subtype) { + case MEDIA_STREAMER_NODE_SRC_TYPE_HTTP: + case MEDIA_STREAMER_NODE_SRC_TYPE_RTSP: + case MEDIA_STREAMER_NODE_SRC_TYPE_ADAPTIVE: + if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_WIFI, &enabled)) { + ms_info("wifi status = %d", enabled); + if (enabled) + supported = TRUE; + } else { + ms_error("SYSTEM_INFO_ERROR"); + } - if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_TELEPHONY, &enabled)) { - ms_info("telephony status = %d", enabled); - if (enabled) - supported = TRUE; - } else { - ms_error("SYSTEM_INFO_ERROR"); - } + if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_TELEPHONY, &enabled)) { + ms_info("telephony status = %d", enabled); + if (enabled) + supported = TRUE; + } else { + ms_error("SYSTEM_INFO_ERROR"); + } - if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_ETHERNET, &enabled)) { - ms_info("ethernet status = %d", enabled); - if (enabled) - supported = TRUE; - } else { - ms_error("SYSTEM_INFO_ERROR"); - } - if (!supported) - ret = MEDIA_STREAMER_ERROR_NOT_SUPPORTED; - break; - case MEDIA_STREAMER_NODE_SRC_TYPE_AUDIO_CAPTURE: - if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_MICROPHONE, &enabled)) { - ms_info("microphone status = %d", enabled); - if (enabled) - supported = TRUE; - } else { - ms_error("SYSTEM_INFO_ERROR"); - } - if (!supported) - ret = MEDIA_STREAMER_ERROR_NOT_SUPPORTED; - break; - case MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA: - case MEDIA_STREAMER_NODE_SRC_TYPE_VIDEO_CAPTURE: - if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_CAMERA, &enabled)) { - ms_info("camera status = %d", enabled); - if (enabled) - supported = TRUE; - } else { - ms_error("SYSTEM_INFO_ERROR"); - } - if (!supported) - ret = MEDIA_STREAMER_ERROR_NOT_SUPPORTED; - break; - default: - ms_info("For current Src Node subtype [%d] privileges are not needed", node->subtype); - break; + if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_ETHERNET, &enabled)) { + ms_info("ethernet status = %d", enabled); + if (enabled) + supported = TRUE; + } else { + ms_error("SYSTEM_INFO_ERROR"); + } + if (!supported) + ret = MEDIA_STREAMER_ERROR_NOT_SUPPORTED; + break; + case MEDIA_STREAMER_NODE_SRC_TYPE_AUDIO_CAPTURE: + if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_MICROPHONE, &enabled)) { + ms_info("microphone status = %d", enabled); + if (enabled) + supported = TRUE; + } else { + ms_error("SYSTEM_INFO_ERROR"); } + if (!supported) + ret = MEDIA_STREAMER_ERROR_NOT_SUPPORTED; + break; + case MEDIA_STREAMER_NODE_SRC_TYPE_CAMERA: + case MEDIA_STREAMER_NODE_SRC_TYPE_VIDEO_CAPTURE: + if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_CAMERA, &enabled)) { + ms_info("camera status = %d", enabled); + if (enabled) + supported = TRUE; + } else { + ms_error("SYSTEM_INFO_ERROR"); + } + if (!supported) + ret = MEDIA_STREAMER_ERROR_NOT_SUPPORTED; + break; + default: + ms_info("For current Src Node subtype [%d] privileges are not needed", node->subtype); + break; } - if (node->type == MEDIA_STREAMER_NODE_TYPE_SINK) { - switch (node->subtype) { - case MEDIA_STREAMER_NODE_SINK_TYPE_HTTP: - case MEDIA_STREAMER_NODE_SINK_TYPE_RTSP: - /* case MEDIA_STREAMER_NODE_SINK_TYPE_ADAPTIVE: */ - if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_WIFI, &enabled)) { - ms_info("wifi status = %d", enabled); - if (enabled) - supported = TRUE; - } else { - ms_error("SYSTEM_INFO_ERROR"); - } + ms_debug_fleave(); - if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_TELEPHONY, &enabled)) { - ms_info("telephony status = %d", enabled); - if (enabled) - supported = TRUE; - } else { - ms_error("SYSTEM_INFO_ERROR"); - } + return ret; +} - if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_ETHERNET, &enabled)) { - ms_info("ethernet status = %d", enabled); - if (enabled) - supported = TRUE; - } else { - ms_error("SYSTEM_INFO_ERROR"); - } - if (!supported) - ret = MEDIA_STREAMER_ERROR_NOT_SUPPORTED; - break; - default: - ms_info("For current Sink Node subtype [%d] privileges are not needed", node->subtype); - break; +static int __ms_sink_node_check_feature(media_streamer_node_s *node) +{ + int ret = MEDIA_STREAMER_ERROR_NONE; + bool enabled = FALSE; + bool supported = FALSE; + + ms_debug_fenter(); + + ms_retvm_if(node == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "node is NULL"); + + switch (node->subtype) { + case MEDIA_STREAMER_NODE_SINK_TYPE_HTTP: + case MEDIA_STREAMER_NODE_SINK_TYPE_RTSP: + /* case MEDIA_STREAMER_NODE_SINK_TYPE_ADAPTIVE: */ + if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_WIFI, &enabled)) { + ms_info("wifi status = %d", enabled); + if (enabled) + supported = TRUE; + } else { + ms_error("SYSTEM_INFO_ERROR"); + } + + if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_TELEPHONY, &enabled)) { + ms_info("telephony status = %d", enabled); + if (enabled) + supported = TRUE; + } else { + ms_error("SYSTEM_INFO_ERROR"); + } + + if (SYSTEM_INFO_ERROR_NONE == system_info_get_platform_bool(_FEATURE_NAME_ETHERNET, &enabled)) { + ms_info("ethernet status = %d", enabled); + if (enabled) + supported = TRUE; + } else { + ms_error("SYSTEM_INFO_ERROR"); } + if (!supported) + ret = MEDIA_STREAMER_ERROR_NOT_SUPPORTED; + break; + default: + ms_info("For current Sink Node subtype [%d] privileges are not needed", node->subtype); + break; } ms_debug_fleave(); @@ -601,7 +612,7 @@ int __ms_src_node_create(media_streamer_node_s *node) return ret; } - ret = __ms_node_check_feature(node); + ret = __ms_src_node_check_feature(node); if (ret != MEDIA_STREAMER_ERROR_NONE) { ms_error("Error getting feature for Src Node"); return ret; @@ -732,7 +743,7 @@ int __ms_sink_node_create(media_streamer_node_s *node) return ret; } - ret = __ms_node_check_feature(node); + ret = __ms_sink_node_check_feature(node); if (ret != MEDIA_STREAMER_ERROR_NONE) { ms_error("Error getting feature for Sink Node"); return ret; -- 2.7.4 From e16735f3064403c6281fecc84f2d41686dd3085c Mon Sep 17 00:00:00 2001 From: Hyunil Date: Tue, 27 Aug 2019 15:54:52 +0900 Subject: [PATCH 10/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 11/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 12/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 13/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 14/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 15/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 16/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