[vlc-commits] packetizer: hevc: store dts in date_t
Francois Cartegnie
git at videolan.org
Tue Apr 4 14:17:29 CEST 2017
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Apr 3 16:59:35 2017 +0200| [88a1c640311007f829116aa90e365333ee78660c] | committer: Francois Cartegnie
packetizer: hevc: store dts in date_t
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=88a1c640311007f829116aa90e365333ee78660c
---
modules/packetizer/hevc.c | 42 ++++++++++++++++++++++++++++++++++--------
1 file changed, 34 insertions(+), 8 deletions(-)
diff --git a/modules/packetizer/hevc.c b/modules/packetizer/hevc.c
index 7ceb442..c50ba71 100644
--- a/modules/packetizer/hevc.c
+++ b/modules/packetizer/hevc.c
@@ -91,6 +91,10 @@ struct decoder_sys_t
const hevc_picture_parameter_set_t *p_active_pps;
bool b_init_sequence_complete;
+ date_t dts;
+ mtime_t pts;
+ bool b_need_ts;
+
/* */
cc_storage_t *p_ccs;
};
@@ -123,11 +127,8 @@ static block_t * OutputQueues(decoder_sys_t *p_sys, bool b_valid)
{
i_flags |= p_sys->frame.p_chain->i_flags;
block_ChainLastAppend(&pp_output_last, p_sys->frame.p_chain);
- if(p_output->i_dts == 0)
- {
- p_output->i_dts = p_sys->frame.p_chain->i_dts;
- p_output->i_pts = p_sys->frame.p_chain->i_pts;
- }
+ p_output->i_dts = date_Get(&p_sys->dts);
+ p_output->i_pts = p_sys->pts;
INITQ(frame);
}
@@ -184,6 +185,16 @@ static int Open(vlc_object_t *p_this)
es_format_Copy(&p_dec->fmt_out, &p_dec->fmt_in);
p_dec->fmt_out.b_packetized = true;
+ /* Init timings */
+ if( p_dec->fmt_in.video.i_frame_rate_base > 0 )
+ 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, 1, 1 );
+ date_Set( &p_sys->dts, VLC_TS_INVALID );
+ p_sys->pts = VLC_TS_INVALID;
+ p_sys->b_need_ts = true;
+
/* Set callbacks */
const uint8_t *p_extra = p_dec->fmt_in.p_extra;
const size_t i_extra = p_dec->fmt_in.i_extra;
@@ -304,6 +315,8 @@ static void PacketizeReset(void *p_private, bool b_broken)
block_ChainRelease(p_out);
p_sys->b_init_sequence_complete = false;
+ p_sys->b_need_ts = true;
+ date_Set(&p_sys->dts, VLC_TS_INVALID);
}
static bool InsertXPS(decoder_t *p_dec, uint8_t i_nal_type, uint8_t i_id,
@@ -685,12 +698,24 @@ static block_t *GatherAndValidateChain(block_t *p_outputchain)
static block_t *ParseNALBlock(decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag)
{
decoder_sys_t *p_sys = p_dec->p_sys;
+ *pb_ts_used = false;
+
+ if(p_sys->b_need_ts)
+ {
+ if(p_frag->i_dts > VLC_TS_INVALID)
+ {
+ date_Set(&p_sys->dts, p_frag->i_dts);
+ *pb_ts_used = true;
+ }
+ p_sys->pts = p_frag->i_pts;
+ if(date_Get( &p_sys->dts ) != VLC_TS_INVALID)
+ p_sys->b_need_ts = false;
+ }
if(unlikely(p_frag->i_buffer < 5))
{
msg_Warn(p_dec,"NAL too small");
block_Release(p_frag);
- *pb_ts_used = false;
return NULL;
}
@@ -698,7 +723,6 @@ static block_t *ParseNALBlock(decoder_t *p_dec, bool *pb_ts_used, block_t *p_fra
{
msg_Warn(p_dec,"Forbidden zero bit not null, corrupted NAL");
block_Release(p_frag);
- *pb_ts_used = false;
return GatherAndValidateChain(OutputQueues(p_sys, false)); /* will drop */
}
@@ -718,7 +742,9 @@ static block_t *ParseNALBlock(decoder_t *p_dec, bool *pb_ts_used, block_t *p_fra
}
p_output = GatherAndValidateChain(p_output);
- *pb_ts_used = (p_output != NULL);
+ if(p_output)
+ p_sys->b_need_ts = true;
+
return p_output;
}
More information about the vlc-commits
mailing list