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