1*4882a593Smuzhiyun /* SPDX-License-Identifier: LGPL-2.1+ WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * dmx.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de> 6*4882a593Smuzhiyun * & Ralph Metzler <ralph@convergence.de> 7*4882a593Smuzhiyun * for convergence integrated media GmbH 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or 10*4882a593Smuzhiyun * modify it under the terms of the GNU Lesser General Public License 11*4882a593Smuzhiyun * as published by the Free Software Foundation; either version 2.1 12*4882a593Smuzhiyun * of the License, or (at your option) any later version. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, 15*4882a593Smuzhiyun * but WITHOUT ANY WARRANTY; without even the implied warranty of 16*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*4882a593Smuzhiyun * GNU General Public License for more details. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * You should have received a copy of the GNU Lesser General Public License 20*4882a593Smuzhiyun * along with this program; if not, write to the Free Software 21*4882a593Smuzhiyun * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #ifndef _UAPI_DVBDMX_H_ 26*4882a593Smuzhiyun #define _UAPI_DVBDMX_H_ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #include <linux/types.h> 29*4882a593Smuzhiyun #ifndef __KERNEL__ 30*4882a593Smuzhiyun #include <time.h> 31*4882a593Smuzhiyun #endif 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define DMX_FILTER_SIZE 16 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /** 37*4882a593Smuzhiyun * enum dmx_output - Output for the demux. 38*4882a593Smuzhiyun * 39*4882a593Smuzhiyun * @DMX_OUT_DECODER: 40*4882a593Smuzhiyun * Streaming directly to decoder. 41*4882a593Smuzhiyun * @DMX_OUT_TAP: 42*4882a593Smuzhiyun * Output going to a memory buffer (to be retrieved via the read command). 43*4882a593Smuzhiyun * Delivers the stream output to the demux device on which the ioctl 44*4882a593Smuzhiyun * is called. 45*4882a593Smuzhiyun * @DMX_OUT_TS_TAP: 46*4882a593Smuzhiyun * Output multiplexed into a new TS (to be retrieved by reading from the 47*4882a593Smuzhiyun * logical DVR device). Routes output to the logical DVR device 48*4882a593Smuzhiyun * ``/dev/dvb/adapter?/dvr?``, which delivers a TS multiplexed from all 49*4882a593Smuzhiyun * filters for which @DMX_OUT_TS_TAP was specified. 50*4882a593Smuzhiyun * @DMX_OUT_TSDEMUX_TAP: 51*4882a593Smuzhiyun * Like @DMX_OUT_TS_TAP but retrieved from the DMX device. 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun enum dmx_output { 54*4882a593Smuzhiyun DMX_OUT_DECODER, 55*4882a593Smuzhiyun DMX_OUT_TAP, 56*4882a593Smuzhiyun DMX_OUT_TS_TAP, 57*4882a593Smuzhiyun DMX_OUT_TSDEMUX_TAP 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /** 62*4882a593Smuzhiyun * enum dmx_input - Input from the demux. 63*4882a593Smuzhiyun * 64*4882a593Smuzhiyun * @DMX_IN_FRONTEND: Input from a front-end device. 65*4882a593Smuzhiyun * @DMX_IN_DVR: Input from the logical DVR device. 66*4882a593Smuzhiyun */ 67*4882a593Smuzhiyun enum dmx_input { 68*4882a593Smuzhiyun DMX_IN_FRONTEND, 69*4882a593Smuzhiyun DMX_IN_DVR 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /** 73*4882a593Smuzhiyun * enum dmx_ts_pes - type of the PES filter. 74*4882a593Smuzhiyun * 75*4882a593Smuzhiyun * @DMX_PES_AUDIO0: first audio PID. Also referred as @DMX_PES_AUDIO. 76*4882a593Smuzhiyun * @DMX_PES_VIDEO0: first video PID. Also referred as @DMX_PES_VIDEO. 77*4882a593Smuzhiyun * @DMX_PES_TELETEXT0: first teletext PID. Also referred as @DMX_PES_TELETEXT. 78*4882a593Smuzhiyun * @DMX_PES_SUBTITLE0: first subtitle PID. Also referred as @DMX_PES_SUBTITLE. 79*4882a593Smuzhiyun * @DMX_PES_PCR0: first Program Clock Reference PID. 80*4882a593Smuzhiyun * Also referred as @DMX_PES_PCR. 81*4882a593Smuzhiyun * 82*4882a593Smuzhiyun * @DMX_PES_AUDIO1: second audio PID. 83*4882a593Smuzhiyun * @DMX_PES_VIDEO1: second video PID. 84*4882a593Smuzhiyun * @DMX_PES_TELETEXT1: second teletext PID. 85*4882a593Smuzhiyun * @DMX_PES_SUBTITLE1: second subtitle PID. 86*4882a593Smuzhiyun * @DMX_PES_PCR1: second Program Clock Reference PID. 87*4882a593Smuzhiyun * 88*4882a593Smuzhiyun * @DMX_PES_AUDIO2: third audio PID. 89*4882a593Smuzhiyun * @DMX_PES_VIDEO2: third video PID. 90*4882a593Smuzhiyun * @DMX_PES_TELETEXT2: third teletext PID. 91*4882a593Smuzhiyun * @DMX_PES_SUBTITLE2: third subtitle PID. 92*4882a593Smuzhiyun * @DMX_PES_PCR2: third Program Clock Reference PID. 93*4882a593Smuzhiyun * 94*4882a593Smuzhiyun * @DMX_PES_AUDIO3: fourth audio PID. 95*4882a593Smuzhiyun * @DMX_PES_VIDEO3: fourth video PID. 96*4882a593Smuzhiyun * @DMX_PES_TELETEXT3: fourth teletext PID. 97*4882a593Smuzhiyun * @DMX_PES_SUBTITLE3: fourth subtitle PID. 98*4882a593Smuzhiyun * @DMX_PES_PCR3: fourth Program Clock Reference PID. 99*4882a593Smuzhiyun * 100*4882a593Smuzhiyun * @DMX_PES_OTHER: any other PID. 101*4882a593Smuzhiyun */ 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun enum dmx_ts_pes { 104*4882a593Smuzhiyun DMX_PES_AUDIO0, 105*4882a593Smuzhiyun DMX_PES_VIDEO0, 106*4882a593Smuzhiyun DMX_PES_TELETEXT0, 107*4882a593Smuzhiyun DMX_PES_SUBTITLE0, 108*4882a593Smuzhiyun DMX_PES_PCR0, 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun DMX_PES_AUDIO1, 111*4882a593Smuzhiyun DMX_PES_VIDEO1, 112*4882a593Smuzhiyun DMX_PES_TELETEXT1, 113*4882a593Smuzhiyun DMX_PES_SUBTITLE1, 114*4882a593Smuzhiyun DMX_PES_PCR1, 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun DMX_PES_AUDIO2, 117*4882a593Smuzhiyun DMX_PES_VIDEO2, 118*4882a593Smuzhiyun DMX_PES_TELETEXT2, 119*4882a593Smuzhiyun DMX_PES_SUBTITLE2, 120*4882a593Smuzhiyun DMX_PES_PCR2, 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun DMX_PES_AUDIO3, 123*4882a593Smuzhiyun DMX_PES_VIDEO3, 124*4882a593Smuzhiyun DMX_PES_TELETEXT3, 125*4882a593Smuzhiyun DMX_PES_SUBTITLE3, 126*4882a593Smuzhiyun DMX_PES_PCR3, 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun DMX_PES_OTHER 129*4882a593Smuzhiyun }; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define DMX_PES_AUDIO DMX_PES_AUDIO0 132*4882a593Smuzhiyun #define DMX_PES_VIDEO DMX_PES_VIDEO0 133*4882a593Smuzhiyun #define DMX_PES_TELETEXT DMX_PES_TELETEXT0 134*4882a593Smuzhiyun #define DMX_PES_SUBTITLE DMX_PES_SUBTITLE0 135*4882a593Smuzhiyun #define DMX_PES_PCR DMX_PES_PCR0 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /** 140*4882a593Smuzhiyun * struct dmx_filter - Specifies a section header filter. 141*4882a593Smuzhiyun * 142*4882a593Smuzhiyun * @filter: bit array with bits to be matched at the section header. 143*4882a593Smuzhiyun * @mask: bits that are valid at the filter bit array. 144*4882a593Smuzhiyun * @mode: mode of match: if bit is zero, it will match if equal (positive 145*4882a593Smuzhiyun * match); if bit is one, it will match if the bit is negated. 146*4882a593Smuzhiyun * 147*4882a593Smuzhiyun * Note: All arrays in this struct have a size of DMX_FILTER_SIZE (16 bytes). 148*4882a593Smuzhiyun */ 149*4882a593Smuzhiyun struct dmx_filter { 150*4882a593Smuzhiyun __u8 filter[DMX_FILTER_SIZE]; 151*4882a593Smuzhiyun __u8 mask[DMX_FILTER_SIZE]; 152*4882a593Smuzhiyun __u8 mode[DMX_FILTER_SIZE]; 153*4882a593Smuzhiyun }; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /** 156*4882a593Smuzhiyun * struct dmx_sct_filter_params - Specifies a section filter. 157*4882a593Smuzhiyun * 158*4882a593Smuzhiyun * @pid: PID to be filtered. 159*4882a593Smuzhiyun * @filter: section header filter, as defined by &struct dmx_filter. 160*4882a593Smuzhiyun * @timeout: maximum time to filter, in milliseconds. 161*4882a593Smuzhiyun * @flags: extra flags for the section filter. 162*4882a593Smuzhiyun * 163*4882a593Smuzhiyun * Carries the configuration for a MPEG-TS section filter. 164*4882a593Smuzhiyun * 165*4882a593Smuzhiyun * The @flags can be: 166*4882a593Smuzhiyun * 167*4882a593Smuzhiyun * - %DMX_CHECK_CRC - only deliver sections where the CRC check succeeded; 168*4882a593Smuzhiyun * - %DMX_ONESHOT - disable the section filter after one section 169*4882a593Smuzhiyun * has been delivered; 170*4882a593Smuzhiyun * - %DMX_IMMEDIATE_START - Start filter immediately without requiring a 171*4882a593Smuzhiyun * :ref:`DMX_START`. 172*4882a593Smuzhiyun */ 173*4882a593Smuzhiyun struct dmx_sct_filter_params { 174*4882a593Smuzhiyun __u16 pid; 175*4882a593Smuzhiyun struct dmx_filter filter; 176*4882a593Smuzhiyun __u32 timeout; 177*4882a593Smuzhiyun __u32 flags; 178*4882a593Smuzhiyun #define DMX_CHECK_CRC 1 179*4882a593Smuzhiyun #define DMX_ONESHOT 2 180*4882a593Smuzhiyun #define DMX_IMMEDIATE_START 4 181*4882a593Smuzhiyun }; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /** 184*4882a593Smuzhiyun * struct dmx_pes_filter_params - Specifies Packetized Elementary Stream (PES) 185*4882a593Smuzhiyun * filter parameters. 186*4882a593Smuzhiyun * 187*4882a593Smuzhiyun * @pid: PID to be filtered. 188*4882a593Smuzhiyun * @input: Demux input, as specified by &enum dmx_input. 189*4882a593Smuzhiyun * @output: Demux output, as specified by &enum dmx_output. 190*4882a593Smuzhiyun * @pes_type: Type of the pes filter, as specified by &enum dmx_pes_type. 191*4882a593Smuzhiyun * @flags: Demux PES flags. 192*4882a593Smuzhiyun */ 193*4882a593Smuzhiyun struct dmx_pes_filter_params { 194*4882a593Smuzhiyun __u16 pid; 195*4882a593Smuzhiyun enum dmx_input input; 196*4882a593Smuzhiyun enum dmx_output output; 197*4882a593Smuzhiyun enum dmx_ts_pes pes_type; 198*4882a593Smuzhiyun __u32 flags; 199*4882a593Smuzhiyun }; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /** 202*4882a593Smuzhiyun * struct dmx_stc - Stores System Time Counter (STC) information. 203*4882a593Smuzhiyun * 204*4882a593Smuzhiyun * @num: input data: number of the STC, from 0 to N. 205*4882a593Smuzhiyun * @base: output: divisor for STC to get 90 kHz clock. 206*4882a593Smuzhiyun * @stc: output: stc in @base * 90 kHz units. 207*4882a593Smuzhiyun */ 208*4882a593Smuzhiyun struct dmx_stc { 209*4882a593Smuzhiyun unsigned int num; 210*4882a593Smuzhiyun unsigned int base; 211*4882a593Smuzhiyun __u64 stc; 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /** 215*4882a593Smuzhiyun * enum dmx_buffer_flags - DMX memory-mapped buffer flags 216*4882a593Smuzhiyun * 217*4882a593Smuzhiyun * @DMX_BUFFER_FLAG_HAD_CRC32_DISCARD: 218*4882a593Smuzhiyun * Indicates that the Kernel discarded one or more frames due to wrong 219*4882a593Smuzhiyun * CRC32 checksum. 220*4882a593Smuzhiyun * @DMX_BUFFER_FLAG_TEI: 221*4882a593Smuzhiyun * Indicates that the Kernel has detected a Transport Error indicator 222*4882a593Smuzhiyun * (TEI) on a filtered pid. 223*4882a593Smuzhiyun * @DMX_BUFFER_PKT_COUNTER_MISMATCH: 224*4882a593Smuzhiyun * Indicates that the Kernel has detected a packet counter mismatch 225*4882a593Smuzhiyun * on a filtered pid. 226*4882a593Smuzhiyun * @DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED: 227*4882a593Smuzhiyun * Indicates that the Kernel has detected one or more frame discontinuity. 228*4882a593Smuzhiyun * @DMX_BUFFER_FLAG_DISCONTINUITY_INDICATOR: 229*4882a593Smuzhiyun * Received at least one packet with a frame discontinuity indicator. 230*4882a593Smuzhiyun */ 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun enum dmx_buffer_flags { 233*4882a593Smuzhiyun DMX_BUFFER_FLAG_HAD_CRC32_DISCARD = 1 << 0, 234*4882a593Smuzhiyun DMX_BUFFER_FLAG_TEI = 1 << 1, 235*4882a593Smuzhiyun DMX_BUFFER_PKT_COUNTER_MISMATCH = 1 << 2, 236*4882a593Smuzhiyun DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED = 1 << 3, 237*4882a593Smuzhiyun DMX_BUFFER_FLAG_DISCONTINUITY_INDICATOR = 1 << 4, 238*4882a593Smuzhiyun }; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun /** 241*4882a593Smuzhiyun * struct dmx_buffer - dmx buffer info 242*4882a593Smuzhiyun * 243*4882a593Smuzhiyun * @index: id number of the buffer 244*4882a593Smuzhiyun * @bytesused: number of bytes occupied by data in the buffer (payload); 245*4882a593Smuzhiyun * @offset: for buffers with memory == DMX_MEMORY_MMAP; 246*4882a593Smuzhiyun * offset from the start of the device memory for this plane, 247*4882a593Smuzhiyun * (or a "cookie" that should be passed to mmap() as offset) 248*4882a593Smuzhiyun * @length: size in bytes of the buffer 249*4882a593Smuzhiyun * @flags: bit array of buffer flags as defined by &enum dmx_buffer_flags. 250*4882a593Smuzhiyun * Filled only at &DMX_DQBUF. 251*4882a593Smuzhiyun * @count: monotonic counter for filled buffers. Helps to identify 252*4882a593Smuzhiyun * data stream loses. Filled only at &DMX_DQBUF. 253*4882a593Smuzhiyun * 254*4882a593Smuzhiyun * Contains data exchanged by application and driver using one of the streaming 255*4882a593Smuzhiyun * I/O methods. 256*4882a593Smuzhiyun * 257*4882a593Smuzhiyun * Please notice that, for &DMX_QBUF, only @index should be filled. 258*4882a593Smuzhiyun * On &DMX_DQBUF calls, all fields will be filled by the Kernel. 259*4882a593Smuzhiyun */ 260*4882a593Smuzhiyun struct dmx_buffer { 261*4882a593Smuzhiyun __u32 index; 262*4882a593Smuzhiyun __u32 bytesused; 263*4882a593Smuzhiyun __u32 offset; 264*4882a593Smuzhiyun __u32 length; 265*4882a593Smuzhiyun __u32 flags; 266*4882a593Smuzhiyun __u32 count; 267*4882a593Smuzhiyun }; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun /** 270*4882a593Smuzhiyun * struct dmx_requestbuffers - request dmx buffer information 271*4882a593Smuzhiyun * 272*4882a593Smuzhiyun * @count: number of requested buffers, 273*4882a593Smuzhiyun * @size: size in bytes of the requested buffer 274*4882a593Smuzhiyun * 275*4882a593Smuzhiyun * Contains data used for requesting a dmx buffer. 276*4882a593Smuzhiyun * All reserved fields must be set to zero. 277*4882a593Smuzhiyun */ 278*4882a593Smuzhiyun struct dmx_requestbuffers { 279*4882a593Smuzhiyun __u32 count; 280*4882a593Smuzhiyun __u32 size; 281*4882a593Smuzhiyun }; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /** 284*4882a593Smuzhiyun * struct dmx_exportbuffer - export of dmx buffer as DMABUF file descriptor 285*4882a593Smuzhiyun * 286*4882a593Smuzhiyun * @index: id number of the buffer 287*4882a593Smuzhiyun * @flags: flags for newly created file, currently only O_CLOEXEC is 288*4882a593Smuzhiyun * supported, refer to manual of open syscall for more details 289*4882a593Smuzhiyun * @fd: file descriptor associated with DMABUF (set by driver) 290*4882a593Smuzhiyun * 291*4882a593Smuzhiyun * Contains data used for exporting a dmx buffer as DMABUF file descriptor. 292*4882a593Smuzhiyun * The buffer is identified by a 'cookie' returned by DMX_QUERYBUF 293*4882a593Smuzhiyun * (identical to the cookie used to mmap() the buffer to userspace). All 294*4882a593Smuzhiyun * reserved fields must be set to zero. The field reserved0 is expected to 295*4882a593Smuzhiyun * become a structure 'type' allowing an alternative layout of the structure 296*4882a593Smuzhiyun * content. Therefore this field should not be used for any other extensions. 297*4882a593Smuzhiyun */ 298*4882a593Smuzhiyun struct dmx_exportbuffer { 299*4882a593Smuzhiyun __u32 index; 300*4882a593Smuzhiyun __u32 flags; 301*4882a593Smuzhiyun __s32 fd; 302*4882a593Smuzhiyun }; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun #define DMX_START _IO('o', 41) 305*4882a593Smuzhiyun #define DMX_STOP _IO('o', 42) 306*4882a593Smuzhiyun #define DMX_SET_FILTER _IOW('o', 43, struct dmx_sct_filter_params) 307*4882a593Smuzhiyun #define DMX_SET_PES_FILTER _IOW('o', 44, struct dmx_pes_filter_params) 308*4882a593Smuzhiyun #define DMX_SET_BUFFER_SIZE _IO('o', 45) 309*4882a593Smuzhiyun #define DMX_GET_PES_PIDS _IOR('o', 47, __u16[5]) 310*4882a593Smuzhiyun #define DMX_GET_STC _IOWR('o', 50, struct dmx_stc) 311*4882a593Smuzhiyun #define DMX_ADD_PID _IOW('o', 51, __u16) 312*4882a593Smuzhiyun #define DMX_REMOVE_PID _IOW('o', 52, __u16) 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun #if !defined(__KERNEL__) 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun /* This is needed for legacy userspace support */ 317*4882a593Smuzhiyun typedef enum dmx_output dmx_output_t; 318*4882a593Smuzhiyun typedef enum dmx_input dmx_input_t; 319*4882a593Smuzhiyun typedef enum dmx_ts_pes dmx_pes_type_t; 320*4882a593Smuzhiyun typedef struct dmx_filter dmx_filter_t; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun #endif 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun #define DMX_REQBUFS _IOWR('o', 60, struct dmx_requestbuffers) 325*4882a593Smuzhiyun #define DMX_QUERYBUF _IOWR('o', 61, struct dmx_buffer) 326*4882a593Smuzhiyun #define DMX_EXPBUF _IOWR('o', 62, struct dmx_exportbuffer) 327*4882a593Smuzhiyun #define DMX_QBUF _IOWR('o', 63, struct dmx_buffer) 328*4882a593Smuzhiyun #define DMX_DQBUF _IOWR('o', 64, struct dmx_buffer) 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun #endif /* _DVBDMX_H_ */ 331