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? > @@ -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