Commit 381e1674 authored by Gildas Bazin's avatar Gildas Bazin

* modules/mux/ogg.c: when removing a stream, flush its fifo first.

parent d5c1443a
......@@ -62,6 +62,7 @@ static int Control ( sout_mux_t *, int, va_list );
static int AddStream( sout_mux_t *, sout_input_t * );
static int DelStream( sout_mux_t *, sout_input_t * );
static int Mux ( sout_mux_t * );
static int MuxBlock ( sout_mux_t *, sout_input_t * );
static block_t *OggCreateHeader( sout_mux_t *, mtime_t );
static block_t *OggCreateFooter( sout_mux_t *, mtime_t );
......@@ -160,14 +161,8 @@ static int MuxGetStream( sout_mux_t *p_mux, int *pi_stream, mtime_t *pi_dts )
else return -1;
}
if( pi_stream )
{
*pi_stream = i_stream;
}
if( pi_dts )
{
*pi_dts = i_dts;
}
if( pi_stream ) *pi_stream = i_stream;
if( pi_dts ) *pi_dts = i_dts;
return i_stream;
}
......@@ -497,6 +492,11 @@ static int DelStream( sout_mux_t *p_mux, sout_input_t *p_input )
/* flush all remaining data */
if( p_input->p_sys )
{
if( !p_stream->b_new )
{
while( p_input->p_fifo->i_depth ) MuxBlock( p_mux, p_input );
}
if( !p_stream->b_new &&
( p_og = OggStreamFlush( p_mux, &p_stream->os, 0 ) ) )
{
......@@ -908,19 +908,20 @@ static int Mux( sout_mux_t *p_mux )
for( ;; )
{
sout_input_t *p_input;
ogg_stream_t *p_stream;
block_t *p_data;
ogg_packet op;
if( MuxGetStream( p_mux, &i_stream, 0 ) < 0 ) return VLC_SUCCESS;
MuxBlock( p_mux, p_mux->pp_inputs[i_stream] );
}
if( MuxGetStream( p_mux, &i_stream, &i_dts) < 0 )
{
return VLC_SUCCESS;
}
}
p_input = p_mux->pp_inputs[i_stream];
p_stream = (ogg_stream_t*)p_input->p_sys;
p_data = block_FifoGet( p_input->p_fifo );
static int MuxBlock( sout_mux_t *p_mux, sout_input_t *p_input )
{
sout_mux_sys_t *p_sys = p_mux->p_sys;
ogg_stream_t *p_stream = (ogg_stream_t*)p_input->p_sys;
block_t *p_data = block_FifoGet( p_input->p_fifo );
block_t *p_og = NULL;
ogg_packet op;
if( p_stream->i_fourcc != VLC_FOURCC( 'v', 'o', 'r', 'b' ) &&
p_stream->i_fourcc != VLC_FOURCC( 'f', 'l', 'a', 'c' ) &&
......@@ -945,15 +946,14 @@ static int Mux( sout_mux_t *p_mux )
{
/* number of sample from begining + current packet */
op.granulepos =
( i_dts - p_sys->i_start_dts + p_data->i_length ) *
( p_data->i_dts - p_sys->i_start_dts + p_data->i_length ) *
(mtime_t)p_input->p_fmt->audio.i_rate / I64C(1000000);
}
else if( p_stream->p_oggds_header )
{
/* number of sample from begining */
op.granulepos = ( i_dts - p_sys->i_start_dts ) *
p_stream->p_oggds_header->i_samples_per_unit /
I64C(1000000);
op.granulepos = ( p_data->i_dts - p_sys->i_start_dts ) *
p_stream->p_oggds_header->i_samples_per_unit / I64C(1000000);
}
}
else if( p_stream->i_cat == VIDEO_ES )
......@@ -961,19 +961,19 @@ static int Mux( sout_mux_t *p_mux )
if( p_stream->i_fourcc == VLC_FOURCC( 't', 'h', 'e', 'o' ) )
{
/* FIXME, we assume only keyframes */
op.granulepos = ( ( i_dts - p_sys->i_start_dts ) *
op.granulepos = ( ( p_data->i_dts - p_sys->i_start_dts ) *
p_input->p_fmt->video.i_frame_rate /
p_input->p_fmt->video.i_frame_rate_base /
I64C(1000000) ) << p_stream->i_keyframe_granule_shift;
}
else if( p_stream->p_oggds_header )
op.granulepos = ( i_dts - p_sys->i_start_dts ) * I64C(10) /
op.granulepos = ( p_data->i_dts - p_sys->i_start_dts ) * I64C(10) /
p_stream->p_oggds_header->i_time_unit;
}
else if( p_stream->i_cat == SPU_ES )
{
/* granulepos is in milisec */
op.granulepos = ( i_dts - p_sys->i_start_dts ) / 1000;
op.granulepos = ( p_data->i_dts - p_sys->i_start_dts ) / 1000;
}
ogg_stream_packetin( &p_stream->os, &op );
......@@ -1008,7 +1008,5 @@ static int Mux( sout_mux_t *p_mux )
}
block_Release( p_data );
}
return VLC_SUCCESS;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment