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 "vpar_synchro.h"
40 #include "video_parser.h"
42 /*****************************************************************************
43 * vpar_InitFIFO : initialize the video FIFO
44 *****************************************************************************/
45 void vpar_InitFIFO( vpar_thread_t * p_vpar )
49 /* Initialize mutex and cond */
50 vlc_mutex_init( &p_vpar->vfifo.lock );
51 vlc_cond_init( &p_vpar->vfifo.wait );
52 vlc_mutex_init( &p_vpar->vbuffer.lock );
54 /* Initialize FIFO properties */
55 p_vpar->vfifo.i_start = p_vpar->vfifo.i_end = 0;
56 p_vpar->vfifo.p_vpar = p_vpar;
58 /* Initialize buffer properties */
59 p_vpar->vbuffer.i_index = VFIFO_SIZE; /* all structures are available */
60 for( i_dummy = 0; i_dummy < VFIFO_SIZE + 1; i_dummy++ )
62 p_vpar->vbuffer.pp_mb_free[i_dummy] = p_vpar->vbuffer.p_macroblocks
67 /*****************************************************************************
68 * vpar_GetMacroblock : return a macroblock to be decoded
69 *****************************************************************************/
70 macroblock_t * vpar_GetMacroblock( video_fifo_t * p_fifo )
74 vlc_mutex_lock( &p_fifo->lock );
75 while( VIDEO_FIFO_ISEMPTY( *p_fifo ) )
77 vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
78 if( p_fifo->p_vpar->b_die )
80 vlc_mutex_unlock( &p_fifo->lock );
85 p_mb = VIDEO_FIFO_START( *p_fifo );
86 VIDEO_FIFO_INCSTART( *p_fifo );
88 vlc_mutex_unlock( &p_fifo->lock );
93 /*****************************************************************************
94 * vpar_NewMacroblock : return a buffer for the parser
95 *****************************************************************************/
96 macroblock_t * vpar_NewMacroblock( video_fifo_t * p_fifo )
100 #define P_buffer p_fifo->p_vpar->vbuffer
101 vlc_mutex_lock( &P_buffer.lock );
102 while( P_buffer.i_index == -1 )
104 /* No more structures available. This should not happen ! */
105 intf_DbgMsg("vpar debug: macroblock list is empty, delaying\n");
106 vlc_mutex_unlock( &P_buffer.lock );
107 msleep(VPAR_IDLE_SLEEP);
108 vlc_mutex_lock( &P_buffer.lock );
111 p_mb = P_buffer.pp_mb_free[ P_buffer.i_index-- ];
113 vlc_mutex_unlock( &P_buffer.lock );
118 /*****************************************************************************
119 * vpar_DecodeMacroblock : put a macroblock in the video fifo
120 *****************************************************************************/
121 void vpar_DecodeMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
123 /* Place picture in the video FIFO */
124 vlc_mutex_lock( &p_fifo->lock );
126 /* By construction, the video FIFO cannot be full */
127 VIDEO_FIFO_END( *p_fifo ) = p_mb;
128 VIDEO_FIFO_INCEND( *p_fifo );
130 vlc_mutex_unlock( &p_fifo->lock );
133 /*****************************************************************************
134 * vpar_ReleaseMacroblock : release a macroblock and put the picture in the
135 * video output heap, if it is finished
136 *****************************************************************************/
137 void vpar_ReleaseMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
139 boolean_t b_finished;
141 /* Unlink picture buffer */
142 vlc_mutex_lock( &p_mb->p_picture->lock_deccount );
143 p_mb->p_picture->i_deccount--;
144 b_finished = (p_mb->p_picture->i_deccount == 1);
145 vlc_mutex_unlock( &p_mb->p_picture->lock_deccount );
146 //fprintf(stderr, "%d ", p_mb->p_picture->i_deccount);
147 /* Test if it was the last block of the picture */
150 fprintf(stderr, "Image decodee\n");
151 /* Mark the picture to be displayed */
152 vout_DisplayPicture( p_fifo->p_vpar->p_vout, p_mb->p_picture );
154 /* Warn Synchro for its records. */
155 vpar_SynchroEnd( p_fifo->p_vpar );
157 /* Unlink referenced pictures */
158 /* if( p_mb->p_forward != NULL )
160 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forward );
162 if( p_mb->p_backward != NULL )
164 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backward );
168 /* Release the macroblock_t structure */
169 #define P_buffer p_fifo->p_vpar->vbuffer
170 vlc_mutex_lock( &P_buffer.lock );
171 P_buffer.pp_mb_free[ ++P_buffer.i_index ] = p_mb;
172 vlc_mutex_unlock( &P_buffer.lock );
176 /*****************************************************************************
177 * vpar_DestroyMacroblock : destroy a macroblock in case of error
178 *****************************************************************************/
179 void vpar_DestroyMacroblock( video_fifo_t * p_fifo, macroblock_t * p_mb )
181 boolean_t b_finished;
183 /* Unlink picture buffer */
184 vlc_mutex_lock( &p_mb->p_picture->lock_deccount );
185 p_mb->p_picture->i_deccount--;
186 b_finished = (p_mb->p_picture->i_deccount == 1);
187 vlc_mutex_unlock( &p_mb->p_picture->lock_deccount );
189 /* Test if it was the last block of the picture */
192 fprintf(stderr, "Image trashee\n");
193 /* Mark the picture to be displayed */
194 vout_DestroyPicture( p_fifo->p_vpar->p_vout, p_mb->p_picture );
196 /* Warn Synchro for its records. */
197 vpar_SynchroEnd( p_fifo->p_vpar );
199 /* Unlink referenced pictures */
200 /* if( p_mb->p_forward != NULL )
202 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forward );
204 if( p_mb->p_backward != NULL )
206 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backward );
210 /* Release the macroblock_t structure */
211 #define P_buffer p_fifo->p_vpar->vbuffer
212 vlc_mutex_lock( &P_buffer.lock );
213 P_buffer.pp_mb_free[ ++P_buffer.i_index ] = p_mb;
214 vlc_mutex_unlock( &P_buffer.lock );