From 1db63972f0349a6d15908cc411d2c8f8f5f49374 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sun, 13 May 2007 01:06:19 +0000 Subject: [PATCH] sys/xvimage/xvimagesink.c: Add some sanity checking for the XVImage size returned by X. Original commit message from CVS: * sys/xvimage/xvimagesink.c: Add some sanity checking for the XVImage size returned by X. Related to #377400. --- ChangeLog | 6 ++++++ sys/xvimage/xvimagesink.c | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/ChangeLog b/ChangeLog index 6d3c8ceb92..6cccf4ac90 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-05-12 David Schleef + + * sys/xvimage/xvimagesink.c: + Add some sanity checking for the XVImage size returned by X. + Related to #377400. + 2007-05-12 Wim Taymans * gst-libs/gst/rtp/gstbasertpdepayload.c: diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index 17add05c58..b225ce37c6 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -543,6 +543,8 @@ gst_xvimagesink_xvimage_new (GstXvImageSink * xvimagesink, GstCaps * caps) #ifdef HAVE_XSHM if (xvimagesink->xcontext->use_xshm) { + int expected_size; + xvimage->xvimage = XvShmCreateImage (xvimagesink->xcontext->disp, xvimagesink->xcontext->xv_port_id, xvimage->im_format, NULL, @@ -566,6 +568,31 @@ gst_xvimagesink_xvimage_new (GstXvImageSink * xvimagesink, GstCaps * caps) GST_LOG_OBJECT (xvimagesink, "XShm image size is %" G_GSIZE_FORMAT, xvimage->size); + /* calculate the expected size. This is only for sanity checking the + * number we get from X. */ + switch (xvimagesink->xcontext->im_format) { + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + expected_size = + GST_ROUND_UP_2 (xvimage->height) * GST_ROUND_UP_4 (xvimage->width); + expected_size += + GST_ROUND_UP_2 (xvimage->height) * GST_ROUND_UP_8 (xvimage->width) / + 2; + break; + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + expected_size = xvimage->height * GST_ROUND_UP_4 (xvimage->width * 2); + break; + default: + expected_size = 0; + break; + } + if (expected_size != 0 && xvimage->size != expected_size) { + GST_WARNING_OBJECT (xvimagesink, + "unexpected XShm image size (got %" G_GSIZE_FORMAT ", expected %d)", + xvimage->size, expected_size); + } + xvimage->SHMInfo.shmid = shmget (IPC_PRIVATE, xvimage->size, IPC_CREAT | 0777); if (xvimage->SHMInfo.shmid == -1) {