diff mbox series

[2/3] media: bttv: add back vbi hack

Message ID 16f3b2a896e2a3788e8e33ab7a0e55cbad4bbd81.1701349092.git.hverkuil-cisco@xs4all.nl (mailing list archive)
State New
Headers show
Series media: bttv: three post-vb2 fixes | expand

Commit Message

Hans Verkuil Nov. 30, 2023, 12:58 p.m. UTC
The old (now removed) videobuf framework had an optional vbi hack where
the sequence number of the frame counter was copied in the last 4 bytes
of the buffer. This hack was active only for the read() interface
(so not for streaming I/O), and it was enabled by bttv. This allowed
applications that used read() for the VBI data to match it with the
corresponding video frame.

When bttv was converted to vb2 this hack was forgotten, but some old
applications rely on this.

So add this back, but this time in the bttv driver rather than in the
vb2 framework.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Fixes: b7ec3212a73a ("media: bttv: convert to vb2")
---
 drivers/media/pci/bt8xx/bttv-driver.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

Comments

Dr. David Alan Gilbert Dec. 3, 2023, 4:17 p.m. UTC | #1
* Hans Verkuil (hverkuil-cisco@xs4all.nl) wrote:
> The old (now removed) videobuf framework had an optional vbi hack where
> the sequence number of the frame counter was copied in the last 4 bytes
> of the buffer. This hack was active only for the read() interface
> (so not for streaming I/O), and it was enabled by bttv. This allowed
> applications that used read() for the VBI data to match it with the
> corresponding video frame.
> 
> When bttv was converted to vb2 this hack was forgotten, but some old
> applications rely on this.
> 
> So add this back, but this time in the bttv driver rather than in the
> vb2 framework.
> 
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> Fixes: b7ec3212a73a ("media: bttv: convert to vb2")

Thanks; this seems to fix the sequence number errors I was getting,
so:
Tested-by: Dr. David Alan Gilbert <dave@treblig.org>

> ---
>  drivers/media/pci/bt8xx/bttv-driver.c | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
> 
> diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c
> index 8e8c9dada67a..49a3dd70ec0f 100644
> --- a/drivers/media/pci/bt8xx/bttv-driver.c
> +++ b/drivers/media/pci/bt8xx/bttv-driver.c
> @@ -2772,6 +2772,27 @@ bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
>  		return;
>  	wakeup->vbuf.vb2_buf.timestamp = ktime_get_ns();
>  	wakeup->vbuf.sequence = btv->field_count >> 1;
> +
> +	/*
> +	 * Ugly hack for backwards compatibility.
> +	 * Some applications expect that the last 4 bytes of
> +	 * the VBI data contains the sequence number.
> +	 *
> +	 * This makes it possible to associate the VBI data
> +	 * with the video frame if you use read() to get the
> +	 * VBI data.
> +	 */
> +	if (vb2_fileio_is_active(wakeup->vbuf.vb2_buf.vb2_queue)) {
> +		u32 *vaddr = vb2_plane_vaddr(&wakeup->vbuf.vb2_buf, 0);
> +		unsigned long size =
> +			vb2_get_plane_payload(&wakeup->vbuf.vb2_buf, 0) / 4;
> +
> +		if (vaddr && size) {
> +			vaddr += size - 1;
> +			*vaddr = wakeup->vbuf.sequence;
> +		}
> +	}
> +
>  	vb2_buffer_done(&wakeup->vbuf.vb2_buf, state);
>  	if (btv->field_count == 0)
>  		btor(BT848_INT_VSYNC, BT848_INT_MASK);
> -- 
> 2.42.0
>
diff mbox series

Patch

diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c
index 8e8c9dada67a..49a3dd70ec0f 100644
--- a/drivers/media/pci/bt8xx/bttv-driver.c
+++ b/drivers/media/pci/bt8xx/bttv-driver.c
@@ -2772,6 +2772,27 @@  bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
 		return;
 	wakeup->vbuf.vb2_buf.timestamp = ktime_get_ns();
 	wakeup->vbuf.sequence = btv->field_count >> 1;
+
+	/*
+	 * Ugly hack for backwards compatibility.
+	 * Some applications expect that the last 4 bytes of
+	 * the VBI data contains the sequence number.
+	 *
+	 * This makes it possible to associate the VBI data
+	 * with the video frame if you use read() to get the
+	 * VBI data.
+	 */
+	if (vb2_fileio_is_active(wakeup->vbuf.vb2_buf.vb2_queue)) {
+		u32 *vaddr = vb2_plane_vaddr(&wakeup->vbuf.vb2_buf, 0);
+		unsigned long size =
+			vb2_get_plane_payload(&wakeup->vbuf.vb2_buf, 0) / 4;
+
+		if (vaddr && size) {
+			vaddr += size - 1;
+			*vaddr = wakeup->vbuf.sequence;
+		}
+	}
+
 	vb2_buffer_done(&wakeup->vbuf.vb2_buf, state);
 	if (btv->field_count == 0)
 		btor(BT848_INT_VSYNC, BT848_INT_MASK);