demux.h 15.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 * demux.h
 *
 * Copyright (c) 2002 Convergence GmbH
 *
 * based on code:
 * Copyright (c) 2000 Nokia Research Center
 *                    Tampere, FINLAND
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 */

#ifndef __DEMUX_H
#define __DEMUX_H

#include <linux/types.h>
#include <linux/errno.h>
#include <linux/list.h>
#include <linux/time.h>
33
#include <linux/dvb/dmx.h>
L
Linus Torvalds 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

/*--------------------------------------------------------------------------*/
/* Common definitions */
/*--------------------------------------------------------------------------*/

/*
 * DMX_MAX_FILTER_SIZE: Maximum length (in bytes) of a section/PES filter.
 */

#ifndef DMX_MAX_FILTER_SIZE
#define DMX_MAX_FILTER_SIZE 18
#endif

/*
 * DMX_MAX_SECFEED_SIZE: Maximum length (in bytes) of a private section feed filter.
 */

51 52 53
#ifndef DMX_MAX_SECTION_SIZE
#define DMX_MAX_SECTION_SIZE 4096
#endif
L
Linus Torvalds 已提交
54
#ifndef DMX_MAX_SECFEED_SIZE
55
#define DMX_MAX_SECFEED_SIZE (DMX_MAX_SECTION_SIZE + 188)
L
Linus Torvalds 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
#endif


/*
 * enum dmx_success: Success codes for the Demux Callback API.
 */

enum dmx_success {
  DMX_OK = 0, /* Received Ok */
  DMX_LENGTH_ERROR, /* Incorrect length */
  DMX_OVERRUN_ERROR, /* Receiver ring buffer overrun */
  DMX_CRC_ERROR, /* Incorrect CRC */
  DMX_FRAME_ERROR, /* Frame alignment error */
  DMX_FIFO_ERROR, /* Receiver FIFO overrun */
  DMX_MISSED_ERROR /* Receiver missed packet */
} ;

/*--------------------------------------------------------------------------*/
/* TS packet reception */
/*--------------------------------------------------------------------------*/

/* TS filter type for set() */

#define TS_PACKET       1   /* send TS packets (188 bytes) to callback (default) */
#define	TS_PAYLOAD_ONLY 2   /* in case TS_PACKET is set, only send the TS
			       payload (<=184 bytes per packet) to callback */
#define TS_DECODER      4   /* send stream to built-in decoder (if present) */
83 84
#define TS_DEMUX        8   /* in case TS_PACKET is set, send the TS to
			       the demux device, not to the dvr device */
L
Linus Torvalds 已提交
85 86

struct dmx_ts_feed {
87 88 89 90
	int is_filtering; /* Set to non-zero when filtering in progress */
	struct dmx_demux *parent; /* Back-pointer */
	void *priv; /* Pointer to private data of the API client */
	int (*set) (struct dmx_ts_feed *feed,
L
Linus Torvalds 已提交
91 92 93 94 95
		    u16 pid,
		    int type,
		    enum dmx_ts_pes pes_type,
		    size_t circular_buffer_size,
		    struct timespec timeout);
96 97
	int (*start_filtering) (struct dmx_ts_feed* feed);
	int (*stop_filtering) (struct dmx_ts_feed* feed);
L
Linus Torvalds 已提交
98 99 100 101 102 103 104
};

/*--------------------------------------------------------------------------*/
/* Section reception */
/*--------------------------------------------------------------------------*/

struct dmx_section_filter {
105 106 107 108 109
	u8 filter_value [DMX_MAX_FILTER_SIZE];
	u8 filter_mask [DMX_MAX_FILTER_SIZE];
	u8 filter_mode [DMX_MAX_FILTER_SIZE];
	struct dmx_section_feed* parent; /* Back-pointer */
	void* priv; /* Pointer to private data of the API client */
L
Linus Torvalds 已提交
110 111 112
};

