Commit 0329f06a authored by François Cartegnie's avatar François Cartegnie 🤞

packetizer: flac: only do pts interpolation

parent 8a6c136e
...@@ -73,9 +73,7 @@ struct decoder_sys_t ...@@ -73,9 +73,7 @@ struct decoder_sys_t
/* /*
* Common properties * Common properties
*/ */
mtime_t i_firstpts; date_t pts;
mtime_t i_firstframepts;
struct flac_header_info headerinfo; struct flac_header_info headerinfo;
size_t i_frame_size; size_t i_frame_size;
...@@ -279,6 +277,7 @@ static void Flush(decoder_t *p_dec) ...@@ -279,6 +277,7 @@ static void Flush(decoder_t *p_dec)
p_sys->i_state = STATE_NOSYNC; p_sys->i_state = STATE_NOSYNC;
p_sys->i_offset = 0; p_sys->i_offset = 0;
date_Set( &p_sys->pts, VLC_TS_INVALID );
block_BytestreamEmpty(&p_sys->bytestream); block_BytestreamEmpty(&p_sys->bytestream);
} }
...@@ -308,7 +307,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block) ...@@ -308,7 +307,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
{ {
decoder_sys_t *p_sys = p_dec->p_sys; decoder_sys_t *p_sys = p_dec->p_sys;
uint8_t p_header[FLAC_HEADER_SIZE_MAX]; uint8_t p_header[FLAC_HEADER_SIZE_MAX];
block_t *out, *in = NULL; block_t *out = NULL, *in = NULL;
if ( pp_block && *pp_block) if ( pp_block && *pp_block)
{ {
...@@ -333,21 +332,6 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block) ...@@ -333,21 +332,6 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
return NULL; return NULL;
} }
if ( p_sys->headerinfo.i_pts <= VLC_TS_INVALID )
{
if ( in && in->i_pts == p_sys->headerinfo.i_pts )
{
/* We've just started the stream, wait for the first PTS. */
block_Release(in);
return NULL;
}
p_sys->headerinfo.i_rate = p_dec->fmt_out.audio.i_rate;
}
else if( in && p_sys->i_firstpts == VLC_TS_INVALID )
{
p_sys->i_firstpts = in->i_pts;
}
if ( in ) if ( in )
block_BytestreamPush(&p_sys->bytestream, in); block_BytestreamPush(&p_sys->bytestream, in);
...@@ -392,9 +376,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block) ...@@ -392,9 +376,7 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
p_sys->i_state = STATE_NOSYNC; p_sys->i_state = STATE_NOSYNC;
break; break;
} }
if (p_sys->headerinfo.i_rate != p_dec->fmt_out.audio.i_rate) {
p_dec->fmt_out.audio.i_rate = p_sys->headerinfo.i_rate;
}
p_sys->i_state = STATE_NEXT_SYNC; p_sys->i_state = STATE_NEXT_SYNC;
p_sys->i_offset = 1; p_sys->i_offset = 1;
p_sys->i_frame_size = 0; p_sys->i_frame_size = 0;
...@@ -500,26 +482,45 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block) ...@@ -500,26 +482,45 @@ static block_t *Packetize(decoder_t *p_dec, block_t **pp_block)
break; break;
case STATE_SEND_DATA: case STATE_SEND_DATA:
out = block_heap_Alloc( p_sys->p_buf, p_sys->i_frame_size ); p_dec->fmt_out.audio.i_rate = p_sys->headerinfo.i_rate;
out->i_dts = out->i_pts = p_sys->headerinfo.i_pts; p_dec->fmt_out.audio.i_channels = p_sys->headerinfo.i_channels;
out->i_length = p_sys->headerinfo.i_duration; p_dec->fmt_out.audio.i_physical_channels = pi_channels_maps[p_sys->stream_info.channels];
out->i_flags = p_sys->i_next_block_flags;
if( p_sys->bytestream.p_block->i_pts > date_Get( &p_sys->pts ) &&
p_sys->bytestream.p_block->i_pts > VLC_TS_INVALID )
{
date_Init( &p_sys->pts, p_sys->headerinfo.i_rate, 1 );
date_Set( &p_sys->pts, p_sys->bytestream.p_block->i_pts );
p_sys->bytestream.p_block->i_pts = VLC_TS_INVALID;
}
if( date_Get( &p_sys->pts ) > VLC_TS_INVALID )
{
out = block_heap_Alloc( p_sys->p_buf, p_sys->i_frame_size );
if( out )
{
out->i_dts = out->i_pts = date_Get( &p_sys->pts );
out->i_flags = p_sys->i_next_block_flags;
p_sys->i_next_block_flags = 0;
}
}
date_Increment( &p_sys->pts, p_sys->headerinfo.i_frame_length );
if( out )
out->i_length = date_Get( &p_sys->pts ) - out->i_pts;
else
free( p_sys->p_buf );
p_sys->i_next_block_flags = 0;
p_sys->i_buf = 0; p_sys->i_buf = 0;
p_sys->p_buf = NULL; p_sys->p_buf = NULL;
p_sys->i_frame_size = 0; p_sys->i_frame_size = 0;
p_sys->i_offset = 0;
p_dec->fmt_out.audio.i_channels = p_sys->headerinfo.i_channels; p_sys->i_state = STATE_NOSYNC;
p_dec->fmt_out.audio.i_physical_channels = pi_channels_maps[p_sys->stream_info.channels];
/* So p_block doesn't get re-added several times */ /* So p_block doesn't get re-added several times */
if ( pp_block ) if ( pp_block )
*pp_block = block_BytestreamPop(&p_sys->bytestream); *pp_block = block_BytestreamPop(&p_sys->bytestream);
p_sys->i_offset = 0;
p_sys->i_state = STATE_NOSYNC;
return out; return out;
} }
...@@ -545,13 +546,13 @@ static int Open(vlc_object_t *p_this) ...@@ -545,13 +546,13 @@ static int Open(vlc_object_t *p_this)
p_sys->b_stream_info = false; p_sys->b_stream_info = false;
p_sys->i_last_frame_size = FLAC_FRAME_SIZE_MIN; p_sys->i_last_frame_size = FLAC_FRAME_SIZE_MIN;
p_sys->i_frame_size = 0; p_sys->i_frame_size = 0;
p_sys->i_firstpts = VLC_TS_INVALID;
p_sys->i_firstframepts = VLC_TS_INVALID;
p_sys->headerinfo.i_pts = VLC_TS_INVALID; p_sys->headerinfo.i_pts = VLC_TS_INVALID;
p_sys->i_buf = 0; p_sys->i_buf = 0;
p_sys->p_buf = NULL; p_sys->p_buf = NULL;
p_sys->i_next_block_flags = 0; p_sys->i_next_block_flags = 0;
block_BytestreamInit(&p_sys->bytestream); block_BytestreamInit(&p_sys->bytestream);
date_Init( &p_sys->pts, 1, 1 );
date_Set( &p_sys->pts, VLC_TS_INVALID );
/* */ /* */
es_format_Copy(&p_dec->fmt_out, &p_dec->fmt_in); es_format_Copy(&p_dec->fmt_out, &p_dec->fmt_in);
......
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