sys/directdraw/gstdirectdrawsink.c
authorOle André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
Wed, 7 May 2008 14:56:22 +0000 (14:56 +0000)
committerOle André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
Wed, 7 May 2008 14:56:22 +0000 (14:56 +0000)
Original commit message from CVS:
* sys/directdraw/gstdirectdrawsink.c
(gst_directdraw_sink_buffer_alloc):
Make it so that gst_directdraw_sink_buffer_alloc uses the right
width/height.
Especially when looking through the pool of buffers, make sure that
the width/height of caps is used instead of the already negotiated
dimensions.
For example if a buffer with different caps is requested, i.e.
higher resolution, the caller would get a buffer with the old
dimensions and thus corrupt the heap.

ChangeLog
sys/directdraw/gstdirectdrawsink.c

index 7d8619a4f39b35cfb96a6662921c75409e4debbb..84e5b660f3df44500ba3b3cb67b151c24ba6c195 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2008-05-07  Ole André Vadla Ravnås  <ole.andre.ravnas at tandberg com>
+
+       * sys/directdraw/gstdirectdrawsink.c
+         (gst_directdraw_sink_buffer_alloc):
+         Make it so that gst_directdraw_sink_buffer_alloc uses the right
+         width/height.
+
+         Especially when looking through the pool of buffers, make sure that
+         the width/height of caps is used instead of the already negotiated
+         dimensions.
+         For example if a buffer with different caps is requested, i.e.
+         higher resolution, the caller would get a buffer with the old
+         dimensions and thus corrupt the heap.
+
 2008-05-07  Ole André Vadla Ravnås  <ole.andre.ravnas at tandberg com>
 
        * sys/directdraw/gstdirectdrawsink.c
index a39e03350e914bfc66c770e42a499f10f687b96f..9d34cf2230b768fb4e5eed3059416dbd28d680fa 100644 (file)
@@ -572,6 +572,8 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
     guint size, GstCaps * caps, GstBuffer ** buf)
 {
   GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (bsink);
+  GstStructure *structure;
+  gint width, height;
   GstDDrawSurface *surface = NULL;
   GstFlowReturn ret = GST_FLOW_OK;
   GstCaps *buffer_caps = caps;
@@ -580,6 +582,14 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
   GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
       "a buffer of %u bytes was requested", size);
 
+  structure = gst_caps_get_structure (caps, 0);
+  if (!gst_structure_get_int (structure, "width", &width) ||
+      !gst_structure_get_int (structure, "height", &height)) {
+    GST_WARNING_OBJECT (ddrawsink, "invalid caps for buffer allocation %"
+        GST_PTR_FORMAT, caps);
+    return GST_FLOW_UNEXPECTED;
+  }
+
   g_mutex_lock (ddrawsink->pool_lock);
 
   /* Inspect our buffer pool */
@@ -591,8 +601,8 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
           ddrawsink->buffer_pool);
 
       /* If the surface is invalid for our need, destroy */
-      if ((surface->width != ddrawsink->video_width) ||
-          (surface->height != ddrawsink->video_height) ||
+      if ((surface->width != width) ||
+          (surface->height != height) ||
           (memcmp (&surface->dd_pixel_format, &ddrawsink->dd_pixel_format,
                   sizeof (DDPIXELFORMAT)) ||
               !gst_directdraw_sink_surface_check (ddrawsink, surface))
@@ -615,9 +625,7 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
     HRESULT hres;
     DDSURFACEDESC2 surface_desc;
     DDSURFACEDESC2 *sd;
-    GstStructure *structure = NULL;
 
-    structure = gst_caps_get_structure (caps, 0);
     if (!gst_structure_get_int (structure, "depth", &depth)) {
       GST_CAT_DEBUG_OBJECT (directdrawsink_debug, ddrawsink,
           "Can't get depth from buffer_alloc caps");
@@ -673,7 +681,7 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
             buffer_caps = copy_caps;
             buffercaps_unref = TRUE;
             /* update buffer size needed to store video frames according to new caps */
-            size = ddrawsink->video_width * ddrawsink->video_height * (bpp / 8);
+            size = width * height * (bpp / 8);
 
             /* update our member pixel format */
             gst_ddrawvideosink_get_format_from_caps (ddrawsink, buffer_caps,