struct dmx_section_feed {
113 114 115
	int is_filtering; /* Set to non-zero when filtering in progress */
	struct dmx_demux* parent; /* Back-pointer */
	void* priv; /* Pointer to private data of the API client */
L
Linus Torvalds 已提交
116

117
	int check_crc;
L
Linus Torvalds 已提交
118 119
	u32 crc_val;

120 121 122
	u8 *secbuf;
	u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
	u16 secbufp, seclen, tsfeedp;
L
Linus Torvalds 已提交
123

124
	int (*set) (struct dmx_section_feed* feed,
L
Linus Torvalds 已提交
125 126 127
		    u16 pid,
		    size_t circular_buffer_size,
		    int check_crc);
128
	int (*allocate_filter) (struct dmx_section_feed* feed,
L
Linus Torvalds 已提交
129
				struct dmx_section_filter** filter);
130
	int (*release_filter) (struct dmx_section_feed* feed,
L
Linus Torvalds 已提交
131
			       struct dmx_section_filter* filter);
132 133
	int (*start_filtering) (struct dmx_section_feed* feed);
	int (*stop_filtering) (struct dmx_section_feed* feed);
L
Linus Torvalds 已提交
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
};

/*--------------------------------------------------------------------------*/
/* Callback functions */
/*--------------------------------------------------------------------------*/

typedef int (*dmx_ts_cb) ( const u8 * buffer1,
			   size_t buffer1_length,
			   const u8 * buffer2,
			   size_t buffer2_length,
			   struct dmx_ts_feed* source,
			   enum dmx_success success);

typedef int (*dmx_section_cb) (	const u8 * buffer1,
				size_t buffer1_len,
				const u8 * buffer2,
				size_t buffer2_len,
				struct dmx_section_filter * source,
				enum dmx_success success);

/*--------------------------------------------------------------------------*/
/* DVB Front-End */
/*--------------------------------------------------------------------------*/

enum dmx_frontend_source {
	DMX_MEMORY_FE,
	DMX_FRONTEND_0,
	DMX_FRONTEND_1,
	DMX_FRONTEND_2,
	DMX_FRONTEND_3,
	DMX_STREAM_0,    /* external stream input, e.g. LVDS */
	DMX_STREAM_1,
	DMX_STREAM_2,
	DMX_STREAM_3
};

struct dmx_frontend {
171
	struct list_head connectivity_list; /* List of front-ends that can
L
Linus Torvalds 已提交
172 173
					       be connected to a particular
					       demux */
174
	enum dmx_frontend_source source;
L
Linus Torvalds 已提交
175 176 177 178 179 180 181
};

/*--------------------------------------------------------------------------*/
/* MPEG-2 TS Demux */
/*--------------------------------------------------------------------------*/

/*
182
 * Flags OR'ed in the capabilities field of struct dmx_demux.
L
Linus Torvalds 已提交
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
 */

#define DMX_TS_FILTERING                        1
#define DMX_PES_FILTERING                       2
#define DMX_SECTION_FILTERING                   4
#define DMX_MEMORY_BASED_FILTERING              8    /* write() available */
#define DMX_CRC_CHECKING                        16
#define DMX_TS_DESCRAMBLING                     32

/*
 * Demux resource type identifier.
*/

/*
 * DMX_FE_ENTRY(): Casts elements in the list of registered
 * front-ends from the generic type struct list_head
 * to the type * struct dmx_frontend
 *.
*/

#define DMX_FE_ENTRY(list) list_entry(list, struct dmx_frontend, connectivity_list)

