1 /*****************************************************************************
2 * input_ps.c: PS demux and packet management
3 *****************************************************************************
4 * Copyright (C) 1998, 1999, 2000 VideoLAN
5 * $Id: input_ps.c,v 1.27 2001/05/31 03:12:49 sam Exp $
7 * Authors: Christophe Massiot <massiot@via.ecp.fr>
8 * Cyril Deguet <asmax@via.ecp.fr>
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.
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.
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 *****************************************************************************/
25 #define MODULE_NAME ps
26 #include "modules_inner.h"
28 /*****************************************************************************
30 *****************************************************************************/
37 #ifdef STRNCASECMP_IN_STRINGS_H
41 #include <sys/types.h>
46 #elif defined( _MSC_VER ) && defined( _WIN32 )
62 #include "stream_control.h"
63 #include "input_ext-intf.h"
64 #include "input_ext-dec.h"
69 #include "mpeg_system.h"
75 /*****************************************************************************
77 *****************************************************************************/
78 static int PSProbe ( probedata_t
* );
79 static int PSRead ( struct input_thread_s
*,
80 data_packet_t
* p_packets
[INPUT_READ_ONCE
] );
81 static void PSInit ( struct input_thread_s
* );
82 static void PSEnd ( struct input_thread_s
* );
83 static void PSSeek ( struct input_thread_s
*, off_t
);
84 static struct pes_packet_s
* NewPES ( void * );
85 static struct data_packet_s
* NewPacket ( void *, size_t );
86 static void DeletePacket( void *, struct data_packet_s
* );
87 static void DeletePES ( void *, struct pes_packet_s
* );
89 /*****************************************************************************
90 * Functions exported as capabilities. They are declared as static so that
91 * we don't pollute the namespace too much.
92 *****************************************************************************/
93 void _M( input_getfunctions
)( function_list_t
* p_function_list
)
95 #define input p_function_list->functions.input
96 p_function_list
->pf_probe
= PSProbe
;
97 input
.pf_init
= PSInit
;
98 input
.pf_open
= NULL
; /* Set in PSInit */
99 input
.pf_close
= NULL
;
100 input
.pf_end
= PSEnd
;
101 input
.pf_set_area
= NULL
;
102 input
.pf_read
= PSRead
;
103 input
.pf_demux
= input_DemuxPS
;
104 input
.pf_new_packet
= NewPacket
;
105 input
.pf_new_pes
= NewPES
;
106 input
.pf_delete_packet
= DeletePacket
;
107 input
.pf_delete_pes
= DeletePES
;
108 input
.pf_rewind
= NULL
;
109 input
.pf_seek
= PSSeek
;
114 * Data reading functions
117 /*****************************************************************************
118 * PSProbe: verifies that the stream is a PS stream
119 *****************************************************************************/
120 static int PSProbe( probedata_t
*p_data
)
122 input_thread_t
* p_input
= (input_thread_t
*)p_data
;
124 char * psz_name
= p_input
->p_source
;
128 if( TestMethod( INPUT_METHOD_VAR
, "ps" ) )
133 if( ( strlen(psz_name
) > 5 ) && !strncasecmp( psz_name
, "file:", 5 ) )
135 /* If the user specified "file:" then it's probably a file */
140 i_handle
= open( psz_name
, 0 );
150 /*****************************************************************************
151 * PSInit: initializes PS structures
152 *****************************************************************************/
153 static void PSInit( input_thread_t
* p_input
)
155 thread_ps_data_t
* p_method
;
156 packet_cache_t
* p_packet_cache
;
158 p_method
= (thread_ps_data_t
*)malloc( sizeof(thread_ps_data_t
) );
159 if( p_method
== NULL
)
161 intf_ErrMsg( "Out of memory" );
162 p_input
->b_error
= 1;
165 p_input
->p_plugin_data
= (void *)p_method
;
167 /* creates the packet cache structure */
168 p_packet_cache
= malloc( sizeof(packet_cache_t
) );
169 if ( p_packet_cache
== NULL
)
171 intf_ErrMsg( "Out of memory" );
172 p_input
->b_error
= 1;
175 p_input
->p_method_data
= (void *)p_packet_cache
;
178 p_input
->pf_open
= p_input
->pf_file_open
;
179 p_input
->pf_close
= p_input
->pf_file_close
;
181 /* Initialize packet cache mutex */
182 vlc_mutex_init( &p_packet_cache
->lock
);
184 /* allocates the data cache */
185 p_packet_cache
->data
.p_stack
= malloc( DATA_CACHE_SIZE
*
186 sizeof(data_packet_t
*) );
187 if ( p_packet_cache
->data
.p_stack
== NULL
)
189 intf_ErrMsg( "Out of memory" );
190 p_input
->b_error
= 1;
193 p_packet_cache
->data
.l_index
= 0;
195 /* allocates the PES cache */
196 p_packet_cache
->pes
.p_stack
= malloc( PES_CACHE_SIZE
*
197 sizeof(pes_packet_t
*) );
198 if ( p_packet_cache
->pes
.p_stack
== NULL
)
200 intf_ErrMsg( "Out of memory" );
201 p_input
->b_error
= 1;
204 p_packet_cache
->pes
.l_index
= 0;
206 /* allocates the small buffer cache */
207 p_packet_cache
->smallbuffer
.p_stack
= malloc( SMALL_CACHE_SIZE
*
208 sizeof(packet_buffer_t
) );
209 if ( p_packet_cache
->smallbuffer
.p_stack
== NULL
)
211 intf_ErrMsg( "Out of memory" );
212 p_input
->b_error
= 1;
215 p_packet_cache
->smallbuffer
.l_index
= 0;
217 /* allocates the large buffer cache */
218 p_packet_cache
->largebuffer
.p_stack
= malloc( LARGE_CACHE_SIZE
*
219 sizeof(packet_buffer_t
) );
220 if ( p_packet_cache
->largebuffer
.p_stack
== NULL
)
222 intf_ErrMsg( "Out of memory" );
223 p_input
->b_error
= 1;
226 p_packet_cache
->largebuffer
.l_index
= 0;
228 /* Re-open the socket as a buffered FILE stream */
229 p_method
->stream
= fdopen( p_input
->i_handle
, "r" );
231 if( p_method
->stream
== NULL
)
233 intf_ErrMsg( "Cannot open file (%s)", strerror(errno
) );
234 p_input
->b_error
= 1;
237 rewind( p_method
->stream
);
239 /* FIXME : detect if InitStream failed */
240 input_InitStream( p_input
, sizeof( stream_ps_data_t
) );
241 input_AddProgram( p_input
, 0, sizeof( stream_ps_data_t
) );
243 if( p_input
->stream
.b_seekable
)
245 stream_ps_data_t
* p_demux_data
=
246 (stream_ps_data_t
*)p_input
->stream
.pp_programs
[0]->p_demux_data
;
248 /* Pre-parse the stream to gather stream_descriptor_t. */
249 p_input
->stream
.pp_programs
[0]->b_is_ok
= 0;
250 p_demux_data
->i_PSM_version
= EMPTY_PSM_VERSION
;
252 while( !p_input
->b_die
&& !p_input
->b_error
253 && !p_demux_data
->b_has_PSM
)
256 data_packet_t
* pp_packets
[INPUT_READ_ONCE
];
258 i_result
= PSRead( p_input
, pp_packets
);
262 vlc_mutex_lock( &p_input
->stream
.stream_lock
);
263 p_input
->stream
.pp_programs
[0]->b_is_ok
= 1;
264 vlc_mutex_unlock( &p_input
->stream
.stream_lock
);
269 p_input
->b_error
= 1;
273 for( i
= 0; i
< INPUT_READ_ONCE
&& pp_packets
[i
] != NULL
; i
++ )
275 /* FIXME: use i_p_config_t */
276 input_ParsePS( p_input
, pp_packets
[i
] );
277 DeletePacket( p_input
->p_method_data
, pp_packets
[i
] );
281 if( p_input
->stream
.p_selected_area
->i_tell
>
282 INPUT_PREPARSE_LENGTH
)
287 rewind( p_method
->stream
);
288 vlc_mutex_lock( &p_input
->stream
.stream_lock
);
290 p_input
->stream
.i_method
= INPUT_METHOD_FILE
;
291 p_input
->stream
.p_selected_area
->i_tell
= 0;
293 if( p_demux_data
->b_has_PSM
)
295 /* (The PSM decoder will care about spawning the decoders) */
296 p_input
->stream
.pp_programs
[0]->b_is_ok
= 1;
301 /* (We have to do it ourselves) */
304 /* FIXME: we should do multiple passes in case an audio type
307 i_es
< p_input
->stream
.pp_programs
[0]->i_es_number
;
310 #define p_es p_input->stream.pp_programs[0]->pp_es[i_es]
311 switch( p_es
->i_type
)
315 input_SelectES( p_input
, p_es
);
320 if( main_GetIntVariable( INPUT_CHANNEL_VAR
, 0 )
321 == (p_es
->i_id
& 0x1F) )
322 switch( main_GetIntVariable( INPUT_AUDIO_VAR
, 0 ) )
325 main_PutIntVariable( INPUT_AUDIO_VAR
,
328 input_SelectES( p_input
, p_es
);
333 if( main_GetIntVariable( INPUT_CHANNEL_VAR
, 0 )
334 == ((p_es
->i_id
& 0xF00) >> 8) )
335 switch( main_GetIntVariable( INPUT_AUDIO_VAR
, 0 ) )
338 main_PutIntVariable( INPUT_AUDIO_VAR
,
341 input_SelectES( p_input
, p_es
);
346 if( main_GetIntVariable( INPUT_SUBTITLE_VAR
, -1 )
347 == ((p_es
->i_id
& 0x1F00) >> 8) )
349 input_SelectES( p_input
, p_es
);
354 if( main_GetIntVariable( INPUT_CHANNEL_VAR
, 0 )
355 == ((p_es
->i_id
& 0x1F00) >> 8) )
356 switch( main_GetIntVariable( INPUT_AUDIO_VAR
, 0 ) )
359 main_PutIntVariable( INPUT_AUDIO_VAR
,
362 input_SelectES( p_input
, p_es
);
371 input_DumpStream( p_input
);
373 vlc_mutex_unlock( &p_input
->stream
.stream_lock
);
377 /* The programs will be added when we read them. */
378 vlc_mutex_lock( &p_input
->stream
.stream_lock
);
379 p_input
->stream
.i_method
= INPUT_METHOD_FILE
;
380 p_input
->stream
.pp_programs
[0]->b_is_ok
= 0;
381 vlc_mutex_unlock( &p_input
->stream
.stream_lock
);
385 /*****************************************************************************
386 * PSEnd: frees unused data
387 *****************************************************************************/
388 static void PSEnd( input_thread_t
* p_input
)
390 vlc_mutex_destroy( &((packet_cache_t
*)p_input
->p_plugin_data
)->lock
);
391 free( p_input
->p_plugin_data
);
394 /*****************************************************************************
395 * SafeRead: reads a chunk of stream and correctly detects errors
396 *****************************************************************************/
397 static __inline__
int SafeRead( input_thread_t
* p_input
, byte_t
* p_buffer
,
400 thread_ps_data_t
* p_method
;
403 p_method
= (thread_ps_data_t
*)p_input
->p_plugin_data
;
404 while( fread( p_buffer
, i_len
, 1, p_method
->stream
) != 1 )
406 if( feof( p_method
->stream
) )
411 if( (i_error
= ferror( p_method
->stream
)) )
413 intf_ErrMsg( "Read failed (%s)", strerror(i_error
) );
417 vlc_mutex_lock( &p_input
->stream
.stream_lock
);
418 p_input
->stream
.p_selected_area
->i_tell
+= i_len
;
419 vlc_mutex_unlock( &p_input
->stream
.stream_lock
);
423 /*****************************************************************************
424 * PSRead: reads data packets
425 *****************************************************************************
426 * Returns -1 in case of error, 0 if everything went well, and 1 in case of
428 *****************************************************************************/
429 static int PSRead( input_thread_t
* p_input
,
430 data_packet_t
* pp_packets
[INPUT_READ_ONCE
] )
433 data_packet_t
* p_data
;
434 size_t i_packet_size
;
435 int i_packet
, i_error
;
436 thread_ps_data_t
* p_method
;
438 p_method
= (thread_ps_data_t
*)p_input
->p_plugin_data
;
440 memset( pp_packets
, 0, INPUT_READ_ONCE
* sizeof(data_packet_t
*) );
441 for( i_packet
= 0; i_packet
< INPUT_READ_ONCE
; i_packet
++ )
443 /* Read what we believe to be a packet header. */
444 if( (i_error
= SafeRead( p_input
, p_header
, 6 )) )
449 if( (U32_AT(p_header
) & 0xFFFFFF00) != 0x100L
)
451 /* This is not the startcode of a packet. Read the stream
452 * until we find one. */
453 u32 i_startcode
= U32_AT(p_header
);
458 /* It is common for MPEG-1 streams to pad with zeros
459 * (although it is forbidden by the recommendation), so
460 * don't bother everybody in this case. */
461 intf_WarnMsg( 3, "Garbage at input (%.8x)", i_startcode
);
464 while( (i_startcode
& 0xFFFFFF00) != 0x100L
)
467 if( (i_dummy
= getc( p_method
->stream
)) != EOF
)
469 i_startcode
|= i_dummy
;
477 *(u32
*)p_header
= U32_AT(&i_startcode
);
478 if( (i_error
= SafeRead( p_input
, p_header
+ 4, 2 )) )
484 if( U32_AT(p_header
) != 0x1BA )
486 /* That's the case for all packets, except pack header. */
487 i_packet_size
= U16_AT(&p_header
[4]);
492 if( (p_header
[4] & 0xC0) == 0x40 )
497 else if( (p_header
[4] & 0xF0) == 0x20 )
504 intf_ErrMsg( "Unable to determine stream type" );
509 /* Fetch a packet of the appropriate size. */
510 p_data
= NewPacket( p_input
->p_method_data
, i_packet_size
+ 6 );
513 intf_ErrMsg( "Out of memory" );
517 /* Copy the header we already read. */
518 memcpy( p_data
->p_buffer
, p_header
, 6 );
520 /* Read the remaining of the packet. */
521 if( i_packet_size
&& (i_error
=
522 SafeRead( p_input
, p_data
->p_buffer
+ 6, i_packet_size
)) )
527 /* In MPEG-2 pack headers we still have to read stuffing bytes. */
528 if( U32_AT(p_header
) == 0x1BA )
530 if( i_packet_size
== 8 && (p_data
->p_buffer
[13] & 0x7) != 0 )
532 /* MPEG-2 stuffing bytes */
534 if( (i_error
= SafeRead( p_input
, p_garbage
,
535 p_data
->p_buffer
[13] & 0x7)) )
542 /* Give the packet to the other input stages. */
543 pp_packets
[i_packet
] = p_data
;
549 /*****************************************************************************
550 * PSSeek: changes the stream position indicator
551 *****************************************************************************/
552 static void PSSeek( input_thread_t
* p_input
, off_t i_position
)
554 thread_ps_data_t
* p_method
;
556 p_method
= (thread_ps_data_t
*)p_input
->p_plugin_data
;
558 /* A little bourrin but should work for a while --Meuuh */
560 fseeko( p_method
->stream
, i_position
, SEEK_SET
);
562 fseek( p_method
->stream
, (long)i_position
, SEEK_SET
);
565 p_input
->stream
.p_selected_area
->i_tell
= i_position
;
569 * Packet management utilities
573 /*****************************************************************************
574 * NewPacket: allocates a data packet
575 *****************************************************************************/
576 static struct data_packet_s
* NewPacket( void * p_packet_cache
,
579 packet_cache_t
* p_cache
;
580 data_packet_t
* p_data
;
583 p_cache
= (packet_cache_t
*)p_packet_cache
;
586 if ( p_cache
== NULL
)
588 intf_ErrMsg( "PPacket cache not initialized" );
594 if( l_size
> INPUT_MAX_PACKET_SIZE
)
596 intf_ErrMsg( "Packet too big (%d)", l_size
);
600 vlc_mutex_lock( &p_cache
->lock
);
602 /* Checks whether the data cache is empty */
603 if( p_cache
->data
.l_index
== 0 )
605 /* Allocates a new packet */
606 p_data
= malloc( sizeof(data_packet_t
) );
609 intf_ErrMsg( "Out of memory" );
610 vlc_mutex_unlock( &p_cache
->lock
);
614 intf_DbgMsg( "PS input: data packet allocated" );
619 /* Takes the packet out from the cache */
620 if( (p_data
= p_cache
->data
.p_stack
[ -- p_cache
->data
.l_index
])
623 intf_ErrMsg( "NULL packet in the data cache" );
624 vlc_mutex_unlock( &p_cache
->lock
);
629 if( l_size
< MAX_SMALL_SIZE
)
633 /* Checks whether the buffer cache is empty */
634 if( p_cache
->smallbuffer
.l_index
== 0 )
636 /* Allocates a new packet */
637 p_data
->p_buffer
= malloc( l_size
);
638 if( p_data
->p_buffer
== NULL
)
640 intf_DbgMsg( "Out of memory" );
642 vlc_mutex_unlock( &p_cache
->lock
);
646 intf_DbgMsg( "PS input: small buffer allocated" );
648 p_data
->l_size
= l_size
;
652 /* Takes the packet out from the cache */
653 l_index
= -- p_cache
->smallbuffer
.l_index
;
654 if( (p_data
->p_buffer
= p_cache
->smallbuffer
.p_stack
[l_index
].p_data
)
657 intf_ErrMsg( "NULL packet in the small buffer cache" );
659 vlc_mutex_unlock( &p_cache
->lock
);
662 /* Reallocates the packet if it is too small or too large */
663 if( p_cache
->smallbuffer
.p_stack
[l_index
].l_size
< l_size
||
664 p_cache
->smallbuffer
.p_stack
[l_index
].l_size
> 2*l_size
)
666 p_data
->p_buffer
= realloc( p_data
->p_buffer
, l_size
);
667 p_data
->l_size
= l_size
;
671 p_data
->l_size
= p_cache
->smallbuffer
.p_stack
[l_index
].l_size
;
679 /* Checks whether the buffer cache is empty */
680 if( p_cache
->largebuffer
.l_index
== 0 )
682 /* Allocates a new packet */
683 p_data
->p_buffer
= malloc( l_size
);
684 if ( p_data
->p_buffer
== NULL
)
686 intf_ErrMsg( "Out of memory" );
688 vlc_mutex_unlock( &p_cache
->lock
);
692 intf_DbgMsg( "PS input: large buffer allocated" );
694 p_data
->l_size
= l_size
;
698 /* Takes the packet out from the cache */
699 l_index
= -- p_cache
->largebuffer
.l_index
;
700 p_data
->p_buffer
= p_cache
->largebuffer
.p_stack
[l_index
].p_data
;
701 if( p_data
->p_buffer
== NULL
)
703 intf_ErrMsg( "NULL packet in the small buffer cache" );
705 vlc_mutex_unlock( &p_cache
->lock
);
708 /* Reallocates the packet if it is too small or too large */
709 if( p_cache
->largebuffer
.p_stack
[l_index
].l_size
< l_size
||
710 p_cache
->largebuffer
.p_stack
[l_index
].l_size
> 2*l_size
)
712 p_data
->p_buffer
= realloc( p_data
->p_buffer
, l_size
);
713 p_data
->l_size
= l_size
;
717 p_data
->l_size
= p_cache
->largebuffer
.p_stack
[l_index
].l_size
;
722 vlc_mutex_unlock( &p_cache
->lock
);
724 /* Initialize data */
725 p_data
->p_next
= NULL
;
726 p_data
->b_discard_payload
= 0;
727 p_data
->p_payload_start
= p_data
->p_buffer
;
728 p_data
->p_payload_end
= p_data
->p_buffer
+ l_size
;
735 /*****************************************************************************
736 * NewPES: allocates a pes packet
737 *****************************************************************************/
738 static pes_packet_t
* NewPES( void * p_packet_cache
)
740 packet_cache_t
* p_cache
;
741 pes_packet_t
* p_pes
;
743 p_cache
= (packet_cache_t
*)p_packet_cache
;
746 if ( p_cache
== NULL
)
748 intf_ErrMsg( "Packet cache not initialized" );
753 vlc_mutex_lock( &p_cache
->lock
);
755 /* Checks whether the PES cache is empty */
756 if( p_cache
->pes
.l_index
== 0 )
758 /* Allocates a new packet */
759 p_pes
= malloc( sizeof(pes_packet_t
) );
762 intf_DbgMsg( "Out of memory" );
763 vlc_mutex_unlock( &p_cache
->lock
);
767 intf_DbgMsg( "PS input: PES packet allocated" );
772 /* Takes the packet out from the cache */
773 p_pes
= p_cache
->pes
.p_stack
[ -- p_cache
->pes
.l_index
];
776 intf_ErrMsg( "NULL packet in the data cache" );
777 vlc_mutex_unlock( &p_cache
->lock
);
782 vlc_mutex_unlock( &p_cache
->lock
);
784 p_pes
->b_data_alignment
= p_pes
->b_discontinuity
=
785 p_pes
->i_pts
= p_pes
->i_dts
= 0;
786 p_pes
->i_pes_size
= 0;
787 p_pes
->p_first
= NULL
;
793 /*****************************************************************************
794 * DeletePacket: deletes a data packet
795 *****************************************************************************/
796 static void DeletePacket( void * p_packet_cache
,
797 data_packet_t
* p_data
)
799 packet_cache_t
* p_cache
;
801 p_cache
= (packet_cache_t
*)p_packet_cache
;
804 if ( p_cache
== NULL
)
806 intf_ErrMsg( "Packet cache not initialized" );
813 vlc_mutex_lock( &p_cache
->lock
);
815 /* Checks whether the data cache is full */
816 if ( p_cache
->data
.l_index
< DATA_CACHE_SIZE
)
818 /* Cache not full: store the packet in it */
819 p_cache
->data
.p_stack
[ p_cache
->data
.l_index
++ ] = p_data
;
820 /* Small buffer or large buffer? */
821 if ( p_data
->l_size
< MAX_SMALL_SIZE
)
823 /* Checks whether the small buffer cache is full */
824 if ( p_cache
->smallbuffer
.l_index
< SMALL_CACHE_SIZE
)
826 p_cache
->smallbuffer
.p_stack
[
827 p_cache
->smallbuffer
.l_index
].l_size
= p_data
->l_size
;
828 p_cache
->smallbuffer
.p_stack
[
829 p_cache
->smallbuffer
.l_index
++ ].p_data
= p_data
->p_buffer
;
833 ASSERT( p_data
->p_buffer
);
834 free( p_data
->p_buffer
);
836 intf_DbgMsg( "PS input: small buffer freed" );
842 /* Checks whether the large buffer cache is full */
843 if ( p_cache
->largebuffer
.l_index
< LARGE_CACHE_SIZE
)
845 p_cache
->largebuffer
.p_stack
[
846 p_cache
->largebuffer
.l_index
].l_size
= p_data
->l_size
;
847 p_cache
->largebuffer
.p_stack
[
848 p_cache
->largebuffer
.l_index
++ ].p_data
= p_data
->p_buffer
;
852 ASSERT( p_data
->p_buffer
);
853 free( p_data
->p_buffer
);
855 intf_DbgMsg( "PS input: large buffer freed" );
862 /* Cache full: the packet must be freed */
863 free( p_data
->p_buffer
);
866 intf_DbgMsg( "PS input: data packet freed" );
870 vlc_mutex_unlock( &p_cache
->lock
);
873 /*****************************************************************************
874 * DeletePES: deletes a PES packet and associated data packets
875 *****************************************************************************/
876 static void DeletePES( void * p_packet_cache
, pes_packet_t
* p_pes
)
878 packet_cache_t
* p_cache
;
879 data_packet_t
* p_data
;
880 data_packet_t
* p_next
;
882 p_cache
= (packet_cache_t
*)p_packet_cache
;
885 if ( p_cache
== NULL
)
887 intf_ErrMsg( "Packet cache not initialized" );
894 p_data
= p_pes
->p_first
;
896 while( p_data
!= NULL
)
898 p_next
= p_data
->p_next
;
899 DeletePacket( p_cache
, p_data
);
903 vlc_mutex_lock( &p_cache
->lock
);
905 /* Checks whether the PES cache is full */
906 if ( p_cache
->pes
.l_index
< PES_CACHE_SIZE
)
908 /* Cache not full: store the packet in it */
909 p_cache
->pes
.p_stack
[ p_cache
->pes
.l_index
++ ] = p_pes
;
913 /* Cache full: the packet must be freed */
916 intf_DbgMsg( "PS input: PES packet freed" );
920 vlc_mutex_unlock( &p_cache
->lock
);