summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTorsten Jager <t.jager@gmx.de>2011-08-22 11:50:16 +0200
committerTorsten Jager <t.jager@gmx.de>2011-08-22 11:50:16 +0200
commit7e6f30b0062375c30db8e67b464c7fe003ed15d5 (patch)
tree44de6d93c143ceb1f9d240a833dd43c23d2ae5b7 /src
parent078eade9b4a427497250ca567ebe1865ecd47a8f (diff)
downloadxine-lib-7e6f30b0062375c30db8e67b464c7fe003ed15d5.tar.gz
xine-lib-7e6f30b0062375c30db8e67b464c7fe003ed15d5.tar.bz2
UI freeze fix
xine_play () gets suspended after start or seek until first frame gets displayed. This often wont work on slow machines when first frame gets dropped because its too old. Consequently, UI freezes for full 10 seconds. Let's wake up xine_play when this happens as well. OK, this is a luxury convenience fix ;-)
Diffstat (limited to 'src')
-rw-r--r--src/xine-engine/video_out.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c
index 0bbf977f2..f3e24537e 100644
--- a/src/xine-engine/video_out.c
+++ b/src/xine-engine/video_out.c
@@ -802,7 +802,7 @@ static void expire_frames (vos_t *this, int64_t cur_vpts) {
while (img) {
- if (img->is_first) {
+ if (img->is_first > 0) {
lprintf("expire_frames: first_frame !\n");
/*
@@ -819,6 +819,8 @@ static void expire_frames (vos_t *this, int64_t cur_vpts) {
img->vpts = cur_vpts + FIRST_FRAME_POLL_DELAY;
}
img->is_first--;
+ /* make sure to wake up xine_play even if this first frame gets discarded */
+ if (img->is_first == 0) img->is_first = -1;
break;
}
@@ -848,6 +850,24 @@ static void expire_frames (vos_t *this, int64_t cur_vpts) {
pthread_mutex_lock( &img->stream->current_extra_info_lock );
_x_extra_info_merge( img->stream->current_extra_info, img->extra_info );
pthread_mutex_unlock( &img->stream->current_extra_info_lock );
+ /* wake up xine_play now if we just discarded first frame */
+ if (img->is_first != 0) {
+ xine_list_iterator_t ite;
+ pthread_mutex_lock (&this->streams_lock);
+ for (ite = xine_list_front(this->streams); ite;
+ ite = xine_list_next(this->streams, ite)) {
+ xine_stream_t *stream = xine_list_get_value (this->streams, ite);
+ if (stream == XINE_ANON_STREAM) continue;
+ pthread_mutex_lock (&stream->first_frame_lock);
+ if (stream->first_frame_flag) {
+ stream->first_frame_flag = 0;
+ pthread_cond_broadcast (&stream->first_frame_reached);
+ }
+ pthread_mutex_unlock (&stream->first_frame_lock);
+ }
+ pthread_mutex_unlock(&this->streams_lock);
+ xine_log (this->xine, XINE_LOG_MSG, _("video_out: just discarded first frame after seek\n"));
+ }
}
/* when flushing frames, keep the first one as backup */