205 206 207 208 209 210 211 212 213 214 215 216
/**
 * struct dmx_demux - Structure that contains the demux capabilities and
 *		      callbacks.
 *
 * @capabilities: Bitfield of capability flags
 *
 * @frontend: Front-end connected to the demux
 *
 * @priv: Pointer to private data of the API client
 *
 * @open: This function reserves the demux for use by the caller and, if
 *	necessary, initializes the demux. When the demux is no longer needed,
217
 * 	the function @close should be called. It should be possible for
218 219
 *	multiple clients to access the demux at the same time. Thus, the
 *	function implementation should increment the demux usage count when
220
 *	@open is called and decrement it when @close is called.
221 222 223 224 225 226 227 228 229
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	It returns
 *		0 on success;
 * 		-EUSERS, if maximum usage count was reached;
 *		-EINVAL, on bad parameter.
 *
 * @close: This function reserves the demux for use by the caller and, if
 *	necessary, initializes the demux. When the demux is no longer needed,
230
 *	the function @close should be called. It should be possible for
231 232
 *	multiple clients to access the demux at the same time. Thus, the
 *	function implementation should increment the demux usage count when
233
 *	@open is called and decrement it when @close is called.
234 235 236 237
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	It returns
 *		0 on success;
238
 *		-ENODEV, if demux was not in use (e. g. no users);
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
 *		-EINVAL, on bad parameter.
 *
 * @write: This function provides the demux driver with a memory buffer
 *	containing TS packets. Instead of receiving TS packets from the DVB
 *	front-end, the demux driver software will read packets from memory.
 *	Any clients of this demux with active TS, PES or Section filters will
 *	receive filtered data via the Demux callback API (see 0). The function
 *	returns when all the data in the buffer has been consumed by the demux.
 *	Demux hardware typically cannot read TS from memory. If this is the
 *	case, memory-based filtering has to be implemented entirely in software.
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	The @buf function parameter contains a pointer to the TS data in
 *	kernel-space memory.
 *	The @count function parameter contains the length of the TS data.
 *	It returns
 *		0 on success;
256 257 258
 *		-ERESTARTSYS, if mutex lock was interrupted;
 *		-EINTR, if a signal handling is pending;
 *		-ENODEV, if demux was removed;
259 260 261 262 263 264 265 266 267 268 269 270 271
 *		-EINVAL, on bad parameter.
 *
 * @allocate_ts_feed: Allocates a new TS feed, which is used to filter the TS
 *	packets carrying a certain PID. The TS feed normally corresponds to a
 *	hardware PID filter on the demux chip.
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	The @feed function parameter contains a pointer to the TS feed API and
 *	instance data.
 *	The @callback function parameter contains a pointer to the callback
 *	function for passing received TS packet.
 *	It returns
 *		0 on success;
272
 *		-ERESTARTSYS, if mutex lock was interrupted;
273 274 275
 *		-EBUSY, if no more TS feeds is available;
 *		-EINVAL, on bad parameter.
 *
276
 * @release_ts_feed: Releases the resources allocated with @allocate_ts_feed.
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
 *	Any filtering in progress on the TS feed should be stopped before
 *	calling this function.
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	The @feed function parameter contains a pointer to the TS feed API and
 *	instance data.
 *	It returns
 *		0 on success;
 *		-EINVAL on bad parameter.
 *
 * @allocate_section_feed: Allocates a new section feed, i.e. a demux resource
 *	for filtering and receiving sections. On platforms with hardware
 *	support for section filtering, a section feed is directly mapped to
 *	the demux HW. On other platforms, TS packets are first PID filtered in
 *	hardware and a hardware section filter then emulated in software. The
 *	caller obtains an API pointer of type dmx_section_feed_t as an out
 *	parameter. Using this API the caller can set filtering parameters and
 *	start receiving sections.
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	The @feed function parameter contains a pointer to the TS feed API and
 *	instance data.
 *	The @callback function parameter contains a pointer to the callback
 *	function for passing received TS packet.
 *	It returns
 *		0 on success;
 *		-EBUSY, if no more TS feeds is available;
 *		-EINVAL, on bad parameter.
 *
 * @release_section_feed: Releases the resources allocated with
307
 *	@allocate_section_feed, including allocated filters. Any filtering in
308 309 310 311 312 313 314 315 316 317 318 319
 *	progress on the section feed should be stopped before calling this
 *	function.
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	The @feed function parameter contains a pointer to the TS feed API and
 *	instance data.
 *	It returns
 *		0 on success;
 *		-EINVAL, on bad parameter.
 *
 * @add_frontend: Registers a connectivity between a demux and a front-end,
 *	i.e., indicates that the demux can be connected via a call to
320
 *	@connect_frontend to use the given front-end as a TS source. The
321 322 323 324
 *	client of this function has to allocate dynamic or static memory for
 *	the frontend structure and initialize its fields before calling this
 *	function. This function is normally called during the driver
 *	initialization. The caller must not free the memory of the frontend
325
 *	struct before successfully calling @remove_frontend.
326 327 328 329 330 331 332 333 334
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	The @frontend function parameter contains a pointer to the front-end
 *	instance data.
 *	It returns
 *		0 on success;
 *		-EINVAL, on bad parameter.
 *
 * @remove_frontend: Indicates that the given front-end, registered by a call
335
 *	to @add_frontend, can no longer be connected as a TS source by this
336 337 338 339
 *	demux. The function should be called when a front-end driver or a demux
 *	driver is removed from the system. If the front-end is in use, the
 *	function fails with the return value of -EBUSY. After successfully
 *	calling this function, the caller can free the memory of the frontend
340
 *	struct if it was dynamically allocated before the @add_frontend
341 342 343 344 345 346 347
 *	operation.
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	The @frontend function parameter contains a pointer to the front-end
 *	instance data.
 *	It returns
 *		0 on success;
348
 *		-ENODEV, if the front-end was not found,
349 350 351 352
 *		-EINVAL, on bad parameter.
 *
 * @get_frontends: Provides the APIs of the front-ends that have been
 *	registered for this demux. Any of the front-ends obtained with this
353
 *	call can be used as a parameter for @connect_frontend. The include
354
 *	file demux.h contains the macro DMX_FE_ENTRY() for converting an
355 356 357
 *	element of the generic type struct &list_head * to the type
 * 	struct &dmx_frontend *. The caller must not free the memory of any of
 *	the elements obtained via this function call.
358 359 360 361 362 363 364
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	It returns a struct list_head pointer to the list of front-end
 *	interfaces, or NULL in the case of an empty list.
 *
 * @connect_frontend: Connects the TS output of the front-end to the input of
 *	the demux. A demux can only be connected to a front-end registered to
365
 *	the demux with the function @add_frontend. It may or may not be
366 367
 *	possible to connect multiple demuxes to the same front-end, depending
 *	on the capabilities of the HW platform. When not used, the front-end
368
 *	should be released by calling @disconnect_frontend.
369 370 371 372 373 374 375 376 377
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	The @frontend function parameter contains a pointer to the front-end
 *	instance data.
 *	It returns
 *		0 on success;
 *		-EINVAL, on bad parameter.
 *
 * @disconnect_frontend: Disconnects the demux and a front-end previously
378
 *	connected by a @connect_frontend call.
379 380 381 382 383 384 385
 *	The @demux function parameter contains a pointer to the demux API and
 *	instance data.
 *	It returns
 *		0 on success;
 *		-EINVAL on bad parameter.
 */

