Added get_duraiton() API and add evas sink node type. 01/52601/1
authorVyacheslav Valkovoy <v.valkovoy@samsung.com>
Tue, 24 Nov 2015 18:44:01 +0000 (20:44 +0200)
committerVyacheslav Valkovoy <v.valkovoy@samsung.com>
Tue, 24 Nov 2015 18:44:28 +0000 (20:44 +0200)
Change-Id: Iaa4991721676332b1a604dfc2cff20fffc961467
Signed-off-by: Vyacheslav Valkovoy <v.valkovoy@samsung.com>
include/media_streamer_priv.h
include/media_streamer_util.h
src/media_streamer.c
src/media_streamer_gst.c
src/media_streamer_node.c
src/media_streamer_priv.c
test/media_streamer_test.c

index 9d4b4c1..499e34b 100755 (executable)
@@ -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];
 
 /**
@@ -119,6 +119,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.
  *
  * @since_tizen 3.0
index b8d3af9..84bed46 100755 (executable)
@@ -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\
index 09c3a5d..5f18407 100755 (executable)
@@ -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;
index 6c9249b..4565623 100755 (executable)
@@ -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:
index 4c6a981..e0dd8df 100755 (executable)
@@ -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;
index 801e012..d27e3bc 100644 (file)
@@ -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");
index fa83f23..ad0d8ea 100755 (executable)
@@ -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);