From 8bf3d5a2b77eff15e130bde36366457c26b7f66a Mon Sep 17 00:00:00 2001 From: Vincent Penquerc'h Date: Thu, 1 Sep 2011 16:46:47 +0100 Subject: [PATCH] ffmpegdec: post QoS messages when dropping a frame There seems to be a little bit of non obvious logic where the QoS logic can decide to not drop decoding a frame and pass it to ffmpeg, telling it to drop. In this case, the QoS logic does not drop the frame itself, but since the frame will end up being dropped, we still mark it as dropped and post a QoS message. https://bugzilla.gnome.org/show_bug.cgi?id=657950 --- ext/ffmpeg/gstffmpegdec.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c index 395937d235..47cd96ce4a 100644 --- a/ext/ffmpeg/gstffmpegdec.c +++ b/ext/ffmpeg/gstffmpegdec.c @@ -126,6 +126,8 @@ struct _GstFFMpegDec /* QoS stuff *//* with LOCK */ gdouble proportion; GstClockTime earliest_time; + gint64 processed; + gint64 dropped; /* clipping segment */ GstSegment segment; @@ -539,6 +541,8 @@ static void gst_ffmpegdec_reset_qos (GstFFMpegDec * ffmpegdec) { gst_ffmpegdec_update_qos (ffmpegdec, 0.5, GST_CLOCK_TIME_NONE); + ffmpegdec->processed = 0; + ffmpegdec->dropped = 0; } static void @@ -1369,6 +1373,7 @@ gst_ffmpegdec_do_qos (GstFFMpegDec * ffmpegdec, GstClockTime timestamp, GstClockTimeDiff diff; gdouble proportion; GstClockTime qostime, earliest_time; + gboolean res = TRUE; *mode_switch = FALSE; @@ -1419,11 +1424,13 @@ gst_ffmpegdec_do_qos (GstFFMpegDec * ffmpegdec, GstClockTime timestamp, } no_qos: + ffmpegdec->processed++; return TRUE; skipping: { - return FALSE; + res = FALSE; + goto drop_qos; } normal_mode: { @@ -1432,6 +1439,7 @@ normal_mode: *mode_switch = TRUE; GST_DEBUG_OBJECT (ffmpegdec, "QOS: normal mode %g < 0.4", proportion); } + ffmpegdec->processed++; return TRUE; } skip_frame: @@ -1442,7 +1450,27 @@ skip_frame: GST_DEBUG_OBJECT (ffmpegdec, "QOS: hurry up, diff %" G_GINT64_FORMAT " >= 0", diff); } - return TRUE; + goto drop_qos; + } +drop_qos: + { + GstClockTime stream_time, jitter; + GstMessage *qos_msg; + + ffmpegdec->dropped++; + stream_time = + gst_segment_to_stream_time (&ffmpegdec->segment, GST_FORMAT_TIME, + timestamp); + jitter = GST_CLOCK_DIFF (qostime, earliest_time); + qos_msg = + gst_message_new_qos (GST_OBJECT_CAST (ffmpegdec), FALSE, qostime, + stream_time, timestamp, GST_CLOCK_TIME_NONE); + gst_message_set_qos_values (qos_msg, jitter, proportion, 1000000); + gst_message_set_qos_stats (qos_msg, GST_FORMAT_BUFFERS, + ffmpegdec->processed, ffmpegdec->dropped); + gst_element_post_message (GST_ELEMENT_CAST (ffmpegdec), qos_msg); + + return res; } }