^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * vivid-kthread-cap.h - video/vbi capture thread support functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/font.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/videodev2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/kthread.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/freezer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/random.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/v4l2-dv-timings.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/div64.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <media/videobuf2-vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <media/v4l2-dv-timings.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <media/v4l2-ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <media/v4l2-fh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <media/v4l2-event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <media/v4l2-rect.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "vivid-core.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "vivid-vid-common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include "vivid-vid-cap.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include "vivid-vid-out.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include "vivid-radio-common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include "vivid-radio-rx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "vivid-radio-tx.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "vivid-sdr-cap.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "vivid-vbi-cap.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "vivid-vbi-out.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include "vivid-osd.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include "vivid-ctrls.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "vivid-kthread-cap.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include "vivid-meta-cap.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) static inline v4l2_std_id vivid_get_std_cap(const struct vivid_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (vivid_is_sdtv_cap(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) return dev->std_cap[dev->input];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) static void copy_pix(struct vivid_dev *dev, int win_y, int win_x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) u16 *cap, const u16 *osd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) u16 out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int left = dev->overlay_out_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) int top = dev->overlay_out_top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) int fb_x = win_x + left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) int fb_y = win_y + top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) out = *cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) *cap = *osd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) if (dev->bitmap_out) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) const u8 *p = dev->bitmap_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) unsigned stride = (dev->compose_out.width + 7) / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) win_x -= dev->compose_out.left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) win_y -= dev->compose_out.top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (!(p[stride * win_y + win_x / 8] & (1 << (win_x & 7))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) for (i = 0; i < dev->clipcount_out; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct v4l2_rect *r = &dev->clips_out[i].c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) if (fb_y >= r->top && fb_y < r->top + r->height &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) fb_x >= r->left && fb_x < r->left + r->width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_CHROMAKEY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) *osd != dev->chromakey_out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_SRC_CHROMAKEY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) out == dev->chromakey_out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (dev->fmt_cap->alpha_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) dev->global_alpha_out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) *cap & dev->fmt_cap->alpha_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) if ((dev->fbuf_out_flags & V4L2_FBUF_FLAG_LOCAL_INV_ALPHA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) !(*cap & dev->fmt_cap->alpha_mask))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) *cap = out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) static void blend_line(struct vivid_dev *dev, unsigned y_offset, unsigned x_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) u8 *vcapbuf, const u8 *vosdbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) unsigned width, unsigned pixsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) unsigned x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) for (x = 0; x < width; x++, vcapbuf += pixsize, vosdbuf += pixsize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) copy_pix(dev, y_offset, x_offset + x,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) (u16 *)vcapbuf, (const u16 *)vosdbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) static void scale_line(const u8 *src, u8 *dst, unsigned srcw, unsigned dstw, unsigned twopixsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /* Coarse scaling with Bresenham */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) unsigned int_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) unsigned fract_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) unsigned src_x = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) unsigned error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) unsigned x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * We always combine two pixels to prevent color bleed in the packed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * yuv case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) srcw /= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) dstw /= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) int_part = srcw / dstw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) fract_part = srcw % dstw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) for (x = 0; x < dstw; x++, dst += twopixsize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) memcpy(dst, src + src_x * twopixsize, twopixsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) src_x += int_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) error += fract_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (error >= dstw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) error -= dstw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) src_x++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) * Precalculate the rectangles needed to perform video looping:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * The nominal pipeline is that the video output buffer is cropped by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * crop_out, scaled to compose_out, overlaid with the output overlay,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * cropped on the capture side by crop_cap and scaled again to the video
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * capture buffer using compose_cap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * To keep things efficient we calculate the intersection of compose_out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * and crop_cap (since that's the only part of the video that will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * actually end up in the capture buffer), determine which part of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * video output buffer that is and which part of the video capture buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * so we can scale the video straight from the output buffer to the capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) * buffer without any intermediate steps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * If we need to deal with an output overlay, then there is no choice and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * that intermediate step still has to be taken. For the output overlay
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * support we calculate the intersection of the framebuffer and the overlay
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * window (which may be partially or wholly outside of the framebuffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * itself) and the intersection of that with loop_vid_copy (i.e. the part of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * the actual looped video that will be overlaid). The result is calculated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * both in framebuffer coordinates (loop_fb_copy) and compose_out coordinates
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * (loop_vid_overlay). Finally calculate the part of the capture buffer that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * will receive that overlaid video.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static void vivid_precalc_copy_rects(struct vivid_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /* Framebuffer rectangle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) struct v4l2_rect r_fb = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 0, 0, dev->display_width, dev->display_height
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) /* Overlay window rectangle in framebuffer coordinates */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) struct v4l2_rect r_overlay = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) dev->overlay_out_left, dev->overlay_out_top,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) dev->compose_out.width, dev->compose_out.height
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) v4l2_rect_intersect(&dev->loop_vid_copy, &dev->crop_cap, &dev->compose_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) dev->loop_vid_out = dev->loop_vid_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) v4l2_rect_scale(&dev->loop_vid_out, &dev->compose_out, &dev->crop_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) dev->loop_vid_out.left += dev->crop_out.left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) dev->loop_vid_out.top += dev->crop_out.top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) dev->loop_vid_cap = dev->loop_vid_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) v4l2_rect_scale(&dev->loop_vid_cap, &dev->crop_cap, &dev->compose_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) dprintk(dev, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) "loop_vid_copy: %dx%d@%dx%d loop_vid_out: %dx%d@%dx%d loop_vid_cap: %dx%d@%dx%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) dev->loop_vid_copy.width, dev->loop_vid_copy.height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) dev->loop_vid_copy.left, dev->loop_vid_copy.top,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) dev->loop_vid_out.width, dev->loop_vid_out.height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) dev->loop_vid_out.left, dev->loop_vid_out.top,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) dev->loop_vid_cap.width, dev->loop_vid_cap.height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) dev->loop_vid_cap.left, dev->loop_vid_cap.top);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) v4l2_rect_intersect(&r_overlay, &r_fb, &r_overlay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /* shift r_overlay to the same origin as compose_out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) r_overlay.left += dev->compose_out.left - dev->overlay_out_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) r_overlay.top += dev->compose_out.top - dev->overlay_out_top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) v4l2_rect_intersect(&dev->loop_vid_overlay, &r_overlay, &dev->loop_vid_copy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) dev->loop_fb_copy = dev->loop_vid_overlay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) /* shift dev->loop_fb_copy back again to the fb origin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) dev->loop_fb_copy.left -= dev->compose_out.left - dev->overlay_out_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) dev->loop_fb_copy.top -= dev->compose_out.top - dev->overlay_out_top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) dev->loop_vid_overlay_cap = dev->loop_vid_overlay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) v4l2_rect_scale(&dev->loop_vid_overlay_cap, &dev->crop_cap, &dev->compose_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) dprintk(dev, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) "loop_fb_copy: %dx%d@%dx%d loop_vid_overlay: %dx%d@%dx%d loop_vid_overlay_cap: %dx%d@%dx%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) dev->loop_fb_copy.width, dev->loop_fb_copy.height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) dev->loop_fb_copy.left, dev->loop_fb_copy.top,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) dev->loop_vid_overlay.width, dev->loop_vid_overlay.height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) dev->loop_vid_overlay.left, dev->loop_vid_overlay.top,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) dev->loop_vid_overlay_cap.width, dev->loop_vid_overlay_cap.height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) dev->loop_vid_overlay_cap.left, dev->loop_vid_overlay_cap.top);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) static void *plane_vaddr(struct tpg_data *tpg, struct vivid_buffer *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) unsigned p, unsigned bpl[TPG_MAX_PLANES], unsigned h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) unsigned i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) void *vbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) if (p == 0 || tpg_g_buffers(tpg) > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) return vb2_plane_vaddr(&buf->vb.vb2_buf, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) vbuf = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) for (i = 0; i < p; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) vbuf += bpl[i] * h / tpg->vdownsampling[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return vbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) static noinline_for_stack int vivid_copy_buffer(struct vivid_dev *dev, unsigned p,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) u8 *vcapbuf, struct vivid_buffer *vid_cap_buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) bool blank = dev->must_blank[vid_cap_buf->vb.vb2_buf.index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) struct tpg_data *tpg = &dev->tpg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) struct vivid_buffer *vid_out_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) unsigned vdiv = dev->fmt_out->vdownsampling[p];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) unsigned twopixsize = tpg_g_twopixelsize(tpg, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) unsigned img_width = tpg_hdiv(tpg, p, dev->compose_cap.width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) unsigned img_height = dev->compose_cap.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) unsigned stride_cap = tpg->bytesperline[p];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) unsigned stride_out = dev->bytesperline_out[p];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) unsigned stride_osd = dev->display_byte_stride;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) unsigned hmax = (img_height * tpg->perc_fill) / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) u8 *voutbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) u8 *vosdbuf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) unsigned y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) bool blend = dev->bitmap_out || dev->clipcount_out || dev->fbuf_out_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* Coarse scaling with Bresenham */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) unsigned vid_out_int_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) unsigned vid_out_fract_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) unsigned vid_out_y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) unsigned vid_out_error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) unsigned vid_overlay_int_part = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) unsigned vid_overlay_fract_part = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) unsigned vid_overlay_y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) unsigned vid_overlay_error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) unsigned vid_cap_left = tpg_hdiv(tpg, p, dev->loop_vid_cap.left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) unsigned vid_cap_right;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) bool quick;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) vid_out_int_part = dev->loop_vid_out.height / dev->loop_vid_cap.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) vid_out_fract_part = dev->loop_vid_out.height % dev->loop_vid_cap.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (!list_empty(&dev->vid_out_active))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) vid_out_buf = list_entry(dev->vid_out_active.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) struct vivid_buffer, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if (vid_out_buf == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) return -ENODATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) vid_cap_buf->vb.field = vid_out_buf->vb.field;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) voutbuf = plane_vaddr(tpg, vid_out_buf, p,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) dev->bytesperline_out, dev->fmt_out_rect.height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (p < dev->fmt_out->buffers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) voutbuf += vid_out_buf->vb.vb2_buf.planes[p].data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) voutbuf += tpg_hdiv(tpg, p, dev->loop_vid_out.left) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) (dev->loop_vid_out.top / vdiv) * stride_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) vcapbuf += tpg_hdiv(tpg, p, dev->compose_cap.left) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) (dev->compose_cap.top / vdiv) * stride_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (dev->loop_vid_copy.width == 0 || dev->loop_vid_copy.height == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) * If there is nothing to copy, then just fill the capture window
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) * with black.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) for (y = 0; y < hmax / vdiv; y++, vcapbuf += stride_cap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) memcpy(vcapbuf, tpg->black_line[p], img_width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (dev->overlay_out_enabled &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) dev->loop_vid_overlay.width && dev->loop_vid_overlay.height) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) vosdbuf = dev->video_vbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) vosdbuf += (dev->loop_fb_copy.left * twopixsize) / 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) dev->loop_fb_copy.top * stride_osd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) vid_overlay_int_part = dev->loop_vid_overlay.height /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) dev->loop_vid_overlay_cap.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) vid_overlay_fract_part = dev->loop_vid_overlay.height %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) dev->loop_vid_overlay_cap.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) vid_cap_right = tpg_hdiv(tpg, p, dev->loop_vid_cap.left + dev->loop_vid_cap.width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) /* quick is true if no video scaling is needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) quick = dev->loop_vid_out.width == dev->loop_vid_cap.width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) dev->cur_scaled_line = dev->loop_vid_out.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) for (y = 0; y < hmax; y += vdiv, vcapbuf += stride_cap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* osdline is true if this line requires overlay blending */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) bool osdline = vosdbuf && y >= dev->loop_vid_overlay_cap.top &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) y < dev->loop_vid_overlay_cap.top + dev->loop_vid_overlay_cap.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) * If this line of the capture buffer doesn't get any video, then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) * just fill with black.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if (y < dev->loop_vid_cap.top ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) y >= dev->loop_vid_cap.top + dev->loop_vid_cap.height) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) memcpy(vcapbuf, tpg->black_line[p], img_width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /* fill the left border with black */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) if (dev->loop_vid_cap.left)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) memcpy(vcapbuf, tpg->black_line[p], vid_cap_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* fill the right border with black */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (vid_cap_right < img_width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) memcpy(vcapbuf + vid_cap_right, tpg->black_line[p],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) img_width - vid_cap_right);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (quick && !osdline) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) memcpy(vcapbuf + vid_cap_left,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) voutbuf + vid_out_y * stride_out,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) tpg_hdiv(tpg, p, dev->loop_vid_cap.width));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) goto update_vid_out_y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) if (dev->cur_scaled_line == vid_out_y) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) memcpy(vcapbuf + vid_cap_left, dev->scaled_line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) tpg_hdiv(tpg, p, dev->loop_vid_cap.width));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) goto update_vid_out_y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) if (!osdline) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) scale_line(voutbuf + vid_out_y * stride_out, dev->scaled_line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) tpg_hdiv(tpg, p, dev->loop_vid_out.width),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) tpg_hdiv(tpg, p, dev->loop_vid_cap.width),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) tpg_g_twopixelsize(tpg, p));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) * Offset in bytes within loop_vid_copy to the start of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) * loop_vid_overlay rectangle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) unsigned offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) ((dev->loop_vid_overlay.left - dev->loop_vid_copy.left) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) twopixsize) / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) u8 *osd = vosdbuf + vid_overlay_y * stride_osd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) scale_line(voutbuf + vid_out_y * stride_out, dev->blended_line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) dev->loop_vid_out.width, dev->loop_vid_copy.width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) tpg_g_twopixelsize(tpg, p));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) if (blend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) blend_line(dev, vid_overlay_y + dev->loop_vid_overlay.top,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) dev->loop_vid_overlay.left,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) dev->blended_line + offset, osd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) dev->loop_vid_overlay.width, twopixsize / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) memcpy(dev->blended_line + offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) osd, (dev->loop_vid_overlay.width * twopixsize) / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) scale_line(dev->blended_line, dev->scaled_line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) dev->loop_vid_copy.width, dev->loop_vid_cap.width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) tpg_g_twopixelsize(tpg, p));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) dev->cur_scaled_line = vid_out_y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) memcpy(vcapbuf + vid_cap_left, dev->scaled_line,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) tpg_hdiv(tpg, p, dev->loop_vid_cap.width));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) update_vid_out_y:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) if (osdline) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) vid_overlay_y += vid_overlay_int_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) vid_overlay_error += vid_overlay_fract_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) if (vid_overlay_error >= dev->loop_vid_overlay_cap.height) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) vid_overlay_error -= dev->loop_vid_overlay_cap.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) vid_overlay_y++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) vid_out_y += vid_out_int_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) vid_out_error += vid_out_fract_part;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (vid_out_error >= dev->loop_vid_cap.height / vdiv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) vid_out_error -= dev->loop_vid_cap.height / vdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) vid_out_y++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) if (!blank)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) for (; y < img_height; y += vdiv, vcapbuf += stride_cap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) memcpy(vcapbuf, tpg->contrast_line[p], img_width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) static void vivid_fillbuff(struct vivid_dev *dev, struct vivid_buffer *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) struct tpg_data *tpg = &dev->tpg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) unsigned factor = V4L2_FIELD_HAS_T_OR_B(dev->field_cap) ? 2 : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) unsigned line_height = 16 / factor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) bool is_tv = vivid_is_sdtv_cap(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) bool is_60hz = is_tv && (dev->std_cap[dev->input] & V4L2_STD_525_60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) unsigned p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) int line = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) u8 *basep[TPG_MAX_PLANES][2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) unsigned ms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) char str[100];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) s32 gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) bool is_loop = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) if (dev->loop_video && dev->can_loop_video &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) ((vivid_is_svid_cap(dev) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) !VIVID_INVALID_SIGNAL(dev->std_signal_mode[dev->input])) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) (vivid_is_hdmi_cap(dev) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) !VIVID_INVALID_SIGNAL(dev->dv_timings_signal_mode[dev->input]))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) is_loop = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) buf->vb.sequence = dev->vid_cap_seq_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) if (dev->field_cap == V4L2_FIELD_ALTERNATE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * 60 Hz standards start with the bottom field, 50 Hz standards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) * with the top field. So if the 0-based seq_count is even,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) * then the field is TOP for 50 Hz and BOTTOM for 60 Hz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) * standards.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) buf->vb.field = ((dev->vid_cap_seq_count & 1) ^ is_60hz) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) V4L2_FIELD_BOTTOM : V4L2_FIELD_TOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) * The sequence counter counts frames, not fields. So divide
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) * by two.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) buf->vb.sequence /= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) buf->vb.field = dev->field_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) tpg_s_field(tpg, buf->vb.field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) dev->field_cap == V4L2_FIELD_ALTERNATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) tpg_s_perc_fill_blank(tpg, dev->must_blank[buf->vb.vb2_buf.index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) vivid_precalc_copy_rects(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) for (p = 0; p < tpg_g_planes(tpg); p++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) void *vbuf = plane_vaddr(tpg, buf, p,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) tpg->bytesperline, tpg->buf_height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * The first plane of a multiplanar format has a non-zero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * data_offset. This helps testing whether the application
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * correctly supports non-zero data offsets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) if (p < tpg_g_buffers(tpg) && dev->fmt_cap->data_offset[p]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) memset(vbuf, dev->fmt_cap->data_offset[p] & 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) dev->fmt_cap->data_offset[p]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) vbuf += dev->fmt_cap->data_offset[p];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) tpg_calc_text_basep(tpg, basep, p, vbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) if (!is_loop || vivid_copy_buffer(dev, p, vbuf, buf))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) tpg_fill_plane_buffer(tpg, vivid_get_std_cap(dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) p, vbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) dev->must_blank[buf->vb.vb2_buf.index] = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) /* Updates stream time, only update at the start of a new frame. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) if (dev->field_cap != V4L2_FIELD_ALTERNATE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) (dev->vid_cap_seq_count & 1) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) dev->ms_vid_cap =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) jiffies_to_msecs(jiffies - dev->jiffies_vid_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) ms = dev->ms_vid_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) if (dev->osd_mode <= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) snprintf(str, sizeof(str), " %02d:%02d:%02d:%03d %u%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) (ms / (60 * 60 * 1000)) % 24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) (ms / (60 * 1000)) % 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) (ms / 1000) % 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) ms % 1000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) buf->vb.sequence,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) (dev->field_cap == V4L2_FIELD_ALTERNATE) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) (buf->vb.field == V4L2_FIELD_TOP ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) " top" : " bottom") : "");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) if (dev->osd_mode == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) snprintf(str, sizeof(str), " %dx%d, input %d ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) dev->src_rect.width, dev->src_rect.height, dev->input);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) gain = v4l2_ctrl_g_ctrl(dev->gain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) mutex_lock(dev->ctrl_hdl_user_vid.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) snprintf(str, sizeof(str),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) " brightness %3d, contrast %3d, saturation %3d, hue %d ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) dev->brightness->cur.val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) dev->contrast->cur.val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) dev->saturation->cur.val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) dev->hue->cur.val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) snprintf(str, sizeof(str),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) " autogain %d, gain %3d, alpha 0x%02x ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) dev->autogain->cur.val, gain, dev->alpha->cur.val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) mutex_unlock(dev->ctrl_hdl_user_vid.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) mutex_lock(dev->ctrl_hdl_user_aud.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) snprintf(str, sizeof(str),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) " volume %3d, mute %d ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) dev->volume->cur.val, dev->mute->cur.val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) mutex_unlock(dev->ctrl_hdl_user_aud.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) mutex_lock(dev->ctrl_hdl_user_gen.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) snprintf(str, sizeof(str), " int32 %d, int64 %lld, bitmask %08x ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) dev->int32->cur.val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) *dev->int64->p_cur.p_s64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) dev->bitmask->cur.val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) snprintf(str, sizeof(str), " boolean %d, menu %s, string \"%s\" ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) dev->boolean->cur.val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) dev->menu->qmenu[dev->menu->cur.val],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) dev->string->p_cur.p_char);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) snprintf(str, sizeof(str), " integer_menu %lld, value %d ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) dev->int_menu->qmenu_int[dev->int_menu->cur.val],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) dev->int_menu->cur.val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) mutex_unlock(dev->ctrl_hdl_user_gen.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (dev->button_pressed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) dev->button_pressed--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) snprintf(str, sizeof(str), " button pressed!");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) tpg_gen_text(tpg, basep, line++ * line_height, 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) if (dev->osd[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) if (vivid_is_hdmi_cap(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) snprintf(str, sizeof(str),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) " OSD \"%s\"", dev->osd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) tpg_gen_text(tpg, basep, line++ * line_height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 16, str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) if (dev->osd_jiffies &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) time_is_before_jiffies(dev->osd_jiffies + 5 * HZ)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) dev->osd[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) dev->osd_jiffies = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) * Return true if this pixel coordinate is a valid video pixel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) static bool valid_pix(struct vivid_dev *dev, int win_y, int win_x, int fb_y, int fb_x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) if (dev->bitmap_cap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * Only if the corresponding bit in the bitmap is set can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) * the video pixel be shown. Coordinates are relative to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) * the overlay window set by VIDIOC_S_FMT.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) const u8 *p = dev->bitmap_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) unsigned stride = (dev->compose_cap.width + 7) / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) if (!(p[stride * win_y + win_x / 8] & (1 << (win_x & 7))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) for (i = 0; i < dev->clipcount_cap; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) * Only if the framebuffer coordinate is not in any of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) * clip rectangles will be video pixel be shown.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct v4l2_rect *r = &dev->clips_cap[i].c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) if (fb_y >= r->top && fb_y < r->top + r->height &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) fb_x >= r->left && fb_x < r->left + r->width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) * Draw the image into the overlay buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) * Note that the combination of overlay and multiplanar is not supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) static void vivid_overlay(struct vivid_dev *dev, struct vivid_buffer *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) struct tpg_data *tpg = &dev->tpg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) unsigned pixsize = tpg_g_twopixelsize(tpg, 0) / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) void *vbase = dev->fb_vbase_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) void *vbuf = vb2_plane_vaddr(&buf->vb.vb2_buf, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) unsigned img_width = dev->compose_cap.width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) unsigned img_height = dev->compose_cap.height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) unsigned stride = tpg->bytesperline[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) /* if quick is true, then valid_pix() doesn't have to be called */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) bool quick = dev->bitmap_cap == NULL && dev->clipcount_cap == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) int x, y, w, out_x = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) * Overlay support is only supported for formats that have a twopixelsize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) * that's >= 2. Warn and bail out if that's not the case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) if (WARN_ON(pixsize == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) if ((dev->overlay_cap_field == V4L2_FIELD_TOP ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) dev->overlay_cap_field == V4L2_FIELD_BOTTOM) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) dev->overlay_cap_field != buf->vb.field)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) vbuf += dev->compose_cap.left * pixsize + dev->compose_cap.top * stride;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) x = dev->overlay_cap_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) w = img_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if (x < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) out_x = -x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) w = w - out_x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) x = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) w = dev->fb_cap.fmt.width - x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) if (w > img_width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) w = img_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) if (w <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) if (dev->overlay_cap_top >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) vbase += dev->overlay_cap_top * dev->fb_cap.fmt.bytesperline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) for (y = dev->overlay_cap_top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) y < dev->overlay_cap_top + (int)img_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) y++, vbuf += stride) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) int px;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) if (y < 0 || y > dev->fb_cap.fmt.height)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) if (quick) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) memcpy(vbase + x * pixsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) vbuf + out_x * pixsize, w * pixsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) vbase += dev->fb_cap.fmt.bytesperline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) for (px = 0; px < w; px++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) if (!valid_pix(dev, y - dev->overlay_cap_top,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) px + out_x, y, px + x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) memcpy(vbase + (px + x) * pixsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) vbuf + (px + out_x) * pixsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) pixsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) vbase += dev->fb_cap.fmt.bytesperline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) static void vivid_cap_update_frame_period(struct vivid_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) u64 f_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) f_period = (u64)dev->timeperframe_vid_cap.numerator * 1000000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) if (WARN_ON(dev->timeperframe_vid_cap.denominator == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) dev->timeperframe_vid_cap.denominator = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) do_div(f_period, dev->timeperframe_vid_cap.denominator);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) if (dev->field_cap == V4L2_FIELD_ALTERNATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) f_period >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) * If "End of Frame", then offset the exposure time by 0.9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) * of the frame period.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) dev->cap_frame_eof_offset = f_period * 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) do_div(dev->cap_frame_eof_offset, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) dev->cap_frame_period = f_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) static noinline_for_stack void vivid_thread_vid_cap_tick(struct vivid_dev *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) int dropped_bufs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct vivid_buffer *vid_cap_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct vivid_buffer *vbi_cap_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct vivid_buffer *meta_cap_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) u64 f_time = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) dprintk(dev, 1, "Video Capture Thread Tick\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) while (dropped_bufs-- > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) tpg_update_mv_count(&dev->tpg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) dev->field_cap == V4L2_FIELD_NONE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) dev->field_cap == V4L2_FIELD_ALTERNATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) /* Drop a certain percentage of buffers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) if (dev->perc_dropped_buffers &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) prandom_u32_max(100) < dev->perc_dropped_buffers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) goto update_mv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) spin_lock(&dev->slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) if (!list_empty(&dev->vid_cap_active)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) vid_cap_buf = list_entry(dev->vid_cap_active.next, struct vivid_buffer, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) list_del(&vid_cap_buf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) if (!list_empty(&dev->vbi_cap_active)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) if (dev->field_cap != V4L2_FIELD_ALTERNATE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) (dev->vbi_cap_seq_count & 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) vbi_cap_buf = list_entry(dev->vbi_cap_active.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) struct vivid_buffer, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) list_del(&vbi_cap_buf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) if (!list_empty(&dev->meta_cap_active)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) meta_cap_buf = list_entry(dev->meta_cap_active.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) struct vivid_buffer, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) list_del(&meta_cap_buf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) spin_unlock(&dev->slock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) if (!vid_cap_buf && !vbi_cap_buf && !meta_cap_buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) goto update_mv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) f_time = dev->cap_frame_period * dev->vid_cap_seq_count +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) dev->cap_stream_start + dev->time_wrap_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) if (vid_cap_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) v4l2_ctrl_request_setup(vid_cap_buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) &dev->ctrl_hdl_vid_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) /* Fill buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) vivid_fillbuff(dev, vid_cap_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) dprintk(dev, 1, "filled buffer %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) vid_cap_buf->vb.vb2_buf.index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) /* Handle overlay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) if (dev->overlay_cap_owner && dev->fb_cap.base &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) dev->fb_cap.fmt.pixelformat == dev->fmt_cap->fourcc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) vivid_overlay(dev, vid_cap_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) v4l2_ctrl_request_complete(vid_cap_buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) &dev->ctrl_hdl_vid_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) vb2_buffer_done(&vid_cap_buf->vb.vb2_buf, dev->dqbuf_error ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) dprintk(dev, 2, "vid_cap buffer %d done\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) vid_cap_buf->vb.vb2_buf.index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) vid_cap_buf->vb.vb2_buf.timestamp = f_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) if (!dev->tstamp_src_is_soe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) vid_cap_buf->vb.vb2_buf.timestamp += dev->cap_frame_eof_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) if (vbi_cap_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) u64 vbi_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) v4l2_ctrl_request_setup(vbi_cap_buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) &dev->ctrl_hdl_vbi_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) if (dev->stream_sliced_vbi_cap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) vivid_sliced_vbi_cap_process(dev, vbi_cap_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) vivid_raw_vbi_cap_process(dev, vbi_cap_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) v4l2_ctrl_request_complete(vbi_cap_buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) &dev->ctrl_hdl_vbi_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) vb2_buffer_done(&vbi_cap_buf->vb.vb2_buf, dev->dqbuf_error ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) dprintk(dev, 2, "vbi_cap %d done\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) vbi_cap_buf->vb.vb2_buf.index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) /* If capturing a VBI, offset by 0.05 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) vbi_period = dev->cap_frame_period * 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) do_div(vbi_period, 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) vbi_cap_buf->vb.vb2_buf.timestamp = f_time + dev->cap_frame_eof_offset + vbi_period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) if (meta_cap_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) v4l2_ctrl_request_setup(meta_cap_buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) &dev->ctrl_hdl_meta_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) vivid_meta_cap_fillbuff(dev, meta_cap_buf, f_time);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) v4l2_ctrl_request_complete(meta_cap_buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) &dev->ctrl_hdl_meta_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) vb2_buffer_done(&meta_cap_buf->vb.vb2_buf, dev->dqbuf_error ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) dprintk(dev, 2, "meta_cap %d done\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) meta_cap_buf->vb.vb2_buf.index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) meta_cap_buf->vb.vb2_buf.timestamp = f_time + dev->cap_frame_eof_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) dev->dqbuf_error = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) update_mv:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) /* Update the test pattern movement counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) tpg_update_mv_count(&dev->tpg, dev->field_cap == V4L2_FIELD_NONE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) dev->field_cap == V4L2_FIELD_ALTERNATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) static int vivid_thread_vid_cap(void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) struct vivid_dev *dev = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) u64 numerators_since_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) u64 buffers_since_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) u64 next_jiffies_since_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) unsigned long jiffies_since_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) unsigned long cur_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) unsigned wait_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) unsigned numerator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) unsigned denominator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) int dropped_bufs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) dprintk(dev, 1, "Video Capture Thread Start\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) set_freezable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) /* Resets frame counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) dev->cap_seq_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) dev->cap_seq_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) dev->cap_seq_resync = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) dev->jiffies_vid_cap = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) dev->cap_stream_start = ktime_get_ns();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) vivid_cap_update_frame_period(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) try_to_freeze();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) if (kthread_should_stop())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) if (!mutex_trylock(&dev->mutex)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) schedule_timeout_uninterruptible(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) cur_jiffies = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (dev->cap_seq_resync) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) dev->jiffies_vid_cap = cur_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) dev->cap_seq_offset = dev->cap_seq_count + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) dev->cap_seq_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) dev->cap_stream_start += dev->cap_frame_period *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) dev->cap_seq_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) vivid_cap_update_frame_period(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) dev->cap_seq_resync = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) numerator = dev->timeperframe_vid_cap.numerator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) denominator = dev->timeperframe_vid_cap.denominator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) if (dev->field_cap == V4L2_FIELD_ALTERNATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) denominator *= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) /* Calculate the number of jiffies since we started streaming */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) jiffies_since_start = cur_jiffies - dev->jiffies_vid_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) /* Get the number of buffers streamed since the start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) buffers_since_start = (u64)jiffies_since_start * denominator +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) (HZ * numerator) / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) do_div(buffers_since_start, HZ * numerator);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) * After more than 0xf0000000 (rounded down to a multiple of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) * 'jiffies-per-day' to ease jiffies_to_msecs calculation)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) * jiffies have passed since we started streaming reset the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) * counters and keep track of the sequence offset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) if (jiffies_since_start > JIFFIES_RESYNC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) dev->jiffies_vid_cap = cur_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) dev->cap_seq_offset = buffers_since_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) buffers_since_start = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) dropped_bufs = buffers_since_start + dev->cap_seq_offset - dev->cap_seq_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) dev->cap_seq_count = buffers_since_start + dev->cap_seq_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) dev->vid_cap_seq_count = dev->cap_seq_count - dev->vid_cap_seq_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) dev->vbi_cap_seq_count = dev->cap_seq_count - dev->vbi_cap_seq_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) dev->meta_cap_seq_count = dev->cap_seq_count - dev->meta_cap_seq_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) vivid_thread_vid_cap_tick(dev, dropped_bufs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) * Calculate the number of 'numerators' streamed since we started,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) * including the current buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) numerators_since_start = ++buffers_since_start * numerator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) /* And the number of jiffies since we started */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) jiffies_since_start = jiffies - dev->jiffies_vid_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) mutex_unlock(&dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) * Calculate when that next buffer is supposed to start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) * in jiffies since we started streaming.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) next_jiffies_since_start = numerators_since_start * HZ +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) denominator / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) do_div(next_jiffies_since_start, denominator);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) /* If it is in the past, then just schedule asap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) if (next_jiffies_since_start < jiffies_since_start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) next_jiffies_since_start = jiffies_since_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) wait_jiffies = next_jiffies_since_start - jiffies_since_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) schedule_timeout_interruptible(wait_jiffies ? wait_jiffies : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) dprintk(dev, 1, "Video Capture Thread End\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) static void vivid_grab_controls(struct vivid_dev *dev, bool grab)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) v4l2_ctrl_grab(dev->ctrl_has_crop_cap, grab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) v4l2_ctrl_grab(dev->ctrl_has_compose_cap, grab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) v4l2_ctrl_grab(dev->ctrl_has_scaler_cap, grab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) int vivid_start_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) dprintk(dev, 1, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) if (dev->kthread_vid_cap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) u32 seq_count = dev->cap_seq_count + dev->seq_wrap * 128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) if (pstreaming == &dev->vid_cap_streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) dev->vid_cap_seq_start = seq_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) else if (pstreaming == &dev->vbi_cap_streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) dev->vbi_cap_seq_start = seq_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) dev->meta_cap_seq_start = seq_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) *pstreaming = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) /* Resets frame counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) tpg_init_mv_count(&dev->tpg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) dev->vid_cap_seq_start = dev->seq_wrap * 128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) dev->vbi_cap_seq_start = dev->seq_wrap * 128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) dev->meta_cap_seq_start = dev->seq_wrap * 128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) dev->kthread_vid_cap = kthread_run(vivid_thread_vid_cap, dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) "%s-vid-cap", dev->v4l2_dev.name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) if (IS_ERR(dev->kthread_vid_cap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) int err = PTR_ERR(dev->kthread_vid_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) dev->kthread_vid_cap = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) v4l2_err(&dev->v4l2_dev, "kernel_thread() failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) *pstreaming = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) vivid_grab_controls(dev, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) dprintk(dev, 1, "returning from %s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) void vivid_stop_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) dprintk(dev, 1, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) if (dev->kthread_vid_cap == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) *pstreaming = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) if (pstreaming == &dev->vid_cap_streaming) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) /* Release all active buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) while (!list_empty(&dev->vid_cap_active)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) struct vivid_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) buf = list_entry(dev->vid_cap_active.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) struct vivid_buffer, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) list_del(&buf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) &dev->ctrl_hdl_vid_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) dprintk(dev, 2, "vid_cap buffer %d done\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) buf->vb.vb2_buf.index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) if (pstreaming == &dev->vbi_cap_streaming) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) while (!list_empty(&dev->vbi_cap_active)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) struct vivid_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) buf = list_entry(dev->vbi_cap_active.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) struct vivid_buffer, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) list_del(&buf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) &dev->ctrl_hdl_vbi_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) dprintk(dev, 2, "vbi_cap buffer %d done\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) buf->vb.vb2_buf.index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) if (pstreaming == &dev->meta_cap_streaming) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) while (!list_empty(&dev->meta_cap_active)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) struct vivid_buffer *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) buf = list_entry(dev->meta_cap_active.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) struct vivid_buffer, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) list_del(&buf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) v4l2_ctrl_request_complete(buf->vb.vb2_buf.req_obj.req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) &dev->ctrl_hdl_meta_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) dprintk(dev, 2, "meta_cap buffer %d done\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) buf->vb.vb2_buf.index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (dev->vid_cap_streaming || dev->vbi_cap_streaming ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) dev->meta_cap_streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) /* shutdown control thread */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) vivid_grab_controls(dev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) kthread_stop(dev->kthread_vid_cap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) dev->kthread_vid_cap = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) }