From 39cc29a7d26c920825e6ed4ebcd2cbd310a21328 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 1 Mar 2012 17:53:41 +0100 Subject: [PATCH] mpegtspacketizer: clock fix and minor addition * Don't take into account packets that arrived at the same time as previous ones for clock skew estimation * Add convenience method for processing the next ts packet --- gst/mpegtsdemux/mpegtspacketizer.c | 16 +++++++++++++++- gst/mpegtsdemux/mpegtspacketizer.h | 7 +++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 1bc9356406..dc11922201 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -212,7 +212,7 @@ mpegts_packetizer_finalize (GObject * object) G_OBJECT_CLASS (mpegts_packetizer_parent_class)->finalize (object); } -guint64 +static inline guint64 mpegts_packetizer_compute_pcr (const guint8 * data) { guint32 pcr1; @@ -2318,6 +2318,14 @@ done: return PACKET_NEED_MORE; } +MpegTSPacketizerPacketReturn +mpegts_packetizer_process_next_packet (MpegTSPacketizer2 * packetizer) +{ + MpegTSPacketizerPacket packet; + + return mpegts_packetizer_next_packet (packetizer, &packet); +} + void mpegts_packetizer_clear_packet (MpegTSPacketizer2 * packetizer, MpegTSPacketizerPacket * packet) @@ -2927,6 +2935,11 @@ calculate_skew (MpegTSPacketizer2 * packetizer, guint64 pcrtime, /* elapsed time at receiver, includes the jitter */ recv_diff = time - packetizer->base_time; + /* Ignore packets received at 100% the same time (i.e. from the same input buffer) */ + if (G_UNLIKELY (time == packetizer->prev_in_time + && GST_CLOCK_TIME_IS_VALID (packetizer->prev_in_time))) + goto no_skew; + /* measure the diff */ delta = ((gint64) recv_diff) - ((gint64) send_diff); @@ -3061,6 +3074,7 @@ no_skew: } packetizer->prev_out_time = out_time; + packetizer->prev_in_time = time; packetizer->prev_send_diff = send_diff; GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT, diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h index 3b18535e49..845541afed 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.h +++ b/gst/mpegtsdemux/mpegtspacketizer.h @@ -86,9 +86,14 @@ struct _MpegTSPacketizer2 { /* clock skew calculation */ gboolean calculate_skew; + + /* Following variables are only active/used when + * calculate_skew is TRUE */ + /* FIXME : These variables should be *per* PCR PID */ GstClockTime base_time; GstClockTime base_pcrtime; GstClockTime prev_out_time; + GstClockTime prev_in_time; GstClockTime last_pcrtime; gint64 window[MAX_WINDOW]; guint window_pos; @@ -161,6 +166,8 @@ void mpegts_packetizer_push (MpegTSPacketizer2 *packetizer, GstBuffer *buffer); gboolean mpegts_packetizer_has_packets (MpegTSPacketizer2 *packetizer); MpegTSPacketizerPacketReturn mpegts_packetizer_next_packet (MpegTSPacketizer2 *packetizer, MpegTSPacketizerPacket *packet); +MpegTSPacketizerPacketReturn +mpegts_packetizer_process_next_packet(MpegTSPacketizer2 * packetizer); void mpegts_packetizer_clear_packet (MpegTSPacketizer2 *packetizer, MpegTSPacketizerPacket *packet); void mpegts_packetizer_remove_stream(MpegTSPacketizer2 *packetizer,