From: Vyacheslav Valkovoy Date: Tue, 24 Nov 2015 18:44:01 +0000 (+0200) Subject: Added get_duraiton() API and add evas sink node type. X-Git-Tag: submit/tizen/20151208.020949~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0b793e1774d261f2d0c8964b171bb9e75e554a1b;p=platform%2Fcore%2Fapi%2Fmediastreamer.git Added get_duraiton() API and add evas sink node type. Change-Id: Iaa4991721676332b1a604dfc2cff20fffc961467 Signed-off-by: Vyacheslav Valkovoy --- diff --git a/include/media_streamer_priv.h b/include/media_streamer_priv.h index 9d4b4c1..499e34b 100755 --- a/include/media_streamer_priv.h +++ b/include/media_streamer_priv.h @@ -39,7 +39,7 @@ typedef struct { void *user_data; } media_streamer_callback_s; -#define PROPERTY_COUNT 24 +#define PROPERTY_COUNT 25 extern char *param_table[PROPERTY_COUNT][2]; /** @@ -118,6 +118,13 @@ typedef struct { */ int __ms_get_position(media_streamer_s *ms_streamer, int *time); +/** + * @brief Gets the duration of Media streamer element. + * + * @since_tizen 3.0 + */ +int __ms_get_duration(media_streamer_s *ms_streamer, int *time); + /** * @brief Seeks Media streamer element to the pointed position. * diff --git a/include/media_streamer_util.h b/include/media_streamer_util.h index b8d3af9..84bed46 100755 --- a/include/media_streamer_util.h +++ b/include/media_streamer_util.h @@ -124,6 +124,7 @@ typedef struct { #define DEFAULT_APP_SOURCE "appsrc" #define DEFAULT_AUDIO_SINK "pulsesink" #define DEFAULT_VIDEO_SINK "waylandsink" +#define DEFAULT_EVAS_SINK "evaspixmapsink" #define DEFAULT_VIDEO_CONVERT "videoconvert" #define DEFAULT_TEXT_OVERLAY "textoverlay" #define DEFAULT_AUDIO_CONVERT "audioconvert" @@ -174,17 +175,18 @@ dot dir = /tmp \n\ \n\ [sources] \n\ \n\ -audio_source = pulsesrc \n\ -camera_source = v4l2src \n\ -video_source = ximagesrc \n\ -udp_source = udpsrc \n\ +audio_source = "DEFAULT_AUDIO_SOURCE" \n\ +camera_source = "DEFAULT_CAMERA_SOURCE" \n\ +video_source = "DEFAULT_VIDEO_SOURCE" \n\ +udp_source = "DEFAULT_UDP_SOURCE" \n\ \n\ \n\ [sinks] \n\ \n\ -audio_sink = pulsesink \n\ -video_sink = waylandsink \n\ -udp_sink = udpsink \n\ +audio_sink = "DEFAULT_AUDIO_SINK" \n\ +video_sink = "DEFAULT_VIDEO_SINK" \n\ +evas_sink = "DEFAULT_EVAS_SINK" \n\ +udp_sink = "DEFAULT_UDP_SINK" \n\ \n\ \n\ [h263] \n\ diff --git a/src/media_streamer.c b/src/media_streamer.c index 09c3a5d..5f18407 100755 --- a/src/media_streamer.c +++ b/src/media_streamer.c @@ -533,6 +533,26 @@ int media_streamer_get_play_position(media_streamer_h streamer, int *time) return ret; } +int media_streamer_get_duration(media_streamer_h streamer, int *duration) +{ + media_streamer_s *ms_streamer = (media_streamer_s *)streamer; + ms_retvm_if(ms_streamer == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + + ms_retvm_if(ms_streamer->state < MEDIA_STREAMER_STATE_READY || + ms_streamer->state > MEDIA_STREAMER_STATE_PAUSED, + MEDIA_STREAMER_ERROR_INVALID_STATE, + "The media streamer state is not in the appropriate state"); + + int ret = MEDIA_STREAMER_ERROR_NONE; + g_mutex_lock(&ms_streamer->mutex_lock); + + ret = __ms_get_duration(streamer, duration); + + g_mutex_unlock(&ms_streamer->mutex_lock); + + return ret; +} + int media_streamer_node_push_packet(media_streamer_node_h src, media_packet_h packet) { media_streamer_node_s *ms_node = (media_streamer_node_s *) src; diff --git a/src/media_streamer_gst.c b/src/media_streamer_gst.c index 6c9249b..4565623 100755 --- a/src/media_streamer_gst.c +++ b/src/media_streamer_gst.c @@ -218,6 +218,10 @@ gboolean __ms_element_set_property(GstElement * element, const char *key, const pint = atoi(param_value); g_object_set(obj, init_name, pint, NULL); ms_info("Set int value: [%d] ", pint); + } else if (!g_strcmp0(key, MEDIA_STREAMER_PARAM_EVAS_OBJECT)) { + g_value_set_pointer(&value, (gpointer)param_value); + g_object_set(obj, init_name, (gpointer)param_value, NULL); + ms_info("Set pointer: [%p]", g_value_get_pointer(&value)); } else if (!g_strcmp0(key, MEDIA_STREAMER_PARAM_VISIBLE)) { bool_val = !g_strcmp0(param_value, "true") ? TRUE : FALSE; g_value_set_boolean(&value, bool_val); @@ -1253,7 +1257,7 @@ int __ms_add_node_into_bin(media_streamer_s * ms_streamer, media_streamer_node_s break; case MEDIA_STREAMER_NODE_TYPE_SINK: switch (ms_node->subtype) { - case MEDIA_STREAMER_NODE_SINK_TYPE_SCREEN: + case MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY: bin = ms_streamer->sink_video_bin; break; case MEDIA_STREAMER_NODE_SINK_TYPE_AUDIO: diff --git a/src/media_streamer_node.c b/src/media_streamer_node.c index 4c6a981..e0dd8df 100755 --- a/src/media_streamer_node.c +++ b/src/media_streamer_node.c @@ -41,6 +41,7 @@ char *param_table[PROPERTY_COUNT][2] = { {MEDIA_STREAMER_PARAM_ROTATE, "rotate"}, {MEDIA_STREAMER_PARAM_FLIP, "flip"}, {MEDIA_STREAMER_PARAM_DISPLAY_GEOMETRY_METHOD, "display-geometry-method"}, + {MEDIA_STREAMER_PARAM_EVAS_OBJECT, "evas-object"}, {MEDIA_STREAMER_PARAM_VISIBLE, "visible"}, {MEDIA_STREAMER_PARAM_HOST, "host"} }; @@ -377,7 +378,7 @@ int __ms_sink_node_create(media_streamer_node_s * node) plugin_name = __ms_ini_get_string(dict, "sinks:audio_sink", DEFAULT_AUDIO_SINK); node->gst_element = __ms_element_create(plugin_name, NULL); break; - case MEDIA_STREAMER_NODE_SINK_TYPE_SCREEN: + case MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY: plugin_name = __ms_ini_get_string(dict, "sinks:video_sink", DEFAULT_VIDEO_SINK); node->gst_element = __ms_element_create(plugin_name, NULL); break; diff --git a/src/media_streamer_priv.c b/src/media_streamer_priv.c index 801e012..d27e3bc 100644 --- a/src/media_streamer_priv.c +++ b/src/media_streamer_priv.c @@ -83,6 +83,7 @@ int __ms_create(media_streamer_s * ms_streamer) int __ms_get_position(media_streamer_s *ms_streamer, int *time) { ms_retvm_if(ms_streamer == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + ms_retvm_if(time == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Return value is NULL"); gint64 current = -1; @@ -97,6 +98,24 @@ int __ms_get_position(media_streamer_s *ms_streamer, int *time) return MEDIA_STREAMER_ERROR_NONE; } +int __ms_get_duration(media_streamer_s *ms_streamer, int *time) +{ + ms_retvm_if(ms_streamer == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); + ms_retvm_if(time == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Return value is NULL"); + + gint64 duration = -1; + + if (!gst_element_query_duration(ms_streamer->pipeline, GST_FORMAT_TIME, &duration)) { + ms_error("Could not query current duration."); + return MEDIA_STREAMER_ERROR_INVALID_OPERATION; + } else { + *time = (int)(((GstClockTime)(duration)) / GST_MSECOND); + ms_info("Media streamer queried duration [%d] msec successfully.", *time); + } + + return MEDIA_STREAMER_ERROR_NONE; +} + int __ms_streamer_seek(media_streamer_s *ms_streamer, int g_time, bool flag) { ms_retvm_if(ms_streamer == NULL, MEDIA_STREAMER_ERROR_INVALID_PARAMETER, "Handle is NULL"); diff --git a/test/media_streamer_test.c b/test/media_streamer_test.c index fa83f23..ad0d8ea 100755 --- a/test/media_streamer_test.c +++ b/test/media_streamer_test.c @@ -345,7 +345,7 @@ static void _create_file_playing() /*********************** videosink *********************************** */ media_streamer_node_h video_sink = NULL; - media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_SCREEN, &video_sink); + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink); media_streamer_node_add(current_media_streamer, video_sink); APPEND_NODE(video_sink); @@ -372,7 +372,7 @@ static void _create_file_sub_playing() /*********************** videosink *********************************** */ media_streamer_node_h video_sink = NULL; - media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_SCREEN, &video_sink); + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink); media_streamer_node_add(current_media_streamer, video_sink); APPEND_NODE(video_sink); @@ -403,7 +403,7 @@ static void _create_http_playing() /*********************** videosink *********************************** */ media_streamer_node_h video_sink = NULL; - media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_SCREEN, &video_sink); + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink); media_streamer_node_add(current_media_streamer, video_sink); APPEND_NODE(video_sink); @@ -558,7 +558,7 @@ static void _create_rtp_client(media_streamer_node_h rtp_bin) /*********************** videosink *********************************** */ media_streamer_node_h video_sink = NULL; - media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_SCREEN, &video_sink); + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink); media_streamer_node_add(current_media_streamer, video_sink); APPEND_NODE(video_sink); @@ -614,7 +614,7 @@ static void _create_rtp_client_autoplug(media_streamer_node_h rtp_bin) /*********************** videosink *********************************** */ media_streamer_node_h video_sink = NULL; - media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_SCREEN, &video_sink); + media_streamer_node_create_sink(MEDIA_STREAMER_NODE_SINK_TYPE_OVERLAY, &video_sink); media_streamer_node_add(current_media_streamer, video_sink); APPEND_NODE(video_sink);