L
Linus Torvalds 已提交
386
struct dmx_demux {
387 388 389
	u32 capabilities;
	struct dmx_frontend* frontend;
	void* priv;
390 391
	int (*open) (struct dmx_demux* demux);
	int (*close) (struct dmx_demux* demux);
392
	int (*write) (struct dmx_demux* demux, const char __user *buf, size_t count);
393
	int (*allocate_ts_feed) (struct dmx_demux* demux,
L
Linus Torvalds 已提交
394 395
				 struct dmx_ts_feed** feed,
				 dmx_ts_cb callback);
396
	int (*release_ts_feed) (struct dmx_demux* demux,
L
Linus Torvalds 已提交
397
				struct dmx_ts_feed* feed);
398
	int (*allocate_section_feed) (struct dmx_demux* demux,
L
Linus Torvalds 已提交
399 400
				      struct dmx_section_feed** feed,
				      dmx_section_cb callback);
401
	int (*release_section_feed) (struct dmx_demux* demux,
L
Linus Torvalds 已提交
402
				     struct dmx_section_feed* feed);
403
	int (*add_frontend) (struct dmx_demux* demux,
L
Linus Torvalds 已提交
404
			     struct dmx_frontend* frontend);
405
	int (*remove_frontend) (struct dmx_demux* demux,
L
Linus Torvalds 已提交
406
				struct dmx_frontend* frontend);
407 408
	struct list_head* (*get_frontends) (struct dmx_demux* demux);
	int (*connect_frontend) (struct dmx_demux* demux,
L
Linus Torvalds 已提交
409
				 struct dmx_frontend* frontend);
410
	int (*disconnect_frontend) (struct dmx_demux* demux);
L
Linus Torvalds 已提交
411

412
	int (*get_pes_pids) (struct dmx_demux* demux, u16 *pids);
L
Linus Torvalds 已提交
413

414 415
	/* private: Not used upstream and never documented */
#if 0
416 417
	int (*get_caps) (struct dmx_demux* demux, struct dmx_caps *caps);
	int (*set_source) (struct dmx_demux* demux, const dmx_source_t *src);
418 419
#endif
	/* public: */
420
	int (*get_stc) (struct dmx_demux* demux, unsigned int num,
L
Linus Torvalds 已提交
421 422 423 424
			u64 *stc, unsigned int *base);
};

#endif /* #ifndef __DEMUX_H */