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"
32 #include "vdec_idct.h"
33 #include "video_decoder.h"
34 #include "vdec_motion.h"
36 #include "vpar_blocks.h"
37 #include "vpar_headers.h"
38 #include "video_fifo.h"
39 #include "video_parser.h"
41 /*****************************************************************************
42 * vpar_InitFIFO : initialize the video FIFO
43 *****************************************************************************/
44 void vpar_InitFIFO( vpar_thread_t * p_vpar )
48 /* Initialize mutex and cond */
49 vlc_mutex_init( &p_vpar->vfifo.lock );
50 vlc_cond_init( &p_vpar->vfifo.wait );
51 vlc_mutex_init( &p_vpar->vbuffer.lock );
53 /* Initialize FIFO properties */
54 p_vpar->vfifo.i_start = p_vpar->vfifo.i_end = 0;
55 p_vpar->vfifo.p_vpar = p_vpar;
57 /* Initialize buffer properties */
58 p_vpar->vbuffer.i_index = VFIFO_SIZE; /* all structures are available */
59 for( i_dummy = 0; i_dummy < VFIFO_SIZE + 1; i_dummy++ )
61 p_vpar->vbuffer.pp_mb_free[i_dummy] = p_vpar->vbuffer.p_macroblocks
66 /*****************************************************************************
67 * vpar_GetMacroblock : return a macroblock to be decoded
68 *****************************************************************************/
69 macroblock_t * vpar_GetMacroblock( video_fifo_t * p_fifo )
73 vlc_mutex_lock( &p_fifo->lock );
74 while( VIDEO_FIFO_ISEMPTY( *p_fifo ) )
76 vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
77 if( p_fifo->p_vpar->b_die )
79 vlc_mutex_unlock( &p_fifo->lock );
84 p_mb = VIDEO_FIFO_START( *p_fifo );
85 VIDEO_FIFO_INCSTART( *p_fifo );
87 vlc_mutex_unlock( &p_fifo->lock );
92 /*****************************************************************************
93 * vpar_NewMacroblock : return a buffer for the parser
94 *****************************************************************************/
95 macroblock_t * vpar_NewMacroblock( video_fifo_t * p_fifo )
99 #define P_buffer p_fifo->p_vpar->vbuffer
100 vlc_mutex_lock( &P_buffer.lock );
101 if( P_buffer.i_index == -1 )
103 /* No more structures available. This should not happen ! */
107 p_mb = P_buffer.pp_mb_free[ P_buffer.i_index-- ];
109 vlc_mutex_unlock( &P_buffer.lock );
114 /*****************************************************************************
115 * vpar_DecodeMacroblock : put a macroblock in the video fifo
116 *****************************************************************************/
117 void vpar_DecodeMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
119 /* Place picture in the video FIFO */
120 vlc_mutex_lock( &p_fifo->lock );
122 /* By construction, the video FIFO cannot be full */
123 VIDEO_FIFO_END( *p_fifo ) = p_mb;
124 VIDEO_FIFO_INCEND( *p_fifo );
126 vlc_mutex_unlock( &p_fifo->lock );
129 /*****************************************************************************
130 * vpar_ReleaseMacroblock : release a macroblock and put the picture in the
131 * video output heap, if it is finished
132 *****************************************************************************/
133 void vpar_ReleaseMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
135 /* Unlink referenced pictures */
136 if( p_mb->p_forw_top != NULL )
138 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forw_top );
140 if( p_mb->p_backw_top != NULL )
142 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backw_top );
144 if( p_mb->p_forw_bot != NULL )
146 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forw_bot );
148 if( p_mb->p_backw_bot != NULL )
150 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backw_bot );
153 /* Unlink picture buffer */
154 vlc_mutex_lock( &p_mb->p_picture->lock_deccount );
155 p_mb->p_picture->i_deccount--;
156 if( p_mb->p_picture->i_deccount == 0 )
158 /* Mark the picture to be displayed */
159 vout_DisplayPicture( p_fifo->p_vpar->p_vout, p_mb->p_picture );
161 /* Warn Synchro for its records. */
162 vpar_SynchroEnd( p_fifo->p_vpar );
164 vlc_mutex_unlock( & p_mb->p_picture->lock_deccount );
166 /* Release the macroblock_t structure */
167 #define P_buffer p_fifo->p_vpar->vbuffer
168 vlc_mutex_lock( &P_buffer.lock );
169 P_buffer.pp_mb_free[ ++P_buffer.i_index ] = p_mb;
170 vlc_mutex_unlock( &P_buffer.lock );
174 /*****************************************************************************
175 * vpar_DestroyMacroblock : destroy a macroblock in case of error
176 *****************************************************************************/
177 void vpar_DestroyMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
179 /* Unlink referenced pictures */
180 if( p_mb->p_forw_top != NULL )
182 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forw_top );
184 if( p_mb->p_backw_top != NULL )
186 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backw_top );
188 if( p_mb->p_forw_bot != NULL )
190 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forw_bot );
192 if( p_mb->p_backw_bot != NULL )
194 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backw_bot );
197 /* Release the macroblock_t structure */
198 #define P_buffer p_fifo->p_vpar->vbuffer
199 vlc_mutex_lock( &P_buffer.lock );
200 P_buffer.pp_mb_free[ ++P_buffer.i_index ] = p_mb;
201 vlc_mutex_unlock( &P_buffer.lock );