]> git.sesse.net Git - vlc/blob - src/misc/picture_fifo.c
1e6fd6c0b96bd3046a39007762f1a1fa948f397c
[vlc] / src / misc / picture_fifo.c
1 /*****************************************************************************
2  * picture_fifo.c : picture fifo functions
3  *****************************************************************************
4  * Copyright (C) 2009 the VideoLAN team
5  * Copyright (C) 2009 Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
6  * $Id$
7  *
8  * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28
29 #ifdef HAVE_CONFIG_H
30 # include "config.h"
31 #endif
32 #include <assert.h>
33
34 #include <vlc_common.h>
35 #include <vlc_picture_fifo.h>
36
37 /*****************************************************************************
38  *
39  *****************************************************************************/
40 struct picture_fifo_t
41 {
42     vlc_mutex_t lock;
43     picture_t *p_first;
44     picture_t **pp_last;
45 };
46
47 static void PictureFifoReset( picture_fifo_t *p_fifo )
48 {
49     p_fifo->p_first = NULL;
50     p_fifo->pp_last = &p_fifo->p_first;
51 }
52 static void PictureFifoPush( picture_fifo_t *p_fifo, picture_t *p_picture )
53 {
54     assert( !p_picture->p_next );
55     *p_fifo->pp_last = p_picture;
56     p_fifo->pp_last = &p_picture->p_next;
57 }
58 static picture_t *PictureFifoPop( picture_fifo_t *p_fifo )
59 {
60     picture_t *p_picture = p_fifo->p_first;
61
62     if( p_picture )
63     {
64         p_fifo->p_first = p_picture->p_next;
65         if( !p_fifo->p_first )
66             p_fifo->pp_last = &p_fifo->p_first;
67     }
68     return p_picture;
69 }
70
71 picture_fifo_t *picture_fifo_New(void)
72 {
73     picture_fifo_t *p_fifo = malloc( sizeof(*p_fifo) );
74     if( !p_fifo )
75         return NULL;
76
77     vlc_mutex_init( &p_fifo->lock );
78     PictureFifoReset( p_fifo );
79     return p_fifo;
80 }
81
82 void picture_fifo_Push( picture_fifo_t *p_fifo, picture_t *p_picture )
83 {
84     vlc_mutex_lock( &p_fifo->lock );
85     PictureFifoPush( p_fifo, p_picture );
86     vlc_mutex_unlock( &p_fifo->lock );
87 }
88 picture_t *picture_fifo_Pop( picture_fifo_t *p_fifo )
89 {
90     vlc_mutex_lock( &p_fifo->lock );
91     picture_t *p_picture = PictureFifoPop( p_fifo );
92     vlc_mutex_unlock( &p_fifo->lock );
93
94     return p_picture;
95 }
96 picture_t *picture_fifo_Peek( picture_fifo_t *p_fifo )
97 {
98     vlc_mutex_lock( &p_fifo->lock );
99     picture_t *p_picture = p_fifo->p_first;
100     if( p_picture )
101         picture_Hold( p_picture );
102     vlc_mutex_unlock( &p_fifo->lock );
103
104     return p_picture;
105 }
106 void picture_fifo_Flush( picture_fifo_t *p_fifo, mtime_t i_date, bool b_below )
107 {
108     picture_t *p_picture;
109
110     vlc_mutex_lock( &p_fifo->lock );
111
112     p_picture = p_fifo->p_first;
113     PictureFifoReset( p_fifo );
114
115     picture_fifo_t tmp;
116     PictureFifoReset( &tmp );
117
118     while( p_picture )
119     {
120         picture_t *p_next = p_picture->p_next;
121
122         p_picture->p_next = NULL;
123         if( (  b_below && p_picture->date <= i_date ) ||
124             ( !b_below && p_picture->date >= i_date ) )
125             PictureFifoPush( &tmp, p_picture );
126         else
127             PictureFifoPush( p_fifo, p_picture );
128         p_picture = p_next;
129     }
130     vlc_mutex_unlock( &p_fifo->lock );
131
132     for( ;; )
133     {
134         picture_t *p_picture = PictureFifoPop( &tmp );
135         if( !p_picture )
136             break;
137         picture_Release( p_picture );
138     }
139 }
140 void picture_fifo_OffsetDate( picture_fifo_t *p_fifo, mtime_t i_delta )
141 {
142     vlc_mutex_lock( &p_fifo->lock );
143     for( picture_t *p_picture = p_fifo->p_first; p_picture != NULL; )
144     {
145         p_picture->date += i_delta;
146         p_picture = p_picture->p_next;
147     }
148     vlc_mutex_unlock( &p_fifo->lock );
149 }
150 void picture_fifo_Delete( picture_fifo_t *p_fifo )
151 {
152     picture_fifo_Flush( p_fifo, INT64_MAX, true );
153     vlc_mutex_destroy( &p_fifo->lock );
154 }
155