1c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* 2c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * vivid-core.h - core datastructures 3c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * 4c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved. 5c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * 6c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * This program is free software; you may redistribute it and/or modify 7c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * it under the terms of the GNU General Public License as published by 8c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * the Free Software Foundation; version 2 of the License. 9c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * 10c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 11c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 12c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 13c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 14c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 15c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 16c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 17c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * SOFTWARE. 18c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil */ 19c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 20c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#ifndef _VIVID_CORE_H_ 21c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define _VIVID_CORE_H_ 22c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 23c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <linux/fb.h> 24c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <media/videobuf2-core.h> 25c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <media/v4l2-device.h> 26c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <media/v4l2-dev.h> 27c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include <media/v4l2-ctrls.h> 28c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include "vivid-tpg.h" 29c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include "vivid-rds-gen.h" 30c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#include "vivid-vbi-gen.h" 31c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 32c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define dprintk(dev, level, fmt, arg...) \ 33c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil v4l2_dbg(level, vivid_debug, &dev->v4l2_dev, fmt, ## arg) 34c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 35c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* Maximum allowed frame rate 36c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * 37c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * vivid will allow setting timeperframe in [1/FPS_MAX - FPS_MAX/1] range. 38c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * 39c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * Ideally FPS_MAX should be infinity, i.e. practically UINT_MAX, but that 40c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * might hit application errors when they manipulate these values. 41c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * 42c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * Besides, for tpf < 10ms image-generation logic should be changed, to avoid 43c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * producing frames with equal content. 44c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil */ 45c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define FPS_MAX 100 46c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 47c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum number of clip rectangles */ 48c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_CLIPS 16 49c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum number of inputs */ 50c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_INPUTS 16 51c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum number of outputs */ 52c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_OUTPUTS 16 53c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum up or down scaling factor is 4 */ 54c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_ZOOM 4 55c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The maximum image width/height are set to 4K DMT */ 56c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_WIDTH 4096 57c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_HEIGHT 2160 58c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The minimum image width/height */ 59c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MIN_WIDTH 16 60c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MIN_HEIGHT 16 61c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The data_offset of plane 0 for the multiplanar formats */ 62c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define PLANE0_DATA_OFFSET 128 63c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 64c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The supported TV frequency range in MHz */ 65c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MIN_TV_FREQ (44U * 16U) 66c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define MAX_TV_FREQ (958U * 16U) 67c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 68c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* The number of samples returned in every SDR buffer */ 69c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define SDR_CAP_SAMPLES_PER_BUF 0x4000 70c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 71c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* used by the threads to know when to resync internal counters */ 72c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define JIFFIES_PER_DAY (3600U * 24U * HZ) 73c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define JIFFIES_RESYNC (JIFFIES_PER_DAY * (0xf0000000U / JIFFIES_PER_DAY)) 74c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 75c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilextern const struct v4l2_rect vivid_min_rect; 76c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilextern const struct v4l2_rect vivid_max_rect; 77c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilextern unsigned vivid_debug; 78c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 79c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstruct vivid_fmt { 80c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil const char *name; 81c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 fourcc; /* v4l2 format id */ 82c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 depth; 83c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool is_yuv; 84c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool can_do_overlay; 85c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 alpha_mask; 86c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 planes; 87c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 data_offset[2]; 88c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}; 89c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 90c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilextern struct vivid_fmt vivid_formats[]; 91c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 92c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil/* buffer for one video frame */ 93c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstruct vivid_buffer { 94c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* common v4l buffer stuff -- must be first */ 95c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct vb2_buffer vb; 96c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct list_head list; 97c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}; 98c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 99c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilenum vivid_input { 100c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil WEBCAM, 101c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil TV, 102c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil SVID, 103c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil HDMI, 104c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}; 105c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 106c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilenum vivid_signal_mode { 107c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil CURRENT_DV_TIMINGS, 108c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil CURRENT_STD = CURRENT_DV_TIMINGS, 109c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil NO_SIGNAL, 110c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil NO_LOCK, 111c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil OUT_OF_RANGE, 112c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil SELECTED_DV_TIMINGS, 113c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil SELECTED_STD = SELECTED_DV_TIMINGS, 114c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil CYCLE_DV_TIMINGS, 115c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil CYCLE_STD = CYCLE_DV_TIMINGS, 116c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil CUSTOM_DV_TIMINGS, 117c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}; 118c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 119c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#define VIVID_INVALID_SIGNAL(mode) \ 120c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil ((mode) == NO_SIGNAL || (mode) == NO_LOCK || (mode) == OUT_OF_RANGE) 121c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 122c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstruct vivid_dev { 123c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned inst; 124c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_device v4l2_dev; 125c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_user_gen; 126c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_user_vid; 127c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_user_aud; 128c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_streaming; 129c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_sdtv_cap; 130c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_loop_out; 131c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct video_device vid_cap_dev; 132c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_vid_cap; 133c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct video_device vid_out_dev; 134c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_vid_out; 135c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct video_device vbi_cap_dev; 136c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_vbi_cap; 137c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct video_device vbi_out_dev; 138c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_vbi_out; 139c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct video_device radio_rx_dev; 140c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_radio_rx; 141c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct video_device radio_tx_dev; 142c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_radio_tx; 143c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct video_device sdr_cap_dev; 144c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl_handler ctrl_hdl_sdr_cap; 145c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil spinlock_t slock; 146c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct mutex mutex; 147c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 148c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* capabilities */ 149c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vid_cap_caps; 150c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vid_out_caps; 151c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vbi_cap_caps; 152c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vbi_out_caps; 153c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 sdr_cap_caps; 154c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 radio_rx_caps; 155c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 radio_tx_caps; 156c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 157c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* supported features */ 158c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool multiplanar; 159c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned num_inputs; 160c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 input_type[MAX_INPUTS]; 161c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 input_name_counter[MAX_INPUTS]; 162c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned num_outputs; 163c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 output_type[MAX_OUTPUTS]; 164c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 output_name_counter[MAX_OUTPUTS]; 165c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_audio_inputs; 166c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_audio_outputs; 167c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_vid_cap; 168c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_vid_out; 169c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_vbi_cap; 170c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_raw_vbi_cap; 171c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_sliced_vbi_cap; 172c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_vbi_out; 173c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_raw_vbi_out; 174c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_sliced_vbi_out; 175c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_radio_rx; 176c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_radio_tx; 177c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_sdr_cap; 178c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_fb; 179c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 180c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool can_loop_video; 181c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 182c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* controls */ 183c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *brightness; 184c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *contrast; 185c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *saturation; 186c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *hue; 187c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct { 188c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* autogain/gain cluster */ 189c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *autogain; 190c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *gain; 191c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil }; 192c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *volume; 193c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *mute; 194c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *alpha; 195c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *button; 196c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *boolean; 197c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *int32; 198c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *int64; 199c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *menu; 200c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *string; 201c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *bitmask; 202c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *int_menu; 203c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *test_pattern; 204c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *colorspace; 205c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *rgb_range_cap; 206c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *real_rgb_range_cap; 207c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct { 208c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* std_signal_mode/standard cluster */ 209c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_std_signal_mode; 210c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_standard; 211c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil }; 212c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct { 213c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* dv_timings_signal_mode/timings cluster */ 214c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_dv_timings_signal_mode; 215c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_dv_timings; 216c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil }; 217c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_has_crop_cap; 218c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_has_compose_cap; 219c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_has_scaler_cap; 220c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_has_crop_out; 221c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_has_compose_out; 222c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_has_scaler_out; 223c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_tx_mode; 224c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *ctrl_tx_rgb_range; 225c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 226c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_pi; 227c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_pty; 228c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_mono_stereo; 229c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_art_head; 230c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_compressed; 231c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_dyn_pty; 232c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_ta; 233c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_tp; 234c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_ms; 235c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_psname; 236c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_tx_rds_radiotext; 237c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 238c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_rx_rds_pty; 239c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_rx_rds_ta; 240c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_rx_rds_tp; 241c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_rx_rds_ms; 242c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_rx_rds_psname; 243c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_ctrl *radio_rx_rds_radiotext; 244c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 245c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned input_brightness[MAX_INPUTS]; 246c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned osd_mode; 247c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned button_pressed; 248c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool sensor_hflip; 249c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool sensor_vflip; 250c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool hflip; 251c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool vflip; 252c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool vbi_cap_interlaced; 253c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool loop_video; 254c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 255c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Framebuffer */ 256c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned long video_pbase; 257c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil void *video_vbase; 258c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 video_buffer_size; 259c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int display_width; 260c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int display_height; 261c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int display_byte_stride; 262c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int bits_per_pixel; 263c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int bytes_per_pixel; 264c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct fb_info fb_info; 265c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct fb_var_screeninfo fb_defined; 266c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct fb_fix_screeninfo fb_fix; 267c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 268c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Error injection */ 269c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool queue_setup_error; 270c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool buf_prepare_error; 271c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool start_streaming_error; 272c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool dqbuf_error; 273c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool seq_wrap; 274c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool time_wrap; 275c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil __kernel_time_t time_wrap_offset; 276c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned perc_dropped_buffers; 277c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil enum vivid_signal_mode std_signal_mode; 278c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned query_std_last; 279c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil v4l2_std_id query_std; 280c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil enum tpg_video_aspect std_aspect_ratio; 281c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 282c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil enum vivid_signal_mode dv_timings_signal_mode; 283c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil char **query_dv_timings_qmenu; 284c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned query_dv_timings_size; 285c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned query_dv_timings_last; 286c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned query_dv_timings; 287c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil enum tpg_video_aspect dv_timings_aspect_ratio; 288c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 289c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Input */ 290c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned input; 291c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil v4l2_std_id std_cap; 292c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_dv_timings dv_timings_cap; 293c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 service_set_cap; 294c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct vivid_vbi_gen_data vbi_gen; 295c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 *edid; 296c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned edid_blocks; 297c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned edid_max_blocks; 298c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned webcam_size_idx; 299c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned webcam_ival_idx; 300c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned tv_freq; 301c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned tv_audmode; 302c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned tv_field_cap; 303c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned tv_audio_input; 304c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 305c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Capture Overlay */ 306c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_framebuffer fb_cap; 307c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_fh *overlay_cap_owner; 308c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil void *fb_vbase_cap; 309c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int overlay_cap_top, overlay_cap_left; 310c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil enum v4l2_field overlay_cap_field; 311c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil void *bitmap_cap; 312c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_clip clips_cap[MAX_CLIPS]; 313c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_clip try_clips_cap[MAX_CLIPS]; 314c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned clipcount_cap; 315c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 316c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Output */ 317c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned output; 318c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil v4l2_std_id std_out; 319c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_dv_timings dv_timings_out; 320c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 colorspace_out; 321c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 service_set_out; 322c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 bytesperline_out[2]; 323c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned tv_field_out; 324c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned tv_audio_output; 325c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool vbi_out_have_wss; 326c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 vbi_out_wss[2]; 327c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool vbi_out_have_cc[2]; 328c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 vbi_out_cc[2][2]; 329c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool dvi_d_out; 330c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 *scaled_line; 331c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 *blended_line; 332c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned cur_scaled_line; 333c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 334c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Output Overlay */ 335c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil void *fb_vbase_out; 336c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool overlay_out_enabled; 337c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int overlay_out_top, overlay_out_left; 338c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil void *bitmap_out; 339c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_clip clips_out[MAX_CLIPS]; 340c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_clip try_clips_out[MAX_CLIPS]; 341c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned clipcount_out; 342c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned fbuf_out_flags; 343c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 chromakey_out; 344c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u8 global_alpha_out; 345c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 346c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* video capture */ 347c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct tpg_data tpg; 348c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned ms_vid_cap; 349c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool must_blank[VIDEO_MAX_FRAME]; 350c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 351c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil const struct vivid_fmt *fmt_cap; 352c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_fract timeperframe_vid_cap; 353c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil enum v4l2_field field_cap; 354c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect src_rect; 355c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect fmt_cap_rect; 356c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect crop_cap; 357c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect compose_cap; 358c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect crop_bounds_cap; 359c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct vb2_queue vb_vid_cap_q; 360c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct list_head vid_cap_active; 361c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct vb2_queue vb_vbi_cap_q; 362c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct list_head vbi_cap_active; 363c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 364c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* thread for generating video capture stream */ 365c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct task_struct *kthread_vid_cap; 366c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned long jiffies_vid_cap; 367c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 cap_seq_offset; 368c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 cap_seq_count; 369c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool cap_seq_resync; 370c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vid_cap_seq_start; 371c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vid_cap_seq_count; 372c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool vid_cap_streaming; 373c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vbi_cap_seq_start; 374c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vbi_cap_seq_count; 375c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool vbi_cap_streaming; 376c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool stream_sliced_vbi_cap; 377c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 378c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* video output */ 379c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil const struct vivid_fmt *fmt_out; 380c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_fract timeperframe_vid_out; 381c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil enum v4l2_field field_out; 382c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect sink_rect; 383c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect fmt_out_rect; 384c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect crop_out; 385c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect compose_out; 386c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect compose_bounds_out; 387c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct vb2_queue vb_vid_out_q; 388c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct list_head vid_out_active; 389c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct vb2_queue vb_vbi_out_q; 390c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct list_head vbi_out_active; 391c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 392c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* video loop precalculated rectangles */ 393c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 394c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* 395c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * Intersection between what the output side composes and the capture side 396c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * crops. I.e., what actually needs to be copied from the output buffer to 397c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * the capture buffer. 398c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil */ 399c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect loop_vid_copy; 400c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* The part of the output buffer that (after scaling) corresponds to loop_vid_copy. */ 401c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect loop_vid_out; 402c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* The part of the capture buffer that (after scaling) corresponds to loop_vid_copy. */ 403c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect loop_vid_cap; 404c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* 405c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * The intersection of the framebuffer, the overlay output window and 406c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * loop_vid_copy. I.e., the part of the framebuffer that actually should be 407c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * blended with the compose_out rectangle. This uses the framebuffer origin. 408c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil */ 409c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect loop_fb_copy; 410c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* The same as loop_fb_copy but with compose_out origin. */ 411c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect loop_vid_overlay; 412c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* 413c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * The part of the capture buffer that (after scaling) corresponds 414c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil * to loop_vid_overlay. 415c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil */ 416c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_rect loop_vid_overlay_cap; 417c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 418c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* thread for generating video output stream */ 419c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct task_struct *kthread_vid_out; 420c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned long jiffies_vid_out; 421c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 out_seq_offset; 422c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 out_seq_count; 423c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool out_seq_resync; 424c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vid_out_seq_start; 425c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vid_out_seq_count; 426c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool vid_out_streaming; 427c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vbi_out_seq_start; 428c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 vbi_out_seq_count; 429c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool vbi_out_streaming; 430c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool stream_sliced_vbi_out; 431c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 432c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* SDR capture */ 433c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct vb2_queue vb_sdr_cap_q; 434c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct list_head sdr_cap_active; 435c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned sdr_adc_freq; 436c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned sdr_fm_freq; 437c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int sdr_fixp_src_phase; 438c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int sdr_fixp_mod_phase; 439c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 440c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool tstamp_src_is_soe; 441c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_crop_cap; 442c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_compose_cap; 443c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_scaler_cap; 444c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_crop_out; 445c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_compose_out; 446c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool has_scaler_out; 447c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 448c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* thread for generating SDR stream */ 449c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct task_struct *kthread_sdr_cap; 450c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned long jiffies_sdr_cap; 451c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 sdr_cap_seq_offset; 452c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil u32 sdr_cap_seq_count; 453c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool sdr_cap_seq_resync; 454c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 455c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* RDS generator */ 456c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct vivid_rds_gen rds_gen; 457c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 458c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Radio receiver */ 459c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned radio_rx_freq; 460c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned radio_rx_audmode; 461c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil int radio_rx_sig_qual; 462c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned radio_rx_hw_seek_mode; 463c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool radio_rx_hw_seek_prog_lim; 464c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool radio_rx_rds_controls; 465c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool radio_rx_rds_enabled; 466c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned radio_rx_rds_use_alternates; 467c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned radio_rx_rds_last_block; 468c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_fh *radio_rx_rds_owner; 469c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 470c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Radio transmitter */ 471c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned radio_tx_freq; 472c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned radio_tx_subchans; 473c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool radio_tx_rds_controls; 474c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil unsigned radio_tx_rds_last_block; 475c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct v4l2_fh *radio_tx_rds_owner; 476c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 477c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil /* Shared between radio receiver and transmitter */ 478c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil bool radio_rds_loop; 479c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil struct timespec radio_rds_init_ts; 480c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil}; 481c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 482c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_webcam(const struct vivid_dev *dev) 483c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{ 484c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil return dev->input_type[dev->input] == WEBCAM; 485c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil} 486c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 487c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_tv_cap(const struct vivid_dev *dev) 488c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{ 489c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil return dev->input_type[dev->input] == TV; 490c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil} 491c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 492c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_svid_cap(const struct vivid_dev *dev) 493c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{ 494c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil return dev->input_type[dev->input] == SVID; 495c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil} 496c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 497c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_hdmi_cap(const struct vivid_dev *dev) 498c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{ 499c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil return dev->input_type[dev->input] == HDMI; 500c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil} 501c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 502c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_sdtv_cap(const struct vivid_dev *dev) 503c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{ 504c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil return vivid_is_tv_cap(dev) || vivid_is_svid_cap(dev); 505c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil} 506c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 507c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_svid_out(const struct vivid_dev *dev) 508c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{ 509c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil return dev->output_type[dev->output] == SVID; 510c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil} 511c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 512c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilstatic inline bool vivid_is_hdmi_out(const struct vivid_dev *dev) 513c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil{ 514c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil return dev->output_type[dev->output] == HDMI; 515c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil} 516c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 517c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilvoid vivid_lock(struct vb2_queue *vq); 518c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuilvoid vivid_unlock(struct vb2_queue *vq); 519c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil 520c88a96b023d8239b2019f93dac42c02e6fd0dff0Hans Verkuil#endif 521