[vlc-commits] packetizer: vc1: use date_t for interpolation
Francois Cartegnie
git at videolan.org
Sat Oct 19 14:03:10 CEST 2019
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Oct 18 13:34:31 2019 +0200| [213849329708a712df84293c29874d0d7ea7078e] | committer: Francois Cartegnie
packetizer: vc1: use date_t for interpolation
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=213849329708a712df84293c29874d0d7ea7078e
---
modules/packetizer/vc1.c | 51 +++++++++++++++++++++++++-----------------------
1 file changed, 27 insertions(+), 24 deletions(-)
diff --git a/modules/packetizer/vc1.c b/modules/packetizer/vc1.c
index 60138ac49b..f41d244432 100644
--- a/modules/packetizer/vc1.c
+++ b/modules/packetizer/vc1.c
@@ -92,9 +92,9 @@ typedef struct
vlc_tick_t i_frame_pts;
block_t *p_frame;
block_t **pp_last;
+ date_t dts;
- vlc_tick_t i_interpolated_dts;
bool b_check_startcode;
/* */
@@ -175,7 +175,11 @@ static int Open( vlc_object_t *p_this )
p_sys->p_frame = NULL;
p_sys->pp_last = &p_sys->p_frame;
- p_sys->i_interpolated_dts = VLC_TICK_INVALID;
+ if( p_dec->fmt_in.video.i_frame_rate && p_dec->fmt_in.video.i_frame_rate_base )
+ date_Init( &p_sys->dts, p_dec->fmt_in.video.i_frame_rate * 2,
+ p_dec->fmt_in.video.i_frame_rate_base );
+ else
+ date_Init( &p_sys->dts, 30000*2, 1000 );
p_sys->b_check_startcode = p_dec->fmt_in.b_packetized;
if( p_dec->fmt_out.i_extra > 0 )
@@ -290,7 +294,7 @@ static void PacketizeReset( void *p_private, bool b_flush )
p_sys->i_frame_dts = VLC_TICK_INVALID;
p_sys->i_frame_pts = VLC_TICK_INVALID;
- p_sys->i_interpolated_dts = VLC_TICK_INVALID;
+ date_Set( &p_sys->dts, VLC_TICK_INVALID );
}
static block_t *PacketizeParse( void *p_private, bool *pb_ts_used, block_t *p_block )
{
@@ -304,7 +308,7 @@ static int PacketizeValidate( void *p_private, block_t *p_au )
decoder_t *p_dec = p_private;
decoder_sys_t *p_sys = p_dec->p_sys;
- if( p_sys->i_interpolated_dts == VLC_TICK_INVALID )
+ if( date_Get( &p_sys->dts ) == VLC_TICK_INVALID )
{
msg_Dbg( p_dec, "need a starting pts/dts" );
return VLC_EGENERIC;
@@ -363,28 +367,16 @@ static block_t *OutputFrame( decoder_t *p_dec )
}
/* */
- if( p_sys->i_frame_dts != VLC_TICK_INVALID )
- p_sys->i_interpolated_dts = i_dts;
+ if( i_dts == VLC_TICK_INVALID )
+ i_dts = date_Get( &p_sys->dts );
+ else
+ date_Set( &p_sys->dts, i_dts );
- /* We can interpolate dts/pts only if we have a frame rate */
- if( p_dec->fmt_out.video.i_frame_rate != 0 && p_dec->fmt_out.video.i_frame_rate_base != 0 )
+ if( i_pts == VLC_TICK_INVALID )
{
- if( p_sys->i_interpolated_dts != VLC_TICK_INVALID )
- p_sys->i_interpolated_dts += vlc_tick_from_samples(
- p_dec->fmt_out.video.i_frame_rate_base,
- p_dec->fmt_out.video.i_frame_rate);
-
- //msg_Dbg( p_dec, "-------------- XXX0 dts=%"PRId64" pts=%"PRId64" interpolated=%"PRId64,
- // i_dts, i_pts, p_sys->i_interpolated_dts );
- if( i_dts == VLC_TICK_INVALID )
- i_dts = p_sys->i_interpolated_dts;
-
- if( i_pts == VLC_TICK_INVALID )
- {
- if( !p_sys->sh.b_has_bframe || (i_pic_flags & BLOCK_FLAG_TYPE_B ) )
- i_pts = i_dts;
- /* TODO compute pts for other case */
- }
+ if( !p_sys->sh.b_has_bframe || (i_pic_flags & BLOCK_FLAG_TYPE_B ) )
+ i_pts = i_dts;
+ /* TODO compute pts for other case */
}
if( p_pic )
@@ -395,6 +387,14 @@ static block_t *OutputFrame( decoder_t *p_dec )
//msg_Dbg( p_dec, "-------------- dts=%"PRId64" pts=%"PRId64, i_dts, i_pts );
+ /* We can interpolate dts/pts only if we have a frame rate */
+ if( p_dec->fmt_out.video.i_frame_rate && p_dec->fmt_out.video.i_frame_rate_base )
+ {
+ date_Increment( &p_sys->dts, 2 );
+ // msg_Dbg( p_dec, "-------------- XXX0 dts=%"PRId64" pts=%"PRId64" interpolated=%"PRId64,
+ // i_dts, i_pts, date_Get( &p_sys->dts ) );
+ }
+
/* CC */
p_sys->i_cc_pts = i_pts;
p_sys->i_cc_dts = i_dts;
@@ -604,7 +604,10 @@ static block_t *ParseIDU( decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag )
vlc_ureduce( &p_es->video.i_frame_rate, &p_es->video.i_frame_rate_base, i_fps_num, i_fps_den, 0 );
if( !p_sys->b_sequence_header )
+ {
msg_Dbg( p_dec, "frame rate %d/%d", p_es->video.i_frame_rate, p_es->video.i_frame_rate_base );
+ date_Change( &p_sys->dts, p_es->video.i_frame_rate * 2, p_es->video.i_frame_rate_base );
+ }
}
if( bs_read1( &s ) && /* Color Format */
p_dec->fmt_in.video.primaries == COLOR_PRIMARIES_UNDEF )
More information about the vlc-commits
mailing list