On Thu, Feb 14, 2013 at 12:43 PM, Carsten Haitzler <ras...@rasterman.com> wrote: > On Wed, 13 Feb 2013 17:02:44 +0530 Arvind R <arvin...@gmail.com> said: > >> On Tue, Feb 12, 2013 at 4:41 PM, Carsten Haitzler <ras...@rasterman.com> >> wrote: >> > On Fri, 1 Feb 2013 22:29:56 +0530 Arvind R <arvin...@gmail.com> said: >> > >> > there - i did my changes to update less frequently - different to your >> > framecount method (time based with timeouts and deletion handling). rev >> > 83854. >> > >> On further probing, I found the following modification (included in >> the post on completing the mouse interface) to really clobber the bug. >> This does not require any minimisation/delay of update frequency, ... >> . It works on all my test clips with all backends (of emotion). From >> this, maybe you can figure out the actual cause of the bug - it may >> not be solved by your timer fix - I have to check it out. > > oh my timer thing doesnt fix any bug - it just improves the ui to not update > TOO often (eg 30 or 20 or 60 times a second, where each update may be very > minimal). its an optimization for things like audio playback for example. > > the below smells of a workaround... do you STOP getting changed callbacks > after > this? > No. But the changed callbacks don't disrupt the plauback -:) Yes, it IS a workaround.
>> @@ -176,9 +248,15 @@ _update_position(void *data, >> Evas_Object *obj __UNUSED__, >> void *event_info __UNUSED__) >> { >> + double pos; >> + >> ELM_PLAYER_DATA_GET(data, sd); >> >> - elm_video_play_position_set(sd->video, elm_slider_value_get(sd->slider)); >> + pos = elm_slider_value_get(sd->slider); >> + if (fabs(sd->pos - pos) > 0.1) { >> + elm_video_play_position_set(sd->video, pos); >> + sd->pos = pos; >> + } >> } >> >> >> >> Hi, >> >> >> >> The slider emits a "changed" signal when its internal representation >> >> of value really changes. It does not know whether the user dragged it >> >> or internal updates caused the value change. Most internal incremental >> >> updates when trimmed to the current resolution of the slider, do not >> >> cause a value change and the signal is not emitted on every "set". >> >> >> >> This behaviour causes a 'feedback-loop' in that the "changed" signal >> >> from an internal update, being undifferentiated from a "user-drag", >> >> causes a delayed reposition command to the emotion engine. The result >> >> is a nice 'track-jump-repeat' which in some extreme cases, a >> >> 'stuck-in-a-groove' effect. >> >> >> >> The foll. patch is a solution to this problem; and also reduces the >> >> frequency of slider updates. An alternate solution would be to use >> >> _smart_callback_del() before actually updating slider in >> >> elc_player.c:_update_slider(), and re-installing it back - but this >> >> could open the door to race conditions. >> >> >> >> Arvind >> >> --- >> >> >> >> diff -uprN a/src/lib/elc_player.c b/src/lib/elc_player.c >> >> --- a/src/lib/elc_player.c 2013-02-01 21:59:39.000000000 +0530 >> >> +++ b/src/lib/elc_player.c 2013-02-01 21:59:54.000000000 +0530 >> >> @@ -163,12 +163,35 @@ _update_slider(void *data, >> >> ELM_PLAYER_DATA_GET(data, sd); >> >> >> >> seekable = elm_video_is_seekable_get(sd->video); >> >> + if (seekable == sd->disabled) >> >> + elm_object_disabled_set(sd->slider, !seekable); >> >> + >> >> length = elm_video_play_length_get(sd->video); >> >> - pos = elm_video_play_position_get(sd->video); >> >> >> >> - elm_object_disabled_set(sd->slider, !seekable); >> >> - elm_slider_min_max_set(sd->slider, 0, length); >> >> - elm_slider_value_set(sd->slider, pos); >> >> + if (sd->length != length) { >> >> + sd->length = length; >> >> + elm_slider_min_max_set(sd->slider, 0, length); >> >> + } >> >> + >> >> + if (sd->frames < 0) { >> >> + pos = elm_video_play_position_get(sd->video); >> >> + if (fabs(sd->pos - pos) > 0.5) { >> >> + sd->pos = pos; >> >> + sd->frames = 30; >> >> + elm_slider_value_set(sd->slider, pos); >> >> + } >> >> + } >> >> +} >> >> + >> >> +static void >> >> +_frame_decoded_cb(void *data, >> >> + Evas_Object *obj __UNUSED__, >> >> + void *event_info __UNUSED__) >> >> +{ >> >> + ELM_PLAYER_DATA_GET(data, sd); >> >> + /* do not update slider on every frame */ >> >> + if (--sd->frames < 0) >> >> + _update_slider(data, obj, event_info); >> >> } >> >> >> >> static void >> >> @@ -176,9 +199,24 @@ _update_position(void *data, >> >> Evas_Object *obj __UNUSED__, >> >> void *event_info __UNUSED__) >> >> { >> >> + /* >> >> + * called wnenever the value of the slider is changed. >> >> + * - irespective of user drags >> >> + * or >> >> + * internal increments larger than the slider resolution. >> >> + * the 2nd case causes an inadvertent repositioning of stream >> >> + * which some engines respond to (xine). >> >> + * This is a feedback loop that needs to be broken. >> >> + */ >> >> + double pos; >> >> + >> >> ELM_PLAYER_DATA_GET(data, sd); >> >> >> >> - elm_video_play_position_set(sd->video, elm_slider_value_get >> >> (sd->slider)); >> >> + pos = elm_slider_value_get(sd->slider); >> >> + if (fabs(sd->pos - pos) > 0.25) { >> >> + elm_video_play_position_set(sd->video, pos); >> >> + sd->pos = pos; >> >> + } >> >> } >> >> >> >> static void >> >> @@ -455,7 +493,7 @@ _elm_player_smart_content_set(Eo *obj, v >> >> else elm_layout_signal_emit(obj, "elm,player,pause", "elm"); >> >> >> >> evas_object_smart_callback_add(sd->emotion, "frame_decode", >> >> - _update_slider, obj); >> >> + _frame_decoded_cb, obj); >> >> evas_object_smart_callback_add(sd->emotion, "frame_resize", >> >> _update_slider, obj); >> >> evas_object_smart_callback_add(sd->emotion, "length_change", >> >> @@ -495,9 +533,13 @@ _elm_player_smart_add(Eo *obj, void *_pd >> >> (priv->slider, _double_to_time, _str_free); >> >> elm_slider_units_format_function_set >> >> (priv->slider, _double_to_time, _str_free); >> >> - elm_slider_min_max_set(priv->slider, 0, 0); >> >> + elm_slider_min_max_set(priv->slider, 0, 1); >> >> elm_slider_value_set(priv->slider, 0); >> >> elm_object_disabled_set(priv->slider, EINA_TRUE); >> >> + priv->disabled = EINA_TRUE; >> >> + priv->length = 0.0; >> >> + priv->frames = 0; >> >> + priv->pos = 0.0; >> >> evas_object_size_hint_align_set(priv->slider, EVAS_HINT_FILL, 0.5); >> >> evas_object_size_hint_weight_set >> >> (priv->slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); >> >> diff -uprN a/src/lib/elm_widget_player.h b/src/lib/elm_widget_player.h >> >> --- a/src/lib/elm_widget_player.h 2012-11-26 12:02:53.000000000 +0530 >> >> +++ b/src/lib/elm_widget_player.h 2013-02-01 21:59:54.000000000 +0530 >> >> @@ -33,6 +33,11 @@ struct _Elm_Player_Smart_Data >> >> Evas_Object *rewind; >> >> Evas_Object *stop; >> >> Evas_Object *slider; >> >> + >> >> + Eina_Bool disabled; /* used for only-when-must changes */ >> >> + double length; /* --- ditto --- */ >> >> + short frames; /* used to reduce update frequency */ >> >> + double pos; /* inter-callback communication to break >> >> slider feedback loop */ >> >> }; >> >> >> >> /** >> >> >> >> ------------------------------------------------------------------------------ >> >> Everyone hates slow websites. So do we. >> >> Make your web apps faster with AppDynamics >> >> Download AppDynamics Lite for free today: >> >> http://p.sf.net/sfu/appdyn_d2d_jan >> >> _______________________________________________ >> >> enlightenment-users mailing list >> >> enlightenment-users@lists.sourceforge.net >> >> https://lists.sourceforge.net/lists/listinfo/enlightenment-users >> >> >> > >> > >> > -- >> > ------------- Codito, ergo sum - "I code, therefore I am" -------------- >> > The Rasterman (Carsten Haitzler) ras...@rasterman.com >> > >> > > > -- > ------------- Codito, ergo sum - "I code, therefore I am" -------------- > The Rasterman (Carsten Haitzler) ras...@rasterman.com > ------------------------------------------------------------------------------ Free Next-Gen Firewall Hardware Offer Buy your Sophos next-gen firewall before the end March 2013 and get the hardware for free! Learn more. http://p.sf.net/sfu/sophos-d2d-feb _______________________________________________ enlightenment-users mailing list enlightenment-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-users