va: h264dec: set latency
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Sat, 8 Aug 2020 17:59:33 +0000 (19:59 +0200)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 17 Aug 2020 09:32:41 +0000 (09:32 +0000)
The min latency is calculated with the maximum number of frames that
precede any frame, if available, and it is lower than the maximum
number of frames in DBP.

The max latency is calculated with the maxium size of frames in DBP.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1500>

sys/va/gstvah264dec.c

index 296c5be..ef9e164 100644 (file)
@@ -677,6 +677,39 @@ _format_changed (GstVaH264Dec * self, VAProfile new_profile, guint new_rtformat,
       && width == new_width && height == new_height);
 }
 
+static void
+_set_latency (GstVaH264Dec * self, const GstH264SPS * sps)
+{
+  GstClockTime duration, min, max;
+  gint fps_d, fps_n;
+  guint32 num_reorder_frames;
+
+  fps_d = self->output_state->info.fps_d;
+  fps_n = self->output_state->info.fps_n;
+
+  /* if 0/1 then 25/1 */
+  if (fps_n == 0) {
+    fps_n = 25;
+    fps_d = 1;
+  }
+
+  num_reorder_frames = 1;
+  if (sps->vui_parameters_present_flag
+      && sps->vui_parameters.bitstream_restriction_flag)
+    num_reorder_frames = sps->vui_parameters.num_reorder_frames;
+  if (num_reorder_frames > self->dpb_size)
+    num_reorder_frames = 1;
+
+  duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n);
+  min = num_reorder_frames * duration;
+  max = self->dpb_size * duration;
+
+  GST_LOG_OBJECT (self,
+      "latency min %" G_GUINT64_FORMAT " max %" G_GUINT64_FORMAT, min, max);
+
+  gst_video_decoder_set_latency (GST_VIDEO_DECODER (self), min, max);
+}
+
 static gboolean
 gst_va_h264_dec_new_sequence (GstH264Decoder * decoder, const GstH264SPS * sps,
     gint max_dpb_size)
@@ -739,6 +772,8 @@ gst_va_h264_dec_new_sequence (GstH264Decoder * decoder, const GstH264SPS * sps,
       GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
       return FALSE;
     }
+
+    _set_latency (self, sps);
   }
 
   return TRUE;