Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * dvb_demux.h: DVB kernel demux API | |
3 | * | |
4 | * Copyright (C) 2000-2001 Marcus Metzler & Ralph Metzler | |
5 | * for convergence integrated media GmbH | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or | |
8 | * modify it under the terms of the GNU Lesser General Public License | |
9 | * as published by the Free Software Foundation; either version 2.1 | |
10 | * of the License, or (at your option) any later version. | |
11 | * | |
12 | * This program is distributed in the hope that it will be useful, | |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | * GNU General Public License for more details. | |
16 | * | |
1da177e4 LT |
17 | */ |
18 | ||
1da177e4 LT |
19 | #ifndef _DVB_DEMUX_H_ |
20 | #define _DVB_DEMUX_H_ | |
21 | ||
22 | #include <linux/time.h> | |
23 | #include <linux/timer.h> | |
24 | #include <linux/spinlock.h> | |
3593cab5 | 25 | #include <linux/mutex.h> |
1da177e4 LT |
26 | |
27 | #include "demux.h" | |
28 | ||
0463625e MCC |
29 | /** |
30 | * enum dvb_dmx_filter_type - type of demux feed. | |
31 | * | |
32 | * @DMX_TYPE_TS: feed is in TS mode. | |
33 | * @DMX_TYPE_SEC: feed is in Section mode. | |
34 | */ | |
35 | enum dvb_dmx_filter_type { | |
36 | DMX_TYPE_TS, | |
37 | DMX_TYPE_SEC, | |
38 | }; | |
1da177e4 | 39 | |
999f3d25 MCC |
40 | /** |
41 | * enum dvb_dmx_state - state machine for a demux filter. | |
42 | * | |
43 | * @DMX_STATE_FREE: indicates that the filter is freed. | |
44 | * @DMX_STATE_ALLOCATED: indicates that the filter was allocated | |
45 | * to be used. | |
46 | * @DMX_STATE_READY: indicates that the filter is ready | |
47 | * to be used. | |
48 | * @DMX_STATE_GO: indicates that the filter is running. | |
49 | */ | |
50 | enum dvb_dmx_state { | |
51 | DMX_STATE_FREE, | |
52 | DMX_STATE_ALLOCATED, | |
53 | DMX_STATE_READY, | |
54 | DMX_STATE_GO, | |
55 | }; | |
1da177e4 LT |
56 | |
57 | #define DVB_DEMUX_MASK_MAX 18 | |
58 | ||
0d834635 AO |
59 | #define MAX_PID 0x1fff |
60 | ||
26b9d6c0 AO |
61 | #define SPEED_PKTS_INTERVAL 50000 |
62 | ||
1da177e4 | 63 | struct dvb_demux_filter { |
dad4a730 AO |
64 | struct dmx_section_filter filter; |
65 | u8 maskandmode[DMX_MAX_FILTER_SIZE]; | |
66 | u8 maskandnotmode[DMX_MAX_FILTER_SIZE]; | |
392cc7af | 67 | bool doneq; |
1da177e4 | 68 | |
dad4a730 AO |
69 | struct dvb_demux_filter *next; |
70 | struct dvb_demux_feed *feed; | |
71 | int index; | |
999f3d25 | 72 | enum dvb_dmx_state state; |
0463625e | 73 | enum dvb_dmx_filter_type type; |
1da177e4 | 74 | |
dad4a730 | 75 | u16 hw_handle; |
1da177e4 LT |
76 | }; |
77 | ||
1da177e4 | 78 | struct dvb_demux_feed { |
dad4a730 AO |
79 | union { |
80 | struct dmx_ts_feed ts; | |
81 | struct dmx_section_feed sec; | |
1da177e4 LT |
82 | } feed; |
83 | ||
dad4a730 AO |
84 | union { |
85 | dmx_ts_cb ts; | |
86 | dmx_section_cb sec; | |
1da177e4 LT |
87 | } cb; |
88 | ||
dad4a730 | 89 | struct dvb_demux *demux; |
1da177e4 | 90 | void *priv; |
0463625e | 91 | enum dvb_dmx_filter_type type; |
999f3d25 | 92 | enum dvb_dmx_state state; |
dad4a730 | 93 | u16 pid; |
1da177e4 | 94 | |
e95be158 | 95 | ktime_t timeout; |
dad4a730 | 96 | struct dvb_demux_filter *filter; |
1da177e4 | 97 | |
4bc8525a | 98 | enum ts_filter_type ts_type; |
dad4a730 | 99 | enum dmx_ts_pes pes_type; |
1da177e4 | 100 | |
dad4a730 | 101 | int cc; |
2c53275c | 102 | bool pusi_seen; /* prevents feeding of garbage from previous section */ |
1da177e4 | 103 | |
dad4a730 | 104 | u16 peslen; |
1da177e4 LT |
105 | |
106 | struct list_head list_head; | |
dad4a730 | 107 | unsigned int index; /* a unique index for each feed (can be used as hardware pid filter index) */ |
1da177e4 LT |
108 | }; |
109 | ||
110 | struct dvb_demux { | |
dad4a730 AO |
111 | struct dmx_demux dmx; |
112 | void *priv; | |
113 | int filternum; | |
114 | int feednum; | |
115 | int (*start_feed)(struct dvb_demux_feed *feed); | |
116 | int (*stop_feed)(struct dvb_demux_feed *feed); | |
117 | int (*write_to_decoder)(struct dvb_demux_feed *feed, | |
1da177e4 | 118 | const u8 *buf, size_t len); |
dad4a730 | 119 | u32 (*check_crc32)(struct dvb_demux_feed *feed, |
1da177e4 | 120 | const u8 *buf, size_t len); |
dad4a730 | 121 | void (*memcopy)(struct dvb_demux_feed *feed, u8 *dst, |
1da177e4 LT |
122 | const u8 *src, size_t len); |
123 | ||
dad4a730 | 124 | int users; |
1da177e4 | 125 | #define MAX_DVB_DEMUX_USERS 10 |
dad4a730 AO |
126 | struct dvb_demux_filter *filter; |
127 | struct dvb_demux_feed *feed; | |
1da177e4 | 128 | |
dad4a730 | 129 | struct list_head frontend_list; |
1da177e4 | 130 | |
fde04ab9 MCC |
131 | struct dvb_demux_feed *pesfilter[DMX_PES_OTHER]; |
132 | u16 pids[DMX_PES_OTHER]; | |
dad4a730 AO |
133 | int playing; |
134 | int recording; | |
1da177e4 LT |
135 | |
136 | #define DMX_MAX_PID 0x2000 | |
137 | struct list_head feed_list; | |
dad4a730 AO |
138 | u8 tsbuf[204]; |
139 | int tsbufp; | |
1da177e4 | 140 | |
3593cab5 | 141 | struct mutex mutex; |
1da177e4 | 142 | spinlock_t lock; |
0d834635 AO |
143 | |
144 | uint8_t *cnt_storage; /* for TS continuity check */ | |
26b9d6c0 | 145 | |
e95be158 | 146 | ktime_t speed_last_time; /* for TS speed check */ |
26b9d6c0 | 147 | uint32_t speed_pkts_cnt; /* for TS speed check */ |
1da177e4 LT |
148 | }; |
149 | ||
1da177e4 | 150 | int dvb_dmx_init(struct dvb_demux *dvbdemux); |
93653467 | 151 | void dvb_dmx_release(struct dvb_demux *dvbdemux); |
dad4a730 AO |
152 | void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, |
153 | size_t count); | |
1da177e4 | 154 | void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count); |
dad4a730 AO |
155 | void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, |
156 | size_t count); | |
8e156702 MK |
157 | void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, |
158 | size_t count); | |
1da177e4 LT |
159 | |
160 | #endif /* _DVB_DEMUX_H_ */ |