xvimagsink: fix failure to allocate large shared memory blocks
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 4 Apr 2014 11:32:14 +0000 (12:32 +0100)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 3 Apr 2015 10:18:46 +0000 (11:18 +0100)
A previous patch increased allocations by 15 bytes in order to ensure
16 byte alignment for g_malloc blocks. However, shared memory is
already block aligned, and this extra 15 bytes caused allocation
to fail when we were already allocating to the shared memory limit,
which is a lot smaller than typical available RAM.

Fix this by removing the alignment slack when allocating shared
memory.

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

sys/xvimage/xvimageallocator.c

index c14a165..3582183 100644 (file)
@@ -346,7 +346,7 @@ gst_xvimage_allocator_alloc (GstXvImageAllocator * allocator, gint im_format,
   int (*handler) (Display *, XErrorEvent *);
   gboolean success = FALSE;
   GstXvContext *context;
-  gint align = 15, offset;
+  gint align, offset;
   GstXvImageMemory *mem;
 
   context = allocator->context;
@@ -453,8 +453,9 @@ gst_xvimage_allocator_alloc (GstXvImageAllocator * allocator, gint im_format,
     }
 
     /* get shared memory */
+    align = 0;
     mem->SHMInfo.shmid =
-        shmget (IPC_PRIVATE, mem->xvimage->data_size + align, IPC_CREAT | 0777);
+        shmget (IPC_PRIVATE, mem->xvimage->data_size, IPC_CREAT | 0777);
     if (mem->SHMInfo.shmid == -1)
       goto shmget_failed;
 
@@ -489,6 +490,7 @@ gst_xvimage_allocator_alloc (GstXvImageAllocator * allocator, gint im_format,
       goto create_failed;
 
     /* we have to use the returned data_size for our image size */
+    align = 15;                 /* g_malloc aligns to 8, we need 16 */
     mem->xvimage->data = g_malloc (mem->xvimage->data_size + align);
 
     XSync (context->disp, FALSE);