1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef _DVB_DEMUX_H_
25#define _DVB_DEMUX_H_
26
27#include <linux/time.h>
28#include <linux/timer.h>
29#include <linux/spinlock.h>
30#include <asm/semaphore.h>
31
32#include "demux.h"
33
34#define DMX_TYPE_TS 0
35#define DMX_TYPE_SEC 1
36#define DMX_TYPE_PES 2
37
38#define DMX_STATE_FREE 0
39#define DMX_STATE_ALLOCATED 1
40#define DMX_STATE_SET 2
41#define DMX_STATE_READY 3
42#define DMX_STATE_GO 4
43
44#define DVB_DEMUX_MASK_MAX 18
45
46struct dvb_demux_filter {
47 struct dmx_section_filter filter;
48 u8 maskandmode [DMX_MAX_FILTER_SIZE];
49 u8 maskandnotmode [DMX_MAX_FILTER_SIZE];
50 int doneq;
51
52 struct dvb_demux_filter *next;
53 struct dvb_demux_feed *feed;
54 int index;
55 int state;
56 int type;
57 int pesto;
58
59 u16 handle;
60 u16 hw_handle;
61 struct timer_list timer;
62 int ts_state;
63};
64
65
66#define DMX_FEED_ENTRY(pos) list_entry(pos, struct dvb_demux_feed, list_head)
67
68struct dvb_demux_feed {
69 union {
70 struct dmx_ts_feed ts;
71 struct dmx_section_feed sec;
72 } feed;
73
74 union {
75 dmx_ts_cb ts;
76 dmx_section_cb sec;
77 } cb;
78
79 struct dvb_demux *demux;
80 void *priv;
81 int type;
82 int state;
83 u16 pid;
84 u8 *buffer;
85 int buffer_size;
86 int descramble;
87
88 struct timespec timeout;
89 struct dvb_demux_filter *filter;
90 int cb_length;
91
92 int ts_type;
93 enum dmx_ts_pes pes_type;
94
95 int cc;
96 int pusi_seen;
97
98 u16 peslen;
99
100 struct list_head list_head;
101};
102
103struct dvb_demux {
104 struct dmx_demux dmx;
105 void *priv;
106 int filternum;
107 int feednum;
108 int (*start_feed) (struct dvb_demux_feed *feed);
109 int (*stop_feed) (struct dvb_demux_feed *feed);
110 int (*write_to_decoder) (struct dvb_demux_feed *feed,
111 const u8 *buf, size_t len);
112 u32 (*check_crc32) (struct dvb_demux_feed *feed,
113 const u8 *buf, size_t len);
114 void (*memcopy) (struct dvb_demux_feed *feed, u8 *dst,
115 const u8 *src, size_t len);
116
117 int users;
118#define MAX_DVB_DEMUX_USERS 10
119 struct dvb_demux_filter *filter;
120 struct dvb_demux_feed *feed;
121
122 struct list_head frontend_list;
123
124 struct dvb_demux_feed *pesfilter[DMX_TS_PES_OTHER];
125 u16 pids[DMX_TS_PES_OTHER];
126 int playing;
127 int recording;
128
129#define DMX_MAX_PID 0x2000
130 struct list_head feed_list;
131 u8 tsbuf[204];
132 int tsbufp;
133
134 struct semaphore mutex;
135 spinlock_t lock;
136};
137
138
139int dvb_dmx_init(struct dvb_demux *dvbdemux);
140int dvb_dmx_release(struct dvb_demux *dvbdemux);
141void dvb_dmx_swfilter_packet(struct dvb_demux *dvbdmx, const u8 *buf);
142void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, size_t count);
143void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count);
144void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count);
145
146int dvbdmx_connect_frontend(struct dmx_demux *demux, struct dmx_frontend *frontend);
147int dvbdmx_disconnect_frontend(struct dmx_demux *demux);
148
149#endif
150
151