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; } }