2 * vivid-vbi-cap.c - vbi capture support functions.
4 * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6 * This program is free software; you may redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
11 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
12 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
13 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
14 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
15 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
16 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 #include <linux/errno.h>
21 #include <linux/kernel.h>
22 #include <linux/videodev2.h>
23 #include <media/v4l2-common.h>
25 #include "vivid-core.h"
26 #include "vivid-kthread-cap.h"
27 #include "vivid-vbi-cap.h"
28 #include "vivid-vbi-gen.h"
30 static void vivid_sliced_vbi_cap_fill(struct vivid_dev
*dev
, unsigned seqnr
)
32 struct vivid_vbi_gen_data
*vbi_gen
= &dev
->vbi_gen
;
33 bool is_60hz
= dev
->std_cap
& V4L2_STD_525_60
;
35 vivid_vbi_gen_sliced(vbi_gen
, is_60hz
, seqnr
);
38 if (dev
->loop_video
) {
39 if (dev
->vbi_out_have_wss
) {
40 vbi_gen
->data
[12].data
[0] = dev
->vbi_out_wss
[0];
41 vbi_gen
->data
[12].data
[1] = dev
->vbi_out_wss
[1];
43 vbi_gen
->data
[12].id
= 0;
46 switch (tpg_g_video_aspect(&dev
->tpg
)) {
47 case TPG_VIDEO_ASPECT_14X9_CENTRE
:
48 vbi_gen
->data
[12].data
[0] = 0x01;
50 case TPG_VIDEO_ASPECT_16X9_CENTRE
:
51 vbi_gen
->data
[12].data
[0] = 0x0b;
53 case TPG_VIDEO_ASPECT_16X9_ANAMORPHIC
:
54 vbi_gen
->data
[12].data
[0] = 0x07;
56 case TPG_VIDEO_ASPECT_4X3
:
58 vbi_gen
->data
[12].data
[0] = 0x08;
62 } else if (dev
->loop_video
&& is_60hz
) {
63 if (dev
->vbi_out_have_cc
[0]) {
64 vbi_gen
->data
[0].data
[0] = dev
->vbi_out_cc
[0][0];
65 vbi_gen
->data
[0].data
[1] = dev
->vbi_out_cc
[0][1];
67 vbi_gen
->data
[0].id
= 0;
69 if (dev
->vbi_out_have_cc
[1]) {
70 vbi_gen
->data
[1].data
[0] = dev
->vbi_out_cc
[1][0];
71 vbi_gen
->data
[1].data
[1] = dev
->vbi_out_cc
[1][1];
73 vbi_gen
->data
[1].id
= 0;
78 static void vivid_g_fmt_vbi_cap(struct vivid_dev
*dev
, struct v4l2_vbi_format
*vbi
)
80 bool is_60hz
= dev
->std_cap
& V4L2_STD_525_60
;
82 vbi
->sampling_rate
= 27000000;
84 vbi
->samples_per_line
= 1440;
85 vbi
->sample_format
= V4L2_PIX_FMT_GREY
;
86 vbi
->start
[0] = is_60hz
? V4L2_VBI_ITU_525_F1_START
+ 9 : V4L2_VBI_ITU_625_F1_START
+ 5;
87 vbi
->start
[1] = is_60hz
? V4L2_VBI_ITU_525_F2_START
+ 9 : V4L2_VBI_ITU_625_F2_START
+ 5;
88 vbi
->count
[0] = vbi
->count
[1] = is_60hz
? 12 : 18;
89 vbi
->flags
= dev
->vbi_cap_interlaced
? V4L2_VBI_INTERLACED
: 0;
94 void vivid_raw_vbi_cap_process(struct vivid_dev
*dev
, struct vivid_buffer
*buf
)
96 struct v4l2_vbi_format vbi
;
97 u8
*vbuf
= vb2_plane_vaddr(&buf
->vb
.vb2_buf
, 0);
99 vivid_g_fmt_vbi_cap(dev
, &vbi
);
100 buf
->vb
.sequence
= dev
->vbi_cap_seq_count
;
101 if (dev
->field_cap
== V4L2_FIELD_ALTERNATE
)
102 buf
->vb
.sequence
/= 2;
104 vivid_sliced_vbi_cap_fill(dev
, buf
->vb
.sequence
);
106 memset(vbuf
, 0x10, vb2_plane_size(&buf
->vb
.vb2_buf
, 0));
108 if (!VIVID_INVALID_SIGNAL(dev
->std_signal_mode
))
109 vivid_vbi_gen_raw(&dev
->vbi_gen
, &vbi
, vbuf
);
111 v4l2_get_timestamp(&buf
->vb
.timestamp
);
112 buf
->vb
.timestamp
.tv_sec
+= dev
->time_wrap_offset
;
116 void vivid_sliced_vbi_cap_process(struct vivid_dev
*dev
,
117 struct vivid_buffer
*buf
)
119 struct v4l2_sliced_vbi_data
*vbuf
=
120 vb2_plane_vaddr(&buf
->vb
.vb2_buf
, 0);
122 buf
->vb
.sequence
= dev
->vbi_cap_seq_count
;
123 if (dev
->field_cap
== V4L2_FIELD_ALTERNATE
)
124 buf
->vb
.sequence
/= 2;
126 vivid_sliced_vbi_cap_fill(dev
, buf
->vb
.sequence
);
128 memset(vbuf
, 0, vb2_plane_size(&buf
->vb
.vb2_buf
, 0));
129 if (!VIVID_INVALID_SIGNAL(dev
->std_signal_mode
)) {
132 for (i
= 0; i
< 25; i
++)
133 vbuf
[i
] = dev
->vbi_gen
.data
[i
];
136 v4l2_get_timestamp(&buf
->vb
.timestamp
);
137 buf
->vb
.timestamp
.tv_sec
+= dev
->time_wrap_offset
;
140 static int vbi_cap_queue_setup(struct vb2_queue
*vq
, const void *parg
,
141 unsigned *nbuffers
, unsigned *nplanes
,
142 unsigned sizes
[], void *alloc_ctxs
[])
144 struct vivid_dev
*dev
= vb2_get_drv_priv(vq
);
145 bool is_60hz
= dev
->std_cap
& V4L2_STD_525_60
;
146 unsigned size
= vq
->type
== V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
?
147 36 * sizeof(struct v4l2_sliced_vbi_data
) :
148 1440 * 2 * (is_60hz
? 12 : 18);
150 if (!vivid_is_sdtv_cap(dev
))
155 if (vq
->num_buffers
+ *nbuffers
< 2)
156 *nbuffers
= 2 - vq
->num_buffers
;
162 static int vbi_cap_buf_prepare(struct vb2_buffer
*vb
)
164 struct vivid_dev
*dev
= vb2_get_drv_priv(vb
->vb2_queue
);
165 bool is_60hz
= dev
->std_cap
& V4L2_STD_525_60
;
166 unsigned size
= vb
->vb2_queue
->type
== V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
?
167 36 * sizeof(struct v4l2_sliced_vbi_data
) :
168 1440 * 2 * (is_60hz
? 12 : 18);
170 dprintk(dev
, 1, "%s\n", __func__
);
172 if (dev
->buf_prepare_error
) {
174 * Error injection: test what happens if buf_prepare() returns
177 dev
->buf_prepare_error
= false;
180 if (vb2_plane_size(vb
, 0) < size
) {
181 dprintk(dev
, 1, "%s data will not fit into plane (%lu < %u)\n",
182 __func__
, vb2_plane_size(vb
, 0), size
);
185 vb2_set_plane_payload(vb
, 0, size
);
190 static void vbi_cap_buf_queue(struct vb2_buffer
*vb
)
192 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
193 struct vivid_dev
*dev
= vb2_get_drv_priv(vb
->vb2_queue
);
194 struct vivid_buffer
*buf
= container_of(vbuf
, struct vivid_buffer
, vb
);
196 dprintk(dev
, 1, "%s\n", __func__
);
198 spin_lock(&dev
->slock
);
199 list_add_tail(&buf
->list
, &dev
->vbi_cap_active
);
200 spin_unlock(&dev
->slock
);
203 static int vbi_cap_start_streaming(struct vb2_queue
*vq
, unsigned count
)
205 struct vivid_dev
*dev
= vb2_get_drv_priv(vq
);
208 dprintk(dev
, 1, "%s\n", __func__
);
209 dev
->vbi_cap_seq_count
= 0;
210 if (dev
->start_streaming_error
) {
211 dev
->start_streaming_error
= false;
214 err
= vivid_start_generating_vid_cap(dev
, &dev
->vbi_cap_streaming
);
217 struct vivid_buffer
*buf
, *tmp
;
219 list_for_each_entry_safe(buf
, tmp
, &dev
->vbi_cap_active
, list
) {
220 list_del(&buf
->list
);
221 vb2_buffer_done(&buf
->vb
.vb2_buf
,
222 VB2_BUF_STATE_QUEUED
);
228 /* abort streaming and wait for last buffer */
229 static void vbi_cap_stop_streaming(struct vb2_queue
*vq
)
231 struct vivid_dev
*dev
= vb2_get_drv_priv(vq
);
233 dprintk(dev
, 1, "%s\n", __func__
);
234 vivid_stop_generating_vid_cap(dev
, &dev
->vbi_cap_streaming
);
237 const struct vb2_ops vivid_vbi_cap_qops
= {
238 .queue_setup
= vbi_cap_queue_setup
,
239 .buf_prepare
= vbi_cap_buf_prepare
,
240 .buf_queue
= vbi_cap_buf_queue
,
241 .start_streaming
= vbi_cap_start_streaming
,
242 .stop_streaming
= vbi_cap_stop_streaming
,
243 .wait_prepare
= vb2_ops_wait_prepare
,
244 .wait_finish
= vb2_ops_wait_finish
,
247 int vidioc_g_fmt_vbi_cap(struct file
*file
, void *priv
,
248 struct v4l2_format
*f
)
250 struct vivid_dev
*dev
= video_drvdata(file
);
251 struct v4l2_vbi_format
*vbi
= &f
->fmt
.vbi
;
253 if (!vivid_is_sdtv_cap(dev
) || !dev
->has_raw_vbi_cap
)
256 vivid_g_fmt_vbi_cap(dev
, vbi
);
260 int vidioc_s_fmt_vbi_cap(struct file
*file
, void *priv
,
261 struct v4l2_format
*f
)
263 struct vivid_dev
*dev
= video_drvdata(file
);
264 int ret
= vidioc_g_fmt_vbi_cap(file
, priv
, f
);
268 if (dev
->stream_sliced_vbi_cap
&& vb2_is_busy(&dev
->vb_vbi_cap_q
))
270 dev
->stream_sliced_vbi_cap
= false;
271 dev
->vbi_cap_dev
.queue
->type
= V4L2_BUF_TYPE_VBI_CAPTURE
;
275 void vivid_fill_service_lines(struct v4l2_sliced_vbi_format
*vbi
, u32 service_set
)
277 vbi
->io_size
= sizeof(struct v4l2_sliced_vbi_data
) * 36;
278 vbi
->service_set
= service_set
;
279 memset(vbi
->service_lines
, 0, sizeof(vbi
->service_lines
));
280 memset(vbi
->reserved
, 0, sizeof(vbi
->reserved
));
282 if (vbi
->service_set
== 0)
285 if (vbi
->service_set
& V4L2_SLICED_CAPTION_525
) {
286 vbi
->service_lines
[0][21] = V4L2_SLICED_CAPTION_525
;
287 vbi
->service_lines
[1][21] = V4L2_SLICED_CAPTION_525
;
289 if (vbi
->service_set
& V4L2_SLICED_WSS_625
) {
292 for (i
= 7; i
<= 18; i
++)
293 vbi
->service_lines
[0][i
] =
294 vbi
->service_lines
[1][i
] = V4L2_SLICED_TELETEXT_B
;
295 vbi
->service_lines
[0][23] = V4L2_SLICED_WSS_625
;
299 int vidioc_g_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
301 struct vivid_dev
*dev
= video_drvdata(file
);
302 struct v4l2_sliced_vbi_format
*vbi
= &fmt
->fmt
.sliced
;
304 if (!vivid_is_sdtv_cap(dev
) || !dev
->has_sliced_vbi_cap
)
307 vivid_fill_service_lines(vbi
, dev
->service_set_cap
);
311 int vidioc_try_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
313 struct vivid_dev
*dev
= video_drvdata(file
);
314 struct v4l2_sliced_vbi_format
*vbi
= &fmt
->fmt
.sliced
;
315 bool is_60hz
= dev
->std_cap
& V4L2_STD_525_60
;
316 u32 service_set
= vbi
->service_set
;
318 if (!vivid_is_sdtv_cap(dev
) || !dev
->has_sliced_vbi_cap
)
321 service_set
&= is_60hz
? V4L2_SLICED_CAPTION_525
:
322 V4L2_SLICED_WSS_625
| V4L2_SLICED_TELETEXT_B
;
323 vivid_fill_service_lines(vbi
, service_set
);
327 int vidioc_s_fmt_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_format
*fmt
)
329 struct vivid_dev
*dev
= video_drvdata(file
);
330 struct v4l2_sliced_vbi_format
*vbi
= &fmt
->fmt
.sliced
;
331 int ret
= vidioc_try_fmt_sliced_vbi_cap(file
, fh
, fmt
);
335 if (!dev
->stream_sliced_vbi_cap
&& vb2_is_busy(&dev
->vb_vbi_cap_q
))
337 dev
->service_set_cap
= vbi
->service_set
;
338 dev
->stream_sliced_vbi_cap
= true;
339 dev
->vbi_cap_dev
.queue
->type
= V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
;
343 int vidioc_g_sliced_vbi_cap(struct file
*file
, void *fh
, struct v4l2_sliced_vbi_cap
*cap
)
345 struct vivid_dev
*dev
= video_drvdata(file
);
346 struct video_device
*vdev
= video_devdata(file
);
349 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
350 is_60hz
= dev
->std_cap
& V4L2_STD_525_60
;
351 if (!vivid_is_sdtv_cap(dev
) || !dev
->has_sliced_vbi_cap
||
352 cap
->type
!= V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
)
355 is_60hz
= dev
->std_out
& V4L2_STD_525_60
;
356 if (!vivid_is_svid_out(dev
) || !dev
->has_sliced_vbi_out
||
357 cap
->type
!= V4L2_BUF_TYPE_SLICED_VBI_OUTPUT
)
361 cap
->service_set
= is_60hz
? V4L2_SLICED_CAPTION_525
:
362 V4L2_SLICED_WSS_625
| V4L2_SLICED_TELETEXT_B
;
364 cap
->service_lines
[0][21] = V4L2_SLICED_CAPTION_525
;
365 cap
->service_lines
[1][21] = V4L2_SLICED_CAPTION_525
;
369 for (i
= 7; i
<= 18; i
++)
370 cap
->service_lines
[0][i
] =
371 cap
->service_lines
[1][i
] = V4L2_SLICED_TELETEXT_B
;
372 cap
->service_lines
[0][23] = V4L2_SLICED_WSS_625
;