V4L/DVB (6345): ivtvfb: YUV handling of an image which is not visible in the display area
When the ivtvfb module is loaded, the YUV output is relative to the framebuffer output. When a virtual screen size is used, the output area for the YUV may actually be off screen. To prevent the hardware from crashing, the current driver will ignore an off-screen position and leave the output visible at the last on-screen position. This may not be desirable, so this patch will switch off the YUV output should the image move off-screen, and re-enable it should the image move on-screen again. Signed-off-by: Ian Armstrong <ian@iarmst.demon.co.uk> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
d343d7f979
commit
0bfeb04a9f
2 changed files with 13 additions and 10 deletions
|
@ -710,7 +710,7 @@ static u32 ivtv_yuv_window_setup (struct ivtv *itv, struct yuv_frame_info *windo
|
||||||
|
|
||||||
/* If there's nothing to safe to display, we may as well stop now */
|
/* If there's nothing to safe to display, we may as well stop now */
|
||||||
if ((int)window->dst_w <= 2 || (int)window->dst_h <= 2 || (int)window->src_w <= 2 || (int)window->src_h <= 2) {
|
if ((int)window->dst_w <= 2 || (int)window->dst_h <= 2 || (int)window->src_w <= 2 || (int)window->src_h <= 2) {
|
||||||
return 0;
|
return IVTV_YUV_UPDATE_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ensure video remains inside OSD area */
|
/* Ensure video remains inside OSD area */
|
||||||
|
@ -791,7 +791,7 @@ static u32 ivtv_yuv_window_setup (struct ivtv *itv, struct yuv_frame_info *windo
|
||||||
|
|
||||||
/* Check again. If there's nothing to safe to display, stop now */
|
/* Check again. If there's nothing to safe to display, stop now */
|
||||||
if ((int)window->dst_w <= 2 || (int)window->dst_h <= 2 || (int)window->src_w <= 2 || (int)window->src_h <= 2) {
|
if ((int)window->dst_w <= 2 || (int)window->dst_h <= 2 || (int)window->src_w <= 2 || (int)window->src_h <= 2) {
|
||||||
return 0;
|
return IVTV_YUV_UPDATE_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Both x offset & width are linked, so they have to be done together */
|
/* Both x offset & width are linked, so they have to be done together */
|
||||||
|
@ -840,12 +840,17 @@ void ivtv_yuv_work_handler (struct ivtv *itv)
|
||||||
if (!(yuv_update = ivtv_yuv_window_setup (itv, &window)))
|
if (!(yuv_update = ivtv_yuv_window_setup (itv, &window)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Update horizontal settings */
|
if (yuv_update & IVTV_YUV_UPDATE_INVALID) {
|
||||||
if (yuv_update & IVTV_YUV_UPDATE_HORIZONTAL)
|
write_reg(0x01008080, 0x2898);
|
||||||
ivtv_yuv_handle_horizontal(itv, &window);
|
} else if (yuv_update) {
|
||||||
|
write_reg(0x00108080, 0x2898);
|
||||||
|
|
||||||
if (yuv_update & IVTV_YUV_UPDATE_VERTICAL)
|
if (yuv_update & IVTV_YUV_UPDATE_HORIZONTAL)
|
||||||
ivtv_yuv_handle_vertical(itv, &window);
|
ivtv_yuv_handle_horizontal(itv, &window);
|
||||||
|
|
||||||
|
if (yuv_update & IVTV_YUV_UPDATE_VERTICAL)
|
||||||
|
ivtv_yuv_handle_vertical(itv, &window);
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(&itv->yuv_info.old_frame_info, &window, sizeof (itv->yuv_info.old_frame_info));
|
memcpy(&itv->yuv_info.old_frame_info, &window, sizeof (itv->yuv_info.old_frame_info));
|
||||||
}
|
}
|
||||||
|
@ -936,9 +941,6 @@ static void ivtv_yuv_init (struct ivtv *itv)
|
||||||
IVTV_DEBUG_WARN ("Failed to allocate yuv blanking buffer\n");
|
IVTV_DEBUG_WARN ("Failed to allocate yuv blanking buffer\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
IVTV_DEBUG_WARN("Enable video output\n");
|
|
||||||
write_reg_sync(0x00108080, 0x2898);
|
|
||||||
|
|
||||||
/* Enable YUV decoder output */
|
/* Enable YUV decoder output */
|
||||||
write_reg_sync(0x01, IVTV_REG_VDM);
|
write_reg_sync(0x01, IVTV_REG_VDM);
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
#define IVTV_YUV_UPDATE_HORIZONTAL 0x01
|
#define IVTV_YUV_UPDATE_HORIZONTAL 0x01
|
||||||
#define IVTV_YUV_UPDATE_VERTICAL 0x02
|
#define IVTV_YUV_UPDATE_VERTICAL 0x02
|
||||||
|
#define IVTV_YUV_UPDATE_INVALID 0x04
|
||||||
|
|
||||||
extern const u32 yuv_offset[4];
|
extern const u32 yuv_offset[4];
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue