Add msg handling to get num of video out buffer 30/68230/6 accepted/tizen/common/20160509.135040 accepted/tizen/ivi/20160510.002305 accepted/tizen/mobile/20160510.002155 accepted/tizen/tv/20160510.002237 accepted/tizen/wearable/20160510.002215 submit/tizen/20160509.073743
authorEunhae Choi <eunhae1.choi@samsung.com>
Tue, 3 May 2016 05:48:24 +0000 (14:48 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Wed, 4 May 2016 06:12:25 +0000 (15:12 +0900)
Change-Id: I28fcc6757ea1aa84935f796ea869ca38458edf37
Signed-off-by: Eunhae Choi <eunhae1.choi@samsung.com>
packaging/libmm-player.spec
src/include/mm_player.h
src/include/mm_player_priv.h
src/mm_player.c
src/mm_player_es.c
src/mm_player_priv.c

index 909e9b2..5b50f97 100644 (file)
@@ -3,7 +3,7 @@
 
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.5.76
+Version:    0.5.77
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 95c89e5..821375d 100644 (file)
@@ -2258,6 +2258,20 @@ int mm_player_set_video_stream_changed_callback(MMHandleType player, mm_player_s
 int mm_player_get_timeout(MMHandleType player, int *timeout);
 
 /**
+ * This function is to get the number of video output buffers.
+ * It's only supported when video stream is included in file. \n
+ *
+ * @param      player  [in] Handle of player.
+ * @param      num     [out] num of buffers.
+ * @param      extra_num [out] extra num of buffers.
+ *
+ * @return     This function returns zero on success, or negative value with error
+ *                     code.
+ * @since 3.0
+ */
+int mm_player_get_num_of_video_out_buffers(MMHandleType player, int *num, int *extra_num);
+
+/**
        @}
  */
 
index de46b9f..812962a 100644 (file)
@@ -508,6 +508,8 @@ typedef struct {
        guint media_stream_buffer_min_percent[MM_PLAYER_STREAM_TYPE_MAX];
        mm_player_media_stream_buffer_status_callback media_stream_buffer_status_cb[MM_PLAYER_STREAM_TYPE_MAX];
        mm_player_media_stream_seek_data_callback media_stream_seek_data_cb[MM_PLAYER_STREAM_TYPE_MAX];
+       int video_num_buffers;  /* total num of buffers in vcodec */
+       int video_extra_num_buffers; /* extra num of buffers in vcodec */
 
        void* buffer_cb_user_param;
 
@@ -834,6 +836,7 @@ void * _mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer);
 void _mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer);
 int _mmplayer_set_pcm_spec(MMHandleType hplayer, int samplerate, int channel);
 int _mmplayer_get_timeout(MMHandleType hplayer, int *timeout);
+int _mmplayer_get_num_of_video_out_buffers(MMHandleType hplayer, int *num, int *extra_num);
 int __mmplayer_gst_set_state (mm_player_t* player, GstElement * pipeline,  GstState state, gboolean async, gint timeout );
 int __mmplayer_set_state(mm_player_t* player, int state);
 int __mmplayer_check_state(mm_player_t* player, enum PlayerCommandState command);
index 9e5c7f9..33119b2 100644 (file)
@@ -1267,3 +1267,19 @@ int mm_player_get_timeout(MMHandleType player, int *timeout)
        return result;
 }
 
