static void
video_obj_time_changed(Evas_Object *obj, Evas_Object *edje)
{
- double pos, len, scale;
+ double pos, len, scale, bsize;
char buf[256];
int ph, pm, ps, pf, lh, lm, ls;
pos = emotion_object_position_get(obj);
len = emotion_object_play_length_get(obj);
-// printf("%3.3f, %3.3f\n", pos, len);
+ bsize = emotion_object_buffer_size_get(obj);
+ // printf("%3.3f, %3.3f [%.2f]\n", pos, len, bsize);
scale = (len > 0.0) ? pos / len : 0.0;
edje_object_part_drag_value_set(edje, "video_progress", scale, 0.0);
lh = len / 3600;
* media file.
*/
EAPI double emotion_object_position_get (const Evas_Object *obj);
+
+/**
+ * @brief Get the percentual size of the buffering cache.
+ *
+ * @param obj The emotion object from which the buffer size will be retrieved.
+ * @return The buffer percent size, ranging from 0.0 to 1.0
+ *
+ * The buffer size is returned as a number between 0.0 and 1.0, 0.0 means
+ * the buffer if empty, 1.0 means full.
+ * If no buffering is in progress 1.0 is returned. In all other cases (maybe
+ * the backend don't support buffering) 1.0 is returned, thus you can always
+ * check for buffer_size < 1.0 to know if buffering is in progress.
+ *
+ * @warning xine backends don't implement this (will return 1.0).
+ */
+EAPI double emotion_object_buffer_size_get (const Evas_Object *obj);
+
/**
* @brief Get whether the media file is seekable.
*
void (*size_get) (void *ef, int *w, int *h);
void (*pos_set) (void *ef, double pos);
double (*len_get) (void *ef);
+ double (*buffer_size_get) (void *ef);
int (*fps_num_get) (void *ef);
int (*fps_den_get) (void *ef);
double (*fps_get) (void *ef);
return sd->pos;
}
+EAPI double
+emotion_object_buffer_size_get(const Evas_Object *obj)
+{
+ Smart_Data *sd;
+
+ E_SMART_OBJ_GET_RETURN(sd, obj, E_OBJ_NAME, 1.0);
+ if (!sd->module) return 1.0;
+ if (!sd->video_data) return 1.0;
+ if (!sd->module->buffer_size_get) return 1.0;
+ return sd->module->buffer_size_get(sd->video_data);
+}
+
EAPI Eina_Bool
emotion_object_seekable_get(const Evas_Object *obj)
{
ev->pos = position;
_emotion_video_pos_update(ev->obj, ev->pos, ev->len);
-
+/* hmmm. no _emotion_progress_set() is for "buffering" progress.
if (ev->len == 0)
return;
snprintf(buf, sizeof(buf), "%0.1f%%", progress * 100);
_emotion_progress_set(ev->obj, buf, progress);
+ */
}
static void
return ev->len;
}
+static double
+em_buffer_size_get(void *data)
+{
+ Emotion_Generic_Video *ev = data;
+ return 1.0;
+ ev = NULL;
+}
+
static int
em_fps_num_get(void *data)
{
em_size_get, /* size_get */
em_pos_set, /* pos_set */
em_len_get, /* len_get */
+ em_buffer_size_get, /* buffer_size_get */
em_fps_num_get, /* fps_num_get */
em_fps_den_get, /* fps_den_get */
em_fps_get, /* fps_get */
static double em_len_get (void *video);
+static double em_buffer_size_get (void *video);
+
static int em_fps_num_get (void *video);
static int em_fps_den_get (void *video);
em_size_get, /* size_get */
em_pos_set, /* pos_set */
em_len_get, /* len_get */
+ em_buffer_size_get, /* buffer_size_get */
em_fps_num_get, /* fps_num_get */
em_fps_den_get, /* fps_den_get */
em_fps_get, /* fps_get */
return 0.0;
}
+static double
+em_buffer_size_get(void *video)
+{
+ Emotion_Gstreamer_Video *ev;
+
+ GstQuery *query;
+ gboolean busy;
+ gint percent;
+
+ ev = video;
+
+ if (!ev->pipeline) return 0.0;
+
+ query = gst_query_new_buffering(GST_FORMAT_DEFAULT);
+ if (gst_element_query(ev->pipeline, query))
+ gst_query_parse_buffering_percent(query, &busy, &percent);
+ else
+ percent = 100;
+
+ gst_query_unref(query);
+ return ((float)(percent)) / 100.0;
+}
+
static int
em_fps_num_get(void *video)
{
static void em_stop (void *ef);
static void em_size_get (void *ef, int *w, int *h);
static void em_pos_set (void *ef, double pos);
+static double em_buffer_size_get (void *ef);
static double em_len_get (void *ef);
static int em_fps_num_get (void *ef);
static int em_fps_den_get (void *ef);
pthread_create(&ev->slave_th, NULL, _em_slave, ev);
pthread_detach(ev->slave_th);
_em_slave_event(ev, 1, NULL);
+
+ ev->buffer = 1.0;
*emotion_video = ev;
return 1;
return ev->len;
}
+static double
+em_buffer_size_get(void *ef)
+{
+ Emotion_Xine_Video *ev;
+
+ ev = (Emotion_Xine_Video *)ef;
+ return ev->buffer;
+}
+
static int
em_fps_num_get(void *ef)
{
{
int fd, len;
void *buf[2];
-
+
fd = ecore_main_fd_handler_fd_get(fdh);
while ((len = read(fd, buf, sizeof(buf))) > 0)
{
e = (xine_progress_data_t *)eev->xine_event;
DBG("PROGRESS: %i", e->percent);
+ ev->buffer = e->percent;
_emotion_progress_set(ev->obj, (char *)e->description, (double)e->percent / 100.0);
}
break;
em_size_get, /* size_get */
em_pos_set, /* pos_set */
em_len_get, /* len_get */
+ em_buffer_size_get, /* buffer_size_get */
em_fps_num_get, /* fps_num_get */
em_fps_den_get, /* fps_den_get */
em_fps_get, /* fps_get */
volatile double pos;
volatile double last_pos;
volatile double volume;
+ volatile double buffer;
double fps;
double ratio;
int w, h;