rage videothumb - use new skip header feature to avoid stutters

This commit is contained in:
Carsten Haitzler 2017-01-09 16:18:07 +09:00
parent f7875643dd
commit d66c83a547
1 changed files with 51 additions and 71 deletions

View File

@ -78,30 +78,10 @@ _thumb_update(Evas_Object *obj)
if (!sd) return;
snprintf(buf, sizeof(buf), "%u", sd->realpos);
evas_object_image_file_set(sd->o_img2, NULL, NULL);
evas_object_image_file_set(sd->o_img2, sd->realfile, buf);
evas_object_image_size_get(sd->o_img2, &(sd->iw), &(sd->ih));
if ((sd->iw <= 0) || (sd->ih <= 0))
{
if (sd->cycle_timer)
{
sd->pos = 0.0;
if (!sd->thumb_exe)
{
_videothumb_eval(obj, EINA_TRUE);
}
}
else
{
evas_object_del(sd->o_img2);
sd->o_img2 = NULL;
evas_object_smart_callback_call(obj, "failed", NULL);
}
}
else
{
evas_object_image_preload(sd->o_img, EINA_FALSE);
evas_object_smart_callback_call(obj, "loaded", NULL);
}
evas_object_image_file_set(sd->o_img2, sd->realfile,
sd->poster ? NULL : buf);
evas_object_image_preload(sd->o_img2, EINA_FALSE);
evas_object_smart_callback_call(obj, "loaded", NULL);
}
static void
@ -232,13 +212,10 @@ _cb_thumb_exe(void *data, int type EINA_UNUSED, void *event)
{
_thumb_match_update(o, sd->realpath);
}
if ((sd->iw <= 0) || (sd->ih <= 0))
if (sd->exe_handler)
{
if (sd->exe_handler)
{
ecore_event_handler_del(sd->exe_handler);
sd->exe_handler = NULL;
}
ecore_event_handler_del(sd->exe_handler);
sd->exe_handler = NULL;
}
return EINA_FALSE;
}
@ -254,8 +231,48 @@ _cb_preload(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void
if (sd->o_img) evas_object_del(sd->o_img);
sd->o_img = sd->o_img2;
sd->o_img2 = NULL;
evas_object_show(sd->o_img);
evas_object_smart_callback_call(data, "data", NULL);
evas_object_image_size_get(sd->o_img, &(sd->iw), &(sd->ih));
if ((sd->iw <= 0) || (sd->ih <= 0))
{
if (sd->cycle_timer)
{
if (sd->pos == 0.0)
{
_videothumb_launch(data);
}
else
{
sd->pos = 0.0;
if (!sd->thumb_exe) _videothumb_eval(data, EINA_TRUE);
}
}
else
{
evas_object_del(sd->o_img);
sd->o_img = NULL;
evas_object_smart_callback_call(data, "failed", NULL);
}
}
else
{
Eina_Bool ok = EINA_FALSE;
struct stat st1, st2;
if (stat(sd->realpath, &st1) == 0)
{
if (stat(sd->realfile, &st2) == 0)
{
if (st1.st_mtime < st2.st_mtime) ok = EINA_TRUE;
}
}
if (ok)
{
evas_object_show(sd->o_img);
evas_object_smart_callback_call(data, "data", NULL);
}
else _videothumb_launch(data);
}
_smart_calculate(data);
}
static void
@ -272,6 +289,7 @@ _videothumb_image_load(Evas_Object *obj)
if (!sd) return;
if (!sd->file) return;
sd->o_img2 = evas_object_image_filled_add(evas_object_evas_get(obj));
evas_object_image_load_head_skip_set(sd->o_img2, EINA_TRUE);
evas_object_smart_member_add(sd->o_img2, obj);
if (sd->poster_mode)
{
@ -312,46 +330,8 @@ _videothumb_image_load(Evas_Object *obj)
_cb_preload, obj);
evas_object_image_file_set(sd->o_img2, sd->realfile,
sd->poster ? NULL : buf);
evas_object_image_size_get(sd->o_img2, &(sd->iw), &(sd->ih));
evas_object_image_preload(sd->o_img2, EINA_FALSE);
_smart_calculate(obj);
if (sd->iw > 0)
{
Eina_Bool ok = EINA_FALSE;
struct stat st1, st2;
if (stat(sd->realpath, &st1) == 0)
{
if (stat(sd->realfile, &st2) == 0)
{
if (st1.st_mtime < st2.st_mtime) ok = EINA_TRUE;
}
}
if (ok)
{
evas_object_image_preload(sd->o_img2, EINA_FALSE);
return;
}
}
if (sd->iw <= 0)
{
Eina_Bool ok = EINA_FALSE;
struct stat st1, st2;
if (stat(sd->realpath, &st1) == 0)
{
if (stat(sd->realfile, &st2) == 0)
{
if (st1.st_mtime < st2.st_mtime)
{
ok = EINA_TRUE;
}
}
}
if (!ok)
{
_videothumb_launch(obj);
}
}
}
static void