videopool: ensure allocation alignment is consistent with video alignment requirements
authorTim-Philipp Müller <tim@centricular.com>
Fri, 11 Sep 2015 22:36:47 +0000 (23:36 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 15 Sep 2015 09:20:37 +0000 (10:20 +0100)
Make sure GstAllocationParams alignment is not less than
any alignment requirement specified via GstVideoAlignment.

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

gst-libs/gst/video/gstvideopool.c

index 4c98ddf..62026e9 100644 (file)
@@ -173,10 +173,29 @@ video_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
       GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
 
   if (priv->need_alignment && priv->add_videometa) {
-    /* get an apply the alignment to the info */
+    guint max_align, n;
+
     gst_buffer_pool_config_get_video_alignment (config, &priv->video_align);
+
+    /* ensure GstAllocationParams alignment is compatible with video alignment */
+    max_align = priv->params.align;
+    for (n = 0; n < GST_VIDEO_MAX_PLANES; ++n)
+      max_align |= priv->video_align.stride_align[n];
+
+    for (n = 0; n < GST_VIDEO_MAX_PLANES; ++n)
+      priv->video_align.stride_align[n] = max_align;
+
+    /* apply the alignment to the info */
     gst_video_info_align (&info, &priv->video_align);
     gst_buffer_pool_config_set_video_alignment (config, &priv->video_align);
+
+    if (priv->params.align < max_align) {
+      GST_WARNING_OBJECT (pool, "allocation params alignment %u is smaller "
+          "than the max specified video stride alignment %u, fixing",
+          (guint) priv->params.align, max_align);
+      priv->params.align = max_align;
+      gst_buffer_pool_config_set_allocator (config, allocator, &priv->params);
+    }
   }
   priv->info = info;
   info.size = MAX (size, info.size);