1 /*****************************************************************************
2 * video_fifo.h : FIFO for the pool of video_decoders
4 *****************************************************************************
5 *****************************************************************************
12 *****************************************************************************/
14 /*****************************************************************************
16 *****************************************************************************/
19 /* ?? move to inline functions */
20 #define VIDEO_FIFO_ISEMPTY( fifo ) ( (fifo).i_start == (fifo).i_end )
21 #define VIDEO_FIFO_ISFULL( fifo ) ( ( ( (fifo).i_end + 1 - (fifo).i_start ) \
23 #define VIDEO_FIFO_START( fifo ) ( (fifo).buffer[ (fifo).i_start ] )
24 #define VIDEO_FIFO_INCSTART( fifo ) ( (fifo).i_start = ((fifo).i_start + 1) \
26 #define VIDEO_FIFO_END( fifo ) ( (fifo).buffer[ (fifo).i_end ] )
27 #define VIDEO_FIFO_INCEND( fifo ) ( (fifo).i_end = ((fifo).i_end + 1) \
31 /*****************************************************************************
32 * vpar_GetMacroblock : return a macroblock to be decoded
33 *****************************************************************************/
34 static __inline__ macroblock_t * vpar_GetMacroblock( video_fifo_t * p_fifo )
39 vlc_mutex_lock( &p_fifo->lock );
40 while( VIDEO_FIFO_ISEMPTY( *p_fifo ) )
42 vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
43 if( p_fifo->p_vpar->b_die )
45 vlc_mutex_unlock( &p_fifo->lock );
50 p_mb = VIDEO_FIFO_START( *p_fifo );
51 VIDEO_FIFO_INCSTART( *p_fifo );
53 vlc_mutex_unlock( &p_fifo->lock );
57 /* Shouldn't normally be used without SMP. */
62 /*****************************************************************************
63 * vpar_NewMacroblock : return a buffer for the parser
64 *****************************************************************************/
65 static __inline__ macroblock_t * vpar_NewMacroblock( video_fifo_t * p_fifo )
70 #define P_buffer p_fifo->p_vpar->vbuffer
71 vlc_mutex_lock( &P_buffer.lock );
72 while( P_buffer.i_index == -1 )
74 /* No more structures available. This should not happen ! */
75 intf_DbgMsg("vpar debug: macroblock list is empty, delaying\n");
76 vlc_mutex_unlock( &P_buffer.lock );
77 if( p_fifo->p_vpar->b_die )
81 msleep(VPAR_OUTMEM_SLEEP);
82 vlc_mutex_lock( &P_buffer.lock );
85 p_mb = P_buffer.pp_mb_free[ P_buffer.i_index-- ];
87 vlc_mutex_unlock( &P_buffer.lock );
91 return( &p_fifo->buffer );
95 /*****************************************************************************
96 * vpar_DecodeMacroblock : put a macroblock in the video fifo
97 *****************************************************************************/
98 static __inline__ void vpar_DecodeMacroblock( video_fifo_t * p_fifo,
102 /* Place picture in the video FIFO */
103 vlc_mutex_lock( &p_fifo->lock );
105 /* By construction, the video FIFO cannot be full */
106 VIDEO_FIFO_END( *p_fifo ) = p_mb;
107 VIDEO_FIFO_INCEND( *p_fifo );
109 vlc_mutex_unlock( &p_fifo->lock );
111 /* Shouldn't normally be used without SMP. */
114 /*****************************************************************************
115 * vpar_ReleaseMacroblock : release a macroblock and put the picture in the
116 * video output heap, if it is finished
117 *****************************************************************************/
118 static __inline__ void vpar_ReleaseMacroblock( video_fifo_t * p_fifo,
119 macroblock_t * p_mb )
122 boolean_t b_finished;
124 /* Unlink picture buffer */
125 vlc_mutex_lock( &p_mb->p_picture->lock_deccount );
126 p_mb->p_picture->i_deccount--;
127 b_finished = (p_mb->p_picture->i_deccount == 1);
128 vlc_mutex_unlock( &p_mb->p_picture->lock_deccount );
129 //fprintf(stderr, "%d ", p_mb->p_picture->i_deccount);
130 /* Test if it was the last block of the picture */
133 //fprintf(stderr, "Image decodee\n");
134 /* Mark the picture to be displayed */
135 vout_DisplayPicture( p_fifo->p_vpar->p_vout, p_mb->p_picture );
137 /* Warn Synchro for its records. */
138 vpar_SynchroEnd( p_fifo->p_vpar );
140 /* Unlink referenced pictures */
141 if( p_mb->p_forward != NULL )
143 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forward );
145 if( p_mb->p_backward != NULL )
147 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backward );
151 /* Release the macroblock_t structure */
152 #define P_buffer p_fifo->p_vpar->vbuffer
153 vlc_mutex_lock( &P_buffer.lock );
154 P_buffer.pp_mb_free[ ++P_buffer.i_index ] = p_mb;
155 vlc_mutex_unlock( &P_buffer.lock );
159 p_mb->p_picture->i_deccount--;
160 if( p_mb->p_picture->i_deccount == 1 )
162 /* Mark the picture to be displayed */
163 vout_DisplayPicture( p_fifo->p_vpar->p_vout, p_mb->p_picture );
165 /* Warn Synchro for its records. */
166 vpar_SynchroEnd( p_fifo->p_vpar );
171 /*****************************************************************************
172 * vpar_DestroyMacroblock : destroy a macroblock in case of error
173 *****************************************************************************/
174 static __inline__ void vpar_DestroyMacroblock( video_fifo_t * p_fifo,
175 macroblock_t * p_mb )
178 boolean_t b_finished;
180 /* Unlink picture buffer */
181 vlc_mutex_lock( &p_mb->p_picture->lock_deccount );
182 p_mb->p_picture->i_deccount--;
183 b_finished = (p_mb->p_picture->i_deccount == 1);
184 vlc_mutex_unlock( &p_mb->p_picture->lock_deccount );
186 /* Test if it was the last block of the picture */
189 fprintf(stderr, "Image trashee\n");
190 /* Mark the picture to be trashed */
191 vout_DestroyPicture( p_fifo->p_vpar->p_vout, p_mb->p_picture );
193 /* Warn Synchro for its records. */
194 vpar_SynchroEnd( p_fifo->p_vpar );
196 /* Unlink referenced pictures */
197 if( p_mb->p_forward != NULL )
199 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forward );
201 if( p_mb->p_backward != NULL )
203 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backward );
207 /* Release the macroblock_t structure */
208 #define P_buffer p_fifo->p_vpar->vbuffer
209 vlc_mutex_lock( &P_buffer.lock );
210 P_buffer.pp_mb_free[ ++P_buffer.i_index ] = p_mb;
211 vlc_mutex_unlock( &P_buffer.lock );
215 p_mb->p_picture->i_deccount--;
216 if( p_mb->p_picture->i_deccount == 1 )
218 /* Mark the picture to be trashed */
219 vout_DestroyPicture( p_fifo->p_vpar->p_vout, p_mb->p_picture );
221 /* Warn Synchro for its records. */
222 vpar_SynchroEnd( p_fifo->p_vpar );
227 /*****************************************************************************
229 *****************************************************************************/
230 void vpar_InitFIFO( struct vpar_thread_s * p_vpar );