+int mm_player_get_num_of_video_out_buffers(MMHandleType player, int *num, int *extra_num)
+{
+       int result = MM_ERROR_NONE;
+
+       MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
+       MMPLAYER_RETURN_VAL_IF_FAIL(num && extra_num, MM_ERROR_COMMON_INVALID_ARGUMENT);
+
+       MMPLAYER_CMD_LOCK( player );
+
+       result = _mmplayer_get_num_of_video_out_buffers(player, num, extra_num);
+
+       MMPLAYER_CMD_UNLOCK( player );
+
+       return result;
+}
+
index ac5d385..449e675 100644 (file)
@@ -115,10 +115,13 @@ _parse_media_format (MMPlayerVideoStreamInfo * video,
   }
 
   if (video) {
+#define DEFAULT_FRAMERATE_NUM 30
+#define DEFAULT_FRAMERATE_DEN 1
     media_format_mimetype_e mime;
-    int width;
-    int height;
-    int avg_bps;
+    int width = 0;
+    int height = 0;
+    int avg_bps = 0;
+    int frame_rate = 0;
 
     if (media_format_get_video_info (format, &mime, &width, &height, &avg_bps,
             NULL) != MEDIA_FORMAT_ERROR_NONE) {
@@ -126,9 +129,17 @@ _parse_media_format (MMPlayerVideoStreamInfo * video,
          return MM_ERROR_PLAYER_INTERNAL;
     }
 
+    if (media_format_get_video_frame_rate(format, &frame_rate)) {
+        LOGW ("failed to get video frame rate, will be set 30.");
+    }
+    LOGD ("frame_rate %d", frame_rate);
+
     _convert_media_format_video_mime_to_str (video, mime);
+
     video->width = width;
     video->height = height;
+    video->framerate_num = (frame_rate>0)?(frame_rate):(DEFAULT_FRAMERATE_NUM);
+    video->framerate_den = DEFAULT_FRAMERATE_DEN;
   }
 
   return MM_ERROR_NONE;
index 27965c2..c41917f 100644 (file)
@@ -93,6 +93,7 @@
 #define PLAYBACK_RATE_EX_AUDIO_MAX             2.0
 #define PLAYBACK_RATE_EX_VIDEO_MIN             0.5
 #define PLAYBACK_RATE_EX_VIDEO_MAX             1.5
+#define DEFAULT_NUM_OF_V_OUT_BUFFER            3
 
 #define GST_QUEUE_DEFAULT_TIME                 4
 #define GST_QUEUE_HLS_TIME                             8
@@ -1692,6 +1693,23 @@ __mmplayer_gst_callback(GstBus *bus, GstMessage *msg, gpointer data) // @
                                if (!structure_name)
                                        break;
 
+                               if (!strcmp(structure_name, "prepare-decode-buffers"))
+                               {
+                                       gint num_buffers = 0;
+                                       gint extra_num_buffers = 0;
+
+                                       if (gst_structure_get_int (gst_message_get_structure(msg), "num_buffers", &num_buffers)) {
+                                               player->video_num_buffers = num_buffers;
+                                               LOGD("video_num_buffers : %d", player->video_num_buffers);
+                                       }
+
+                                       if (gst_structure_get_int (gst_message_get_structure(msg), "extra_num_buffers", &extra_num_buffers)) {
+                                               player->video_extra_num_buffers = extra_num_buffers;
+                                               LOGD("num_of_vout_extra num buffers : %d", extra_num_buffers);
+                                       }
+                                       break;
+                               }
+
                                if (!strcmp(structure_name, "Language_list"))
                                {
                                        const GValue *lang_list = NULL;
@@ -6247,7 +6265,7 @@ __gst_appsrc_seek_data(GstElement *element, guint64 offset, gpointer user_data)
 
        MMPLAYER_RETURN_VAL_IF_FAIL ( player, FALSE );
 
-       LOGI("app-src: seek data\n");
+       LOGI("app-src: seek data, offset: %llu\n", offset);
 
        if(player->media_stream_seek_data_cb[type])
                player->media_stream_seek_data_cb[type](type, offset, player->buffer_cb_user_param);
@@ -9090,7 +9108,8 @@ _mmplayer_create_player(MMHandleType handle) // @
        player->video_share_api_delta = 0;
        player->video_share_clock_delta = 0;
        player->has_closed_caption = FALSE;
-
+       player->video_num_buffers = DEFAULT_NUM_OF_V_OUT_BUFFER;
+       player->video_extra_num_buffers = 0;
        if (player->ini.dump_element_keyword[0][0] == '\0')
        {
                player->ini.set_dump_element_flag= FALSE;
@@ -16126,9 +16145,8 @@ _mmplayer_enable_media_packet_video_stream(MMHandleType hplayer, bool enable)
        mm_player_t* player = (mm_player_t*) hplayer;
 
        MMPLAYER_FENTER();
-
        MMPLAYER_RETURN_VAL_IF_FAIL (player, MM_ERROR_PLAYER_NOT_INITIALIZED);
-       MMPLAYER_RETURN_VAL_IF_FAIL (enable == TRUE || enable == FALSE, MM_ERROR_INVALID_ARGUMENT);
+
        if(enable)
                player->bufmgr = tbm_bufmgr_init(-1);
        else {
@@ -16268,7 +16286,7 @@ __gst_seek_audio_data (GstElement * appsrc, guint64 position, gpointer user_data
 
        MMPLAYER_RETURN_VAL_IF_FAIL( player, FALSE );
 
-       LOGD("app-src: seek audio data\n");
+       LOGD("app-src: seek audio data %llu\n", position);
 
        if (player->media_stream_seek_data_cb[type])
        {
@@ -16286,7 +16304,7 @@ __gst_seek_video_data (GstElement * appsrc, guint64 position, gpointer user_data
 
        MMPLAYER_RETURN_VAL_IF_FAIL( player, FALSE );
 
-       LOGD("app-src: seek video data\n");
+       LOGD("app-src: seek video data %llu\n", position);
 
        if (player->media_stream_seek_data_cb[type])
        {
@@ -16350,3 +16368,21 @@ int _mmplayer_get_timeout(MMHandleType hplayer, int *timeout)
        return MM_ERROR_NONE;
 }
 
+int _mmplayer_get_num_of_video_out_buffers(MMHandleType hplayer, int *num, int *extra_num)
+{
+       mm_player_t* player = (mm_player_t*) hplayer;
+
+       MMPLAYER_FENTER();
+
+       MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
+       MMPLAYER_RETURN_VAL_IF_FAIL(num && extra_num, MM_ERROR_COMMON_INVALID_ARGUMENT);
+
+       *num = player->video_num_buffers;
+       *extra_num = player->video_extra_num_buffers;
+
+       LOGD("state %d, num %d(%d)\n", MMPLAYER_CURRENT_STATE(player), *num, *extra_num);
+
+       MMPLAYER_FLEAVE();
+       return MM_ERROR_NONE;
+}
+