Mercurial > mplayer.hg
annotate stream/stream_dvb.c @ 32931:03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
Since the NumberOfMainItems, NumberOfBarItems and NumberOfMenuItems members
actually hold the last index used rather than the number of items, rename
them 'IndexOf' to avoid further confusion. Besides, change their loop
conditions to meet the new name.
author | ib |
---|---|
date | Thu, 03 Mar 2011 14:37:47 +0000 |
parents | b39155e98ac3 |
children | 04dc3e55cd90 |
rev | line source |
---|---|
19296 | 1 /* |
2 | |
3 dvbstream | |
4 (C) Dave Chapman <dave@dchapman.com> 2001, 2002. | |
5 | |
6 The latest version can be found at http://www.linuxstb.org/dvbstream | |
7 | |
8 Modified for use with MPlayer, for details see the changelog at | |
9 http://svn.mplayerhq.hu/mplayer/trunk/ | |
10 $Id$ | |
11 | |
12 Copyright notice: | |
13 | |
14 This program is free software; you can redistribute it and/or modify | |
15 it under the terms of the GNU General Public License as published by | |
16 the Free Software Foundation; either version 2 of the License, or | |
17 (at your option) any later version. | |
18 | |
19 This program is distributed in the hope that it will be useful, | |
20 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 GNU General Public License for more details. | |
23 | |
24 You should have received a copy of the GNU General Public License | |
25 along with this program; if not, write to the Free Software | |
21977
cea0eb833758
Fix FSF address and otherwise broken license headers.
diego
parents:
21834
diff
changeset
|
26 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19296 | 27 |
28 */ | |
29 | |
30 #include "config.h" | |
31 #include <stdio.h> | |
32 #include <stdlib.h> | |
33 #include <string.h> | |
34 #include <ctype.h> | |
35 #include <sys/ioctl.h> | |
36 #include <sys/time.h> | |
27431
bb738b9ea7c4
Use '#include <poll.h>' instead of '#include <sys/poll.h>'.
diego
parents:
27370
diff
changeset
|
37 #include <poll.h> |
19296 | 38 #include <unistd.h> |
39 #include <fcntl.h> | |
40 #include <errno.h> | |
41 | |
42 #include "stream.h" | |
19312
ab8d6b6deb63
proper inclusion of demuxer.h (including libmpdemux in Makefile only was to make previous split easier)
ben
parents:
19296
diff
changeset
|
43 #include "libmpdemux/demuxer.h" |
19296 | 44 #include "help_mp.h" |
45 #include "m_option.h" | |
46 #include "m_struct.h" | |
30901 | 47 #include "path.h" |
23703
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23629
diff
changeset
|
48 #include "libavutil/avstring.h" |
19296 | 49 |
50 #include "dvbin.h" | |
51 | |
52 | |
53 #define MAX_CHANNELS 8 | |
54 #define CHANNEL_LINE_LEN 256 | |
55 #define min(a, b) ((a) <= (b) ? (a) : (b)) | |
56 | |
57 | |
58 //TODO: CAMBIARE list_ptr e da globale a per_priv | |
59 | |
60 | |
61 static struct stream_priv_s | |
62 { | |
63 char *prog; | |
64 int card; | |
65 int timeout; | |
66 char *file; | |
67 } | |
68 stream_defaults = | |
69 { | |
26391
16ab100f5870
removed useless parameter :type from -dvbin (the frontend type is reported by the card)
nicodvb
parents:
26390
diff
changeset
|
70 "", 1, 30, NULL |
19296 | 71 }; |
72 | |
73 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s, f) | |
74 | |
75 /// URL definition | |
25242 | 76 static const m_option_t stream_params[] = { |
19296 | 77 {"prog", ST_OFF(prog), CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
78 {"card", ST_OFF(card), CONF_TYPE_INT, M_OPT_RANGE, 1, 4, NULL}, | |
79 {"timeout",ST_OFF(timeout), CONF_TYPE_INT, M_OPT_RANGE, 1, 30, NULL}, | |
80 {"file", ST_OFF(file), CONF_TYPE_STRING, 0, 0 ,0, NULL}, | |
81 | |
82 {"hostname", ST_OFF(prog), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
83 {"username", ST_OFF(card), CONF_TYPE_INT, M_OPT_RANGE, 1, 4, NULL}, | |
84 {NULL, NULL, 0, 0, 0, 0, NULL} | |
85 }; | |
86 | |
25691 | 87 static const struct m_struct_st stream_opts = { |
19296 | 88 "dvbin", |
89 sizeof(struct stream_priv_s), | |
90 &stream_defaults, | |
91 stream_params | |
92 }; | |
93 | |
94 | |
95 | |
25241
bb7c65f2a289
Make m_option_t arrays referenced by cfg-common.h const
reimar
parents:
25211
diff
changeset
|
96 const m_option_t dvbin_opts_conf[] = { |
19296 | 97 {"prog", &stream_defaults.prog, CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
98 {"card", &stream_defaults.card, CONF_TYPE_INT, M_OPT_RANGE, 1, 4, NULL}, | |
99 {"timeout", &stream_defaults.timeout, CONF_TYPE_INT, M_OPT_RANGE, 1, 30, NULL}, | |
100 {"file", &stream_defaults.file, CONF_TYPE_STRING, 0, 0 ,0, NULL}, | |
101 | |
102 {NULL, NULL, 0, 0, 0, 0, NULL} | |
103 }; | |
104 | |
105 | |
106 | |
107 | |
28051 | 108 int dvb_set_ts_filt(int fd, uint16_t pid, dmx_pes_type_t pestype); |
109 int dvb_demux_stop(int fd); | |
110 int dvb_get_tuner_type(int fd); | |
24875 | 111 int dvb_open_devices(dvb_priv_t *priv, int n, int demux_cnt); |
112 int dvb_fix_demuxes(dvb_priv_t *priv, int cnt); | |
19296 | 113 |
28051 | 114 int dvb_tune(dvb_priv_t *priv, int freq, char pol, int srate, int diseqc, int tone, |
19296 | 115 fe_spectral_inversion_t specInv, fe_modulation_t modulation, fe_guard_interval_t guardInterval, |
116 fe_transmit_mode_t TransmissionMode, fe_bandwidth_t bandWidth, fe_code_rate_t HP_CodeRate, | |
117 fe_code_rate_t LP_CodeRate, fe_hierarchy_t hier, int timeout); | |
118 | |
119 | |
120 | |
121 static dvb_channels_list *dvb_get_channels(char *filename, int type) | |
122 { | |
123 dvb_channels_list *list; | |
124 FILE *f; | |
125 char line[CHANNEL_LINE_LEN], *colon; | |
126 | |
127 int fields, cnt, pcnt, k; | |
21814
8032b9d9349d
don't add pid 0 if it's already present in the list
nicodvb
parents:
21465
diff
changeset
|
128 int has8192, has0; |
19296 | 129 dvb_channel_t *ptr, *tmp, chn; |
130 char tmp_lcr[256], tmp_hier[256], inv[256], bw[256], cr[256], mod[256], transm[256], gi[256], vpid_str[256], apid_str[256]; | |
131 const char *cbl_conf = "%d:%255[^:]:%d:%255[^:]:%255[^:]:%255[^:]:%255[^:]\n"; | |
132 const char *sat_conf = "%d:%c:%d:%d:%255[^:]:%255[^:]\n"; | |
133 const char *ter_conf = "%d:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]\n"; | |
134 const char *atsc_conf = "%d:%255[^:]:%255[^:]:%255[^:]\n"; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
135 |
19296 | 136 mp_msg(MSGT_DEMUX, MSGL_V, "CONFIG_READ FILE: %s, type: %d\n", filename, type); |
137 if((f=fopen(filename, "r"))==NULL) | |
138 { | |
139 mp_msg(MSGT_DEMUX, MSGL_FATAL, "CAN'T READ CONFIG FILE %s\n", filename); | |
140 return NULL; | |
141 } | |
142 | |
143 list = malloc(sizeof(dvb_channels_list)); | |
144 if(list == NULL) | |
145 { | |
146 fclose(f); | |
147 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_GET_CHANNELS: couldn't malloc enough memory\n"); | |
148 return NULL; | |
149 } | |
150 | |
151 ptr = &chn; | |
152 list->NUM_CHANNELS = 0; | |
153 list->channels = NULL; | |
154 while(! feof(f)) | |
155 { | |
156 if( fgets(line, CHANNEL_LINE_LEN, f) == NULL ) | |
157 continue; | |
158 | |
159 if((line[0] == '#') || (strlen(line) == 0)) | |
160 continue; | |
161 | |
21464 | 162 colon = strchr(line, ':'); |
19296 | 163 if(colon) |
164 { | |
165 k = colon - line; | |
166 if(!k) | |
167 continue; | |
23629 | 168 ptr->name = malloc(k+1); |
19296 | 169 if(! ptr->name) |
170 continue; | |
23703
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23629
diff
changeset
|
171 av_strlcpy(ptr->name, line, k+1); |
19296 | 172 } |
173 else | |
174 continue; | |
175 k++; | |
176 apid_str[0] = vpid_str[0] = 0; | |
177 ptr->pids_cnt = 0; | |
178 ptr->freq = 0; | |
179 if(type == TUNER_TER) | |
180 { | |
181 fields = sscanf(&line[k], ter_conf, | |
182 &ptr->freq, inv, bw, cr, tmp_lcr, mod, | |
183 transm, gi, tmp_hier, vpid_str, apid_str); | |
184 mp_msg(MSGT_DEMUX, MSGL_V, | |
185 "TER, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d", | |
186 list->NUM_CHANNELS, fields, ptr->name, ptr->freq); | |
187 } | |
188 else if(type == TUNER_CBL) | |
189 { | |
190 fields = sscanf(&line[k], cbl_conf, | |
191 &ptr->freq, inv, &ptr->srate, | |
192 cr, mod, vpid_str, apid_str); | |
193 mp_msg(MSGT_DEMUX, MSGL_V, | |
194 "CBL, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d, SRATE: %d", | |
195 list->NUM_CHANNELS, fields, ptr->name, ptr->freq, ptr->srate); | |
196 } | |
197 #ifdef DVB_ATSC | |
198 else if(type == TUNER_ATSC) | |
199 { | |
200 fields = sscanf(&line[k], atsc_conf, | |
201 &ptr->freq, mod, vpid_str, apid_str); | |
202 mp_msg(MSGT_DEMUX, MSGL_V, | |
203 "ATSC, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d\n", | |
204 list->NUM_CHANNELS, fields, ptr->name, ptr->freq); | |
205 } | |
206 #endif | |
207 else //SATELLITE | |
208 { | |
209 fields = sscanf(&line[k], sat_conf, | |
210 &ptr->freq, &ptr->pol, &ptr->diseqc, &ptr->srate, vpid_str, apid_str); | |
211 ptr->pol = toupper(ptr->pol); | |
212 ptr->freq *= 1000UL; | |
213 ptr->srate *= 1000UL; | |
214 ptr->tone = -1; | |
215 ptr->inv = INVERSION_AUTO; | |
216 ptr->cr = FEC_AUTO; | |
217 if((ptr->diseqc > 4) || (ptr->diseqc < 0)) | |
218 continue; | |
219 if(ptr->diseqc > 0) | |
220 ptr->diseqc--; | |
221 mp_msg(MSGT_DEMUX, MSGL_V, | |
222 "SAT, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d, SRATE: %d, POL: %c, DISEQC: %d", | |
223 list->NUM_CHANNELS, fields, ptr->name, ptr->freq, ptr->srate, ptr->pol, ptr->diseqc); | |
224 } | |
225 | |
226 if(vpid_str[0]) | |
227 { | |
228 pcnt = sscanf(vpid_str, "%d+%d+%d+%d+%d+%d+%d", &ptr->pids[0], &ptr->pids[1], &ptr->pids[2], &ptr->pids[3], | |
229 &ptr->pids[4], &ptr->pids[5], &ptr->pids[6]); | |
230 if(pcnt > 0) | |
231 { | |
232 ptr->pids_cnt = pcnt; | |
233 fields++; | |
234 } | |
235 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
236 |
19296 | 237 if(apid_str[0]) |
238 { | |
239 cnt = ptr->pids_cnt; | |
240 pcnt = sscanf(apid_str, "%d+%d+%d+%d+%d+%d+%d+%d", &ptr->pids[cnt], &ptr->pids[cnt+1], &ptr->pids[cnt+2], | |
241 &ptr->pids[cnt+3], &ptr->pids[cnt+4], &ptr->pids[cnt+5], &ptr->pids[cnt+6], &ptr->pids[cnt+7]); | |
242 if(pcnt > 0) | |
243 { | |
244 ptr->pids_cnt += pcnt; | |
245 fields++; | |
246 } | |
247 } | |
248 | |
249 if((fields < 2) || (ptr->pids_cnt <= 0) || (ptr->freq == 0) || (strlen(ptr->name) == 0)) | |
250 continue; | |
251 | |
21814
8032b9d9349d
don't add pid 0 if it's already present in the list
nicodvb
parents:
21465
diff
changeset
|
252 has8192 = has0 = 0; |
21033
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
253 for(cnt = 0; cnt < ptr->pids_cnt; cnt++) |
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
254 { |
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
255 if(ptr->pids[cnt] == 8192) |
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
256 has8192 = 1; |
21814
8032b9d9349d
don't add pid 0 if it's already present in the list
nicodvb
parents:
21465
diff
changeset
|
257 if(ptr->pids[cnt] == 0) |
8032b9d9349d
don't add pid 0 if it's already present in the list
nicodvb
parents:
21465
diff
changeset
|
258 has0 = 1; |
21033
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
259 } |
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
260 if(has8192) |
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
261 { |
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
262 ptr->pids[0] = 8192; |
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
263 ptr->pids_cnt = 1; |
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
264 } |
21814
8032b9d9349d
don't add pid 0 if it's already present in the list
nicodvb
parents:
21465
diff
changeset
|
265 else if(! has0) |
21033
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
266 { |
21034 | 267 ptr->pids[ptr->pids_cnt] = 0; //PID 0 is the PAT |
268 ptr->pids_cnt++; | |
21033
087cad309e9c
if in the list of pids appears at least one 8192 (while TS) remove all other pid filters
nicodvb
parents:
20660
diff
changeset
|
269 } |
19296 | 270 mp_msg(MSGT_DEMUX, MSGL_V, " PIDS: "); |
271 for(cnt = 0; cnt < ptr->pids_cnt; cnt++) | |
272 mp_msg(MSGT_DEMUX, MSGL_V, " %d ", ptr->pids[cnt]); | |
273 mp_msg(MSGT_DEMUX, MSGL_V, "\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
274 |
19296 | 275 if((type == TUNER_TER) || (type == TUNER_CBL)) |
276 { | |
277 if(! strcmp(inv, "INVERSION_ON")) | |
278 ptr->inv = INVERSION_ON; | |
279 else if(! strcmp(inv, "INVERSION_OFF")) | |
280 ptr->inv = INVERSION_OFF; | |
281 else | |
282 ptr->inv = INVERSION_AUTO; | |
283 | |
284 | |
285 if(! strcmp(cr, "FEC_1_2")) | |
286 ptr->cr =FEC_1_2; | |
287 else if(! strcmp(cr, "FEC_2_3")) | |
288 ptr->cr =FEC_2_3; | |
289 else if(! strcmp(cr, "FEC_3_4")) | |
290 ptr->cr =FEC_3_4; | |
291 else if(! strcmp(cr, "FEC_4_5")) | |
292 ptr->cr =FEC_4_5; | |
293 else if(! strcmp(cr, "FEC_6_7")) | |
294 ptr->cr =FEC_6_7; | |
295 else if(! strcmp(cr, "FEC_8_9")) | |
296 ptr->cr =FEC_8_9; | |
297 else if(! strcmp(cr, "FEC_5_6")) | |
298 ptr->cr =FEC_5_6; | |
299 else if(! strcmp(cr, "FEC_7_8")) | |
300 ptr->cr =FEC_7_8; | |
301 else if(! strcmp(cr, "FEC_NONE")) | |
302 ptr->cr =FEC_NONE; | |
303 else ptr->cr =FEC_AUTO; | |
304 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
305 |
19296 | 306 |
307 if((type == TUNER_TER) || (type == TUNER_CBL) || (type == TUNER_ATSC)) | |
308 { | |
309 if(! strcmp(mod, "QAM_128")) | |
310 ptr->mod = QAM_128; | |
311 else if(! strcmp(mod, "QAM_256")) | |
312 ptr->mod = QAM_256; | |
313 else if(! strcmp(mod, "QAM_64")) | |
314 ptr->mod = QAM_64; | |
315 else if(! strcmp(mod, "QAM_32")) | |
316 ptr->mod = QAM_32; | |
317 else if(! strcmp(mod, "QAM_16")) | |
318 ptr->mod = QAM_16; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
319 #ifdef DVB_ATSC |
19296 | 320 else if(! strcmp(mod, "VSB_8") || ! strcmp(mod, "8VSB")) |
321 ptr->mod = VSB_8; | |
322 else if(! strcmp(mod, "VSB_16") || !strcmp(mod, "16VSB")) | |
323 ptr->mod = VSB_16; | |
29761 | 324 else if(! strcmp(mod, "QAM_AUTO")) |
325 ptr->mod = QAM_AUTO; | |
19296 | 326 |
327 #endif | |
328 } | |
329 | |
330 if(type == TUNER_TER) | |
331 { | |
332 if(! strcmp(bw, "BANDWIDTH_6_MHZ")) | |
333 ptr->bw = BANDWIDTH_6_MHZ; | |
334 else if(! strcmp(bw, "BANDWIDTH_7_MHZ")) | |
335 ptr->bw = BANDWIDTH_7_MHZ; | |
336 else if(! strcmp(bw, "BANDWIDTH_8_MHZ")) | |
337 ptr->bw = BANDWIDTH_8_MHZ; | |
338 | |
339 | |
340 if(! strcmp(transm, "TRANSMISSION_MODE_2K")) | |
341 ptr->trans = TRANSMISSION_MODE_2K; | |
342 else if(! strcmp(transm, "TRANSMISSION_MODE_8K")) | |
343 ptr->trans = TRANSMISSION_MODE_8K; | |
29761 | 344 else if(! strcmp(transm, "TRANSMISSION_MODE_AUTO")) |
345 ptr->trans = TRANSMISSION_MODE_AUTO; | |
19296 | 346 |
347 if(! strcmp(gi, "GUARD_INTERVAL_1_32")) | |
348 ptr->gi = GUARD_INTERVAL_1_32; | |
349 else if(! strcmp(gi, "GUARD_INTERVAL_1_16")) | |
350 ptr->gi = GUARD_INTERVAL_1_16; | |
351 else if(! strcmp(gi, "GUARD_INTERVAL_1_8")) | |
352 ptr->gi = GUARD_INTERVAL_1_8; | |
29761 | 353 else if(! strcmp(gi, "GUARD_INTERVAL_1_4")) |
354 ptr->gi = GUARD_INTERVAL_1_4; | |
355 else ptr->gi = GUARD_INTERVAL_AUTO; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
356 |
19296 | 357 if(! strcmp(tmp_lcr, "FEC_1_2")) |
358 ptr->cr_lp =FEC_1_2; | |
359 else if(! strcmp(tmp_lcr, "FEC_2_3")) | |
360 ptr->cr_lp =FEC_2_3; | |
361 else if(! strcmp(tmp_lcr, "FEC_3_4")) | |
362 ptr->cr_lp =FEC_3_4; | |
363 else if(! strcmp(tmp_lcr, "FEC_4_5")) | |
364 ptr->cr_lp =FEC_4_5; | |
365 else if(! strcmp(tmp_lcr, "FEC_6_7")) | |
366 ptr->cr_lp =FEC_6_7; | |
367 else if(! strcmp(tmp_lcr, "FEC_8_9")) | |
368 ptr->cr_lp =FEC_8_9; | |
369 else if(! strcmp(tmp_lcr, "FEC_5_6")) | |
370 ptr->cr_lp =FEC_5_6; | |
371 else if(! strcmp(tmp_lcr, "FEC_7_8")) | |
372 ptr->cr_lp =FEC_7_8; | |
373 else if(! strcmp(tmp_lcr, "FEC_NONE")) | |
374 ptr->cr_lp =FEC_NONE; | |
375 else ptr->cr_lp =FEC_AUTO; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
376 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
377 |
19296 | 378 if(! strcmp(tmp_hier, "HIERARCHY_1")) |
379 ptr->hier = HIERARCHY_1; | |
380 else if(! strcmp(tmp_hier, "HIERARCHY_2")) | |
381 ptr->hier = HIERARCHY_2; | |
382 else if(! strcmp(tmp_hier, "HIERARCHY_4")) | |
383 ptr->hier = HIERARCHY_4; | |
384 else if(! strcmp(tmp_hier, "HIERARCHY_AUTO")) | |
385 ptr->hier = HIERARCHY_AUTO; | |
386 else ptr->hier = HIERARCHY_NONE; | |
387 } | |
388 | |
23629 | 389 tmp = realloc(list->channels, sizeof(dvb_channel_t) * (list->NUM_CHANNELS + 1)); |
19296 | 390 if(tmp == NULL) |
391 break; | |
392 | |
393 list->channels = tmp; | |
394 memcpy(&(list->channels[list->NUM_CHANNELS]), ptr, sizeof(dvb_channel_t)); | |
395 list->NUM_CHANNELS++; | |
396 if(sizeof(dvb_channel_t) * list->NUM_CHANNELS >= 1024*1024) | |
397 { | |
398 mp_msg(MSGT_DEMUX, MSGL_V, "dvbin.c, > 1MB allocated for channels struct, dropping the rest of the file\r\n"); | |
399 break; | |
400 } | |
401 } | |
402 | |
403 fclose(f); | |
404 if(list->NUM_CHANNELS == 0) | |
405 { | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
31800
diff
changeset
|
406 free(list->channels); |
19296 | 407 free(list); |
408 return NULL; | |
409 } | |
410 | |
411 list->current = 0; | |
412 return list; | |
413 } | |
414 | |
25379
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
415 void dvb_free_config(dvb_config_t *config) |
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
416 { |
25389
cd65c1242675
10l, in dvb_free_config() channels' names must be free individually
nicodvb
parents:
25380
diff
changeset
|
417 int i, j; |
19296 | 418 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
419 for(i=0; i<config->count; i++) |
25379
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
420 { |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
31800
diff
changeset
|
421 free(config->cards[i].name); |
25379
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
422 if(!config->cards[i].list) |
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
423 continue; |
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
424 if(config->cards[i].list->channels) |
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
425 { |
25389
cd65c1242675
10l, in dvb_free_config() channels' names must be free individually
nicodvb
parents:
25380
diff
changeset
|
426 for(j=0; j<config->cards[i].list->NUM_CHANNELS; j++) |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
31800
diff
changeset
|
427 free(config->cards[i].list->channels[j].name); |
25379
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
428 free(config->cards[i].list->channels); |
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
429 } |
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
430 free(config->cards[i].list); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
431 } |
25379
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
432 free(config); |
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
433 } |
19296 | 434 |
435 static int dvb_streaming_read(stream_t *stream, char *buffer, int size) | |
436 { | |
437 struct pollfd pfds[1]; | |
438 int pos=0, tries, rk, fd; | |
439 dvb_priv_t *priv = (dvb_priv_t *) stream->priv; | |
440 | |
441 mp_msg(MSGT_DEMUX, MSGL_DBG3, "dvb_streaming_read(%d)\n", size); | |
442 | |
443 tries = priv->retry + 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
444 |
19296 | 445 fd = stream->fd; |
446 while(pos < size) | |
447 { | |
448 pfds[0].fd = fd; | |
449 pfds[0].events = POLLIN | POLLPRI; | |
450 | |
451 rk = size - pos; | |
452 if(poll(pfds, 1, 500) <= 0) | |
453 { | |
23486 | 454 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_streaming_read, attempt N. %d failed with errno %d when reading %d bytes\n", tries, errno, size-pos); |
19296 | 455 errno = 0; |
456 if(--tries > 0) | |
457 continue; | |
458 else | |
459 break; | |
460 } | |
461 if((rk = read(fd, &buffer[pos], rk)) > 0) | |
462 { | |
463 pos += rk; | |
464 mp_msg(MSGT_DEMUX, MSGL_DBG3, "ret (%d) bytes\n", pos); | |
465 } | |
466 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
467 |
19296 | 468 |
469 if(! pos) | |
470 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_streaming_read, return %d bytes\n", pos); | |
471 | |
472 return pos; | |
473 } | |
474 | |
475 static void dvbin_close(stream_t *stream); | |
476 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
477 int dvb_set_channel(stream_t *stream, int card, int n) |
19296 | 478 { |
479 dvb_channels_list *new_list; | |
480 dvb_channel_t *channel; | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
481 dvb_priv_t *priv = stream->priv; |
19296 | 482 char buf[4096]; |
483 dvb_config_t *conf = (dvb_config_t *) priv->config; | |
484 int devno; | |
485 int i; | |
486 | |
487 if((card < 0) || (card > conf->count)) | |
488 { | |
489 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_set_channel: INVALID CARD NUMBER: %d vs %d, abort\n", card, conf->count); | |
490 return 0; | |
491 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
492 |
19296 | 493 devno = conf->cards[card].devno; |
494 new_list = conf->cards[card].list; | |
495 if((n > new_list->NUM_CHANNELS) || (n < 0)) | |
496 { | |
497 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_set_channel: INVALID CHANNEL NUMBER: %d, for card %d, abort\n", n, card); | |
498 return 0; | |
499 } | |
500 channel = &(new_list->channels[n]); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
501 |
19296 | 502 if(priv->is_on) //the fds are already open and we have to stop the demuxers |
503 { | |
504 for(i = 0; i < priv->demux_fds_cnt; i++) | |
505 dvb_demux_stop(priv->demux_fds[i]); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
506 |
19296 | 507 priv->retry = 0; |
508 while(dvb_streaming_read(stream, buf, 4096) > 0); //empty both the stream's and driver's buffer | |
509 if(priv->card != card) | |
510 { | |
511 dvbin_close(stream); | |
24875 | 512 if(! dvb_open_devices(priv, devno, channel->pids_cnt)) |
19296 | 513 { |
514 mp_msg(MSGT_DEMUX, MSGL_ERR, "DVB_SET_CHANNEL, COULDN'T OPEN DEVICES OF CARD: %d, EXIT\n", card); | |
515 return 0; | |
516 } | |
517 } | |
518 else //close all demux_fds with pos > pids required for the new channel or open other demux_fds if we have too few | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
519 { |
24875 | 520 if(! dvb_fix_demuxes(priv, channel->pids_cnt)) |
19296 | 521 return 0; |
522 } | |
523 } | |
524 else | |
525 { | |
24875 | 526 if(! dvb_open_devices(priv, devno, channel->pids_cnt)) |
19296 | 527 { |
528 mp_msg(MSGT_DEMUX, MSGL_ERR, "DVB_SET_CHANNEL2, COULDN'T OPEN DEVICES OF CARD: %d, EXIT\n", card); | |
529 return 0; | |
530 } | |
531 } | |
532 | |
533 priv->card = card; | |
534 priv->list = new_list; | |
535 priv->retry = 5; | |
536 new_list->current = n; | |
537 stream->fd = priv->dvr_fd; | |
538 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_SET_CHANNEL: new channel name=%s, card: %d, channel %d\n", channel->name, card, n); | |
539 | |
30625
bc29a1172753
Replace misuse of stream_reset to set stream pos to 0 by more appropriate code.
reimar
parents:
29761
diff
changeset
|
540 stream->buf_pos = stream->buf_len = 0; |
bc29a1172753
Replace misuse of stream_reset to set stream pos to 0 by more appropriate code.
reimar
parents:
29761
diff
changeset
|
541 stream->pos = 0; |
bc29a1172753
Replace misuse of stream_reset to set stream pos to 0 by more appropriate code.
reimar
parents:
29761
diff
changeset
|
542 stream->eof = 0; |
19296 | 543 |
20659
31b525f90395
nonsense removal: compare old and new frequency in order to skip tuning
nicodvb
parents:
19312
diff
changeset
|
544 if(channel->freq != priv->last_freq) |
19296 | 545 if (! dvb_tune(priv, channel->freq, channel->pol, channel->srate, channel->diseqc, channel->tone, |
546 channel->inv, channel->mod, channel->gi, channel->trans, channel->bw, channel->cr, channel->cr_lp, channel->hier, priv->timeout)) | |
547 return 0; | |
548 | |
20659
31b525f90395
nonsense removal: compare old and new frequency in order to skip tuning
nicodvb
parents:
19312
diff
changeset
|
549 priv->last_freq = channel->freq; |
19296 | 550 priv->is_on = 1; |
551 | |
552 //sets demux filters and restart the stream | |
553 for(i = 0; i < channel->pids_cnt; i++) | |
554 { | |
555 if(! dvb_set_ts_filt(priv->demux_fds[i], channel->pids[i], DMX_PES_OTHER)) | |
556 return 0; | |
557 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
558 |
19296 | 559 return 1; |
560 } | |
561 | |
562 | |
563 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
564 int dvb_step_channel(stream_t *stream, int dir) |
19296 | 565 { |
566 int new_current; | |
567 dvb_channels_list *list; | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
568 dvb_priv_t *priv = stream->priv; |
19296 | 569 |
570 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_STEP_CHANNEL dir %d\n", dir); | |
571 | |
572 if(priv == NULL) | |
573 { | |
574 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_step_channel: NULL priv_ptr, quit\n"); | |
575 return 0; | |
576 } | |
577 | |
578 list = priv->list; | |
579 if(list == NULL) | |
580 { | |
581 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_step_channel: NULL list_ptr, quit\n"); | |
582 return 0; | |
583 } | |
584 | |
585 new_current = (list->NUM_CHANNELS + list->current + (dir == DVB_CHANNEL_HIGHER ? 1 : -1)) % list->NUM_CHANNELS; | |
586 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
587 return dvb_set_channel(stream, priv->card, new_current); |
19296 | 588 } |
589 | |
590 | |
591 | |
592 | |
593 static void dvbin_close(stream_t *stream) | |
594 { | |
595 int i; | |
596 dvb_priv_t *priv = (dvb_priv_t *) stream->priv; | |
597 | |
598 for(i = priv->demux_fds_cnt-1; i >= 0; i--) | |
599 { | |
600 priv->demux_fds_cnt--; | |
601 mp_msg(MSGT_DEMUX, MSGL_V, "DVBIN_CLOSE, close(%d), fd=%d, COUNT=%d\n", i, priv->demux_fds[i], priv->demux_fds_cnt); | |
602 close(priv->demux_fds[i]); | |
603 } | |
604 close(priv->dvr_fd); | |
605 | |
606 close(priv->fe_fd); | |
27863
f3384addfb0b
set to -1 fds that were closed; handle the sec_fd only if CONFIG_DVB_HEAD isn't defined; patch by Reimar
nicodvb
parents:
27858
diff
changeset
|
607 priv->fe_fd = priv->sec_fd = priv->dvr_fd = -1; |
19296 | 608 |
609 priv->is_on = 0; | |
25379
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
610 dvb_free_config(priv->config); |
19296 | 611 } |
612 | |
613 | |
25380
5857ec4dedb4
removed the obscene priv->stream entry. Someone must have injected vodka in my milk when I wrote it
nicodvb
parents:
25379
diff
changeset
|
614 static int dvb_streaming_start(stream_t *stream, struct stream_priv_s *opts, int tuner_type, char *progname) |
19296 | 615 { |
616 int i; | |
617 dvb_channel_t *channel = NULL; | |
25380
5857ec4dedb4
removed the obscene priv->stream entry. Someone must have injected vodka in my milk when I wrote it
nicodvb
parents:
25379
diff
changeset
|
618 dvb_priv_t *priv = stream->priv; |
19296 | 619 |
26391
16ab100f5870
removed useless parameter :type from -dvbin (the frontend type is reported by the card)
nicodvb
parents:
26390
diff
changeset
|
620 mp_msg(MSGT_DEMUX, MSGL_V, "\r\ndvb_streaming_start(PROG: %s, CARD: %d, FILE: %s)\r\n", |
16ab100f5870
removed useless parameter :type from -dvbin (the frontend type is reported by the card)
nicodvb
parents:
26390
diff
changeset
|
621 opts->prog, opts->card, opts->file); |
19296 | 622 |
623 priv->is_on = 0; | |
624 | |
625 i = 0; | |
626 while((channel == NULL) && i < priv->list->NUM_CHANNELS) | |
627 { | |
628 if(! strcmp(priv->list->channels[i].name, progname)) | |
629 channel = &(priv->list->channels[i]); | |
630 | |
631 i++; | |
632 } | |
633 | |
634 if(channel != NULL) | |
635 { | |
636 priv->list->current = i-1; | |
637 mp_msg(MSGT_DEMUX, MSGL_V, "PROGRAM NUMBER %d: name=%s, freq=%u\n", i-1, channel->name, channel->freq); | |
638 } | |
639 else | |
640 { | |
641 mp_msg(MSGT_DEMUX, MSGL_ERR, "\n\nDVBIN: no such channel \"%s\"\n\n", progname); | |
642 return 0; | |
643 } | |
644 | |
645 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
646 if(!dvb_set_channel(stream, priv->card, priv->list->current)) |
19296 | 647 { |
648 mp_msg(MSGT_DEMUX, MSGL_ERR, "ERROR, COULDN'T SET CHANNEL %i: ", priv->list->current); | |
649 dvbin_close(stream); | |
650 return 0; | |
651 } | |
652 | |
653 mp_msg(MSGT_DEMUX, MSGL_V, "SUCCESSFUL EXIT from dvb_streaming_start\n"); | |
654 | |
655 return 1; | |
656 } | |
657 | |
658 | |
659 | |
660 | |
661 static int dvb_open(stream_t *stream, int mode, void *opts, int *file_format) | |
662 { | |
663 // I don't force the file format bacause, although it's almost always TS, | |
664 // there are some providers that stream an IP multicast with M$ Mpeg4 inside | |
665 struct stream_priv_s* p = (struct stream_priv_s*)opts; | |
666 dvb_priv_t *priv; | |
667 char *progname; | |
21241
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
668 int tuner_type = 0, i; |
19296 | 669 |
670 | |
671 if(mode != STREAM_READ) | |
24257 | 672 return STREAM_UNSUPPORTED; |
19296 | 673 |
23629 | 674 stream->priv = calloc(1, sizeof(dvb_priv_t)); |
19296 | 675 if(stream->priv == NULL) |
676 return STREAM_ERROR; | |
677 | |
678 priv = (dvb_priv_t *)stream->priv; | |
27863
f3384addfb0b
set to -1 fds that were closed; handle the sec_fd only if CONFIG_DVB_HEAD isn't defined; patch by Reimar
nicodvb
parents:
27858
diff
changeset
|
679 priv->fe_fd = priv->sec_fd = priv->dvr_fd = -1; |
25379
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
680 priv->config = dvb_get_config(); |
9befb9809011
get rid of the file-static dvb_config and free the config at close() . Patch by Andrew Calkin and me
nicodvb
parents:
25377
diff
changeset
|
681 if(priv->config == NULL) |
19296 | 682 { |
683 free(priv); | |
684 mp_msg(MSGT_DEMUX, MSGL_ERR, "DVB CONFIGURATION IS EMPTY, exit\n"); | |
685 return STREAM_ERROR; | |
686 } | |
687 | |
21241
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
688 priv->card = -1; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
689 for(i=0; i<priv->config->count; i++) |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
690 { |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
691 if(priv->config->cards[i].devno+1 == p->card) |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
692 { |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
693 priv->card = i; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
694 break; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
695 } |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
696 } |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
697 |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
698 if(priv->card == -1) |
19296 | 699 { |
700 free(priv); | |
701 mp_msg(MSGT_DEMUX, MSGL_ERR, "NO CONFIGURATION FOUND FOR CARD N. %d, exit\n", p->card); | |
702 return STREAM_ERROR; | |
703 } | |
704 priv->timeout = p->timeout; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
705 |
19296 | 706 tuner_type = priv->config->cards[priv->card].type; |
707 | |
708 if(tuner_type == 0) | |
709 { | |
710 free(priv); | |
711 mp_msg(MSGT_DEMUX, MSGL_V, "OPEN_DVB: UNKNOWN OR UNDETECTABLE TUNER TYPE, EXIT\n"); | |
712 return STREAM_ERROR; | |
713 } | |
714 | |
715 | |
716 priv->tuner_type = tuner_type; | |
717 | |
26390
b2cc442c095d
removed defunct options :vid and :aid from -dvbin (they were useless from the start)
nicodvb
parents:
26123
diff
changeset
|
718 mp_msg(MSGT_DEMUX, MSGL_V, "OPEN_DVB: prog=%s, card=%d, type=%d\n", |
b2cc442c095d
removed defunct options :vid and :aid from -dvbin (they were useless from the start)
nicodvb
parents:
26123
diff
changeset
|
719 p->prog, priv->card+1, priv->tuner_type); |
19296 | 720 |
721 priv->list = priv->config->cards[priv->card].list; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
722 |
19296 | 723 if((! strcmp(p->prog, "")) && (priv->list != NULL)) |
724 progname = priv->list->channels[0].name; | |
725 else | |
726 progname = p->prog; | |
727 | |
728 | |
25380
5857ec4dedb4
removed the obscene priv->stream entry. Someone must have injected vodka in my milk when I wrote it
nicodvb
parents:
25379
diff
changeset
|
729 if(! dvb_streaming_start(stream, p, tuner_type, progname)) |
19296 | 730 { |
731 free(stream->priv); | |
732 stream->priv = NULL; | |
733 return STREAM_ERROR; | |
734 } | |
735 | |
736 stream->type = STREAMTYPE_DVB; | |
737 stream->fill_buffer = dvb_streaming_read; | |
738 stream->close = dvbin_close; | |
739 m_struct_free(&stream_opts, opts); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
740 |
19296 | 741 *file_format = DEMUXER_TYPE_MPEG_TS; |
742 | |
743 return STREAM_OK; | |
744 } | |
745 | |
746 #define MAX_CARDS 4 | |
747 dvb_config_t *dvb_get_config(void) | |
748 { | |
749 int i, fd, type, size; | |
750 char filename[30], *conf_file, *name; | |
751 dvb_channels_list *list; | |
752 dvb_card_config_t *cards = NULL, *tmp; | |
753 dvb_config_t *conf = NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
754 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
755 |
23629 | 756 conf = malloc(sizeof(dvb_config_t)); |
19296 | 757 if(conf == NULL) |
758 return NULL; | |
759 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
760 conf->priv = NULL; |
19296 | 761 conf->count = 0; |
762 conf->cards = NULL; | |
763 for(i=0; i<MAX_CARDS; i++) | |
764 { | |
22402
963d93b2fe7c
replaced 2 instances of sprintf() with snprintf() and one instance
nicodvb
parents:
21977
diff
changeset
|
765 snprintf(filename, sizeof(filename), "/dev/dvb/adapter%d/frontend0", i); |
21834
8d486fd6cf2f
in dvb_get_config() open the frontend in READ_ONLY mode for probing (worksaround some buggy driver)
nicodvb
parents:
21814
diff
changeset
|
766 fd = open(filename, O_RDONLY|O_NONBLOCK); |
19296 | 767 if(fd < 0) |
768 { | |
769 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_CONFIG, can't open device %s, skipping\n", filename); | |
770 continue; | |
771 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
772 |
19296 | 773 type = dvb_get_tuner_type(fd); |
774 close(fd); | |
775 if(type != TUNER_SAT && type != TUNER_TER && type != TUNER_CBL && type != TUNER_ATSC) | |
776 { | |
777 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_CONFIG, can't detect tuner type of card %d, skipping\n", i); | |
778 continue; | |
779 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
780 |
31800 | 781 conf_file = get_path("channels.conf"); |
19296 | 782 switch(type) |
783 { | |
784 case TUNER_TER: | |
785 conf_file = get_path("channels.conf.ter"); | |
786 break; | |
787 case TUNER_CBL: | |
788 conf_file = get_path("channels.conf.cbl"); | |
789 break; | |
790 case TUNER_SAT: | |
791 conf_file = get_path("channels.conf.sat"); | |
792 break; | |
793 case TUNER_ATSC: | |
794 conf_file = get_path("channels.conf.atsc"); | |
795 break; | |
796 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
797 |
19296 | 798 if((access(conf_file, F_OK | R_OK) != 0)) |
25355
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
799 { |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
31800
diff
changeset
|
800 free(conf_file); |
19296 | 801 conf_file = get_path("channels.conf"); |
26123
37786c8469b2
search channels.conf in mplayer's instdir if all other searches fail; patch by foxcore gmail com
nicodvb
parents:
25692
diff
changeset
|
802 if((access(conf_file, F_OK | R_OK) != 0)) |
37786c8469b2
search channels.conf in mplayer's instdir if all other searches fail; patch by foxcore gmail com
nicodvb
parents:
25692
diff
changeset
|
803 { |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
31800
diff
changeset
|
804 free(conf_file); |
26123
37786c8469b2
search channels.conf in mplayer's instdir if all other searches fail; patch by foxcore gmail com
nicodvb
parents:
25692
diff
changeset
|
805 conf_file = strdup(MPLAYER_CONFDIR "/channels.conf"); |
37786c8469b2
search channels.conf in mplayer's instdir if all other searches fail; patch by foxcore gmail com
nicodvb
parents:
25692
diff
changeset
|
806 } |
25355
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
807 } |
19296 | 808 |
809 list = dvb_get_channels(conf_file, type); | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
31800
diff
changeset
|
810 free(conf_file); |
19296 | 811 if(list == NULL) |
812 continue; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
813 |
19296 | 814 size = sizeof(dvb_card_config_t) * (conf->count + 1); |
815 tmp = realloc(conf->cards, size); | |
816 | |
817 if(tmp == NULL) | |
818 { | |
819 fprintf(stderr, "DVB_CONFIG, can't realloc %d bytes, skipping\n", size); | |
820 continue; | |
821 } | |
822 cards = tmp; | |
823 | |
23629 | 824 name = malloc(20); |
19296 | 825 if(name==NULL) |
826 { | |
827 fprintf(stderr, "DVB_CONFIG, can't realloc 20 bytes, skipping\n"); | |
828 continue; | |
829 } | |
830 | |
831 conf->cards = cards; | |
832 conf->cards[conf->count].devno = i; | |
833 conf->cards[conf->count].list = list; | |
834 conf->cards[conf->count].type = type; | |
22402
963d93b2fe7c
replaced 2 instances of sprintf() with snprintf() and one instance
nicodvb
parents:
21977
diff
changeset
|
835 snprintf(name, 20, "DVB-%c card n. %d", type==TUNER_TER ? 'T' : (type==TUNER_CBL ? 'C' : 'S'), conf->count+1); |
19296 | 836 conf->cards[conf->count].name = name; |
837 conf->count++; | |
838 } | |
839 | |
840 if(conf->count == 0) | |
841 { | |
842 free(conf); | |
843 conf = NULL; | |
844 } | |
845 | |
846 return conf; | |
847 } | |
848 | |
849 | |
850 | |
25211 | 851 const stream_info_t stream_info_dvb = { |
19296 | 852 "Dvb Input", |
853 "dvbin", | |
854 "Nico", | |
855 "based on the code from ??? (probably Arpi)", | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
856 dvb_open, |
19296 | 857 { "dvb", NULL }, |
858 &stream_opts, | |
859 1 // Urls are an option string | |
860 }; |