ENGR00132543 v4l2 output: fill black in streamoff

Fill black data in streamoff, otherwise the last frame will keep in fb.

Signed-off-by: Jason Chen <b02280@freescale.com>
This commit is contained in:
Matt Sealey
2010-12-13 09:57:03 -06:00
parent 6f660227c7
commit 9fb3a4d079

View File

@@ -1536,6 +1536,49 @@ static int mxc_v4l2out_streamoff(vout_data * vout)
if (vout->ic_bypass)
cancel_work_sync(&vout->timer_work);
/* fill black color for fb, we assume fb has double buffer*/
if (format_is_yuv(vout->v2f.fmt.pix.pixelformat)) {
int i;
if ((vout->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_UYVY) ||
(vout->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV) ||
(!vout->ic_bypass)) {
short * tmp = (short *) fbi->screen_base;
short color;
if (vout->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
color = 0x8000;
else
color = 0x80;
for (i = 0; i < (fbi->fix.line_length * fbi->var.yres_virtual)/2;
i++, tmp++)
*tmp = color;
} else if ((vout->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420) ||
(vout->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YVU420) ||
(vout->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_NV12)) {
char * base = (char *)fbi->screen_base;
int j, screen_size = fbi->var.xres * fbi->var.yres;
for (j = 0; j < 2; j++) {
memset(base, 0, screen_size);
base += screen_size;
for (i = 0; i < screen_size/2; i++, base++)
*base = 0x80;
}
} else if (vout->v2f.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV422P) {
char * base = (char *)fbi->screen_base;
int j, screen_size = fbi->var.xres * fbi->var.yres;
for (j = 0; j < 2; j++) {
memset(base, 0, screen_size);
base += screen_size;
for (i = 0; i < screen_size; i++, base++)
*base = 0x80;
}
}
} else
memset(fbi->screen_base, 0x0,
fbi->fix.line_length * fbi->var.yres_virtual);
spin_lock_irqsave(&g_lock, lockflag);
del_timer(&vout->output_timer);