- if( i == -1 )
- p_input = p_sys->p_pcr_input;
- else if( p_mux->pp_inputs[i]->p_sys == p_pcr_stream )
- continue;
- else
- p_input = p_mux->pp_inputs[i];
- p_stream = (ts_stream_t*)p_input->p_sys;
-
- if( ( ( p_stream == p_pcr_stream ) &&
- ( p_stream->i_pes_length < i_shaping_delay ) ) ||
- ( p_stream->i_pes_dts + p_stream->i_pes_length <
- p_pcr_stream->i_pes_dts + p_pcr_stream->i_pes_length ) )
- {
- /* Need more data */
- if( block_FifoCount( p_input->p_fifo ) <= 1 )
- {
- if( ( p_input->p_fmt->i_cat == AUDIO_ES ) ||
- ( p_input->p_fmt->i_cat == VIDEO_ES ) )
- {
- /* We need more data */
- return VLC_SUCCESS;
- }
- else if( block_FifoCount( p_input->p_fifo ) <= 0 )
- {
- /* spu, only one packet is needed */
- continue;
- }
- else if( p_input->p_fmt->i_cat == SPU_ES )
- {
- /* Don't mux the SPU yet if it is too early */
- block_t *p_spu = block_FifoShow( p_input->p_fifo );
-
- i_spu_delay =
- p_spu->i_dts - p_pcr_stream->i_pes_dts;
-
- if( ( i_spu_delay > i_shaping_delay ) &&
- ( i_spu_delay < INT64_C(100000000) ) )
- continue;
-
- if ( ( i_spu_delay >= INT64_C(100000000) ) ||
- ( i_spu_delay < INT64_C(10000) ) )
- {
- BufferChainClean( &p_stream->chain_pes );
- p_stream->i_pes_dts = 0;
- p_stream->i_pes_used = 0;
- p_stream->i_pes_length = 0;
- continue;
- }
- }
- }
- b_ok = false;
-
- if( p_stream == p_pcr_stream || p_sys->b_data_alignment
- || p_input->p_fmt->i_codec !=
- VLC_CODEC_MPGA )
- {
- p_data = block_FifoGet( p_input->p_fifo );
-
- if( p_input->p_fmt->i_codec ==
- VLC_CODEC_MP4A )
- p_data = Add_ADTS( p_data, p_input->p_fmt );
- }
- else
- p_data = FixPES( p_mux, p_input->p_fifo );
-
- if( block_FifoCount( p_input->p_fifo ) > 0 &&
- p_input->p_fmt->i_cat != SPU_ES )
- {
- block_t *p_next = block_FifoShow( p_input->p_fifo );
- p_data->i_length = p_next->i_dts - p_data->i_dts;
- }
- else if( p_input->p_fmt->i_codec !=
- VLC_CODEC_SUBT )
- p_data->i_length = 1000;
-
- if( ( p_pcr_stream->i_pes_dts > 0 &&
- p_data->i_dts - 10000000 > p_pcr_stream->i_pes_dts +
- p_pcr_stream->i_pes_length ) ||
- p_data->i_dts < p_stream->i_pes_dts ||
- ( p_stream->i_pes_dts > 0 &&
- p_input->p_fmt->i_cat != SPU_ES &&
- p_data->i_dts - 10000000 > p_stream->i_pes_dts +
- p_stream->i_pes_length ) )
- {
- msg_Warn( p_mux, "packet with too strange dts "
- "(dts=%"PRId64",old=%"PRId64",pcr=%"PRId64")",
- p_data->i_dts, p_stream->i_pes_dts,
- p_pcr_stream->i_pes_dts );
- block_Release( p_data );
-
- BufferChainClean( &p_stream->chain_pes );
- p_stream->i_pes_dts = 0;
- p_stream->i_pes_used = 0;
- p_stream->i_pes_length = 0;
-
- if( p_input->p_fmt->i_cat != SPU_ES )
- {
- BufferChainClean( &p_pcr_stream->chain_pes );
- p_pcr_stream->i_pes_dts = 0;
- p_pcr_stream->i_pes_used = 0;
- p_pcr_stream->i_pes_length = 0;
- }
- }
- else
- {
- int i_header_size = 0;
- int i_max_pes_size = 0;
- int b_data_alignment = 0;
- if( p_input->p_fmt->i_cat == SPU_ES )
- {
- if( p_input->p_fmt->i_codec ==
- VLC_CODEC_SUBT )
- {
- /* Prepend header */
- p_data = block_Realloc( p_data, 2,
- p_data->i_buffer );
- p_data->p_buffer[0] =
- ( (p_data->i_buffer - 2) >> 8) & 0xff;
- p_data->p_buffer[1] =
- ( (p_data->i_buffer - 2) ) & 0xff;
-
- /* remove trailling \0 if any */
- if( p_data->i_buffer > 2 &&
- p_data->p_buffer[p_data->i_buffer -1] ==
- '\0' )
- p_data->i_buffer--;
-
- /* Append a empty sub (sub text only) */
- if( p_data->i_length > 0 &&
- !( p_data->i_buffer == 1 &&
- *p_data->p_buffer == ' ' ) )
- {
- block_t *p_spu = block_New( p_mux, 3 );
-
- p_spu->i_dts = p_spu->i_pts =
- p_data->i_dts + p_data->i_length;
- p_spu->i_length = 1000;
-
- p_spu->p_buffer[0] = 0;
- p_spu->p_buffer[1] = 1;
- p_spu->p_buffer[2] = ' ';
-
- EStoPES( p_mux->p_sout, &p_spu, p_spu,
- p_input->p_fmt,
- p_stream->i_stream_id, 1,
- 0, 0, 0 );
- p_data->p_next = p_spu;
- }
- }
- else if( p_input->p_fmt->i_codec ==
- VLC_CODEC_TELETEXT )
- {
- /* EN 300 472 */
- i_header_size = 0x24;
- b_data_alignment = 1;
- }
- else if( p_input->p_fmt->i_codec ==
- VLC_CODEC_DVBS )
- {
- /* EN 300 743 */
- b_data_alignment = 1;
- }
- }
- else if( p_data->i_length < 0 ||
- p_data->i_length > 2000000 )
- {
- /* FIXME choose a better value, but anyway we
- * should never have to do that */
- p_data->i_length = 1000;
- }
-
- p_stream->i_pes_length += p_data->i_length;
- if( p_stream->i_pes_dts == 0 )
- {
- p_stream->i_pes_dts = p_data->i_dts;
- }
-
- /* Convert to pes */
- if( p_stream->i_stream_id == 0xa0 &&
- p_data->i_pts <= 0 )
- {
- /* XXX yes I know, it's awful, but it's needed,
- * so don't remove it ... */
- p_data->i_pts = p_data->i_dts;
- }
-
- if( p_input->p_fmt->i_codec ==
- VLC_CODEC_DIRAC )
- {
- b_data_alignment = 1;
- /* dirac pes packets should be unbounded in
- * length, specify a suitibly large max size */
- i_max_pes_size = INT_MAX;
- }
-
- EStoPES ( p_mux->p_sout, &p_data, p_data,
- p_input->p_fmt, p_stream->i_stream_id,
- 1, b_data_alignment, i_header_size,
- i_max_pes_size );
-
- BufferChainAppend( &p_stream->chain_pes, p_data );
-
- if( p_sys->b_use_key_frames && p_stream == p_pcr_stream
- && (p_data->i_flags & BLOCK_FLAG_TYPE_I)
- && !(p_data->i_flags & BLOCK_FLAG_NO_KEYFRAME)
- && (p_stream->i_pes_length > 400000) )
- {
- i_shaping_delay = p_stream->i_pes_length;
- p_stream->b_key_frame = 1;
- }
- }
- }