summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReinhard Nißl <rnissl@gmx.de>2007-04-15 21:39:37 +0200
committerReinhard Nißl <rnissl@gmx.de>2007-04-15 21:39:37 +0200
commitbcf37512cdb7e72162917ceb5dfa7bbc4d486485 (patch)
tree95d99d9ab68e37f1f65aedf187fa97c99f628219
parentb55b86b40e17a331fe2131ba4e6e3e76d0ba061c (diff)
downloadxine-lib-bcf37512cdb7e72162917ceb5dfa7bbc4d486485.tar.gz
xine-lib-bcf37512cdb7e72162917ceb5dfa7bbc4d486485.tar.bz2
Avoid skipping an unsuitable frame when there are only few buffers
available. Usually it's a good idea to avoid reallocating frames especially when a deinterlacer needs a different format than the decoder, as this would then happen all the time. But when there is only a limited number of frames available, then even a single frame which is not scheduled at frame allocation may let the number of frames ready for displaying drop below frame drop limit and thus resulting in unnecessary frame drops.
-rw-r--r--src/xine-engine/video_out.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c
index d61df1eb2..852e13524 100644
--- a/src/xine-engine/video_out.c
+++ b/src/xine-engine/video_out.c
@@ -71,6 +71,7 @@ typedef struct {
vo_frame_t *first;
vo_frame_t *last;
int num_buffers;
+ int num_buffers_max;
int locked_for_read;
pthread_mutex_t mutex;
@@ -144,9 +145,11 @@ static img_buf_fifo_t *vo_new_img_buf_queue () {
queue = (img_buf_fifo_t *) xine_xmalloc (sizeof (img_buf_fifo_t));
if( queue ) {
- queue->first = NULL;
- queue->last = NULL;
- queue->num_buffers = 0;
+ queue->first = NULL;
+ queue->last = NULL;
+ queue->num_buffers = 0;
+ queue->num_buffers_max = 0;
+
queue->locked_for_read = 0;
pthread_mutex_init (&queue->mutex, NULL);
pthread_cond_init (&queue->not_empty, NULL);
@@ -173,6 +176,8 @@ static void vo_append_to_img_buf_queue_int (img_buf_fifo_t *queue,
}
queue->num_buffers++;
+ if (queue->num_buffers_max < queue->num_buffers)
+ queue->num_buffers_max = queue->num_buffers;
pthread_cond_signal (&queue->not_empty);
}
@@ -213,14 +218,15 @@ static vo_frame_t *vo_remove_from_img_buf_queue_int (img_buf_fifo_t *queue, int
if( width && height ) {
if( !img ) {
- if( queue->num_buffers == 1 && !blocking) {
+ if( queue->num_buffers == 1 && !blocking && queue->num_buffers_max > 8) {
/* non-blocking and only a single frame on fifo with different
* format -> ignore it (give another chance of a frame format hit)
+ * only if we have a lot of buffers at all.
*/
lprintf("frame format mismatch - will wait another frame\n");
} else {
- /* we have at least 2 frames on fifo but they don't match ->
- * give up. return whatever we got.
+ /* we have just a limited number of buffers or at least 2 frames
+ * on fifo but they don't match -> give up. return whatever we got.
*/
img = queue->first;
lprintf("frame format miss (%d/%d)\n", i, queue->num_buffers);