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>
8 * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
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.
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.
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 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
34 #include <vlc_common.h>
35 #include <vlc_picture_fifo.h>
37 /*****************************************************************************
39 *****************************************************************************/
47 static void PictureFifoReset( picture_fifo_t *p_fifo )
49 p_fifo->p_first = NULL;
50 p_fifo->pp_last = &p_fifo->p_first;
52 static void PictureFifoPush( picture_fifo_t *p_fifo, picture_t *p_picture )
54 assert( !p_picture->p_next );
55 *p_fifo->pp_last = p_picture;
56 p_fifo->pp_last = &p_picture->p_next;
58 static picture_t *PictureFifoPop( picture_fifo_t *p_fifo )
60 picture_t *p_picture = p_fifo->p_first;
64 p_fifo->p_first = p_picture->p_next;
65 if( !p_fifo->p_first )
66 p_fifo->pp_last = &p_fifo->p_first;
71 picture_fifo_t *picture_fifo_New(void)
73 picture_fifo_t *p_fifo = malloc( sizeof(*p_fifo) );
77 vlc_mutex_init( &p_fifo->lock );
78 PictureFifoReset( p_fifo );
82 void picture_fifo_Push( picture_fifo_t *p_fifo, picture_t *p_picture )
84 vlc_mutex_lock( &p_fifo->lock );
85 PictureFifoPush( p_fifo, p_picture );
86 vlc_mutex_unlock( &p_fifo->lock );
88 picture_t *picture_fifo_Pop( picture_fifo_t *p_fifo )
90 vlc_mutex_lock( &p_fifo->lock );
91 picture_t *p_picture = PictureFifoPop( p_fifo );
92 vlc_mutex_unlock( &p_fifo->lock );
96 picture_t *picture_fifo_Peek( picture_fifo_t *p_fifo )
98 vlc_mutex_lock( &p_fifo->lock );
99 picture_t *p_picture = p_fifo->p_first;
101 picture_Hold( p_picture );
102 vlc_mutex_unlock( &p_fifo->lock );
106 void picture_fifo_Flush( picture_fifo_t *p_fifo, mtime_t i_date, bool b_below )
108 picture_t *p_picture;
110 vlc_mutex_lock( &p_fifo->lock );
112 p_picture = p_fifo->p_first;
113 PictureFifoReset( p_fifo );
116 PictureFifoReset( &tmp );
120 picture_t *p_next = p_picture->p_next;
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 );
127 PictureFifoPush( p_fifo, p_picture );
130 vlc_mutex_unlock( &p_fifo->lock );
134 picture_t *p_picture = PictureFifoPop( &tmp );
137 picture_Release( p_picture );
140 void picture_fifo_OffsetDate( picture_fifo_t *p_fifo, mtime_t i_delta )
142 vlc_mutex_lock( &p_fifo->lock );
143 for( picture_t *p_picture = p_fifo->p_first; p_picture != NULL; )
145 p_picture->date += i_delta;
146 p_picture = p_picture->p_next;
148 vlc_mutex_unlock( &p_fifo->lock );
150 void picture_fifo_Delete( picture_fifo_t *p_fifo )
152 picture_fifo_Flush( p_fifo, INT64_MAX, true );
153 vlc_mutex_destroy( &p_fifo->lock );