[vlc-devel] commit: Added a picture_fifo_t helper. (Laurent Aimar )

git version control git at videolan.org
Sun May 31 01:49:14 CEST 2009


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sat May 30 23:31:25 2009 +0200| [39321c06a7ae911b161ca527a76be9311a80b0b2] | committer: Laurent Aimar 

Added a picture_fifo_t helper.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=39321c06a7ae911b161ca527a76be9311a80b0b2
---

 include/vlc_picture_fifo.h       |   89 +++++++++++++++++++++++++++++
 src/libvlccore.sym               |    7 ++
 src/video_output/vout_pictures.c |  117 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 213 insertions(+), 0 deletions(-)

diff --git a/include/vlc_picture_fifo.h b/include/vlc_picture_fifo.h
new file mode 100644
index 0000000..a881cea
--- /dev/null
+++ b/include/vlc_picture_fifo.h
@@ -0,0 +1,89 @@
+/*****************************************************************************
+ * vlc_picture_fifo.h: picture fifo definitions
+ *****************************************************************************
+ * Copyright (C) 2009 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef VLC_PICTURE_FIFO_H
+#define VLC_PICTURE_FIFO_H 1
+
+/**
+ * \file
+ * This file defines picture fifo structures and functions in vlc
+ */
+
+#include <vlc_picture.h>
+
+/**
+ * Picture fifo handle
+ *
+ * It is thread safe (push/pop).
+ */
+typedef struct picture_fifo_t picture_fifo_t;
+
+/**
+ * It creates an empty picture_fifo_t.
+ */
+VLC_EXPORT( picture_fifo_t *, picture_fifo_New, ( void ) LIBVLC_USED );
+
+/**
+ * It destroys a fifo created by picture_fifo_New.
+ *
+ * All pictures inside the fifo will be released by picture_Release.
+ */
+VLC_EXPORT( void, picture_fifo_Delete, ( picture_fifo_t * ) );
+
+/**
+ * It retreives a picture_t from the fifo.
+ *
+ * If the fifo is empty, it return NULL without waiting.
+ */
+VLC_EXPORT( picture_t *, picture_fifo_Pop, ( picture_fifo_t * ) LIBVLC_USED );
+
+/**
+ * It returns the first picture_t pointer from the fifo but does not
+ * remove it. The picture returned has been hold for you so you
+ * must call picture_Release on it.
+ *
+ * If the fifo is empty, it return NULL without waiting.
+ */
+VLC_EXPORT( picture_t *, picture_fifo_Peek, ( picture_fifo_t * ) LIBVLC_USED );
+
+/**
+ * It saves a picture_t into the fifo.
+ */
+VLC_EXPORT( void, picture_fifo_Push, ( picture_fifo_t *, picture_t * ) );
+
+/**
+ * It release all picture inside the fifo that have a lower or equal date
+ * if b_below or higher or equal to not b_below than the given one.
+ *
+ * All pictures inside the fifo will be released by picture_Release.
+ */
+VLC_EXPORT( void, picture_fifo_Flush, ( picture_fifo_t *, mtime_t i_date, bool b_below ) );
+
+/**
+ * It applies a delta on all the picture timestamp.
+ */
+VLC_EXPORT( void, picture_fifo_OffsetDate, ( picture_fifo_t *, mtime_t i_delta ) );
+
+
+#endif /* VLC_PICTURE_FIFO_H */
+
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index a13bc38..d10ce07 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -276,6 +276,13 @@ path_sanitize
 picture_CopyPixels
 picture_Delete
 picture_Export
+picture_fifo_Delete
+picture_fifo_Flush
+picture_fifo_New
+picture_fifo_OffsetDate
+picture_fifo_Peek
+picture_fifo_Pop
+picture_fifo_Push
 picture_New
 picture_Reset
 picture_Setup
diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c
index 5c98c58..2e7be9e 100644
--- a/src/video_output/vout_pictures.c
+++ b/src/video_output/vout_pictures.c
@@ -38,6 +38,7 @@
 #include <vlc_filter.h>
 #include <vlc_image.h>
 #include <vlc_block.h>
+#include <vlc_picture_fifo.h>
 
 #include "vout_pictures.h"
 #include "vout_internal.h"
