Commit 943e8910 authored by Ian Armstrong's avatar Ian Armstrong Committed by Mauro Carvalho Chehab

V4L/DVB (5972): ivtv: prevent yuv register updates from being missed

The yuv output code always compares the new frame position & size with those
of the previous frame. If they are different, a flag is set to request the
yuv output registers be updated when the new frame is displayed.

If the incoming frames are delivered too fast, exhausting the buffers, the
most recent frame already buffered will be discarded. Unfortunately, any
update request will also be discarded. If the new frame matches the size &
position of the now discarded frame, the yuv registers are not flagged for
update & will remain in their old state.

This patch preserves the register update flag in the event that a frame is
dropped.
Signed-off-by: default avatarIan Armstrong <ian@iarmst.demon.co.uk>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 68a341a5
...@@ -940,6 +940,7 @@ int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args) ...@@ -940,6 +940,7 @@ int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args)
int rc = 0; int rc = 0;
int got_sig = 0; int got_sig = 0;
int frame, next_fill_frame, last_fill_frame; int frame, next_fill_frame, last_fill_frame;
int register_update = 0;
IVTV_DEBUG_INFO("yuv_prep_frame\n"); IVTV_DEBUG_INFO("yuv_prep_frame\n");
...@@ -953,6 +954,7 @@ int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args) ...@@ -953,6 +954,7 @@ int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args)
/* Buffers are full - Overwrite the last frame */ /* Buffers are full - Overwrite the last frame */
next_fill_frame = frame; next_fill_frame = frame;
frame = (frame - 1) & 3; frame = (frame - 1) & 3;
register_update = itv->yuv_info.new_frame_info[frame].update;
} }
/* Take a snapshot of the yuv coordinate information */ /* Take a snapshot of the yuv coordinate information */
...@@ -991,6 +993,8 @@ int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args) ...@@ -991,6 +993,8 @@ int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args)
/* IVTV_DEBUG_YUV ("Requesting register update for frame %d\n",frame); */ /* IVTV_DEBUG_YUV ("Requesting register update for frame %d\n",frame); */
} }
itv->yuv_info.new_frame_info[frame].update |= register_update;
/* DMA the frame */ /* DMA the frame */
mutex_lock(&itv->udma.lock); mutex_lock(&itv->udma.lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment