]> git.sesse.net Git - vlc/blob - modules/packetizer/copy.c
* modules/packetizer/copy.c, modules/stream_out/transcode.c: handle raw RV15, RV16...
[vlc] / modules / packetizer / copy.c
1 /*****************************************************************************
2  * copy.c
3  *****************************************************************************
4  * Copyright (C) 2001, 2002 VideoLAN
5  * $Id: copy.c,v 1.11 2003/07/20 23:30:07 gbazin Exp $
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Eric Petit <titer@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #include <vlc/vlc.h>
29 #include <vlc/aout.h>
30 #include <vlc/decoder.h>
31 #include <vlc/input.h>
32 #include <vlc/sout.h>
33
34 #include <stdlib.h>                                      /* malloc(), free() */
35 #include <string.h>                                              /* strdup() */
36
37 #include "codecs.h"
38 /*****************************************************************************
39  * Local prototypes
40  *****************************************************************************/
41 typedef struct packetizer_thread_s
42 {
43     /* Input properties */
44     decoder_fifo_t          *p_fifo;
45
46     /* Output properties */
47     sout_packetizer_input_t *p_sout_input;
48     sout_format_t           output_format;
49
50 //    mtime_t i_last_pts;
51
52 } packetizer_thread_t;
53
54 static int  Open    ( vlc_object_t * );
55 static int  Run     ( decoder_fifo_t * );
56
57 static int  InitThread     ( packetizer_thread_t * );
58 static void PacketizeThread   ( packetizer_thread_t * );
59 static void EndThread      ( packetizer_thread_t * );
60
61
62 static void input_ShowPES( decoder_fifo_t *p_fifo, pes_packet_t **pp_pes );
63
64 /*****************************************************************************
65  * Module descriptor
66  *****************************************************************************/
67
68 vlc_module_begin();
69     set_description( _("Copy packetizer") );
70     set_capability( "packetizer", 1 );
71     set_callbacks( Open, NULL );
72 vlc_module_end();
73
74
75 /*****************************************************************************
76  * OpenDecoder: probe the packetizer and return score
77  *****************************************************************************
78  * Tries to launch a decoder and return score so that the interface is able
79  * to choose.
80  *****************************************************************************/
81 static int Open( vlc_object_t *p_this )
82 {
83     decoder_fifo_t *p_fifo = (decoder_fifo_t*) p_this;
84
85     p_fifo->pf_run = Run;
86
87     return VLC_SUCCESS;
88 }
89
90 /*****************************************************************************
91  * RunDecoder: this function is called just after the thread is created
92  *****************************************************************************/
93 static int Run( decoder_fifo_t *p_fifo )
94 {
95     packetizer_thread_t *p_pack;
96     int b_error;
97
98     msg_Info( p_fifo, "Running copy packetizer" );
99     if( !( p_pack = malloc( sizeof( packetizer_thread_t ) ) ) )
100     {
101         msg_Err( p_fifo, "out of memory" );
102         DecoderError( p_fifo );
103         return( -1 );
104     }
105     memset( p_pack, 0, sizeof( packetizer_thread_t ) );
106
107     p_pack->p_fifo = p_fifo;
108
109     if( InitThread( p_pack ) != 0 )
110     {
111         DecoderError( p_fifo );
112         return( -1 );
113     }
114
115     while( ( !p_pack->p_fifo->b_die )&&( !p_pack->p_fifo->b_error ) )
116     {
117         PacketizeThread( p_pack );
118     }
119
120
121     if( ( b_error = p_pack->p_fifo->b_error ) )
122     {
123         DecoderError( p_pack->p_fifo );
124     }
125
126     EndThread( p_pack );
127     if( b_error )
128     {
129         return( -1 );
130     }
131
132     return( 0 );
133 }
134
135
136 #define FREE( p ) if( p ) free( p ); p = NULL
137
138 /*****************************************************************************
139  * InitThread: initialize data before entering main loop
140  *****************************************************************************/
141
142 static int InitThread( packetizer_thread_t *p_pack )
143 {
144
145     switch( p_pack->p_fifo->i_fourcc )
146     {
147         /* video */
148         case VLC_FOURCC( 'm', '4', 's', '2'):
149         case VLC_FOURCC( 'M', '4', 'S', '2'):
150         case VLC_FOURCC( 'm', 'p', '4', 's'):
151         case VLC_FOURCC( 'M', 'P', '4', 'S'):
152         case VLC_FOURCC( 'm', 'p', '4', 'v'):
153         case VLC_FOURCC( 'D', 'I', 'V', 'X'):
154         case VLC_FOURCC( 'd', 'i', 'v', 'x'):
155         case VLC_FOURCC( 'X', 'V', 'I', 'D'):
156         case VLC_FOURCC( 'X', 'v', 'i', 'D'):
157         case VLC_FOURCC( 'x', 'v', 'i', 'd'):
158         case VLC_FOURCC( 'D', 'X', '5', '0'):
159         case VLC_FOURCC( 0x04, 0,   0,   0):
160         case VLC_FOURCC( '3', 'I', 'V', '2'):
161             p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', '4', 'v');
162             p_pack->output_format.i_cat = VIDEO_ES;
163             break;
164         case VLC_FOURCC( 'm', 'p', 'g', 'v' ):
165         case VLC_FOURCC( 'm', 'p', 'g', '1' ):
166         case VLC_FOURCC( 'm', 'p', 'g', '2' ):
167         case VLC_FOURCC( 'm', 'p', '1', 'v' ):
168         case VLC_FOURCC( 'm', 'p', '2', 'v' ):
169             p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', 'g', 'v' );
170             p_pack->output_format.i_cat = VIDEO_ES;
171             break;
172
173         case VLC_FOURCC( 'd', 'i', 'v', '1' ):
174         case VLC_FOURCC( 'D', 'I', 'V', '1' ):
175         case VLC_FOURCC( 'M', 'P', 'G', '4' ):
176         case VLC_FOURCC( 'm', 'p', 'g', '4' ):
177             p_pack->output_format.i_fourcc = VLC_FOURCC( 'D', 'I', 'V', '1' );
178             p_pack->output_format.i_cat = VIDEO_ES;
179             break;
180         case VLC_FOURCC( 'd', 'i', 'v', '2' ):
181         case VLC_FOURCC( 'D', 'I', 'V', '2' ):
182         case VLC_FOURCC( 'M', 'P', '4', '2' ):
183         case VLC_FOURCC( 'm', 'p', '4', '2' ):
184             p_pack->output_format.i_fourcc = VLC_FOURCC( 'D', 'I', 'V', '2' );
185             p_pack->output_format.i_cat = VIDEO_ES;
186             break;
187         case VLC_FOURCC( 'd', 'i', 'v', '3' ):
188         case VLC_FOURCC( 'D', 'I', 'V', '3' ):
189         case VLC_FOURCC( 'd', 'i', 'v', '4' ):
190         case VLC_FOURCC( 'D', 'I', 'V', '4' ):
191         case VLC_FOURCC( 'd', 'i', 'v', '5' ):
192         case VLC_FOURCC( 'D', 'I', 'V', '5' ):
193         case VLC_FOURCC( 'd', 'i', 'v', '6' ):
194         case VLC_FOURCC( 'D', 'I', 'V', '6' ):
195         case VLC_FOURCC( 'M', 'P', '4', '3' ):
196         case VLC_FOURCC( 'm', 'p', '4', '3' ):
197         case VLC_FOURCC( 'm', 'p', 'g', '3' ):
198         case VLC_FOURCC( 'M', 'P', 'G', '3' ):
199         case VLC_FOURCC( 'A', 'P', '4', '1' ):
200             p_pack->output_format.i_fourcc = VLC_FOURCC( 'D', 'I', 'V', '3' );
201             p_pack->output_format.i_cat = VIDEO_ES;
202             break;
203         case VLC_FOURCC( 'H', '2', '6', '3' ):
204         case VLC_FOURCC( 'h', '2', '6', '3' ):
205         case VLC_FOURCC( 'U', '2', '6', '3' ):
206         case VLC_FOURCC( 'u', '2', '6', '3' ):
207             p_pack->output_format.i_fourcc = VLC_FOURCC( 'H', '2', '6', '3' );
208             p_pack->output_format.i_cat = VIDEO_ES;
209             break;
210         case VLC_FOURCC( 'I', '2', '6', '3' ):
211         case VLC_FOURCC( 'i', '2', '6', '3' ):
212             p_pack->output_format.i_fourcc = VLC_FOURCC( 'I', '2', '6', '3' );
213             p_pack->output_format.i_cat = VIDEO_ES;
214             break;
215         case VLC_FOURCC( 'W', 'M', 'V', '1' ):
216             p_pack->output_format.i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '1' );
217             p_pack->output_format.i_cat = VIDEO_ES;
218             break;
219         case VLC_FOURCC( 'W', 'M', 'V', '2' ):
220             p_pack->output_format.i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '2' );
221             p_pack->output_format.i_cat = VIDEO_ES;
222             break;
223         case VLC_FOURCC( 'M', 'J', 'P', 'G' ):
224         case VLC_FOURCC( 'm', 'j', 'p', 'g' ):
225         case VLC_FOURCC( 'm', 'j', 'p', 'a' ):
226         case VLC_FOURCC( 'j', 'p', 'e', 'g' ):
227         case VLC_FOURCC( 'J', 'P', 'E', 'G' ):
228         case VLC_FOURCC( 'J', 'F', 'I', 'F' ):
229             p_pack->output_format.i_fourcc = VLC_FOURCC( 'M', 'J', 'P', 'G' );
230             p_pack->output_format.i_cat = VIDEO_ES;
231             break;
232         case VLC_FOURCC( 'm', 'j', 'p', 'b' ):
233             p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'j', 'p', 'b' );
234             p_pack->output_format.i_cat = VIDEO_ES;
235             break;
236         case VLC_FOURCC( 'd', 'v', 's', 'l' ):
237         case VLC_FOURCC( 'd', 'v', 's', 'd' ):
238         case VLC_FOURCC( 'D', 'V', 'S', 'D' ):
239         case VLC_FOURCC( 'd', 'v', 'h', 'd' ):
240             p_pack->output_format.i_fourcc = VLC_FOURCC( 'd', 'v', 's', 'l' );
241             p_pack->output_format.i_cat = VIDEO_ES;
242             break;
243         case VLC_FOURCC( 'S', 'V', 'Q', '1' ):
244             p_pack->output_format.i_fourcc = VLC_FOURCC( 'S', 'V', 'Q', '1' );
245             p_pack->output_format.i_cat = VIDEO_ES;
246             break;
247         case VLC_FOURCC( 'S', 'V', 'Q', '3' ):
248             p_pack->output_format.i_fourcc = VLC_FOURCC( 'S', 'V', 'Q', '3' );
249             p_pack->output_format.i_cat = VIDEO_ES;
250             break;
251
252         case VLC_FOURCC( 'I', '4', '2', '0' ):
253             p_pack->output_format.i_fourcc = VLC_FOURCC( 'I', '4', '2', '0' );
254             p_pack->output_format.i_cat = VIDEO_ES;
255             break;
256         case VLC_FOURCC( 'I', '4', '2', '2' ):
257             p_pack->output_format.i_fourcc = VLC_FOURCC( 'I', '4', '2', '2' );
258             p_pack->output_format.i_cat = VIDEO_ES;
259             break;
260         case VLC_FOURCC( 'R', 'V', '1', '5' ):
261             p_pack->output_format.i_fourcc = VLC_FOURCC( 'R', 'V', '1', '5' );
262             p_pack->output_format.i_cat = VIDEO_ES;
263             break;
264         case VLC_FOURCC( 'R', 'V', '1', '6' ):
265             p_pack->output_format.i_fourcc = VLC_FOURCC( 'R', 'V', '1', '6' );
266             p_pack->output_format.i_cat = VIDEO_ES;
267             break;
268         case VLC_FOURCC( 'R', 'V', '2', '4' ):
269             p_pack->output_format.i_fourcc = VLC_FOURCC( 'R', 'V', '2', '4' );
270             p_pack->output_format.i_cat = VIDEO_ES;
271             break;
272         case VLC_FOURCC( 'R', 'V', '3', '2' ):
273             p_pack->output_format.i_fourcc = VLC_FOURCC( 'R', 'V', '3', '2' );
274             p_pack->output_format.i_cat = VIDEO_ES;
275             break;
276         case VLC_FOURCC( 'G', 'R', 'E', 'Y' ):
277             p_pack->output_format.i_fourcc = VLC_FOURCC( 'G', 'R', 'E', 'Y' );
278             p_pack->output_format.i_cat = VIDEO_ES;
279             break;
280
281         /* audio */
282         case VLC_FOURCC( 'm', 'p', 'g', 'a' ):
283             p_pack->output_format.i_fourcc = VLC_FOURCC( 'm', 'p', 'g', 'a' );
284             p_pack->output_format.i_cat = AUDIO_ES;
285             break;
286         case VLC_FOURCC( 'w', 'm', 'a', '1' ):
287             p_pack->output_format.i_fourcc = VLC_FOURCC( 'w', 'm', 'a', '1' );
288             p_pack->output_format.i_cat = AUDIO_ES;
289             break;
290         case VLC_FOURCC( 'w', 'm', 'a', '2' ):
291             p_pack->output_format.i_fourcc = VLC_FOURCC( 'w', 'm', 'a', '2' );
292             p_pack->output_format.i_cat = AUDIO_ES;
293             break;
294         case VLC_FOURCC( 'a', 'r', 'a', 'w' ):
295         {
296             WAVEFORMATEX *p_wf = (WAVEFORMATEX*)p_pack->p_fifo->p_waveformatex;
297             if( p_wf )
298             {
299                 switch( ( p_wf->wBitsPerSample + 7 ) / 8 )
300                 {
301                     case 1:
302                         p_pack->output_format.i_fourcc = VLC_FOURCC('u','8',' ',' ');
303                         break;
304                     case 2:
305                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','1','6','l');
306                         break;
307                     case 3:
308                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','2','4','l');
309                         break;
310                     case 4:
311                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','3','2','l');
312                         break;
313                     default:
314                         msg_Err( p_pack->p_fifo, "unknown raw audio sample size !!" );
315                         return VLC_EGENERIC;
316                 }
317             }
318             else
319             {
320                 msg_Err( p_pack->p_fifo, "unknown raw audio sample size !!" );
321                 return VLC_EGENERIC;
322             }
323             p_pack->output_format.i_cat = AUDIO_ES;
324             break;
325         }
326         case VLC_FOURCC( 't', 'w', 'o', 's' ):
327         {
328             WAVEFORMATEX *p_wf = (WAVEFORMATEX*)p_pack->p_fifo->p_waveformatex;
329             if( p_wf )
330             {
331                 switch( ( p_wf->wBitsPerSample + 7 ) / 8 )
332                 {
333                     case 1:
334                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','8',' ',' ');
335                         break;
336                     case 2:
337                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','1','6','b');
338                         break;
339                     case 3:
340                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','2','4','b');
341                         break;
342                     case 4:
343                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','3','2','b');
344                         break;
345                     default:
346                         msg_Err( p_pack->p_fifo, "unknown raw audio sample size !!" );
347                         return VLC_EGENERIC;
348                 }
349             }
350             else
351             {
352                 msg_Err( p_pack->p_fifo, "unknown raw audio sample size !!" );
353                 return VLC_EGENERIC;
354             }
355             p_pack->output_format.i_cat = AUDIO_ES;
356             break;
357         }
358         case VLC_FOURCC( 's', 'o', 'w', 't' ):
359         {
360             WAVEFORMATEX *p_wf = (WAVEFORMATEX*)p_pack->p_fifo->p_waveformatex;
361             if( p_wf )
362             {
363                 switch( ( p_wf->wBitsPerSample + 7 ) / 8 )
364                 {
365                     case 1:
366                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','8',' ',' ');
367                         break;
368                     case 2:
369                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','1','6','l');
370                         break;
371                     case 3:
372                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','2','4','l');
373                         break;
374                     case 4:
375                         p_pack->output_format.i_fourcc = VLC_FOURCC('s','3','2','l');
376                         break;
377                     default:
378                         msg_Err( p_pack->p_fifo, "unknown raw audio sample size !!" );
379                         return VLC_EGENERIC;
380                 }
381             }
382             else
383             {
384                 msg_Err( p_pack->p_fifo, "unknown raw audio sample size !!" );
385                 return VLC_EGENERIC;
386             }
387             p_pack->output_format.i_cat = AUDIO_ES;
388             break;
389         }
390
391         default:
392             msg_Err( p_pack->p_fifo, "unknown es type !!" );
393             return VLC_EGENERIC;
394             //p_pack->output_format.i_fourcc = p_pack->p_fifo->i_fourcc;
395             //p_pack->output_format.i_cat = UNKNOWN_ES;
396             //break;
397     }
398
399     switch( p_pack->output_format.i_cat )
400     {
401         case AUDIO_ES:
402             {
403                 WAVEFORMATEX *p_wf = (WAVEFORMATEX*)p_pack->p_fifo->p_waveformatex;
404                 if( p_wf )
405                 {
406                     p_pack->output_format.i_sample_rate = p_wf->nSamplesPerSec;
407                     p_pack->output_format.i_channels    = p_wf->nChannels;
408                     p_pack->output_format.i_block_align = p_wf->nBlockAlign;
409                     p_pack->output_format.i_bitrate     = p_wf->nAvgBytesPerSec * 8;
410                     p_pack->output_format.i_extra_data  = p_wf->cbSize;
411                     if( p_wf->cbSize  > 0 )
412                     {
413                         p_pack->output_format.p_extra_data =
414                             malloc( p_pack->output_format.i_extra_data );
415                         memcpy( p_pack->output_format.p_extra_data,
416                                 &p_wf[1],
417                                 p_pack->output_format.i_extra_data );
418                     }
419                     else
420                     {
421                         p_pack->output_format.p_extra_data = NULL;
422                     }
423                 }
424                 else
425                 {
426                     p_pack->output_format.i_sample_rate = 0;
427                     p_pack->output_format.i_channels    = 0;
428                     p_pack->output_format.i_block_align = 0;
429                     p_pack->output_format.i_bitrate     = 0;
430                     p_pack->output_format.i_extra_data  = 0;
431                     p_pack->output_format.p_extra_data  = NULL;
432                 }
433             }
434             break;
435
436         case VIDEO_ES:
437             {
438                 BITMAPINFOHEADER *p_bih = (BITMAPINFOHEADER*)p_pack->p_fifo->p_bitmapinfoheader;
439
440                 p_pack->output_format.i_bitrate = 0;
441                 if( p_bih )
442                 {
443                     p_pack->output_format.i_width  = p_bih->biWidth;
444                     p_pack->output_format.i_height = p_bih->biHeight;
445                     p_pack->output_format.i_extra_data  = p_bih->biSize - sizeof( BITMAPINFOHEADER );
446                     if( p_pack->output_format.i_extra_data > 0 )
447                     {
448                         p_pack->output_format.p_extra_data =
449                             malloc( p_pack->output_format.i_extra_data );
450                         memcpy( p_pack->output_format.p_extra_data,
451                                 &p_bih[1],
452                                 p_pack->output_format.i_extra_data );
453                     }
454                 }
455                 else
456                 {
457                     p_pack->output_format.i_width  = 0;
458                     p_pack->output_format.i_height = 0;
459                     p_pack->output_format.i_extra_data  = 0;
460                     p_pack->output_format.p_extra_data  = NULL;
461                 }
462             }
463             break;
464
465         default:
466             return VLC_EGENERIC;
467     }
468
469     p_pack->p_sout_input =
470         sout_InputNew( p_pack->p_fifo,
471                        &p_pack->output_format );
472
473     if( !p_pack->p_sout_input )
474     {
475         msg_Err( p_pack->p_fifo, "cannot add a new stream" );
476         return VLC_EGENERIC;
477     }
478 //    p_pack->i_last_pts = 0;
479     return( VLC_SUCCESS );
480 }
481
482 /*****************************************************************************
483  * PacketizeThread: packetize an unit (here copy a complete pes)
484  *****************************************************************************/
485 static void PacketizeThread( packetizer_thread_t *p_pack )
486 {
487     sout_buffer_t   *p_sout_buffer;
488     pes_packet_t    *p_pes;
489     ssize_t         i_size;
490     mtime_t         i_pts;
491
492     /* **** get samples count **** */
493     input_ExtractPES( p_pack->p_fifo, &p_pes );
494     if( !p_pes )
495     {
496         p_pack->p_fifo->b_error = 1;
497         return;
498     }
499     i_pts = p_pes->i_pts;
500
501     if( i_pts <= 0 ) //&& p_pack->i_last_pts <= 0 )
502     {
503         msg_Dbg( p_pack->p_fifo, "need pts != 0" );
504         input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
505         return;
506     }
507
508     i_size = p_pes->i_pes_size;
509
510 //    msg_Dbg( p_pack->p_fifo, "pes size:%d", i_size );
511     if( i_size > 0 )
512     {
513         pes_packet_t    *p_pes_next;
514         data_packet_t   *p_data;
515         ssize_t          i_buffer;
516
517         p_sout_buffer =
518             sout_BufferNew( p_pack->p_sout_input->p_sout, i_size );
519         if( !p_sout_buffer )
520         {
521             p_pack->p_fifo->b_error = 1;
522             input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
523             return;
524         }
525         /* TODO: memcpy of the pes packet */
526         for( i_buffer = 0, p_data = p_pes->p_first;
527              p_data != NULL && i_buffer < i_size;
528              p_data = p_data->p_next)
529         {
530             ssize_t i_copy;
531
532             i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start,
533                             i_size - i_buffer );
534             if( i_copy > 0 )
535             {
536                 p_pack->p_fifo->p_vlc->pf_memcpy( p_sout_buffer->p_buffer + i_buffer,
537                                                   p_data->p_payload_start,
538                                                   i_copy );
539             }
540             i_buffer += i_copy;
541         }
542         p_sout_buffer->i_length = 0;
543         p_sout_buffer->i_dts = i_pts; //p_pes->i_pts - p_pack->i_pts_start;
544         p_sout_buffer->i_pts = i_pts; //p_pes->i_pts - p_pack->i_pts_start;
545         p_sout_buffer->i_bitrate = 0;
546
547         input_ShowPES( p_pack->p_fifo, &p_pes_next );
548         if( p_pes_next )
549         {
550             p_sout_buffer->i_length = p_pes_next->i_pts - i_pts;
551         }
552         sout_InputSendBuffer( p_pack->p_sout_input,
553                                p_sout_buffer );
554     }
555
556     input_DeletePES( p_pack->p_fifo->p_packets_mgt, p_pes );
557 }
558
559
560 /*****************************************************************************
561  * EndThread : packetizer thread destruction
562  *****************************************************************************/
563 static void EndThread ( packetizer_thread_t *p_pack)
564 {
565     if( p_pack->p_sout_input )
566     {
567         sout_InputDelete( p_pack->p_sout_input );
568     }
569     free( p_pack );
570 }
571
572 static void input_ShowPES( decoder_fifo_t *p_fifo, pes_packet_t **pp_pes )
573 {
574     pes_packet_t *p_pes;
575
576     vlc_mutex_lock( &p_fifo->data_lock );
577
578     if( p_fifo->p_first == NULL )
579     {
580         if( p_fifo->b_die )
581         {
582             vlc_mutex_unlock( &p_fifo->data_lock );
583             if( pp_pes ) *pp_pes = NULL;
584             return;
585         }
586
587         /* Signal the input thread we're waiting. This is only
588          * needed in case of slave clock (ES plug-in) but it won't
589          * harm. */
590         vlc_cond_signal( &p_fifo->data_wait );
591
592         /* Wait for the input to tell us when we received a packet. */
593         vlc_cond_wait( &p_fifo->data_wait, &p_fifo->data_lock );
594     }
595     p_pes = p_fifo->p_first;
596     vlc_mutex_unlock( &p_fifo->data_lock );
597
598     if( pp_pes )
599     {
600         *pp_pes = p_pes;
601     }
602 }
603