@@ -1070,3 +1071,119 @@ int picture_Export( vlc_object_t *p_obj,
 /*****************************************************************************
  *
  *****************************************************************************/
+struct picture_fifo_t
+{
+    vlc_mutex_t lock;
+    picture_t *p_first;
+    picture_t **pp_last;
+};
+
+static void PictureFifoReset( picture_fifo_t *p_fifo )
+{
+    p_fifo->p_first = NULL;
+    p_fifo->pp_last = &p_fifo->p_first;
+}
+static void PictureFifoPush( picture_fifo_t *p_fifo, picture_t *p_picture )
+{
+    assert( !p_picture->p_next );
+    *p_fifo->pp_last = p_picture;
+    p_fifo->pp_last = &p_picture->p_next;
+}
+static picture_t *PictureFifoPop( picture_fifo_t *p_fifo )
+{
+    picture_t *p_picture = p_fifo->p_first;
+
+    if( p_picture )
+    {
+        p_fifo->p_first = p_picture->p_next;
+        if( !p_fifo->p_first )
+            p_fifo->pp_last = &p_fifo->p_first;
+    }
+    return p_picture;
+}
+
+picture_fifo_t *picture_fifo_New(void)
+{
+    picture_fifo_t *p_fifo = malloc( sizeof(*p_fifo) );
+    if( !p_fifo )
+        return NULL;
+
+    vlc_mutex_init( &p_fifo->lock );
+    PictureFifoReset( p_fifo );
+    return p_fifo;
+}
+
+void picture_fifo_Push( picture_fifo_t *p_fifo, picture_t *p_picture )
+{
+    vlc_mutex_lock( &p_fifo->lock );
+    PictureFifoPush( p_fifo, p_picture );
+    vlc_mutex_unlock( &p_fifo->lock );
+}
+picture_t *picture_fifo_Pop( picture_fifo_t *p_fifo )
+{
+    vlc_mutex_lock( &p_fifo->lock );
+    picture_t *p_picture = PictureFifoPop( p_fifo );
+    vlc_mutex_unlock( &p_fifo->lock );
+
+    return p_picture;
+}
+picture_t *picture_fifo_Peek( picture_fifo_t *p_fifo )
+{
+    vlc_mutex_lock( &p_fifo->lock );
+    picture_t *p_picture = p_fifo->p_first;
+    if( p_picture )
+        picture_Hold( p_picture );
+    vlc_mutex_unlock( &p_fifo->lock );
+
+    return p_picture;
+}
+void picture_fifo_Flush( picture_fifo_t *p_fifo, mtime_t i_date, bool b_below )
+{
+    picture_t *p_picture;
+
+    vlc_mutex_lock( &p_fifo->lock );
+
+    p_picture = p_fifo->p_first;
+    PictureFifoReset( p_fifo );
+
+    picture_fifo_t tmp;
+    PictureFifoReset( &tmp );
+
+    while( p_picture )
+    {
+        picture_t *p_next = p_picture->p_next;
+
+        p_picture->p_next = NULL;
+        if( (  b_below && p_picture->date <= i_date ) ||
+            ( !b_below && p_picture->date >= i_date ) )
+            PictureFifoPush( &tmp, p_picture );
+        else
+            PictureFifoPush( p_fifo, p_picture );
+        p_picture = p_next;
+    }
+    vlc_mutex_unlock( &p_fifo->lock );
+
+    for( ;; )
+    {
+        picture_t *p_picture = PictureFifoPop( &tmp );
+        if( !p_picture )
+            break;
+        picture_Release( p_picture );
+    }
+}
+void picture_fifo_OffsetDate( picture_fifo_t *p_fifo, mtime_t i_delta )
+{
+    vlc_mutex_lock( &p_fifo->lock );
+    for( picture_t *p_picture = p_fifo->p_first; p_picture != NULL; )
+    {
+        p_picture->date += i_delta;
+        p_picture = p_picture->p_next;
+    }
+    vlc_mutex_unlock( &p_fifo->lock );
+}
+void picture_fifo_Delete( picture_fifo_t *p_fifo )
+{
+    picture_fifo_Flush( p_fifo, INT64_MAX, true );
+    vlc_mutex_destroy( &p_fifo->lock );
+}
+




More information about the vlc-devel mailing list