diff options
author | Jason Chen <b02280@freescale.com> | 2010-11-24 11:00:06 +0800 |
---|---|---|
committer | Jason Chen <b02280@freescale.com> | 2010-11-24 18:55:32 +0800 |
commit | 0f8ae79234cb8315ced1fc74a25f733ba7b95249 (patch) | |
tree | 3fe235ef394f4049fd69ffbb3b3ec1201a701e57 /drivers/media | |
parent | 8b63429a2b0b18e4473a71fd49d2e57428eac7d3 (diff) |
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>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/mxc/output/mxc_v4l2_output.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/media/video/mxc/output/mxc_v4l2_output.c b/drivers/media/video/mxc/output/mxc_v4l2_output.c index 04382da454d8..debf204bc26e 100644 --- a/drivers/media/video/mxc/output/mxc_v4l2_output.c +++ b/drivers/media/video/mxc/output/mxc_v4l2_output.c @@ -1623,6 +1623,49 @@ static int mxc_v4l2out_streamoff(vout_data *vout) if (vout->ic_bypass) cancel_work_sync(&vout->icbypass_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); |