提交 b4b38bd6 编写于 作者: I Ian Armstrong 提交者: Mauro Carvalho Chehab

V4L/DVB (5970): ivtv: prevent vertical overflow of yuv output

When the video standard is changed, there's no guarantee the framebuffer
dimensions are still legal. The yuv output code uses these dimensions to
calculate the size & position for the video overlay. If the framebuffer
dimensions are now illegal, the output may exceed the vertical limit of the
display, causing distortion.

This patch adds an additional check to ensure the output doesn't exceed
the limits for the current video standard, cropping if required.
Signed-off-by: NIan Armstrong <ian@iarmst.demon.co.uk>
Signed-off-by: NHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: NMauro Carvalho Chehab <mchehab@infradead.org>
上级 813ce47c
...@@ -898,8 +898,21 @@ static void ivtv_yuv_init (struct ivtv *itv) ...@@ -898,8 +898,21 @@ static void ivtv_yuv_init (struct ivtv *itv)
itv->yuv_info.decode_height = 480; itv->yuv_info.decode_height = 480;
/* If no visible size set, assume full size */ /* If no visible size set, assume full size */
if (!itv->yuv_info.osd_vis_w) itv->yuv_info.osd_vis_w = 720 - itv->yuv_info.osd_x_offset; if (!itv->yuv_info.osd_vis_w)
if (!itv->yuv_info.osd_vis_h) itv->yuv_info.osd_vis_h = itv->yuv_info.decode_height - itv->yuv_info.osd_y_offset; itv->yuv_info.osd_vis_w = 720 - itv->yuv_info.osd_x_offset;
if (!itv->yuv_info.osd_vis_h) {
itv->yuv_info.osd_vis_h = itv->yuv_info.decode_height - itv->yuv_info.osd_y_offset;
} else {
/* If output video standard has changed, requested height may
not be legal */
if (itv->yuv_info.osd_vis_h + itv->yuv_info.osd_y_offset > itv->yuv_info.decode_height) {
IVTV_DEBUG_WARN("Clipping yuv output - fb size (%d) exceeds video standard limit (%d)\n",
itv->yuv_info.osd_vis_h + itv->yuv_info.osd_y_offset,
itv->yuv_info.decode_height);
itv->yuv_info.osd_vis_h = itv->yuv_info.decode_height - itv->yuv_info.osd_y_offset;
}
}
/* We need a buffer for blanking when Y plane is offset - non-fatal if we can't get one */ /* We need a buffer for blanking when Y plane is offset - non-fatal if we can't get one */
itv->yuv_info.blanking_ptr = kzalloc(720*16,GFP_KERNEL); itv->yuv_info.blanking_ptr = kzalloc(720*16,GFP_KERNEL);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册