summaryrefslogtreecommitdiff
path: root/gst/mpegtsdemux
diff options
context:
space:
mode:
authorEdward Hervey <edward.hervey@collabora.co.uk>2012-03-01 17:53:41 +0100
committerEdward Hervey <edward.hervey@collabora.co.uk>2012-03-01 18:15:51 +0100
commit39cc29a7d26c920825e6ed4ebcd2cbd310a21328 (patch)
treef267197496eb7e45f47540fe5e7e8c7261ceb5d8 /gst/mpegtsdemux
parentc10fc17a1e930c2cfd9cacb7f90d8b6a6cec4a88 (diff)
downloadgstreamer-plugins-bad-39cc29a7d26c920825e6ed4ebcd2cbd310a21328.tar.gz
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
Diffstat (limited to 'gst/mpegtsdemux')
-rw-r--r--gst/mpegtsdemux/mpegtspacketizer.c16
-rw-r--r--gst/mpegtsdemux/mpegtspacketizer.h7
2 files changed, 22 insertions, 1 deletions
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c
index 1bc935640..dc1192220 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 3b18535e4..845541afe 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,