[gstreamer-bugs] [Bug 576381] New: [basesink] QoS: emergency rendering not always done

GStreamer (bugzilla.gnome.org) bugzilla-daemon at bugzilla.gnome.org
Mon Mar 23 04:06:49 PDT 2009


If you have any questions why you received this email, please see the text at
the end of this email. Replies to this email are NOT read, please see the text
at the end of this email. You can add comments to this bug at:
  http://bugzilla.gnome.org/show_bug.cgi?id=576381

  GStreamer | gstreamer (core) | Ver: git
           Summary: [basesink] QoS: emergency rendering not always done
           Product: GStreamer
           Version: git
          Platform: Other
        OS/Version: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: Normal
         Component: gstreamer (core)
        AssignedTo: gstreamer-bugs at lists.sourceforge.net
        ReportedBy: t.i.m at zen.co.uk
         QAContact: gstreamer-bugs at lists.sourceforge.net
     GNOME version: Unspecified
   GNOME milestone: Unspecified


Consider a situation where a video decoder is very very slow, *much* slower
than the desired framerate. The decoder supports QoS, yet still only the very
first frame is ever rendered; no 'emergency renderings' are done, because all
buffers but the very first are late and the code in gst_base_sink_is_too_late()
goes like this:

     /* !!emergency!!, if we did not receive anything valid for more than a 
      * second, render it anyway so the user sees something */
     if (priv->last_in_time && start - priv->last_in_time > GST_SECOND) {
      late = FALSE;
      GST_DEBUG_OBJECT (basesink,
          "**emergency** last buffer at %" GST_TIME_FORMAT " > GST_SECOND",
          GST_TIME_ARGS (priv->last_in_time));
    }

The problem is the priv->last_in_time != 0 check here. priv->last_in_time is
updated whenever a frame/buffer is actually rendered (normal or emergency), so
if only the very first frame with a timestamp of 0 ever got rendered, no
emergency renderings will be done ever again, unless a buffer actually arrives
in time, which would set last_in_time to something non-0.

I think this should be:

     /* !!emergency!!, if we did not receive anything valid for more than a 
      * second, render it anyway so the user sees something */
-    if (priv->last_in_time && start - priv->last_in_time > GST_SECOND) {
+    if (priv->last_in_time != -1 && start - priv->last_in_time > GST_SECOND) {

instead (or maybe the last_in_time check should just be dropped at all?).

I will attach two logs that demonstrate the problem.


-- 
See http://bugzilla.gnome.org/page.cgi?id=email.html for more info about why you received
this email, why you can't respond via email, how to stop receiving
emails (or reduce the number you receive), and how to contact someone
if you are having problems with the system.

You can add comments to this bug at http://bugzilla.gnome.org/show_bug.cgi?id=576381.




More information about the Gstreamer-bugs mailing list