1 /*******************************************************************************
2 * video_fifo.c : video FIFO management
4 *******************************************************************************/
6 /*******************************************************************************
8 *******************************************************************************/
16 #include <X11/extensions/XShm.h>
21 #include "vlc_thread.h"
24 #include "debug.h" /* ?? temporaire, requis par netlist.h */
27 #include "input_netlist.h"
28 #include "decoder_fifo.h"
30 #include "video_output.h"
31 #include "video_parser.h"
33 #include "macroblock.h"
34 #include "video_fifo.h"
35 #include "video_decoder.h"
37 /*****************************************************************************
38 * vpar_InitFIFO : initialize the video FIFO
39 *****************************************************************************/
40 void vpar_InitFIFO( vpar_thread_t * p_vpar )
44 /* Initialize mutex and cond */
45 vlc_mutex_init( p_vpar->vfifo.lock );
46 vlc_cond_init( p_vpar->vfifo.wait );
47 vlc_mutex_init( p_vpar->vbuffer.lock );
49 /* Initialize FIFO properties */
50 p_vpar->vfifo.i_start = p_vpar->vfifo.i_end = 0;
51 p_vpar->vfifo.p_vpar = p_vpar;
53 /* Initialize buffer properties */
54 i_index = VFIFO_SIZE; /* all structures are available */
55 for( i_dummy = 0; i_dummy < VFIFO_SIZE + 1; i_dummy++ )
57 p_vpar->vfifo.pp_mb_free[i_dummy] = p_vpar->vfifo.p_macroblocks + i;
61 /*****************************************************************************
62 * vpar_GetMacroblock : return a macroblock to be decoded
63 *****************************************************************************/
64 macroblock_t * vpar_GetMacroblock( video_fifo_t * p_fifo )
68 vlc_mutex_lock( &p_fifo->lock );
69 while( VIDEO_FIFO_ISEMPTY( *p_fifo ) )
71 vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
72 if( p_fifo->p_vpar->b_die )
74 vlc_mutex_unlock( &p_fifo->lock );
79 p_mb = VIDEO_FIFO_START( *p_fifo );
80 VIDEO_FIFO_INCSTART( *p_fifo );
82 vlc_mutex_unlock( &p_fifo->lock );
87 /*****************************************************************************
88 * vpar_NewMacroblock : return a buffer for the parser
89 *****************************************************************************/
90 macroblock_t * vpar_NewMacroblock( video_fifo_t * p_fifo )
94 #define P_buffer p_fifo->p_vpar.vbuffer
95 vlc_mutex_lock( &P_buffer->lock );
96 if( P_buffer.i_index == -1 )
98 /* No more structures available. This should not happen ! */
102 p_mb = P_buffer->pp_undec_free[ P_buffer->i_index-- ];
105 vlc_mutex_unlock( &P_buffer->lock );
109 /*****************************************************************************
110 * vpar_DecodeMacroblock : put a macroblock in the video fifo
111 *****************************************************************************/
112 void vpar_DecodeMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
114 /* Place picture in the video FIFO */
115 vlc_mutex_lock( &p_fifo->lock );
117 /* By construction, the video FIFO cannot be full */
118 VIDEO_FIFO_END( *p_fifo ) = p_mb;
119 VIDEO_FIFO_INCEND( *p_fifo );
121 vlc_mutex_unlock( &p_fifo->lock );
124 /*****************************************************************************
125 * vpar_ReleaseMacroblock : release a macroblock and put the picture in the
126 * video output heap, if it is finished
127 *****************************************************************************/
128 void vpar_ReleaseMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
130 /* Unlink referenced pictures */
131 if( p_mb->p_forw_top != NULL )
133 vout_UnlinkPicture( p_fifo->p_vpar.p_vout, p_mb->p_forw_top );
135 if( p_mb->p_backw_top != NULL )
137 vout_UnlinkPicture( p_fifo->p_vpar.p_vout, p_mb->p_backw_top );
139 if( p_mb->p_forw_bot != NULL )
141 vout_UnlinkPicture( p_fifo->p_vpar.p_vout, p_mb->p_forw_bot );
143 if( p_mb->p_backw_bot != NULL )
145 vout_UnlinkPicture( p_fifo->p_vpar.p_vout, p_mb->p_backw_bot );
148 /* Unlink picture buffer */
149 vlc_mutex_lock( &p_mb->p_picture->lock_deccount );
150 p_mb->p_picture->i_deccount--;
151 if( p_mb->p_picture->i_deccount == 0 )
153 /* Mark the picture to be displayed */
154 vout_DisplayPicture( p_fifo->p_vpar.p_vout, p_mb->p_picture );
156 /* Warn Synchro for its records. */
157 vpar_SynchroEnd( p_fifo->p_vpar );
159 vlc_mutex_unlock( & p_mb->p_picture->lock_deccount );
161 /* Release the macroblock_t structure */
162 #define P_buffer p_fifo->p_vpar.vbuffer
163 vlc_mutex_lock( &P_buffer->lock );
164 P_buffer->pp_mb_free[ ++P_buffer->i_index ] = p_mb;
165 vlc_mutex_unlock( &P_buffer->lock );
169 /*****************************************************************************
170 * vpar_DestroyMacroblock : destroy a macroblock in case of error
171 *****************************************************************************/
172 void vpar_DestroyMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
174 /* Unlink referenced pictures */
175 if( p_mb->p_forw_top != NULL )
177 vout_UnlinkPicture( p_fifo->p_vpar.p_vout, p_mb->p_forw_top );
179 if( p_mb->p_backw_top != NULL )
181 vout_UnlinkPicture( p_fifo->p_vpar.p_vout, p_mb->p_backw_top );
183 if( p_mb->p_forw_bot != NULL )
185 vout_UnlinkPicture( p_fifo->p_vpar.p_vout, p_mb->p_forw_bot );
187 if( p_mb->p_backw_bot != NULL )
189 vout_UnlinkPicture( p_fifo->p_vpar.p_vout, p_mb->p_backw_bot );
192 /* Release the macroblock_t structure */
193 #define P_buffer p_fifo->p_vpar.vbuffer
194 vlc_mutex_lock( &P_buffer->lock );
195 P_buffer->pp_mb_free[ ++P_buffer->i_index ] = p_mb;
196 vlc_mutex_unlock( &P_buffer->lock );