1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * VIDEO MOTION CODECs internal API for video devices 4 * 5 * Interface for MJPEG (and maybe later MPEG/WAVELETS) codec's 6 * bound to a master device. 7 * 8 * (c) 2002 Wolfgang Scherr <scherr@net4you.at> 9 */ 10 11 /* =================== */ 12 /* general description */ 13 /* =================== */ 14 15 /* 16 * Should ease the (re-)usage of drivers supporting cards with (different) 17 * video codecs. The codecs register to this module their functionality, 18 * and the processors (masters) can attach to them if they fit. 19 * 20 * The codecs are typically have a "strong" binding to their master - so I 21 * don't think it makes sense to have a full blown interfacing as with e.g. 22 * i2c. If you have an other opinion, let's discuss & implement it :-))) 23 * 24 * Usage: 25 * 26 * The slave has just to setup the videocodec structure and use two functions: 27 * videocodec_register(codecdata); 28 * videocodec_unregister(codecdata); 29 * The best is just calling them at module (de-)initialisation. 30 * 31 * The master sets up the structure videocodec_master and calls: 32 * codecdata=videocodec_attach(master_codecdata); 33 * videocodec_detach(codecdata); 34 * 35 * The slave is called during attach/detach via functions setup previously 36 * during register. At that time, the master_data pointer is set up 37 * and the slave can access any io registers of the master device (in the case 38 * the slave is bound to it). Otherwise it doesn't need this functions and 39 * therefor they may not be initialized. 40 * 41 * The other functions are just for convenience, as they are for sure used by 42 * most/all of the codecs. The last ones may be omitted, too. 43 * 44 * See the structure declaration below for more information and which data has 45 * to be set up for the master and the slave. 46 * 47 * ---------------------------------------------------------------------------- 48 * The master should have "knowledge" of the slave and vice versa. So the data 49 * structures sent to/from slave via set_data/get_data set_image/get_image are 50 * device dependent and vary between MJPEG/MPEG/WAVELET/... devices. (!!!!) 51 * ---------------------------------------------------------------------------- 52 */ 53 54 /* ========================================== */ 55 /* description of the videocodec_io structure */ 56 /* ========================================== */ 57 58 /* 59 * ==== master setup ==== 60 * name -> name of the device structure for reference and debugging 61 * master_data -> data ref. for the master (e.g. the zr36055,57,67) 62 * readreg -> ref. to read-fn from register (setup by master, used by slave) 63 * writereg -> ref. to write-fn to register (setup by master, used by slave) 64 * this two functions do the lowlevel I/O job 65 * 66 * ==== slave functionality setup ==== 67 * slave_data -> data ref. for the slave (e.g. the zr36050,60) 68 * check -> fn-ref. checks availability of an device, returns -EIO on failure or 69 * the type on success 70 * this makes espcecially sense if a driver module supports more than 71 * one codec which may be quite similar to access, nevertheless it 72 * is good for a first functionality check 73 * 74 * -- main functions you always need for compression/decompression -- 75 * 76 * set_mode -> this fn-ref. resets the entire codec, and sets up the mode 77 * with the last defined norm/size (or device default if not 78 * available) - it returns 0 if the mode is possible 79 * set_size -> this fn-ref. sets the norm and image size for 80 * compression/decompression (returns 0 on success) 81 * the norm param is defined in videodev2.h (V4L2_STD_*) 82 * 83 * additional setup may be available, too - but the codec should work with 84 * some default values even without this 85 * 86 * set_data -> sets device-specific data (tables, quality etc.) 87 * get_data -> query device-specific data (tables, quality etc.) 88 * 89 * if the device delivers interrupts, they may be setup/handled here 90 * setup_interrupt -> codec irq setup (not needed for 36050/60) 91 * handle_interrupt -> codec irq handling (not needed for 36050/60) 92 93 * if the device delivers pictures, they may be handled here 94 * put_image -> puts image data to the codec (not needed for 36050/60) 95 * get_image -> gets image data from the codec (not needed for 36050/60) 96 * the calls include frame numbers and flags (even/odd/...) 97 * if needed and a flag which allows blocking until its ready 98 */ 99 100 /* ============== */ 101 /* user interface */ 102 /* ============== */ 103 104 /* 105 * Currently there is only a information display planned, as the layer 106 * is not visible for the user space at all. 107 * 108 * Information is available via procfs. The current entry is "/proc/videocodecs" 109 * but it makes sense to "hide" it in the /proc/video tree of v4l(2) --TODO--. 110 * 111 * A example for such an output is: 112 * 113 * <S>lave or attached <M>aster name type flags magic (connected as) 114 * S zr36050 0002 0000d001 00000000 (TEMPLATE) 115 * M zr36055[0] 0001 0000c001 00000000 (zr36050[0]) 116 * M zr36055[1] 0001 0000c001 00000000 (zr36050[1]) 117 */ 118 119 /* =============================================== */ 120 /* special defines for the videocodec_io structure */ 121 /* =============================================== */ 122 123 #ifndef __LINUX_VIDEOCODEC_H 124 #define __LINUX_VIDEOCODEC_H 125 126 #include <linux/debugfs.h> 127 #include <linux/videodev2.h> 128 129 #define CODEC_DO_COMPRESSION 0 130 #define CODEC_DO_EXPANSION 1 131 132 /* this are the current codec flags I think they are needed */ 133 /* -> type value in structure */ 134 #define CODEC_FLAG_JPEG 0x00000001L // JPEG codec 135 #define CODEC_FLAG_MPEG 0x00000002L // MPEG1/2/4 codec 136 #define CODEC_FLAG_DIVX 0x00000004L // DIVX codec 137 #define CODEC_FLAG_WAVELET 0x00000008L // WAVELET codec 138 // room for other types 139 140 #define CODEC_FLAG_MAGIC 0x00000800L // magic key must match 141 #define CODEC_FLAG_HARDWARE 0x00001000L // is a hardware codec 142 #define CODEC_FLAG_VFE 0x00002000L // has direct video frontend 143 #define CODEC_FLAG_ENCODER 0x00004000L // compression capability 144 #define CODEC_FLAG_DECODER 0x00008000L // decompression capability 145 #define CODEC_FLAG_NEEDIRQ 0x00010000L // needs irq handling 146 #define CODEC_FLAG_RDWRPIC 0x00020000L // handles picture I/O 147 148 /* a list of modes, some are just examples (is there any HW?) */ 149 #define CODEC_MODE_BJPG 0x0001 // Baseline JPEG 150 #define CODEC_MODE_LJPG 0x0002 // Lossless JPEG 151 #define CODEC_MODE_MPEG1 0x0003 // MPEG 1 152 #define CODEC_MODE_MPEG2 0x0004 // MPEG 2 153 #define CODEC_MODE_MPEG4 0x0005 // MPEG 4 154 #define CODEC_MODE_MSDIVX 0x0006 // MS DivX 155 #define CODEC_MODE_ODIVX 0x0007 // Open DivX 156 #define CODEC_MODE_WAVELET 0x0008 // Wavelet 157 158 /* this are the current codec types I want to implement */ 159 /* -> type value in structure */ 160 #define CODEC_TYPE_NONE 0 161 #define CODEC_TYPE_L64702 1 162 #define CODEC_TYPE_ZR36050 2 163 #define CODEC_TYPE_ZR36016 3 164 #define CODEC_TYPE_ZR36060 4 165 166 /* the type of data may be enhanced by future implementations (data-fn.'s) */ 167 /* -> used in command */ 168 #define CODEC_G_STATUS 0x0000 /* codec status (query only) */ 169 #define CODEC_S_CODEC_MODE 0x0001 /* codec mode (baseline JPEG, MPEG1,... */ 170 #define CODEC_G_CODEC_MODE 0x8001 171 #define CODEC_S_VFE 0x0002 /* additional video frontend setup */ 172 #define CODEC_G_VFE 0x8002 173 #define CODEC_S_MMAP 0x0003 /* MMAP setup (if available) */ 174 175 #define CODEC_S_JPEG_TDS_BYTE 0x0010 /* target data size in bytes */ 176 #define CODEC_G_JPEG_TDS_BYTE 0x8010 177 #define CODEC_S_JPEG_SCALE 0x0011 /* scaling factor for quant. tables */ 178 #define CODEC_G_JPEG_SCALE 0x8011 179 #define CODEC_S_JPEG_HDT_DATA 0x0018 /* huffman-tables */ 180 #define CODEC_G_JPEG_HDT_DATA 0x8018 181 #define CODEC_S_JPEG_QDT_DATA 0x0019 /* quantizing-tables */ 182 #define CODEC_G_JPEG_QDT_DATA 0x8019 183 #define CODEC_S_JPEG_APP_DATA 0x001A /* APP marker */ 184 #define CODEC_G_JPEG_APP_DATA 0x801A 185 #define CODEC_S_JPEG_COM_DATA 0x001B /* COM marker */ 186 #define CODEC_G_JPEG_COM_DATA 0x801B 187 188 #define CODEC_S_PRIVATE 0x1000 /* "private" commands start here */ 189 #define CODEC_G_PRIVATE 0x9000 190 191 #define CODEC_G_FLAG 0x8000 /* this is how 'get' is detected */ 192 193 /* types of transfer, directly user space or a kernel buffer (image-fn.'s) */ 194 /* -> used in get_image, put_image */ 195 #define CODEC_TRANSFER_KERNEL 0 /* use "memcopy" */ 196 #define CODEC_TRANSFER_USER 1 /* use "to/from_user" */ 197 198 /* ========================= */ 199 /* the structures itself ... */ 200 /* ========================= */ 201 202 struct vfe_polarity { 203 unsigned int vsync_pol:1; 204 unsigned int hsync_pol:1; 205 unsigned int field_pol:1; 206 unsigned int blank_pol:1; 207 unsigned int subimg_pol:1; 208 unsigned int poe_pol:1; 209 unsigned int pvalid_pol:1; 210 unsigned int vclk_pol:1; 211 }; 212 213 struct vfe_settings { 214 __u32 x, y; /* Offsets into image */ 215 __u32 width, height; /* Area to capture */ 216 __u16 decimation; /* Decimation divider */ 217 __u16 flags; /* Flags for capture */ 218 __u16 quality; /* quality of the video */ 219 }; 220 221 struct tvnorm { 222 u16 wt, wa, h_start, h_sync_start, ht, ha, v_start; 223 }; 224 225 struct jpeg_com_marker { 226 int len; /* number of usable bytes in data */ 227 char data[60]; 228 }; 229 230 struct jpeg_app_marker { 231 int appn; /* number app segment */ 232 int len; /* number of usable bytes in data */ 233 char data[60]; 234 }; 235 236 struct videocodec { 237 /* -- filled in by slave device during register -- */ 238 char name[32]; 239 unsigned long magic; /* may be used for client<->master attaching */ 240 unsigned long flags; /* functionality flags */ 241 unsigned int type; /* codec type */ 242 243 /* -- these is filled in later during master device attach -- */ 244 245 struct videocodec_master *master_data; 246 247 /* -- these are filled in by the slave device during register -- */ 248 249 void *data; /* private slave data */ 250 251 /* attach/detach client functions (indirect call) */ 252 int (*setup)(struct videocodec *codec); 253 int (*unset)(struct videocodec *codec); 254 255 /* main functions, every client needs them for sure! */ 256 // set compression or decompression (or freeze, stop, standby, etc) 257 int (*set_mode)(struct videocodec *codec, int mode); 258 // setup picture size and norm (for the codec's video frontend) 259 int (*set_video)(struct videocodec *codec, const struct tvnorm *norm, 260 struct vfe_settings *cap, struct vfe_polarity *pol); 261 // other control commands, also mmap setup etc. 262 int (*control)(struct videocodec *codec, int type, int size, void *data); 263 264 /* additional setup/query/processing (may be NULL pointer) */ 265 // interrupt setup / handling (for irq's delivered by master) 266 int (*setup_interrupt)(struct videocodec *codec, long mode); 267 int (*handle_interrupt)(struct videocodec *codec, int source, long flag); 268 // picture interface (if any) 269 long (*put_image)(struct videocodec *codec, int tr_type, int block, 270 long *fr_num, long *flag, long size, void *buf); 271 long (*get_image)(struct videocodec *codec, int tr_type, int block, 272 long *fr_num, long *flag, long size, void *buf); 273 }; 274 275 struct videocodec_master { 276 /* -- filled in by master device for registration -- */ 277 char name[32]; 278 unsigned long magic; /* may be used for client<->master attaching */ 279 unsigned long flags; /* functionality flags */ 280 unsigned int type; /* master type */ 281 282 void *data; /* private master data */ 283 284 __u32 (*readreg)(struct videocodec *codec, __u16 reg); 285 void (*writereg)(struct videocodec *codec, __u16 reg, __u32 value); 286 }; 287 288 /* ================================================= */ 289 /* function prototypes of the master/slave interface */ 290 /* ================================================= */ 291 292 /* attach and detach commands for the master */ 293 // * master structure needs to be kmalloc'ed before calling attach 294 // and free'd after calling detach 295 // * returns pointer on success, NULL on failure 296 struct videocodec *videocodec_attach(struct videocodec_master *master); 297 // * 0 on success, <0 (errno) on failure 298 int videocodec_detach(struct videocodec *codec); 299 300 /* register and unregister commands for the slaves */ 301 // * 0 on success, <0 (errno) on failure 302 int videocodec_register(const struct videocodec *codec); 303 // * 0 on success, <0 (errno) on failure 304 int videocodec_unregister(const struct videocodec *codec); 305 306 /* the other calls are directly done via the videocodec structure! */ 307 308 int videocodec_debugfs_show(struct seq_file *m); 309 310 #include "zoran.h" 311 static inline struct zoran *videocodec_master_to_zoran(struct videocodec_master *master) 312 { 313 struct zoran *zr = master->data; 314 315 return zr; 316 } 317 318 static inline struct zoran *videocodec_to_zoran(struct videocodec *codec) 319 { 320 struct videocodec_master *master = codec->master_data; 321 322 return videocodec_master_to_zoran(master); 323 } 324 325 #endif /*ifndef __LINUX_VIDEOCODEC_H */ 326