Fix for QTMOBILITY-1772 VideoWidget example crash on windows

The surface format stride calculation in directshow backend is wrong which results in memory access violation.

Change-Id: I80da5affc9a727513bad9c8d74a9f49d0c1a6c0d
Task-number:QTMOBILITY-1772
Reviewed-by:Michael Goddard
(cherry picked from commit 0b010e781634d3b33750fcead445fc7bd3a6f828)
Reviewed-on: http://codereview.qt.nokia.com/2070
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
This commit is contained in:
Ling Hu
2011-07-19 10:50:41 +10:00
committed by Qt by Nokia
parent 1b1012f299
commit f0bc3aa8df

View File

@@ -153,6 +153,7 @@ QVideoSurfaceFormat DirectShowMediaType::formatFromType(const AM_MEDIA_TYPE &typ
return QVideoSurfaceFormat(); return QVideoSurfaceFormat();
} }
#define PAD_TO_DWORD(x) (((x) + 3) & ~3)
int DirectShowMediaType::bytesPerLine(const QVideoSurfaceFormat &format) int DirectShowMediaType::bytesPerLine(const QVideoSurfaceFormat &format)
{ {
switch (format.pixelFormat()) { switch (format.pixelFormat()) {
@@ -162,13 +163,13 @@ int DirectShowMediaType::bytesPerLine(const QVideoSurfaceFormat &format)
return format.frameWidth() * 4; return format.frameWidth() * 4;
// 24 bpp packed formats. // 24 bpp packed formats.
case QVideoFrame::Format_RGB24: case QVideoFrame::Format_RGB24:
return format.frameWidth() * 3 + 3 - format.frameWidth() % 4; return PAD_TO_DWORD(format.frameWidth() * 3);
// 16 bpp packed formats. // 16 bpp packed formats.
case QVideoFrame::Format_RGB565: case QVideoFrame::Format_RGB565:
case QVideoFrame::Format_RGB555: case QVideoFrame::Format_RGB555:
case QVideoFrame::Format_YUYV: case QVideoFrame::Format_YUYV:
case QVideoFrame::Format_UYVY: case QVideoFrame::Format_UYVY:
return format.frameWidth() * 2 + 3 - format.frameWidth() % 4; return PAD_TO_DWORD(format.frameWidth() * 2);
// Planar formats. // Planar formats.
case QVideoFrame::Format_IMC1: case QVideoFrame::Format_IMC1:
case QVideoFrame::Format_IMC2: case QVideoFrame::Format_IMC2:
@@ -177,7 +178,7 @@ int DirectShowMediaType::bytesPerLine(const QVideoSurfaceFormat &format)
case QVideoFrame::Format_YV12: case QVideoFrame::Format_YV12:
case QVideoFrame::Format_NV12: case QVideoFrame::Format_NV12:
case QVideoFrame::Format_YUV420P: case QVideoFrame::Format_YUV420P:
return format.frameWidth() + 3 - format.frameWidth() % 4; return PAD_TO_DWORD(format.frameWidth());
default: default:
return 0; return 0;
} }