]> git.sesse.net Git - vlc/blob - src/video_parser/video_fifo.c
Avancement du debuggage du motion.
[vlc] / src / video_parser / video_fifo.c
1 /*******************************************************************************
2  * video_fifo.c : video FIFO management
3  * (c)1999 VideoLAN
4  *******************************************************************************/
5
6 /*******************************************************************************
7  * Preamble
8  *******************************************************************************/
9 #include <errno.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <unistd.h>
13 #include <string.h>
14 #include <sys/uio.h>
15 #include <X11/Xlib.h>
16 #include <X11/extensions/XShm.h>
17
18 #include "config.h"
19 #include "common.h"
20 #include "mtime.h"
21 #include "vlc_thread.h"
22
23 #include "intf_msg.h"
24 #include "debug.h"                      /* ?? temporaire, requis par netlist.h */
25
26 #include "input.h"
27 #include "input_netlist.h"
28 #include "decoder_fifo.h"
29 #include "video.h"
30 #include "video_output.h"
31
32 #include "vdec_idct.h"
33 #include "video_decoder.h"
34 #include "vdec_motion.h"
35
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"
41
42 /*****************************************************************************
43  * vpar_InitFIFO : initialize the video FIFO
44  *****************************************************************************/
45 void vpar_InitFIFO( vpar_thread_t * p_vpar )
46 {
47     int                 i_dummy;
48     
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 );
53     
54     /* Initialize FIFO properties */
55     p_vpar->vfifo.i_start = p_vpar->vfifo.i_end = 0;
56     p_vpar->vfifo.p_vpar = p_vpar;
57     
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++ )
61     {
62         p_vpar->vbuffer.pp_mb_free[i_dummy] = p_vpar->vbuffer.p_macroblocks
63                                                + i_dummy;
64     }
65 }
66
67 /*****************************************************************************
68  * vpar_GetMacroblock : return a macroblock to be decoded
69  *****************************************************************************/
70 macroblock_t * vpar_GetMacroblock( video_fifo_t * p_fifo )
71 {
72     macroblock_t *      p_mb;
73
74     vlc_mutex_lock( &p_fifo->lock );
75     while( VIDEO_FIFO_ISEMPTY( *p_fifo ) )
76     {
77         vlc_cond_wait( &p_fifo->wait, &p_fifo->lock );
78         if( p_fifo->p_vpar->b_die )
79         {
80             vlc_mutex_unlock( &p_fifo->lock );
81             return( NULL );
82         }
83     }
84     
85     p_mb = VIDEO_FIFO_START( *p_fifo );
86     VIDEO_FIFO_INCSTART( *p_fifo );
87
88     vlc_mutex_unlock( &p_fifo->lock );
89     
90     return( p_mb );
91 }
92
93 /*****************************************************************************
94  * vpar_NewMacroblock : return a buffer for the parser
95  *****************************************************************************/
96 macroblock_t * vpar_NewMacroblock( video_fifo_t * p_fifo )
97 {
98     macroblock_t *      p_mb;
99
100 #define P_buffer p_fifo->p_vpar->vbuffer
101     vlc_mutex_lock( &P_buffer.lock );
102     while( P_buffer.i_index == -1 )
103     {
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 );
109     }
110
111     p_mb = P_buffer.pp_mb_free[ P_buffer.i_index-- ];
112
113     vlc_mutex_unlock( &P_buffer.lock );
114 #undef P_buffer
115     return( p_mb );
116 }
117
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 )
122 {
123     /* Place picture in the video FIFO */
124     vlc_mutex_lock( &p_fifo->lock );
125         
126     /* By construction, the video FIFO cannot be full */
127     VIDEO_FIFO_END( *p_fifo ) = p_mb;
128     VIDEO_FIFO_INCEND( *p_fifo );
129
130     vlc_mutex_unlock( &p_fifo->lock );
131 }
132
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 )
138 {
139     boolean_t      b_finished;
140
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 */
148     if( b_finished )
149     {
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 );
153
154         /* Warn Synchro for its records. */
155         vpar_SynchroEnd( p_fifo->p_vpar );
156      
157         /* Unlink referenced pictures */
158         if( p_mb->p_forward != NULL )
159         {
160                 vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forward );
161         }
162         if( p_mb->p_backward != NULL )
163         {
164             vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backward );
165         }
166     }
167
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 );
173 #undef P_buffer
174 }
175
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 )
180 {
181     boolean_t       b_finished;
182
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 );
188
189     /* Test if it was the last block of the picture */
190     if( b_finished )
191     {
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 );
195
196         /* Warn Synchro for its records. */
197         vpar_SynchroEnd( p_fifo->p_vpar );
198
199         /* Unlink referenced pictures */
200         if( p_mb->p_forward != NULL )
201         {
202             vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_forward );
203         }
204         if( p_mb->p_backward != NULL )
205         {
206             vout_UnlinkPicture( p_fifo->p_vpar->p_vout, p_mb->p_backward );
207         }
208     }
209
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 );
215 #undef P_buffer
216 }