diff options
author | Thibaut Mattern <tmattern@users.sourceforge.net> | 2003-05-11 12:59:38 +0000 |
---|---|---|
committer | Thibaut Mattern <tmattern@users.sourceforge.net> | 2003-05-11 12:59:38 +0000 |
commit | 9b37bb8059ada2e9cb3db3d109c4cd919ff1c97b (patch) | |
tree | 0f31d75b8303f265fe7bd9970d24faf4ee61eda4 /src | |
parent | 576549e58ddedec13e2060b2dac4c7e7d53dd17f (diff) | |
download | xine-lib-9b37bb8059ada2e9cb3db3d109c4cd919ff1c97b.tar.gz xine-lib-9b37bb8059ada2e9cb3db3d109c4cd919ff1c97b.tar.bz2 |
Little seeking improvement.
Change the frame dropping policy to not drop frames immediately after a seek.
CVS patchset: 4820
CVS date: 2003/05/11 12:59:38
Diffstat (limited to 'src')
-rw-r--r-- | src/xine-engine/video_out.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c index 356d39bce..360c383b9 100644 --- a/src/xine-engine/video_out.c +++ b/src/xine-engine/video_out.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_out.c,v 1.158 2003/05/06 20:50:12 miguelfreitas Exp $ + * $Id: video_out.c,v 1.159 2003/05/11 12:59:38 tmattern Exp $ * * frame allocation / queuing / scheduling / output functions */ @@ -90,6 +90,8 @@ typedef struct { int current_width, current_height; int64_t current_duration; + int frame_drop_limit; + int frame_drop_cpt; } vos_t; /* @@ -333,7 +335,24 @@ static int vo_frame_draw (vo_frame_t *img, xine_stream_t *stream) { /* avoid division by zero */ if( img->duration <= 0 ) img->duration = 3000; - frames_to_skip = ((-1 * diff) / img->duration + 2) * 2; + + /* Frame dropping slow start: + * The engine starts to drop frames if there is less than frame_drop_limit + * frames in advance. There might be a problem just after a seek because + * there is no frame in advance yet. + * The following code increases progressively the frame_drop_limit (-2 -> 3) + * after a seek to give a chance to the engine to display the first frames + * smootly before starting to drop frames if the decoder is really too + * slow. + */ + if (stream->first_frame_flag == 2) + this->frame_drop_cpt = 10; + + if (this->frame_drop_cpt) { + this->frame_drop_limit = 3 - (this->frame_drop_cpt / 2); + this->frame_drop_cpt--; + } + frames_to_skip = ((-1 * diff) / img->duration + this->frame_drop_limit) * 2; if (frames_to_skip<0) frames_to_skip = 0; @@ -1435,6 +1454,9 @@ xine_video_port_t *vo_new_port (xine_t *xine, vo_driver_t *driver, this->overlay_source->init (this->overlay_source); this->overlay_enabled = 1; + this->frame_drop_limit = 3; + this->frame_drop_cpt = 0; + num_frame_buffers = driver->get_property (driver, VO_PROP_MAX_NUM_FRAMES); if (!num_frame_buffers) |