omxh264dec: implement is_format_change
authorPhilippe Normand <philn@igalia.com>
Sun, 16 Aug 2015 12:53:42 +0000 (14:53 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Sun, 16 Aug 2015 13:48:16 +0000 (15:48 +0200)
The omxvideodecoder class only checks some of the caps parameters but if
other fields change such as h264 profile and/or level it wouldn't trigger a
reconfiguration.

https://bugzilla.gnome.org/show_bug.cgi?id=752376

omx/gstomxh264dec.c

index 2581889..2132d9f 100644 (file)
@@ -83,6 +83,31 @@ static gboolean
 gst_omx_h264_dec_is_format_change (GstOMXVideoDec * dec,
     GstOMXPort * port, GstVideoCodecState * state)
 {
+  GstCaps *old_caps = NULL;
+  GstCaps *new_caps = state->caps;
+  GstStructure *old_structure, *new_structure;
+  const gchar *old_profile, *old_level, *new_profile, *new_level;
+
+  if (dec->input_state) {
+    old_caps = dec->input_state->caps;
+  }
+
+  if (!old_caps) {
+    return FALSE;
+  }
+
+  old_structure = gst_caps_get_structure (old_caps, 0);
+  new_structure = gst_caps_get_structure (new_caps, 0);
+  old_profile = gst_structure_get_string (old_structure, "profile");
+  old_level = gst_structure_get_string (old_structure, "level");
+  new_profile = gst_structure_get_string (new_structure, "profile");
+  new_level = gst_structure_get_string (new_structure, "level");
+
+  if (g_strcmp0 (old_profile, new_profile) != 0
+      || g_strcmp0 (old_level, new_level) != 0) {
+    return TRUE;
+  }
+
   return FALSE;
 }