Lines Matching full:dev

45 static inline v4l2_std_id vivid_get_std_cap(const struct vivid_dev *dev)  in vivid_get_std_cap()  argument
47 if (vivid_is_sdtv_cap(dev)) in vivid_get_std_cap()
48 return dev->std_cap[dev->input]; in vivid_get_std_cap()
52 static void copy_pix(struct vivid_dev *dev, int win_y, int win_x, in copy_pix() argument
56 int left = dev->overlay_out_left; in copy_pix()
57 int top = dev->overlay_out_top; in copy_pix()
64 if (dev->bitmap_out) { in copy_pix()
65 const u8 *p = dev->bitmap_out; in copy_pix()
66 unsigned stride = (dev->compose_out.width + 7) / 8; in copy_pix()
68 win_x -= dev->compose_out.left; in copy_pix()
69 win_y -= dev->compose_out.top; in copy_pix()
74 for (i = 0; i < dev->clipcount_out; i++) { in copy_pix()
75 struct v4l2_rect *r = &dev->clips_out[i].c; in copy_pix()
81 if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_CHROMAKEY) && in copy_pix()
82 *osd != dev->chromakey_out) in copy_pix()
84 if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_SRC_CHROMAKEY) && in copy_pix()
85 out == dev->chromakey_out) in copy_pix()
87 if (dev->fmt_cap->alpha_mask) { in copy_pix()
88 if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) && in copy_pix()
89 dev->global_alpha_out) in copy_pix()
91 if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) && in copy_pix()
92 *cap & dev->fmt_cap->alpha_mask) in copy_pix()
94 if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_LOCAL_INV_ALPHA) && in copy_pix()
95 !(*cap & dev->fmt_cap->alpha_mask)) in copy_pix()
101 static void blend_line(struct vivid_dev *dev, unsigned y_offset, unsigned x_offset, in blend_line() argument
108 copy_pix(dev, y_offset, x_offset + x, in blend_line()
166 static void vivid_precalc_copy_rects(struct vivid_dev *dev) in vivid_precalc_copy_rects() argument
170 0, 0, dev->display_width, dev->display_height in vivid_precalc_copy_rects()
174 dev->overlay_out_left, dev->overlay_out_top, in vivid_precalc_copy_rects()
175 dev->compose_out.width, dev->compose_out.height in vivid_precalc_copy_rects()
178 v4l2_rect_intersect(&dev->loop_vid_copy, &dev->crop_cap, &dev->compose_out); in vivid_precalc_copy_rects()
180 dev->loop_vid_out = dev->loop_vid_copy; in vivid_precalc_copy_rects()
181 v4l2_rect_scale(&dev->loop_vid_out, &dev->compose_out, &dev->crop_out); in vivid_precalc_copy_rects()
182 dev->loop_vid_out.left += dev->crop_out.left; in vivid_precalc_copy_rects()
183 dev->loop_vid_out.top += dev->crop_out.top; in vivid_precalc_copy_rects()
185 dev->loop_vid_cap = dev->loop_vid_copy; in vivid_precalc_copy_rects()
186 v4l2_rect_scale(&dev->loop_vid_cap, &dev->crop_cap, &dev->compose_cap); in vivid_precalc_copy_rects()
188 dprintk(dev, 1, in vivid_precalc_copy_rects()
190 dev->loop_vid_copy.width, dev->loop_vid_copy.height, in vivid_precalc_copy_rects()
191 dev->loop_vid_copy.left, dev->loop_vid_copy.top, in vivid_precalc_copy_rects()
192 dev->loop_vid_out.width, dev->loop_vid_out.height, in vivid_precalc_copy_rects()
193 dev->loop_vid_out.left, dev->loop_vid_out.top, in vivid_precalc_copy_rects()
194 dev->loop_vid_cap.width, dev->loop_vid_cap.height, in vivid_precalc_copy_rects()
195 dev->loop_vid_cap.left, dev->loop_vid_cap.top); in vivid_precalc_copy_rects()
200 r_overlay.left += dev->compose_out.left - dev->overlay_out_left; in vivid_precalc_copy_rects()
201 r_overlay.top += dev->compose_out.top - dev->overlay_out_top; in vivid_precalc_copy_rects()
203 v4l2_rect_intersect(&dev->loop_vid_overlay, &r_overlay, &dev->loop_vid_copy); in vivid_precalc_copy_rects()
204 dev->loop_fb_copy = dev->loop_vid_overlay; in vivid_precalc_copy_rects()
206 /* shift dev->loop_fb_copy back again to the fb origin */ in vivid_precalc_copy_rects()
207 dev->loop_fb_copy.left -= dev->compose_out.left - dev->overlay_out_left; in vivid_precalc_copy_rects()
208 dev->loop_fb_copy.top -= dev->compose_out.top - dev->overlay_out_top; in vivid_precalc_copy_rects()
210 dev->loop_vid_overlay_cap = dev->loop_vid_overlay; in vivid_precalc_copy_rects()
211 v4l2_rect_scale(&dev->loop_vid_overlay_cap, &dev->crop_cap, &dev->compose_cap); in vivid_precalc_copy_rects()
213 dprintk(dev, 1, in vivid_precalc_copy_rects()
215 dev->loop_fb_copy.width, dev->loop_fb_copy.height, in vivid_precalc_copy_rects()
216 dev->loop_fb_copy.left, dev->loop_fb_copy.top, in vivid_precalc_copy_rects()
217 dev->loop_vid_overlay.width, dev->loop_vid_overlay.height, in vivid_precalc_copy_rects()
218 dev->loop_vid_overlay.left, dev->loop_vid_overlay.top, in vivid_precalc_copy_rects()
219 dev->loop_vid_overlay_cap.width, dev->loop_vid_overlay_cap.height, in vivid_precalc_copy_rects()
220 dev->loop_vid_overlay_cap.left, dev->loop_vid_overlay_cap.top); in vivid_precalc_copy_rects()
237 static noinline_for_stack int vivid_copy_buffer(struct vivid_dev *dev, unsigned p, in vivid_copy_buffer() argument
240 bool blank = dev->must_blank[vid_cap_buf->vb.vb2_buf.index]; in vivid_copy_buffer()
241 struct tpg_data *tpg = &dev->tpg; in vivid_copy_buffer()
243 unsigned vdiv = dev->fmt_out->vdownsampling[p]; in vivid_copy_buffer()
245 unsigned img_width = tpg_hdiv(tpg, p, dev->compose_cap.width); in vivid_copy_buffer()
246 unsigned img_height = dev->compose_cap.height; in vivid_copy_buffer()
248 unsigned stride_out = dev->bytesperline_out[p]; in vivid_copy_buffer()
249 unsigned stride_osd = dev->display_byte_stride; in vivid_copy_buffer()
254 bool blend = dev->bitmap_out || dev->clipcount_out || dev->fbuf_out_flags; in vivid_copy_buffer()
264 unsigned vid_cap_left = tpg_hdiv(tpg, p, dev->loop_vid_cap.left); in vivid_copy_buffer()
268 vid_out_int_part = dev->loop_vid_out.height / dev->loop_vid_cap.height; in vivid_copy_buffer()
269 vid_out_fract_part = dev->loop_vid_out.height % dev->loop_vid_cap.height; in vivid_copy_buffer()
271 if (!list_empty(&dev->vid_out_active)) in vivid_copy_buffer()
272 vid_out_buf = list_entry(dev->vid_out_active.next, in vivid_copy_buffer()
280 dev->bytesperline_out, dev->fmt_out_rect.height); in vivid_copy_buffer()
281 if (p < dev->fmt_out->buffers) in vivid_copy_buffer()
283 voutbuf += tpg_hdiv(tpg, p, dev->loop_vid_out.left) + in vivid_copy_buffer()
284 (dev->loop_vid_out.top / vdiv) * stride_out; in vivid_copy_buffer()
285 vcapbuf += tpg_hdiv(tpg, p, dev->compose_cap.left) + in vivid_copy_buffer()
286 (dev->compose_cap.top / vdiv) * stride_cap; in vivid_copy_buffer()
288 if (dev->loop_vid_copy.width == 0 || dev->loop_vid_copy.height == 0) { in vivid_copy_buffer()
298 if (dev->overlay_out_enabled && in vivid_copy_buffer()
299 dev->loop_vid_overlay.width && dev->loop_vid_overlay.height) { in vivid_copy_buffer()
300 vosdbuf = dev->video_vbase; in vivid_copy_buffer()
301 vosdbuf += (dev->loop_fb_copy.left * twopixsize) / 2 + in vivid_copy_buffer()
302 dev->loop_fb_copy.top * stride_osd; in vivid_copy_buffer()
303 vid_overlay_int_part = dev->loop_vid_overlay.height / in vivid_copy_buffer()
304 dev->loop_vid_overlay_cap.height; in vivid_copy_buffer()
305 vid_overlay_fract_part = dev->loop_vid_overlay.height % in vivid_copy_buffer()
306 dev->loop_vid_overlay_cap.height; in vivid_copy_buffer()
309 vid_cap_right = tpg_hdiv(tpg, p, dev->loop_vid_cap.left + dev->loop_vid_cap.width); in vivid_copy_buffer()
311 quick = dev->loop_vid_out.width == dev->loop_vid_cap.width; in vivid_copy_buffer()
313 dev->cur_scaled_line = dev->loop_vid_out.height; in vivid_copy_buffer()
316 bool osdline = vosdbuf && y >= dev->loop_vid_overlay_cap.top && in vivid_copy_buffer()
317 y < dev->loop_vid_overlay_cap.top + dev->loop_vid_overlay_cap.height; in vivid_copy_buffer()
323 if (y < dev->loop_vid_cap.top || in vivid_copy_buffer()
324 y >= dev->loop_vid_cap.top + dev->loop_vid_cap.height) { in vivid_copy_buffer()
330 if (dev->loop_vid_cap.left) in vivid_copy_buffer()
341 tpg_hdiv(tpg, p, dev->loop_vid_cap.width)); in vivid_copy_buffer()
344 if (dev->cur_scaled_line == vid_out_y) { in vivid_copy_buffer()
345 memcpy(vcapbuf + vid_cap_left, dev->scaled_line, in vivid_copy_buffer()
346 tpg_hdiv(tpg, p, dev->loop_vid_cap.width)); in vivid_copy_buffer()
350 scale_line(voutbuf + vid_out_y * stride_out, dev->scaled_line, in vivid_copy_buffer()
351 tpg_hdiv(tpg, p, dev->loop_vid_out.width), in vivid_copy_buffer()
352 tpg_hdiv(tpg, p, dev->loop_vid_cap.width), in vivid_copy_buffer()
360 ((dev->loop_vid_overlay.left - dev->loop_vid_copy.left) * in vivid_copy_buffer()
364 scale_line(voutbuf + vid_out_y * stride_out, dev->blended_line, in vivid_copy_buffer()
365 dev->loop_vid_out.width, dev->loop_vid_copy.width, in vivid_copy_buffer()
368 blend_line(dev, vid_overlay_y + dev->loop_vid_overlay.top, in vivid_copy_buffer()
369 dev->loop_vid_overlay.left, in vivid_copy_buffer()
370 dev->blended_line + offset, osd, in vivid_copy_buffer()
371 dev->loop_vid_overlay.width, twopixsize / 2); in vivid_copy_buffer()
373 memcpy(dev->blended_line + offset, in vivid_copy_buffer()
374 osd, (dev->loop_vid_overlay.width * twopixsize) / 2); in vivid_copy_buffer()
375 scale_line(dev->blended_line, dev->scaled_line, in vivid_copy_buffer()
376 dev->loop_vid_copy.width, dev->loop_vid_cap.width, in vivid_copy_buffer()
379 dev->cur_scaled_line = vid_out_y; in vivid_copy_buffer()
380 memcpy(vcapbuf + vid_cap_left, dev->scaled_line, in vivid_copy_buffer()
381 tpg_hdiv(tpg, p, dev->loop_vid_cap.width)); in vivid_copy_buffer()
387 if (vid_overlay_error >= dev->loop_vid_overlay_cap.height) { in vivid_copy_buffer()
388 vid_overlay_error -= dev->loop_vid_overlay_cap.height; in vivid_copy_buffer()
394 if (vid_out_error >= dev->loop_vid_cap.height / vdiv) { in vivid_copy_buffer()
395 vid_out_error -= dev->loop_vid_cap.height / vdiv; in vivid_copy_buffer()
407 static void vivid_fillbuff(struct vivid_dev *dev, struct vivid_buffer *buf) in vivid_fillbuff() argument
409 struct tpg_data *tpg = &dev->tpg; in vivid_fillbuff()
410 unsigned factor = V4L2_FIELD_HAS_T_OR_B(dev->field_cap) ? 2 : 1; in vivid_fillbuff()
412 bool is_tv = vivid_is_sdtv_cap(dev); in vivid_fillbuff()
413 bool is_60hz = is_tv && (dev->std_cap[dev->input] & V4L2_STD_525_60); in vivid_fillbuff()
422 if (dev->loop_video && dev->can_loop_video && in vivid_fillbuff()
423 ((vivid_is_svid_cap(dev) && in vivid_fillbuff()
424 !VIVID_INVALID_SIGNAL(dev->std_signal_mode[dev->input])) || in vivid_fillbuff()
425 (vivid_is_hdmi_cap(dev) && in vivid_fillbuff()
426 !VIVID_INVALID_SIGNAL(dev->dv_timings_signal_mode[dev->input])))) in vivid_fillbuff()
429 buf->vb.sequence = dev->vid_cap_seq_count; in vivid_fillbuff()
430 v4l2_ctrl_s_ctrl(dev->ro_int32, buf->vb.sequence & 0xff); in vivid_fillbuff()
431 if (dev->field_cap == V4L2_FIELD_ALTERNATE) { in vivid_fillbuff()
438 buf->vb.field = ((dev->vid_cap_seq_count & 1) ^ is_60hz) ? in vivid_fillbuff()
446 buf->vb.field = dev->field_cap; in vivid_fillbuff()
449 dev->field_cap == V4L2_FIELD_ALTERNATE); in vivid_fillbuff()
450 tpg_s_perc_fill_blank(tpg, dev->must_blank[buf->vb.vb2_buf.index]); in vivid_fillbuff()
452 vivid_precalc_copy_rects(dev); in vivid_fillbuff()
463 if (p < tpg_g_buffers(tpg) && dev->fmt_cap->data_offset[p]) { in vivid_fillbuff()
464 memset(vbuf, dev->fmt_cap->data_offset[p] & 0xff, in vivid_fillbuff()
465 dev->fmt_cap->data_offset[p]); in vivid_fillbuff()
466 vbuf += dev->fmt_cap->data_offset[p]; in vivid_fillbuff()
469 if (!is_loop || vivid_copy_buffer(dev, p, vbuf, buf)) in vivid_fillbuff()
470 tpg_fill_plane_buffer(tpg, vivid_get_std_cap(dev), in vivid_fillbuff()
473 dev->must_blank[buf->vb.vb2_buf.index] = false; in vivid_fillbuff()
476 if (dev->field_cap != V4L2_FIELD_ALTERNATE || in vivid_fillbuff()
477 (dev->vid_cap_seq_count & 1) == 0) in vivid_fillbuff()
478 dev->ms_vid_cap = in vivid_fillbuff()
479 jiffies_to_msecs(jiffies - dev->jiffies_vid_cap); in vivid_fillbuff()
481 ms = dev->ms_vid_cap; in vivid_fillbuff()
482 if (dev->osd_mode <= 1) { in vivid_fillbuff()
489 (dev->field_cap == V4L2_FIELD_ALTERNATE) ? in vivid_fillbuff()
494 if (dev->osd_mode == 0) { in vivid_fillbuff()
496 dev->src_rect.width, dev->src_rect.height, dev->input); in vivid_fillbuff()
499 gain = v4l2_ctrl_g_ctrl(dev->gain); in vivid_fillbuff()
500 mutex_lock(dev->ctrl_hdl_user_vid.lock); in vivid_fillbuff()
503 dev->brightness->cur.val, in vivid_fillbuff()
504 dev->contrast->cur.val, in vivid_fillbuff()
505 dev->saturation->cur.val, in vivid_fillbuff()
506 dev->hue->cur.val); in vivid_fillbuff()
510 dev->autogain->cur.val, gain, dev->alpha->cur.val); in vivid_fillbuff()
511 mutex_unlock(dev->ctrl_hdl_user_vid.lock); in vivid_fillbuff()
513 mutex_lock(dev->ctrl_hdl_user_aud.lock); in vivid_fillbuff()
516 dev->volume->cur.val, dev->mute->cur.val); in vivid_fillbuff()
517 mutex_unlock(dev->ctrl_hdl_user_aud.lock); in vivid_fillbuff()
519 mutex_lock(dev->ctrl_hdl_user_gen.lock); in vivid_fillbuff()
521 dev->int32->cur.val, in vivid_fillbuff()
522 dev->ro_int32->cur.val, in vivid_fillbuff()
523 *dev->int64->p_cur.p_s64, in vivid_fillbuff()
524 dev->bitmask->cur.val); in vivid_fillbuff()
527 dev->boolean->cur.val, in vivid_fillbuff()
528 dev->menu->qmenu[dev->menu->cur.val], in vivid_fillbuff()
529 dev->string->p_cur.p_char); in vivid_fillbuff()
532 dev->int_menu->qmenu_int[dev->int_menu->cur.val], in vivid_fillbuff()
533 dev->int_menu->cur.val); in vivid_fillbuff()
534 mutex_unlock(dev->ctrl_hdl_user_gen.lock); in vivid_fillbuff()
536 if (dev->button_pressed) { in vivid_fillbuff()
537 dev->button_pressed--; in vivid_fillbuff()
541 if (dev->osd[0]) { in vivid_fillbuff()
542 if (vivid_is_hdmi_cap(dev)) { in vivid_fillbuff()
544 " OSD \"%s\"", dev->osd); in vivid_fillbuff()
548 if (dev->osd_jiffies && in vivid_fillbuff()
549 time_is_before_jiffies(dev->osd_jiffies + 5 * HZ)) { in vivid_fillbuff()
550 dev->osd[0] = 0; in vivid_fillbuff()
551 dev->osd_jiffies = 0; in vivid_fillbuff()
560 static bool valid_pix(struct vivid_dev *dev, int win_y, int win_x, int fb_y, int fb_x) in valid_pix() argument
564 if (dev->bitmap_cap) { in valid_pix()
570 const u8 *p = dev->bitmap_cap; in valid_pix()
571 unsigned stride = (dev->compose_cap.width + 7) / 8; in valid_pix()
577 for (i = 0; i < dev->clipcount_cap; i++) { in valid_pix()
582 struct v4l2_rect *r = &dev->clips_cap[i].c; in valid_pix()
595 static void vivid_overlay(struct vivid_dev *dev, struct vivid_buffer *buf) in vivid_overlay() argument
597 struct tpg_data *tpg = &dev->tpg; in vivid_overlay()
599 void *vbase = dev->fb_vbase_cap; in vivid_overlay()
601 unsigned img_width = dev->compose_cap.width; in vivid_overlay()
602 unsigned img_height = dev->compose_cap.height; in vivid_overlay()
605 bool quick = dev->bitmap_cap == NULL && dev->clipcount_cap == 0; in vivid_overlay()
614 if ((dev->overlay_cap_field == V4L2_FIELD_TOP || in vivid_overlay()
615 dev->overlay_cap_field == V4L2_FIELD_BOTTOM) && in vivid_overlay()
616 dev->overlay_cap_field != buf->vb.field) in vivid_overlay()
619 vbuf += dev->compose_cap.left * pixsize + dev->compose_cap.top * stride; in vivid_overlay()
620 x = dev->overlay_cap_left; in vivid_overlay()
627 w = dev->fb_cap.fmt.width - x; in vivid_overlay()
633 if (dev->overlay_cap_top >= 0) in vivid_overlay()
634 vbase += dev->overlay_cap_top * dev->fb_cap.fmt.bytesperline; in vivid_overlay()
635 for (y = dev->overlay_cap_top; in vivid_overlay()
636 y < dev->overlay_cap_top + (int)img_height; in vivid_overlay()
640 if (y < 0 || y > dev->fb_cap.fmt.height) in vivid_overlay()
645 vbase += dev->fb_cap.fmt.bytesperline; in vivid_overlay()
649 if (!valid_pix(dev, y - dev->overlay_cap_top, in vivid_overlay()
656 vbase += dev->fb_cap.fmt.bytesperline; in vivid_overlay()
660 static void vivid_cap_update_frame_period(struct vivid_dev *dev) in vivid_cap_update_frame_period() argument
664 f_period = (u64)dev->timeperframe_vid_cap.numerator * 1000000000; in vivid_cap_update_frame_period()
665 if (WARN_ON(dev->timeperframe_vid_cap.denominator == 0)) in vivid_cap_update_frame_period()
666 dev->timeperframe_vid_cap.denominator = 1; in vivid_cap_update_frame_period()
667 do_div(f_period, dev->timeperframe_vid_cap.denominator); in vivid_cap_update_frame_period()
668 if (dev->field_cap == V4L2_FIELD_ALTERNATE) in vivid_cap_update_frame_period()
674 dev->cap_frame_eof_offset = f_period * 9; in vivid_cap_update_frame_period()
675 do_div(dev->cap_frame_eof_offset, 10); in vivid_cap_update_frame_period()
676 dev->cap_frame_period = f_period; in vivid_cap_update_frame_period()
679 static noinline_for_stack void vivid_thread_vid_cap_tick(struct vivid_dev *dev, in vivid_thread_vid_cap_tick() argument
687 dprintk(dev, 1, "Video Capture Thread Tick\n"); in vivid_thread_vid_cap_tick()
690 tpg_update_mv_count(&dev->tpg, in vivid_thread_vid_cap_tick()
691 dev->field_cap == V4L2_FIELD_NONE || in vivid_thread_vid_cap_tick()
692 dev->field_cap == V4L2_FIELD_ALTERNATE); in vivid_thread_vid_cap_tick()
695 if (dev->perc_dropped_buffers && in vivid_thread_vid_cap_tick()
696 prandom_u32_max(100) < dev->perc_dropped_buffers) in vivid_thread_vid_cap_tick()
699 spin_lock(&dev->slock); in vivid_thread_vid_cap_tick()
700 if (!list_empty(&dev->vid_cap_active)) { in vivid_thread_vid_cap_tick()
701 vid_cap_buf = list_entry(dev->vid_cap_active.next, struct vivid_buffer, list); in vivid_thread_vid_cap_tick()
704 if (!list_empty(&dev->vbi_cap_active)) { in vivid_thread_vid_cap_tick()
705 if (dev->field_cap != V4L2_FIELD_ALTERNATE || in vivid_thread_vid_cap_tick()
706 (dev->vbi_cap_seq_count & 1)) { in vivid_thread_vid_cap_tick()
707 vbi_cap_buf = list_entry(dev->vbi_cap_active.next, in vivid_thread_vid_cap_tick()
712 if (!list_empty(&dev->meta_cap_active)) { in vivid_thread_vid_cap_tick()
713 meta_cap_buf = list_entry(dev->meta_cap_active.next, in vivid_thread_vid_cap_tick()
718 spin_unlock(&dev->slock); in vivid_thread_vid_cap_tick()
723 f_time = ktime_get_ns() + dev->time_wrap_offset; in vivid_thread_vid_cap_tick()
727 &dev->ctrl_hdl_vid_cap); in vivid_thread_vid_cap_tick()
729 vivid_fillbuff(dev, vid_cap_buf); in vivid_thread_vid_cap_tick()
730 dprintk(dev, 1, "filled buffer %d\n", in vivid_thread_vid_cap_tick()
734 if (dev->overlay_cap_owner && dev->fb_cap.base && in vivid_thread_vid_cap_tick()
735 dev->fb_cap.fmt.pixelformat == dev->fmt_cap->fourcc) in vivid_thread_vid_cap_tick()
736 vivid_overlay(dev, vid_cap_buf); in vivid_thread_vid_cap_tick()
739 &dev->ctrl_hdl_vid_cap); in vivid_thread_vid_cap_tick()
740 vb2_buffer_done(&vid_cap_buf->vb.vb2_buf, dev->dqbuf_error ? in vivid_thread_vid_cap_tick()
742 dprintk(dev, 2, "vid_cap buffer %d done\n", in vivid_thread_vid_cap_tick()
746 if (!dev->tstamp_src_is_soe) in vivid_thread_vid_cap_tick()
747 vid_cap_buf->vb.vb2_buf.timestamp += dev->cap_frame_eof_offset; in vivid_thread_vid_cap_tick()
754 &dev->ctrl_hdl_vbi_cap); in vivid_thread_vid_cap_tick()
756 vivid_sliced_vbi_cap_process(dev, vbi_cap_buf); in vivid_thread_vid_cap_tick()
758 vivid_raw_vbi_cap_process(dev, vbi_cap_buf); in vivid_thread_vid_cap_tick()
760 &dev->ctrl_hdl_vbi_cap); in vivid_thread_vid_cap_tick()
761 vb2_buffer_done(&vbi_cap_buf->vb.vb2_buf, dev->dqbuf_error ? in vivid_thread_vid_cap_tick()
763 dprintk(dev, 2, "vbi_cap %d done\n", in vivid_thread_vid_cap_tick()
767 vbi_period = dev->cap_frame_period * 5; in vivid_thread_vid_cap_tick()
769 vbi_cap_buf->vb.vb2_buf.timestamp = f_time + dev->cap_frame_eof_offset + vbi_period; in vivid_thread_vid_cap_tick()
774 &dev->ctrl_hdl_meta_cap); in vivid_thread_vid_cap_tick()
775 vivid_meta_cap_fillbuff(dev, meta_cap_buf, f_time); in vivid_thread_vid_cap_tick()
777 &dev->ctrl_hdl_meta_cap); in vivid_thread_vid_cap_tick()
778 vb2_buffer_done(&meta_cap_buf->vb.vb2_buf, dev->dqbuf_error ? in vivid_thread_vid_cap_tick()
780 dprintk(dev, 2, "meta_cap %d done\n", in vivid_thread_vid_cap_tick()
782 meta_cap_buf->vb.vb2_buf.timestamp = f_time + dev->cap_frame_eof_offset; in vivid_thread_vid_cap_tick()
785 dev->dqbuf_error = false; in vivid_thread_vid_cap_tick()
789 tpg_update_mv_count(&dev->tpg, dev->field_cap == V4L2_FIELD_NONE || in vivid_thread_vid_cap_tick()
790 dev->field_cap == V4L2_FIELD_ALTERNATE); in vivid_thread_vid_cap_tick()
795 struct vivid_dev *dev = data; in vivid_thread_vid_cap() local
806 dprintk(dev, 1, "Video Capture Thread Start\n"); in vivid_thread_vid_cap()
811 dev->cap_seq_offset = 0; in vivid_thread_vid_cap()
812 dev->cap_seq_count = 0; in vivid_thread_vid_cap()
813 dev->cap_seq_resync = false; in vivid_thread_vid_cap()
814 dev->jiffies_vid_cap = jiffies; in vivid_thread_vid_cap()
815 dev->cap_stream_start = ktime_get_ns(); in vivid_thread_vid_cap()
816 if (dev->time_wrap) in vivid_thread_vid_cap()
817 dev->time_wrap_offset = dev->time_wrap - dev->cap_stream_start; in vivid_thread_vid_cap()
819 dev->time_wrap_offset = 0; in vivid_thread_vid_cap()
820 vivid_cap_update_frame_period(dev); in vivid_thread_vid_cap()
827 if (!mutex_trylock(&dev->mutex)) { in vivid_thread_vid_cap()
833 if (dev->cap_seq_resync) { in vivid_thread_vid_cap()
834 dev->jiffies_vid_cap = cur_jiffies; in vivid_thread_vid_cap()
835 dev->cap_seq_offset = dev->cap_seq_count + 1; in vivid_thread_vid_cap()
836 dev->cap_seq_count = 0; in vivid_thread_vid_cap()
837 dev->cap_stream_start += dev->cap_frame_period * in vivid_thread_vid_cap()
838 dev->cap_seq_offset; in vivid_thread_vid_cap()
839 vivid_cap_update_frame_period(dev); in vivid_thread_vid_cap()
840 dev->cap_seq_resync = false; in vivid_thread_vid_cap()
842 numerator = dev->timeperframe_vid_cap.numerator; in vivid_thread_vid_cap()
843 denominator = dev->timeperframe_vid_cap.denominator; in vivid_thread_vid_cap()
845 if (dev->field_cap == V4L2_FIELD_ALTERNATE) in vivid_thread_vid_cap()
849 jiffies_since_start = cur_jiffies - dev->jiffies_vid_cap; in vivid_thread_vid_cap()
862 dev->jiffies_vid_cap = cur_jiffies; in vivid_thread_vid_cap()
863 dev->cap_seq_offset = buffers_since_start; in vivid_thread_vid_cap()
866 dropped_bufs = buffers_since_start + dev->cap_seq_offset - dev->cap_seq_count; in vivid_thread_vid_cap()
867 dev->cap_seq_count = buffers_since_start + dev->cap_seq_offset; in vivid_thread_vid_cap()
868 dev->vid_cap_seq_count = dev->cap_seq_count - dev->vid_cap_seq_start; in vivid_thread_vid_cap()
869 dev->vbi_cap_seq_count = dev->cap_seq_count - dev->vbi_cap_seq_start; in vivid_thread_vid_cap()
870 dev->meta_cap_seq_count = dev->cap_seq_count - dev->meta_cap_seq_start; in vivid_thread_vid_cap()
872 vivid_thread_vid_cap_tick(dev, dropped_bufs); in vivid_thread_vid_cap()
881 jiffies_since_start = jiffies - dev->jiffies_vid_cap; in vivid_thread_vid_cap()
883 mutex_unlock(&dev->mutex); in vivid_thread_vid_cap()
901 dprintk(dev, 1, "Video Capture Thread End\n"); in vivid_thread_vid_cap()
905 static void vivid_grab_controls(struct vivid_dev *dev, bool grab) in vivid_grab_controls() argument
907 v4l2_ctrl_grab(dev->ctrl_has_crop_cap, grab); in vivid_grab_controls()
908 v4l2_ctrl_grab(dev->ctrl_has_compose_cap, grab); in vivid_grab_controls()
909 v4l2_ctrl_grab(dev->ctrl_has_scaler_cap, grab); in vivid_grab_controls()
912 int vivid_start_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming) in vivid_start_generating_vid_cap() argument
914 dprintk(dev, 1, "%s\n", __func__); in vivid_start_generating_vid_cap()
916 if (dev->kthread_vid_cap) { in vivid_start_generating_vid_cap()
917 u32 seq_count = dev->cap_seq_count + dev->seq_wrap * 128; in vivid_start_generating_vid_cap()
919 if (pstreaming == &dev->vid_cap_streaming) in vivid_start_generating_vid_cap()
920 dev->vid_cap_seq_start = seq_count; in vivid_start_generating_vid_cap()
921 else if (pstreaming == &dev->vbi_cap_streaming) in vivid_start_generating_vid_cap()
922 dev->vbi_cap_seq_start = seq_count; in vivid_start_generating_vid_cap()
924 dev->meta_cap_seq_start = seq_count; in vivid_start_generating_vid_cap()
930 tpg_init_mv_count(&dev->tpg); in vivid_start_generating_vid_cap()
932 dev->vid_cap_seq_start = dev->seq_wrap * 128; in vivid_start_generating_vid_cap()
933 dev->vbi_cap_seq_start = dev->seq_wrap * 128; in vivid_start_generating_vid_cap()
934 dev->meta_cap_seq_start = dev->seq_wrap * 128; in vivid_start_generating_vid_cap()
936 dev->kthread_vid_cap = kthread_run(vivid_thread_vid_cap, dev, in vivid_start_generating_vid_cap()
937 "%s-vid-cap", dev->v4l2_dev.name); in vivid_start_generating_vid_cap()
939 if (IS_ERR(dev->kthread_vid_cap)) { in vivid_start_generating_vid_cap()
940 int err = PTR_ERR(dev->kthread_vid_cap); in vivid_start_generating_vid_cap()
942 dev->kthread_vid_cap = NULL; in vivid_start_generating_vid_cap()
943 v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n"); in vivid_start_generating_vid_cap()
947 vivid_grab_controls(dev, true); in vivid_start_generating_vid_cap()
949 dprintk(dev, 1, "returning from %s\n", __func__); in vivid_start_generating_vid_cap()
953 void vivid_stop_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming) in vivid_stop_generating_vid_cap() argument
955 dprintk(dev, 1, "%s\n", __func__); in vivid_stop_generating_vid_cap()
957 if (dev->kthread_vid_cap == NULL) in vivid_stop_generating_vid_cap()
961 if (pstreaming == &dev->vid_cap_streaming) { in vivid_stop_generating_vid_cap()
963 while (!list_empty(&dev->vid_cap_active)) { in vivid_stop_generating_vid_cap()
966 buf = list_entry(dev->vid_cap_active.next, in vivid_stop_generating_vid_cap()
970 &dev->ctrl_hdl_vid_cap); in vivid_stop_generating_vid_cap()
972 dprintk(dev, 2, "vid_cap buffer %d done\n", in vivid_stop_generating_vid_cap()
977 if (pstreaming == &dev->vbi_cap_streaming) { in vivid_stop_generating_vid_cap()
978 while (!list_empty(&dev->vbi_cap_active)) { in vivid_stop_generating_vid_cap()
981 buf = list_entry(dev->vbi_cap_active.next, in vivid_stop_generating_vid_cap()
985 &dev->ctrl_hdl_vbi_cap); in vivid_stop_generating_vid_cap()
987 dprintk(dev, 2, "vbi_cap buffer %d done\n", in vivid_stop_generating_vid_cap()
992 if (pstreaming == &dev->meta_cap_streaming) { in vivid_stop_generating_vid_cap()
993 while (!list_empty(&dev->meta_cap_active)) { in vivid_stop_generating_vid_cap()
996 buf = list_entry(dev->meta_cap_active.next, in vivid_stop_generating_vid_cap()
1000 &dev->ctrl_hdl_meta_cap); in vivid_stop_generating_vid_cap()
1002 dprintk(dev, 2, "meta_cap buffer %d done\n", in vivid_stop_generating_vid_cap()
1007 if (dev->vid_cap_streaming || dev->vbi_cap_streaming || in vivid_stop_generating_vid_cap()
1008 dev->meta_cap_streaming) in vivid_stop_generating_vid_cap()
1012 vivid_grab_controls(dev, false); in vivid_stop_generating_vid_cap()
1013 kthread_stop(dev->kthread_vid_cap); in vivid_stop_generating_vid_cap()
1014 dev->kthread_vid_cap = NULL; in vivid_stop_generating_vid_cap()