sys/directdraw/gstdirectdrawsink.c

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.
This commit is contained in:
Ole André Vadla Ravnås 2008-05-07 14:56:22 +00:00
parent c02e043b1f
commit deab3d26ba
2 changed files with 27 additions and 5 deletions

View file

@ -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> 2008-05-07 Ole André Vadla Ravnås <ole.andre.ravnas at tandberg com>
* sys/directdraw/gstdirectdrawsink.c * sys/directdraw/gstdirectdrawsink.c

View file

@ -572,6 +572,8 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
guint size, GstCaps * caps, GstBuffer ** buf) guint size, GstCaps * caps, GstBuffer ** buf)
{ {
GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (bsink); GstDirectDrawSink *ddrawsink = GST_DIRECTDRAW_SINK (bsink);
GstStructure *structure;
gint width, height;
GstDDrawSurface *surface = NULL; GstDDrawSurface *surface = NULL;
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
GstCaps *buffer_caps = caps; GstCaps *buffer_caps = caps;
@ -580,6 +582,14 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink, GST_CAT_INFO_OBJECT (directdrawsink_debug, ddrawsink,
"a buffer of %u bytes was requested", size); "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); g_mutex_lock (ddrawsink->pool_lock);
/* Inspect our buffer pool */ /* Inspect our buffer pool */
@ -591,8 +601,8 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
ddrawsink->buffer_pool); ddrawsink->buffer_pool);
/* If the surface is invalid for our need, destroy */ /* If the surface is invalid for our need, destroy */
if ((surface->width != ddrawsink->video_width) || if ((surface->width != width) ||
(surface->height != ddrawsink->video_height) || (surface->height != height) ||
(memcmp (&surface->dd_pixel_format, &ddrawsink->dd_pixel_format, (memcmp (&surface->dd_pixel_format, &ddrawsink->dd_pixel_format,
sizeof (DDPIXELFORMAT)) || sizeof (DDPIXELFORMAT)) ||
!gst_directdraw_sink_surface_check (ddrawsink, surface)) !gst_directdraw_sink_surface_check (ddrawsink, surface))
@ -615,9 +625,7 @@ gst_directdraw_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset,
HRESULT hres; HRESULT hres;
DDSURFACEDESC2 surface_desc; DDSURFACEDESC2 surface_desc;
DDSURFACEDESC2 *sd; DDSURFACEDESC2 *sd;
GstStructure *structure = NULL;
structure = gst_caps_get_structure (caps, 0);
if (!gst_structure_get_int (structure, "depth", &depth)) { if (!gst_structure_get_int (structure, "depth", &depth)) {
GST_CAT_DEBUG_OBJECT (directdrawsink_debug, ddrawsink, GST_CAT_DEBUG_OBJECT (directdrawsink_debug, ddrawsink,
"Can't get depth from buffer_alloc caps"); "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; buffer_caps = copy_caps;
buffercaps_unref = TRUE; buffercaps_unref = TRUE;
/* update buffer size needed to store video frames according to new caps */ /* 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 */ /* update our member pixel format */
gst_ddrawvideosink_get_format_from_caps (ddrawsink, buffer_caps, gst_ddrawvideosink_get_format_from_caps (ddrawsink, buffer_caps,