Lines Matching full:dev

60 static inline unsigned int webcam_ival_count(const struct vivid_dev *dev,  in webcam_ival_count()  argument
80 struct vivid_dev *dev = vb2_get_drv_priv(vq); in vid_cap_queue_setup() local
81 unsigned buffers = tpg_g_buffers(&dev->tpg); in vid_cap_queue_setup()
82 unsigned h = dev->fmt_cap_rect.height; in vid_cap_queue_setup()
85 if (dev->field_cap == V4L2_FIELD_ALTERNATE) { in vid_cap_queue_setup()
94 if (dev->queue_setup_error) { in vid_cap_queue_setup()
99 dev->queue_setup_error = false; in vid_cap_queue_setup()
110 if (sizes[p] < tpg_g_line_width(&dev->tpg, p) * h / in vid_cap_queue_setup()
111 dev->fmt_cap->vdownsampling[p] + in vid_cap_queue_setup()
112 dev->fmt_cap->data_offset[p]) in vid_cap_queue_setup()
117 sizes[p] = (tpg_g_line_width(&dev->tpg, p) * h) / in vid_cap_queue_setup()
118 dev->fmt_cap->vdownsampling[p] + in vid_cap_queue_setup()
119 dev->fmt_cap->data_offset[p]; in vid_cap_queue_setup()
124 dprintk(dev, 1, "%s: count=%d\n", __func__, *nbuffers); in vid_cap_queue_setup()
126 dprintk(dev, 1, "%s: size[%u]=%u\n", __func__, p, sizes[p]); in vid_cap_queue_setup()
133 struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue); in vid_cap_buf_prepare() local
135 unsigned buffers = tpg_g_buffers(&dev->tpg); in vid_cap_buf_prepare()
138 dprintk(dev, 1, "%s\n", __func__); in vid_cap_buf_prepare()
140 if (WARN_ON(NULL == dev->fmt_cap)) in vid_cap_buf_prepare()
143 if (dev->buf_prepare_error) { in vid_cap_buf_prepare()
148 dev->buf_prepare_error = false; in vid_cap_buf_prepare()
152 size = (tpg_g_line_width(&dev->tpg, p) * in vid_cap_buf_prepare()
153 dev->fmt_cap_rect.height) / in vid_cap_buf_prepare()
154 dev->fmt_cap->vdownsampling[p] + in vid_cap_buf_prepare()
155 dev->fmt_cap->data_offset[p]; in vid_cap_buf_prepare()
158 dprintk(dev, 1, "%s data will not fit into plane %u (%lu < %lu)\n", in vid_cap_buf_prepare()
164 vb->planes[p].data_offset = dev->fmt_cap->data_offset[p]; in vid_cap_buf_prepare()
173 struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue); in vid_cap_buf_finish() local
178 if (!vivid_is_sdtv_cap(dev)) in vid_cap_buf_finish()
186 if (dev->std_cap[dev->input] & V4L2_STD_525_60) in vid_cap_buf_finish()
199 struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue); in vid_cap_buf_queue() local
202 dprintk(dev, 1, "%s\n", __func__); in vid_cap_buf_queue()
204 spin_lock(&dev->slock); in vid_cap_buf_queue()
205 list_add_tail(&buf->list, &dev->vid_cap_active); in vid_cap_buf_queue()
206 spin_unlock(&dev->slock); in vid_cap_buf_queue()
211 struct vivid_dev *dev = vb2_get_drv_priv(vq); in vid_cap_start_streaming() local
215 dev->vid_cap_seq_count = 0; in vid_cap_start_streaming()
216 dprintk(dev, 1, "%s\n", __func__); in vid_cap_start_streaming()
218 dev->must_blank[i] = tpg_g_perc_fill(&dev->tpg) < 100; in vid_cap_start_streaming()
219 if (dev->start_streaming_error) { in vid_cap_start_streaming()
220 dev->start_streaming_error = false; in vid_cap_start_streaming()
223 err = vivid_start_generating_vid_cap(dev, &dev->vid_cap_streaming); in vid_cap_start_streaming()
228 list_for_each_entry_safe(buf, tmp, &dev->vid_cap_active, list) { in vid_cap_start_streaming()
240 struct vivid_dev *dev = vb2_get_drv_priv(vq); in vid_cap_stop_streaming() local
242 dprintk(dev, 1, "%s\n", __func__); in vid_cap_stop_streaming()
243 vivid_stop_generating_vid_cap(dev, &dev->vid_cap_streaming); in vid_cap_stop_streaming()
248 struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue); in vid_cap_buf_request_complete() local
250 v4l2_ctrl_request_complete(vb->req_obj.req, &dev->ctrl_hdl_vid_cap); in vid_cap_buf_request_complete()
268 void vivid_update_quality(struct vivid_dev *dev) in vivid_update_quality() argument
272 if (dev->input_is_connected_to_output[dev->input]) { in vivid_update_quality()
277 tpg_s_quality(&dev->tpg, TPG_QUAL_NOISE, 0); in vivid_update_quality()
280 if (vivid_is_hdmi_cap(dev) && in vivid_update_quality()
281 VIVID_INVALID_SIGNAL(dev->dv_timings_signal_mode[dev->input])) { in vivid_update_quality()
282 tpg_s_quality(&dev->tpg, TPG_QUAL_NOISE, 0); in vivid_update_quality()
285 if (vivid_is_sdtv_cap(dev) && in vivid_update_quality()
286 VIVID_INVALID_SIGNAL(dev->std_signal_mode[dev->input])) { in vivid_update_quality()
287 tpg_s_quality(&dev->tpg, TPG_QUAL_NOISE, 0); in vivid_update_quality()
290 if (!vivid_is_tv_cap(dev)) { in vivid_update_quality()
291 tpg_s_quality(&dev->tpg, TPG_QUAL_COLOR, 0); in vivid_update_quality()
301 freq_modulus = (dev->tv_freq - 676 /* (43.25-1) * 16 */) % (6 * 16); in vivid_update_quality()
303 tpg_s_quality(&dev->tpg, TPG_QUAL_NOISE, in vivid_update_quality()
304 next_pseudo_random32(dev->tv_freq ^ 0x55) & 0x3f); in vivid_update_quality()
308 tpg_s_quality(&dev->tpg, TPG_QUAL_GRAY, 0); in vivid_update_quality()
310 tpg_s_quality(&dev->tpg, TPG_QUAL_COLOR, 0); in vivid_update_quality()
316 static enum tpg_quality vivid_get_quality(struct vivid_dev *dev, s32 *afc) in vivid_get_quality() argument
322 if (tpg_g_quality(&dev->tpg) == TPG_QUAL_COLOR || in vivid_get_quality()
323 tpg_g_quality(&dev->tpg) == TPG_QUAL_NOISE) in vivid_get_quality()
324 return tpg_g_quality(&dev->tpg); in vivid_get_quality()
332 freq_modulus = (dev->tv_freq - 676 /* (43.25-1) * 16 */) % (6 * 16); in vivid_get_quality()
338 enum tpg_video_aspect vivid_get_video_aspect(const struct vivid_dev *dev) in vivid_get_video_aspect() argument
340 if (vivid_is_sdtv_cap(dev)) in vivid_get_video_aspect()
341 return dev->std_aspect_ratio[dev->input]; in vivid_get_video_aspect()
343 if (vivid_is_hdmi_cap(dev)) in vivid_get_video_aspect()
344 return dev->dv_timings_aspect_ratio[dev->input]; in vivid_get_video_aspect()
349 static enum tpg_pixel_aspect vivid_get_pixel_aspect(const struct vivid_dev *dev) in vivid_get_pixel_aspect() argument
351 if (vivid_is_sdtv_cap(dev)) in vivid_get_pixel_aspect()
352 return (dev->std_cap[dev->input] & V4L2_STD_525_60) ? in vivid_get_pixel_aspect()
355 if (vivid_is_hdmi_cap(dev) && in vivid_get_pixel_aspect()
356 dev->src_rect.width == 720 && dev->src_rect.height <= 576) in vivid_get_pixel_aspect()
357 return dev->src_rect.height == 480 ? in vivid_get_pixel_aspect()
367 void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls) in vivid_update_format_cap() argument
369 struct v4l2_bt_timings *bt = &dev->dv_timings_cap[dev->input].bt; in vivid_update_format_cap()
374 switch (dev->input_type[dev->input]) { in vivid_update_format_cap()
377 dev->src_rect.width = webcam_sizes[dev->webcam_size_idx].width; in vivid_update_format_cap()
378 dev->src_rect.height = webcam_sizes[dev->webcam_size_idx].height; in vivid_update_format_cap()
379 dev->timeperframe_vid_cap = webcam_intervals[dev->webcam_ival_idx]; in vivid_update_format_cap()
380 dev->field_cap = V4L2_FIELD_NONE; in vivid_update_format_cap()
381 tpg_s_rgb_range(&dev->tpg, V4L2_DV_RGB_RANGE_AUTO); in vivid_update_format_cap()
385 dev->field_cap = dev->tv_field_cap; in vivid_update_format_cap()
386 dev->src_rect.width = 720; in vivid_update_format_cap()
387 if (dev->std_cap[dev->input] & V4L2_STD_525_60) { in vivid_update_format_cap()
388 dev->src_rect.height = 480; in vivid_update_format_cap()
389 dev->timeperframe_vid_cap = (struct v4l2_fract) { 1001, 30000 }; in vivid_update_format_cap()
390 dev->service_set_cap = V4L2_SLICED_CAPTION_525; in vivid_update_format_cap()
392 dev->src_rect.height = 576; in vivid_update_format_cap()
393 dev->timeperframe_vid_cap = (struct v4l2_fract) { 1000, 25000 }; in vivid_update_format_cap()
394 dev->service_set_cap = V4L2_SLICED_WSS_625 | V4L2_SLICED_TELETEXT_B; in vivid_update_format_cap()
396 tpg_s_rgb_range(&dev->tpg, V4L2_DV_RGB_RANGE_AUTO); in vivid_update_format_cap()
399 dev->src_rect.width = bt->width; in vivid_update_format_cap()
400 dev->src_rect.height = bt->height; in vivid_update_format_cap()
402 if (dev->reduced_fps && can_reduce_fps(bt)) { in vivid_update_format_cap()
409 dev->timeperframe_vid_cap = (struct v4l2_fract) { in vivid_update_format_cap()
413 dev->field_cap = V4L2_FIELD_ALTERNATE; in vivid_update_format_cap()
415 dev->field_cap = V4L2_FIELD_NONE; in vivid_update_format_cap()
421 if (keep_controls || !dev->colorspace) in vivid_update_format_cap()
425 v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M); in vivid_update_format_cap()
427 v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_709); in vivid_update_format_cap()
428 v4l2_ctrl_s_ctrl(dev->real_rgb_range_cap, 1); in vivid_update_format_cap()
430 v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB); in vivid_update_format_cap()
431 v4l2_ctrl_s_ctrl(dev->real_rgb_range_cap, 0); in vivid_update_format_cap()
433 tpg_s_rgb_range(&dev->tpg, v4l2_ctrl_g_ctrl(dev->rgb_range_cap)); in vivid_update_format_cap()
436 vivid_update_quality(dev); in vivid_update_format_cap()
437 tpg_reset_source(&dev->tpg, dev->src_rect.width, dev->src_rect.height, dev->field_cap); in vivid_update_format_cap()
438 dev->crop_cap = dev->src_rect; in vivid_update_format_cap()
439 dev->crop_bounds_cap = dev->src_rect; in vivid_update_format_cap()
440 dev->compose_cap = dev->crop_cap; in vivid_update_format_cap()
441 if (V4L2_FIELD_HAS_T_OR_B(dev->field_cap)) in vivid_update_format_cap()
442 dev->compose_cap.height /= 2; in vivid_update_format_cap()
443 dev->fmt_cap_rect = dev->compose_cap; in vivid_update_format_cap()
444 tpg_s_video_aspect(&dev->tpg, vivid_get_video_aspect(dev)); in vivid_update_format_cap()
445 tpg_s_pixel_aspect(&dev->tpg, vivid_get_pixel_aspect(dev)); in vivid_update_format_cap()
446 tpg_update_mv_step(&dev->tpg); in vivid_update_format_cap()
455 dims[0] = roundup(dev->src_rect.width, PIXEL_ARRAY_DIV); in vivid_update_format_cap()
456 dims[1] = roundup(dev->src_rect.height, PIXEL_ARRAY_DIV); in vivid_update_format_cap()
457 v4l2_ctrl_modify_dimensions(dev->pixel_array, dims); in vivid_update_format_cap()
461 static enum v4l2_field vivid_field_cap(struct vivid_dev *dev, enum v4l2_field field) in vivid_field_cap() argument
463 if (vivid_is_sdtv_cap(dev)) { in vivid_field_cap()
478 if (vivid_is_hdmi_cap(dev)) in vivid_field_cap()
479 return dev->dv_timings_cap[dev->input].bt.interlaced ? in vivid_field_cap()
484 static unsigned vivid_colorspace_cap(struct vivid_dev *dev) in vivid_colorspace_cap() argument
486 if (!vivid_input_is_connected_to(dev)) in vivid_colorspace_cap()
487 return tpg_g_colorspace(&dev->tpg); in vivid_colorspace_cap()
488 return dev->colorspace_out; in vivid_colorspace_cap()
491 static unsigned vivid_xfer_func_cap(struct vivid_dev *dev) in vivid_xfer_func_cap() argument
493 if (!vivid_input_is_connected_to(dev)) in vivid_xfer_func_cap()
494 return tpg_g_xfer_func(&dev->tpg); in vivid_xfer_func_cap()
495 return dev->xfer_func_out; in vivid_xfer_func_cap()
498 static unsigned vivid_ycbcr_enc_cap(struct vivid_dev *dev) in vivid_ycbcr_enc_cap() argument
500 if (!vivid_input_is_connected_to(dev)) in vivid_ycbcr_enc_cap()
501 return tpg_g_ycbcr_enc(&dev->tpg); in vivid_ycbcr_enc_cap()
502 return dev->ycbcr_enc_out; in vivid_ycbcr_enc_cap()
505 static unsigned int vivid_hsv_enc_cap(struct vivid_dev *dev) in vivid_hsv_enc_cap() argument
507 if (!vivid_input_is_connected_to(dev)) in vivid_hsv_enc_cap()
508 return tpg_g_hsv_enc(&dev->tpg); in vivid_hsv_enc_cap()
509 return dev->hsv_enc_out; in vivid_hsv_enc_cap()
512 static unsigned vivid_quantization_cap(struct vivid_dev *dev) in vivid_quantization_cap() argument
514 if (!vivid_input_is_connected_to(dev)) in vivid_quantization_cap()
515 return tpg_g_quantization(&dev->tpg); in vivid_quantization_cap()
516 return dev->quantization_out; in vivid_quantization_cap()
522 struct vivid_dev *dev = video_drvdata(file); in vivid_g_fmt_vid_cap() local
526 mp->width = dev->fmt_cap_rect.width; in vivid_g_fmt_vid_cap()
527 mp->height = dev->fmt_cap_rect.height; in vivid_g_fmt_vid_cap()
528 mp->field = dev->field_cap; in vivid_g_fmt_vid_cap()
529 mp->pixelformat = dev->fmt_cap->fourcc; in vivid_g_fmt_vid_cap()
530 mp->colorspace = vivid_colorspace_cap(dev); in vivid_g_fmt_vid_cap()
531 mp->xfer_func = vivid_xfer_func_cap(dev); in vivid_g_fmt_vid_cap()
532 if (dev->fmt_cap->color_enc == TGP_COLOR_ENC_HSV) in vivid_g_fmt_vid_cap()
533 mp->hsv_enc = vivid_hsv_enc_cap(dev); in vivid_g_fmt_vid_cap()
535 mp->ycbcr_enc = vivid_ycbcr_enc_cap(dev); in vivid_g_fmt_vid_cap()
536 mp->quantization = vivid_quantization_cap(dev); in vivid_g_fmt_vid_cap()
537 mp->num_planes = dev->fmt_cap->buffers; in vivid_g_fmt_vid_cap()
539 mp->plane_fmt[p].bytesperline = tpg_g_bytesperline(&dev->tpg, p); in vivid_g_fmt_vid_cap()
541 (tpg_g_line_width(&dev->tpg, p) * mp->height) / in vivid_g_fmt_vid_cap()
542 dev->fmt_cap->vdownsampling[p] + in vivid_g_fmt_vid_cap()
543 dev->fmt_cap->data_offset[p]; in vivid_g_fmt_vid_cap()
553 struct vivid_dev *dev = video_drvdata(file); in vivid_try_fmt_vid_cap() local
561 fmt = vivid_get_format(dev, mp->pixelformat); in vivid_try_fmt_vid_cap()
563 dprintk(dev, 1, "Fourcc format (0x%08x) unknown.\n", in vivid_try_fmt_vid_cap()
566 fmt = vivid_get_format(dev, mp->pixelformat); in vivid_try_fmt_vid_cap()
569 mp->field = vivid_field_cap(dev, mp->field); in vivid_try_fmt_vid_cap()
570 if (vivid_is_webcam(dev)) { in vivid_try_fmt_vid_cap()
578 } else if (vivid_is_sdtv_cap(dev)) { in vivid_try_fmt_vid_cap()
580 h = (dev->std_cap[dev->input] & V4L2_STD_525_60) ? 480 : 576; in vivid_try_fmt_vid_cap()
582 w = dev->src_rect.width; in vivid_try_fmt_vid_cap()
583 h = dev->src_rect.height; in vivid_try_fmt_vid_cap()
587 if (vivid_is_webcam(dev) || in vivid_try_fmt_vid_cap()
588 (!dev->has_scaler_cap && !dev->has_crop_cap && !dev->has_compose_cap)) { in vivid_try_fmt_vid_cap()
596 if (dev->has_scaler_cap && !dev->has_compose_cap) { in vivid_try_fmt_vid_cap()
600 } else if (!dev->has_scaler_cap && dev->has_crop_cap && !dev->has_compose_cap) { in vivid_try_fmt_vid_cap()
601 v4l2_rect_set_max_size(&r, &dev->src_rect); in vivid_try_fmt_vid_cap()
602 } else if (!dev->has_scaler_cap && !dev->has_crop_cap) { in vivid_try_fmt_vid_cap()
603 v4l2_rect_set_min_size(&r, &dev->src_rect); in vivid_try_fmt_vid_cap()
634 mp->colorspace = vivid_colorspace_cap(dev); in vivid_try_fmt_vid_cap()
637 mp->xfer_func = vivid_xfer_func_cap(dev); in vivid_try_fmt_vid_cap()
641 mp->hsv_enc = vivid_hsv_enc_cap(dev); in vivid_try_fmt_vid_cap()
644 mp->ycbcr_enc = vivid_ycbcr_enc_cap(dev); in vivid_try_fmt_vid_cap()
646 mp->ycbcr_enc = vivid_ycbcr_enc_cap(dev); in vivid_try_fmt_vid_cap()
652 mp->quantization = vivid_quantization_cap(dev); in vivid_try_fmt_vid_cap()
654 mp->quantization = vivid_quantization_cap(dev); in vivid_try_fmt_vid_cap()
665 struct vivid_dev *dev = video_drvdata(file); in vivid_s_fmt_vid_cap() local
666 struct v4l2_rect *crop = &dev->crop_cap; in vivid_s_fmt_vid_cap()
667 struct v4l2_rect *compose = &dev->compose_cap; in vivid_s_fmt_vid_cap()
668 struct vb2_queue *q = &dev->vb_vid_cap_q; in vivid_s_fmt_vid_cap()
678 dprintk(dev, 1, "%s device busy\n", __func__); in vivid_s_fmt_vid_cap()
682 dev->fmt_cap = vivid_get_format(dev, mp->pixelformat); in vivid_s_fmt_vid_cap()
688 if (!vivid_is_webcam(dev) && in vivid_s_fmt_vid_cap()
689 (dev->has_scaler_cap || dev->has_crop_cap || dev->has_compose_cap)) { in vivid_s_fmt_vid_cap()
692 if (dev->has_scaler_cap) { in vivid_s_fmt_vid_cap()
693 if (dev->has_compose_cap) in vivid_s_fmt_vid_cap()
697 if (dev->has_crop_cap && !dev->has_compose_cap) { in vivid_s_fmt_vid_cap()
711 v4l2_rect_map_inside(crop, &dev->crop_bounds_cap); in vivid_s_fmt_vid_cap()
712 } else if (dev->has_crop_cap) { in vivid_s_fmt_vid_cap()
726 v4l2_rect_map_inside(crop, &dev->crop_bounds_cap); in vivid_s_fmt_vid_cap()
728 } else if (dev->has_crop_cap && !dev->has_compose_cap) { in vivid_s_fmt_vid_cap()
731 v4l2_rect_map_inside(crop, &dev->crop_bounds_cap); in vivid_s_fmt_vid_cap()
735 } else if (!dev->has_crop_cap) { in vivid_s_fmt_vid_cap()
740 v4l2_rect_map_inside(crop, &dev->crop_bounds_cap); in vivid_s_fmt_vid_cap()
748 } else if (vivid_is_webcam(dev)) { in vivid_s_fmt_vid_cap()
749 unsigned int ival_sz = webcam_ival_count(dev, dev->webcam_size_idx); in vivid_s_fmt_vid_cap()
756 dev->webcam_size_idx = i; in vivid_s_fmt_vid_cap()
757 if (dev->webcam_ival_idx >= ival_sz) in vivid_s_fmt_vid_cap()
758 dev->webcam_ival_idx = ival_sz - 1; in vivid_s_fmt_vid_cap()
759 vivid_update_format_cap(dev, false); in vivid_s_fmt_vid_cap()
768 dev->fmt_cap_rect.width = mp->width; in vivid_s_fmt_vid_cap()
769 dev->fmt_cap_rect.height = mp->height; in vivid_s_fmt_vid_cap()
770 tpg_s_buf_height(&dev->tpg, mp->height); in vivid_s_fmt_vid_cap()
771 tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc); in vivid_s_fmt_vid_cap()
772 for (p = 0; p < tpg_g_buffers(&dev->tpg); p++) in vivid_s_fmt_vid_cap()
773 tpg_s_bytesperline(&dev->tpg, p, mp->plane_fmt[p].bytesperline); in vivid_s_fmt_vid_cap()
774 dev->field_cap = mp->field; in vivid_s_fmt_vid_cap()
775 if (dev->field_cap == V4L2_FIELD_ALTERNATE) in vivid_s_fmt_vid_cap()
776 tpg_s_field(&dev->tpg, V4L2_FIELD_TOP, true); in vivid_s_fmt_vid_cap()
778 tpg_s_field(&dev->tpg, dev->field_cap, false); in vivid_s_fmt_vid_cap()
779 tpg_s_crop_compose(&dev->tpg, &dev->crop_cap, &dev->compose_cap); in vivid_s_fmt_vid_cap()
780 if (vivid_is_sdtv_cap(dev)) in vivid_s_fmt_vid_cap()
781 dev->tv_field_cap = mp->field; in vivid_s_fmt_vid_cap()
782 tpg_update_mv_step(&dev->tpg); in vivid_s_fmt_vid_cap()
783 dev->tpg.colorspace = mp->colorspace; in vivid_s_fmt_vid_cap()
784 dev->tpg.xfer_func = mp->xfer_func; in vivid_s_fmt_vid_cap()
785 if (dev->fmt_cap->color_enc == TGP_COLOR_ENC_YCBCR) in vivid_s_fmt_vid_cap()
786 dev->tpg.ycbcr_enc = mp->ycbcr_enc; in vivid_s_fmt_vid_cap()
788 dev->tpg.hsv_enc = mp->hsv_enc; in vivid_s_fmt_vid_cap()
789 dev->tpg.quantization = mp->quantization; in vivid_s_fmt_vid_cap()
797 struct vivid_dev *dev = video_drvdata(file); in vidioc_g_fmt_vid_cap_mplane() local
799 if (!dev->multiplanar) in vidioc_g_fmt_vid_cap_mplane()
807 struct vivid_dev *dev = video_drvdata(file); in vidioc_try_fmt_vid_cap_mplane() local
809 if (!dev->multiplanar) in vidioc_try_fmt_vid_cap_mplane()
817 struct vivid_dev *dev = video_drvdata(file); in vidioc_s_fmt_vid_cap_mplane() local
819 if (!dev->multiplanar) in vidioc_s_fmt_vid_cap_mplane()
827 struct vivid_dev *dev = video_drvdata(file); in vidioc_g_fmt_vid_cap() local
829 if (dev->multiplanar) in vidioc_g_fmt_vid_cap()
837 struct vivid_dev *dev = video_drvdata(file); in vidioc_try_fmt_vid_cap() local
839 if (dev->multiplanar) in vidioc_try_fmt_vid_cap()
847 struct vivid_dev *dev = video_drvdata(file); in vidioc_s_fmt_vid_cap() local
849 if (dev->multiplanar) in vidioc_s_fmt_vid_cap()
857 struct vivid_dev *dev = video_drvdata(file); in vivid_vid_cap_g_selection() local
859 if (!dev->has_crop_cap && !dev->has_compose_cap) in vivid_vid_cap_g_selection()
863 if (vivid_is_webcam(dev)) in vivid_vid_cap_g_selection()
869 if (!dev->has_crop_cap) in vivid_vid_cap_g_selection()
871 sel->r = dev->crop_cap; in vivid_vid_cap_g_selection()
875 if (!dev->has_crop_cap) in vivid_vid_cap_g_selection()
877 sel->r = dev->src_rect; in vivid_vid_cap_g_selection()
880 if (!dev->has_compose_cap) in vivid_vid_cap_g_selection()
885 if (!dev->has_compose_cap) in vivid_vid_cap_g_selection()
887 sel->r = dev->compose_cap; in vivid_vid_cap_g_selection()
890 if (!dev->has_compose_cap) in vivid_vid_cap_g_selection()
892 sel->r = dev->fmt_cap_rect; in vivid_vid_cap_g_selection()
902 struct vivid_dev *dev = video_drvdata(file); in vivid_vid_cap_s_selection() local
903 struct v4l2_rect *crop = &dev->crop_cap; in vivid_vid_cap_s_selection()
904 struct v4l2_rect *compose = &dev->compose_cap; in vivid_vid_cap_s_selection()
905 unsigned factor = V4L2_FIELD_HAS_T_OR_B(dev->field_cap) ? 2 : 1; in vivid_vid_cap_s_selection()
908 if (!dev->has_crop_cap && !dev->has_compose_cap) in vivid_vid_cap_s_selection()
912 if (vivid_is_webcam(dev)) in vivid_vid_cap_s_selection()
917 if (!dev->has_crop_cap) in vivid_vid_cap_s_selection()
923 v4l2_rect_set_max_size(&s->r, &dev->src_rect); in vivid_vid_cap_s_selection()
924 v4l2_rect_map_inside(&s->r, &dev->crop_bounds_cap); in vivid_vid_cap_s_selection()
927 if (dev->has_scaler_cap) { in vivid_vid_cap_s_selection()
928 struct v4l2_rect fmt = dev->fmt_cap_rect; in vivid_vid_cap_s_selection()
941 if (!dev->has_compose_cap) in vivid_vid_cap_s_selection()
943 if (!v4l2_rect_same_size(&dev->fmt_cap_rect, &fmt) && in vivid_vid_cap_s_selection()
944 vb2_is_busy(&dev->vb_vid_cap_q)) in vivid_vid_cap_s_selection()
946 if (dev->has_compose_cap) { in vivid_vid_cap_s_selection()
951 dev->fmt_cap_rect = fmt; in vivid_vid_cap_s_selection()
952 tpg_s_buf_height(&dev->tpg, fmt.height); in vivid_vid_cap_s_selection()
953 } else if (dev->has_compose_cap) { in vivid_vid_cap_s_selection()
954 struct v4l2_rect fmt = dev->fmt_cap_rect; in vivid_vid_cap_s_selection()
957 if (!v4l2_rect_same_size(&dev->fmt_cap_rect, &fmt) && in vivid_vid_cap_s_selection()
958 vb2_is_busy(&dev->vb_vid_cap_q)) in vivid_vid_cap_s_selection()
960 dev->fmt_cap_rect = fmt; in vivid_vid_cap_s_selection()
961 tpg_s_buf_height(&dev->tpg, fmt.height); in vivid_vid_cap_s_selection()
963 v4l2_rect_map_inside(compose, &dev->fmt_cap_rect); in vivid_vid_cap_s_selection()
965 if (!v4l2_rect_same_size(&s->r, &dev->fmt_cap_rect) && in vivid_vid_cap_s_selection()
966 vb2_is_busy(&dev->vb_vid_cap_q)) in vivid_vid_cap_s_selection()
968 v4l2_rect_set_size_to(&dev->fmt_cap_rect, &s->r); in vivid_vid_cap_s_selection()
970 v4l2_rect_map_inside(compose, &dev->fmt_cap_rect); in vivid_vid_cap_s_selection()
971 tpg_s_buf_height(&dev->tpg, dev->fmt_cap_rect.height); in vivid_vid_cap_s_selection()
978 if (!dev->has_compose_cap) in vivid_vid_cap_s_selection()
984 v4l2_rect_set_max_size(&s->r, &dev->fmt_cap_rect); in vivid_vid_cap_s_selection()
985 if (dev->has_scaler_cap) { in vivid_vid_cap_s_selection()
988 dev->src_rect.width * MAX_ZOOM, in vivid_vid_cap_s_selection()
989 (dev->src_rect.height / factor) * MAX_ZOOM in vivid_vid_cap_s_selection()
993 if (dev->has_crop_cap) { in vivid_vid_cap_s_selection()
1007 v4l2_rect_map_inside(crop, &dev->crop_bounds_cap); in vivid_vid_cap_s_selection()
1009 } else if (dev->has_crop_cap) { in vivid_vid_cap_s_selection()
1012 v4l2_rect_set_max_size(&s->r, &dev->src_rect); in vivid_vid_cap_s_selection()
1014 v4l2_rect_map_inside(crop, &dev->crop_bounds_cap); in vivid_vid_cap_s_selection()
1018 v4l2_rect_set_size_to(&s->r, &dev->src_rect); in vivid_vid_cap_s_selection()
1021 v4l2_rect_map_inside(&s->r, &dev->fmt_cap_rect); in vivid_vid_cap_s_selection()
1028 tpg_s_crop_compose(&dev->tpg, crop, compose); in vivid_vid_cap_s_selection()
1035 struct vivid_dev *dev = video_drvdata(file); in vivid_vid_cap_g_pixelaspect() local
1040 switch (vivid_get_pixel_aspect(dev)) { in vivid_vid_cap_g_pixelaspect()
1063 struct vivid_dev *dev = video_drvdata(file); in vidioc_enum_input() local
1065 if (inp->index >= dev->num_inputs) in vidioc_enum_input()
1069 switch (dev->input_type[inp->index]) { in vidioc_enum_input()
1072 dev->inst, dev->input_name_counter[inp->index]); in vidioc_enum_input()
1077 dev->inst, dev->input_name_counter[inp->index]); in vidioc_enum_input()
1080 if (dev->has_audio_inputs) in vidioc_enum_input()
1086 dev->inst, dev->input_name_counter[inp->index]); in vidioc_enum_input()
1088 if (dev->has_audio_inputs) in vidioc_enum_input()
1094 dev->inst, dev->input_name_counter[inp->index]); in vidioc_enum_input()
1096 if (dev->edid_blocks == 0 || in vidioc_enum_input()
1097 dev->dv_timings_signal_mode[dev->input] == NO_SIGNAL) in vidioc_enum_input()
1099 else if (dev->dv_timings_signal_mode[dev->input] == NO_LOCK || in vidioc_enum_input()
1100 dev->dv_timings_signal_mode[dev->input] == OUT_OF_RANGE) in vidioc_enum_input()
1104 if (dev->sensor_hflip) in vidioc_enum_input()
1106 if (dev->sensor_vflip) in vidioc_enum_input()
1108 if (dev->input == inp->index && vivid_is_sdtv_cap(dev)) { in vidioc_enum_input()
1109 if (dev->std_signal_mode[dev->input] == NO_SIGNAL) { in vidioc_enum_input()
1111 } else if (dev->std_signal_mode[dev->input] == NO_LOCK) { in vidioc_enum_input()
1113 } else if (vivid_is_tv_cap(dev)) { in vidioc_enum_input()
1114 switch (tpg_g_quality(&dev->tpg)) { in vidioc_enum_input()
1131 struct vivid_dev *dev = video_drvdata(file); in vidioc_g_input() local
1133 *i = dev->input; in vidioc_g_input()
1139 struct vivid_dev *dev = video_drvdata(file); in vidioc_s_input() local
1140 struct v4l2_bt_timings *bt = &dev->dv_timings_cap[dev->input].bt; in vidioc_s_input()
1143 if (i >= dev->num_inputs) in vidioc_s_input()
1146 if (i == dev->input) in vidioc_s_input()
1149 if (vb2_is_busy(&dev->vb_vid_cap_q) || in vidioc_s_input()
1150 vb2_is_busy(&dev->vb_vbi_cap_q) || in vidioc_s_input()
1151 vb2_is_busy(&dev->vb_meta_cap_q)) in vidioc_s_input()
1154 dev->input = i; in vidioc_s_input()
1155 dev->vid_cap_dev.tvnorms = 0; in vidioc_s_input()
1156 if (dev->input_type[i] == TV || dev->input_type[i] == SVID) { in vidioc_s_input()
1157 dev->tv_audio_input = (dev->input_type[i] == TV) ? 0 : 1; in vidioc_s_input()
1158 dev->vid_cap_dev.tvnorms = V4L2_STD_ALL; in vidioc_s_input()
1160 dev->vbi_cap_dev.tvnorms = dev->vid_cap_dev.tvnorms; in vidioc_s_input()
1161 dev->meta_cap_dev.tvnorms = dev->vid_cap_dev.tvnorms; in vidioc_s_input()
1162 vivid_update_format_cap(dev, false); in vidioc_s_input()
1164 if (dev->colorspace) { in vidioc_s_input()
1165 switch (dev->input_type[i]) { in vidioc_s_input()
1167 v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB); in vidioc_s_input()
1171 v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M); in vidioc_s_input()
1175 if (dev->src_rect.width == 720 && dev->src_rect.height <= 576) in vidioc_s_input()
1176 v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M); in vidioc_s_input()
1178 v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_709); in vidioc_s_input()
1180 v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB); in vidioc_s_input()
1193 brightness = 128 * i + dev->input_brightness[i]; in vidioc_s_input()
1194 v4l2_ctrl_modify_range(dev->brightness, in vidioc_s_input()
1196 v4l2_ctrl_s_ctrl(dev->brightness, brightness); in vidioc_s_input()
1199 v4l2_ctrl_activate(dev->ctrl_dv_timings_signal_mode, in vidioc_s_input()
1200 vivid_is_hdmi_cap(dev)); in vidioc_s_input()
1201 v4l2_ctrl_activate(dev->ctrl_dv_timings, vivid_is_hdmi_cap(dev) && in vidioc_s_input()
1202 dev->dv_timings_signal_mode[dev->input] == in vidioc_s_input()
1204 v4l2_ctrl_activate(dev->ctrl_std_signal_mode, vivid_is_sdtv_cap(dev)); in vidioc_s_input()
1205 v4l2_ctrl_activate(dev->ctrl_standard, vivid_is_sdtv_cap(dev) && in vidioc_s_input()
1206 dev->std_signal_mode[dev->input]); in vidioc_s_input()
1208 if (vivid_is_hdmi_cap(dev)) { in vidioc_s_input()
1209 v4l2_ctrl_s_ctrl(dev->ctrl_dv_timings_signal_mode, in vidioc_s_input()
1210 dev->dv_timings_signal_mode[dev->input]); in vidioc_s_input()
1211 v4l2_ctrl_s_ctrl(dev->ctrl_dv_timings, in vidioc_s_input()
1212 dev->query_dv_timings[dev->input]); in vidioc_s_input()
1213 } else if (vivid_is_sdtv_cap(dev)) { in vidioc_s_input()
1214 v4l2_ctrl_s_ctrl(dev->ctrl_std_signal_mode, in vidioc_s_input()
1215 dev->std_signal_mode[dev->input]); in vidioc_s_input()
1216 v4l2_ctrl_s_ctrl(dev->ctrl_standard, in vidioc_s_input()
1217 dev->std_signal_mode[dev->input]); in vidioc_s_input()
1233 struct vivid_dev *dev = video_drvdata(file); in vidioc_g_audio() local
1235 if (!vivid_is_sdtv_cap(dev)) in vidioc_g_audio()
1237 *vin = vivid_audio_inputs[dev->tv_audio_input]; in vidioc_g_audio()
1243 struct vivid_dev *dev = video_drvdata(file); in vidioc_s_audio() local
1245 if (!vivid_is_sdtv_cap(dev)) in vidioc_s_audio()
1249 dev->tv_audio_input = vin->index; in vidioc_s_audio()
1255 struct vivid_dev *dev = video_drvdata(file); in vivid_video_g_frequency() local
1259 vf->frequency = dev->tv_freq; in vivid_video_g_frequency()
1265 struct vivid_dev *dev = video_drvdata(file); in vivid_video_s_frequency() local
1269 dev->tv_freq = clamp_t(unsigned, vf->frequency, MIN_TV_FREQ, MAX_TV_FREQ); in vivid_video_s_frequency()
1270 if (vivid_is_tv_cap(dev)) in vivid_video_s_frequency()
1271 vivid_update_quality(dev); in vivid_video_s_frequency()
1277 struct vivid_dev *dev = video_drvdata(file); in vivid_video_s_tuner() local
1283 dev->tv_audmode = vt->audmode; in vivid_video_s_tuner()
1289 struct vivid_dev *dev = video_drvdata(file); in vivid_video_g_tuner() local
1297 vt->audmode = dev->tv_audmode; in vivid_video_g_tuner()
1300 qual = vivid_get_quality(dev, &vt->afc); in vivid_video_g_tuner()
1312 unsigned int channel_nr = dev->tv_freq / (6 * 16); in vivid_video_g_tuner()
1314 (dev->std_cap[dev->input] & V4L2_STD_NTSC_M) ? 4 : 3; in vivid_video_g_tuner()
1324 if (dev->std_cap[dev->input] & V4L2_STD_NTSC_M) in vivid_video_g_tuner()
1380 struct vivid_dev *dev = video_drvdata(file); in vidioc_querystd() local
1381 unsigned int last = dev->query_std_last[dev->input]; in vidioc_querystd()
1383 if (!vivid_is_sdtv_cap(dev)) in vidioc_querystd()
1385 if (dev->std_signal_mode[dev->input] == NO_SIGNAL || in vidioc_querystd()
1386 dev->std_signal_mode[dev->input] == NO_LOCK) { in vidioc_querystd()
1390 if (vivid_is_tv_cap(dev) && tpg_g_quality(&dev->tpg) == TPG_QUAL_NOISE) { in vidioc_querystd()
1392 } else if (dev->std_signal_mode[dev->input] == CURRENT_STD) { in vidioc_querystd()
1393 *id = dev->std_cap[dev->input]; in vidioc_querystd()
1394 } else if (dev->std_signal_mode[dev->input] == SELECTED_STD) { in vidioc_querystd()
1395 *id = dev->query_std[dev->input]; in vidioc_querystd()
1398 dev->query_std_last[dev->input] = in vidioc_querystd()
1407 struct vivid_dev *dev = video_drvdata(file); in vivid_vid_cap_s_std() local
1409 if (!vivid_is_sdtv_cap(dev)) in vivid_vid_cap_s_std()
1411 if (dev->std_cap[dev->input] == id) in vivid_vid_cap_s_std()
1413 if (vb2_is_busy(&dev->vb_vid_cap_q) || vb2_is_busy(&dev->vb_vbi_cap_q)) in vivid_vid_cap_s_std()
1415 dev->std_cap[dev->input] = id; in vivid_vid_cap_s_std()
1416 vivid_update_format_cap(dev, false); in vivid_vid_cap_s_std()
1494 struct vivid_dev *dev = video_drvdata(file); in vivid_vid_cap_s_dv_timings() local
1496 if (!vivid_is_hdmi_cap(dev)) in vivid_vid_cap_s_dv_timings()
1503 if (v4l2_match_dv_timings(timings, &dev->dv_timings_cap[dev->input], in vivid_vid_cap_s_dv_timings()
1506 if (vb2_is_busy(&dev->vb_vid_cap_q)) in vivid_vid_cap_s_dv_timings()
1509 dev->dv_timings_cap[dev->input] = *timings; in vivid_vid_cap_s_dv_timings()
1510 vivid_update_format_cap(dev, false); in vivid_vid_cap_s_dv_timings()
1517 struct vivid_dev *dev = video_drvdata(file); in vidioc_query_dv_timings() local
1518 unsigned int input = dev->input; in vidioc_query_dv_timings()
1519 unsigned int last = dev->query_dv_timings_last[input]; in vidioc_query_dv_timings()
1521 if (!vivid_is_hdmi_cap(dev)) in vidioc_query_dv_timings()
1523 if (dev->dv_timings_signal_mode[input] == NO_SIGNAL || in vidioc_query_dv_timings()
1524 dev->edid_blocks == 0) in vidioc_query_dv_timings()
1526 if (dev->dv_timings_signal_mode[input] == NO_LOCK) in vidioc_query_dv_timings()
1528 if (dev->dv_timings_signal_mode[input] == OUT_OF_RANGE) { in vidioc_query_dv_timings()
1532 if (dev->dv_timings_signal_mode[input] == CURRENT_DV_TIMINGS) { in vidioc_query_dv_timings()
1533 *timings = dev->dv_timings_cap[input]; in vidioc_query_dv_timings()
1534 } else if (dev->dv_timings_signal_mode[input] == in vidioc_query_dv_timings()
1537 v4l2_dv_timings_presets[dev->query_dv_timings[input]]; in vidioc_query_dv_timings()
1541 dev->query_dv_timings_last[input] = in vidioc_query_dv_timings()
1542 (last + 1) % dev->query_dv_timings_size; in vidioc_query_dv_timings()
1547 void vivid_update_outputs(struct vivid_dev *dev) in vivid_update_outputs() argument
1551 if (!dev || !dev->num_outputs) in vivid_update_outputs()
1553 for (unsigned int i = 0, j = 0; i < dev->num_outputs; i++) { in vivid_update_outputs()
1554 if (dev->output_type[i] != HDMI) in vivid_update_outputs()
1557 struct vivid_dev *dev_rx = dev->output_to_input_instance[i]; in vivid_update_outputs()
1563 v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, edid_present); in vivid_update_outputs()
1564 v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, edid_present); in vivid_update_outputs()
1565 v4l2_ctrl_s_ctrl(dev->ctrl_tx_rxsense, edid_present); in vivid_update_outputs()
1568 void vivid_update_connected_outputs(struct vivid_dev *dev) in vivid_update_connected_outputs() argument
1570 u16 phys_addr = cec_get_edid_phys_addr(dev->edid, dev->edid_blocks * 128, NULL); in vivid_update_connected_outputs()
1572 for (unsigned int i = 0, j = 0; i < dev->num_inputs; i++) { in vivid_update_connected_outputs()
1574 dev->input_is_connected_to_output[i]; in vivid_update_connected_outputs()
1576 if (dev->input_type[i] != HDMI) in vivid_update_connected_outputs()
1591 if (dev->edid_blocks) { in vivid_update_connected_outputs()
1604 struct vivid_dev *dev = video_drvdata(file); in vidioc_s_edid() local
1609 if (edid->pad >= dev->num_inputs) in vidioc_s_edid()
1611 if (dev->input_type[edid->pad] != HDMI || edid->start_block) in vidioc_s_edid()
1614 if (vb2_is_busy(&dev->vb_vid_cap_q)) in vidioc_s_edid()
1616 dev->edid_blocks = 0; in vidioc_s_edid()
1617 vivid_update_connected_outputs(dev); in vidioc_s_edid()
1620 if (edid->blocks > dev->edid_max_blocks) { in vidioc_s_edid()
1621 edid->blocks = dev->edid_max_blocks; in vidioc_s_edid()
1629 if (vb2_is_busy(&dev->vb_vid_cap_q)) in vidioc_s_edid()
1632 dev->edid_blocks = edid->blocks; in vidioc_s_edid()
1633 memcpy(dev->edid, edid->edid, edid->blocks * 128); in vidioc_s_edid()
1635 vivid_update_connected_outputs(dev); in vidioc_s_edid()
1642 struct vivid_dev *dev = video_drvdata(file); in vidioc_enum_framesizes() local
1644 if (!vivid_is_webcam(dev) && !dev->has_scaler_cap) in vidioc_enum_framesizes()
1646 if (vivid_get_format(dev, fsize->pixel_format) == NULL) in vidioc_enum_framesizes()
1648 if (vivid_is_webcam(dev)) { in vidioc_enum_framesizes()
1671 struct vivid_dev *dev = video_drvdata(file); in vidioc_enum_frameintervals() local
1675 fmt = vivid_get_format(dev, fival->pixel_format); in vidioc_enum_frameintervals()
1679 if (!vivid_is_webcam(dev)) { in vidioc_enum_frameintervals()
1687 fival->discrete = dev->timeperframe_vid_cap; in vidioc_enum_frameintervals()
1697 if (fival->index >= webcam_ival_count(dev, i)) in vidioc_enum_frameintervals()
1707 struct vivid_dev *dev = video_drvdata(file); in vivid_vid_cap_g_parm() local
1709 if (parm->type != (dev->multiplanar ? in vivid_vid_cap_g_parm()
1715 parm->parm.capture.timeperframe = dev->timeperframe_vid_cap; in vivid_vid_cap_g_parm()
1723 struct vivid_dev *dev = video_drvdata(file); in vivid_vid_cap_s_parm() local
1724 unsigned int ival_sz = webcam_ival_count(dev, dev->webcam_size_idx); in vivid_vid_cap_s_parm()
1728 if (parm->type != (dev->multiplanar ? in vivid_vid_cap_s_parm()
1732 if (!vivid_is_webcam(dev)) in vivid_vid_cap_s_parm()
1744 dev->webcam_ival_idx = i; in vivid_vid_cap_s_parm()
1745 tpf = webcam_intervals[dev->webcam_ival_idx]; in vivid_vid_cap_s_parm()
1748 dev->cap_seq_resync = true; in vivid_vid_cap_s_parm()
1749 dev->timeperframe_vid_cap = tpf; in vivid_vid_cap_s_parm()