Mercurial > mplayer.hg
annotate stream/stream_dvb.c @ 27985:1c77b86d355d
Remove a ColorFill that is not necessary since the surface it is used
on has exactly the same size as the video image and the video will
be copied into it before it is used the first time.
author | reimar |
---|---|
date | Mon, 24 Nov 2008 09:46:23 +0000 |
parents | f3384addfb0b |
children | 9e739bdb049c |
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" | |
24242
76f5d8892c04
Clean up the way get_path is handled: Compile get_path.c to an object to link
diego
parents:
23703
diff
changeset
|
47 #include "get_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 | |
108 extern int dvb_set_ts_filt(int fd, uint16_t pid, dmx_pes_type_t pestype); | |
109 extern int dvb_demux_stop(int fd); | |
110 extern 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 |
114 extern int dvb_tune(dvb_priv_t *priv, int freq, char pol, int srate, int diseqc, int tone, | |
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"; | |
135 | |
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 } | |
236 | |
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"); | |
274 | |
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; | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
26391
diff
changeset
|
291 #ifdef CONFIG_DVB_HEAD |
19296 | 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 #endif | |
299 else if(! strcmp(cr, "FEC_5_6")) | |
300 ptr->cr =FEC_5_6; | |
301 else if(! strcmp(cr, "FEC_7_8")) | |
302 ptr->cr =FEC_7_8; | |
303 else if(! strcmp(cr, "FEC_NONE")) | |
304 ptr->cr =FEC_NONE; | |
305 else ptr->cr =FEC_AUTO; | |
306 } | |
307 | |
308 | |
309 if((type == TUNER_TER) || (type == TUNER_CBL) || (type == TUNER_ATSC)) | |
310 { | |
311 if(! strcmp(mod, "QAM_128")) | |
312 ptr->mod = QAM_128; | |
313 else if(! strcmp(mod, "QAM_256")) | |
314 ptr->mod = QAM_256; | |
315 else if(! strcmp(mod, "QAM_64")) | |
316 ptr->mod = QAM_64; | |
317 else if(! strcmp(mod, "QAM_32")) | |
318 ptr->mod = QAM_32; | |
319 else if(! strcmp(mod, "QAM_16")) | |
320 ptr->mod = QAM_16; | |
321 #ifdef DVB_ATSC | |
322 else if(! strcmp(mod, "VSB_8") || ! strcmp(mod, "8VSB")) | |
323 ptr->mod = VSB_8; | |
324 else if(! strcmp(mod, "VSB_16") || !strcmp(mod, "16VSB")) | |
325 ptr->mod = VSB_16; | |
326 | |
327 ptr->inv = INVERSION_AUTO; | |
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; | |
345 | |
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; | |
353 else ptr->gi = GUARD_INTERVAL_1_4; | |
354 | |
355 if(! strcmp(tmp_lcr, "FEC_1_2")) | |
356 ptr->cr_lp =FEC_1_2; | |
357 else if(! strcmp(tmp_lcr, "FEC_2_3")) | |
358 ptr->cr_lp =FEC_2_3; | |
359 else if(! strcmp(tmp_lcr, "FEC_3_4")) | |
360 ptr->cr_lp =FEC_3_4; | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
26391
diff
changeset
|
361 #ifdef CONFIG_DVB_HEAD |
19296 | 362 else if(! strcmp(tmp_lcr, "FEC_4_5")) |
363 ptr->cr_lp =FEC_4_5; | |
364 else if(! strcmp(tmp_lcr, "FEC_6_7")) | |
365 ptr->cr_lp =FEC_6_7; | |
366 else if(! strcmp(tmp_lcr, "FEC_8_9")) | |
367 ptr->cr_lp =FEC_8_9; | |
368 #endif | |
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; | |
376 | |
377 | |
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; | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
26391
diff
changeset
|
384 #ifdef CONFIG_DVB_HEAD |
19296 | 385 else if(! strcmp(tmp_hier, "HIERARCHY_AUTO")) |
386 ptr->hier = HIERARCHY_AUTO; | |
387 #endif | |
388 else ptr->hier = HIERARCHY_NONE; | |
389 } | |
390 | |
23629 | 391 tmp = realloc(list->channels, sizeof(dvb_channel_t) * (list->NUM_CHANNELS + 1)); |
19296 | 392 if(tmp == NULL) |
393 break; | |
394 | |
395 list->channels = tmp; | |
396 memcpy(&(list->channels[list->NUM_CHANNELS]), ptr, sizeof(dvb_channel_t)); | |
397 list->NUM_CHANNELS++; | |
398 if(sizeof(dvb_channel_t) * list->NUM_CHANNELS >= 1024*1024) | |
399 { | |
400 mp_msg(MSGT_DEMUX, MSGL_V, "dvbin.c, > 1MB allocated for channels struct, dropping the rest of the file\r\n"); | |
401 break; | |
402 } | |
403 } | |
404 | |
405 fclose(f); | |
406 if(list->NUM_CHANNELS == 0) | |
407 { | |
408 if(list->channels != NULL) | |
409 free(list->channels); | |
410 free(list); | |
411 return NULL; | |
412 } | |
413 | |
414 list->current = 0; | |
415 return list; | |
416 } | |
417 | |
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
|
418 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
|
419 { |
25389
cd65c1242675
10l, in dvb_free_config() channels' names must be free individually
nicodvb
parents:
25380
diff
changeset
|
420 int i, j; |
19296 | 421 |
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 for(i=0; i<config->count; i++) |
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 { |
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].name) |
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 free(config->cards[i].name); |
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 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
|
427 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
|
428 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
|
429 { |
25389
cd65c1242675
10l, in dvb_free_config() channels' names must be free individually
nicodvb
parents:
25380
diff
changeset
|
430 for(j=0; j<config->cards[i].list->NUM_CHANNELS; j++) |
cd65c1242675
10l, in dvb_free_config() channels' names must be free individually
nicodvb
parents:
25380
diff
changeset
|
431 { |
cd65c1242675
10l, in dvb_free_config() channels' names must be free individually
nicodvb
parents:
25380
diff
changeset
|
432 if(config->cards[i].list->channels[j].name) |
cd65c1242675
10l, in dvb_free_config() channels' names must be free individually
nicodvb
parents:
25380
diff
changeset
|
433 free(config->cards[i].list->channels[j].name); |
cd65c1242675
10l, in dvb_free_config() channels' names must be free individually
nicodvb
parents:
25380
diff
changeset
|
434 } |
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
|
435 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
|
436 } |
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
|
437 free(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
|
438 } |
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
|
439 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
|
440 } |
19296 | 441 |
442 static int dvb_streaming_read(stream_t *stream, char *buffer, int size) | |
443 { | |
444 struct pollfd pfds[1]; | |
445 int pos=0, tries, rk, fd; | |
446 dvb_priv_t *priv = (dvb_priv_t *) stream->priv; | |
447 | |
448 mp_msg(MSGT_DEMUX, MSGL_DBG3, "dvb_streaming_read(%d)\n", size); | |
449 | |
450 tries = priv->retry + 1; | |
451 | |
452 fd = stream->fd; | |
453 while(pos < size) | |
454 { | |
455 pfds[0].fd = fd; | |
456 pfds[0].events = POLLIN | POLLPRI; | |
457 | |
458 rk = size - pos; | |
459 if(poll(pfds, 1, 500) <= 0) | |
460 { | |
23486 | 461 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 | 462 errno = 0; |
463 if(--tries > 0) | |
464 continue; | |
465 else | |
466 break; | |
467 } | |
468 if((rk = read(fd, &buffer[pos], rk)) > 0) | |
469 { | |
470 pos += rk; | |
471 mp_msg(MSGT_DEMUX, MSGL_DBG3, "ret (%d) bytes\n", pos); | |
472 } | |
473 } | |
474 | |
475 | |
476 if(! pos) | |
477 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_streaming_read, return %d bytes\n", pos); | |
478 | |
479 return pos; | |
480 } | |
481 | |
482 static void dvbin_close(stream_t *stream); | |
483 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
484 int dvb_set_channel(stream_t *stream, int card, int n) |
19296 | 485 { |
486 dvb_channels_list *new_list; | |
487 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
|
488 dvb_priv_t *priv = stream->priv; |
19296 | 489 char buf[4096]; |
490 dvb_config_t *conf = (dvb_config_t *) priv->config; | |
491 int devno; | |
492 int i; | |
493 | |
494 if((card < 0) || (card > conf->count)) | |
495 { | |
496 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_set_channel: INVALID CARD NUMBER: %d vs %d, abort\n", card, conf->count); | |
497 return 0; | |
498 } | |
499 | |
500 devno = conf->cards[card].devno; | |
501 new_list = conf->cards[card].list; | |
502 if((n > new_list->NUM_CHANNELS) || (n < 0)) | |
503 { | |
504 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_set_channel: INVALID CHANNEL NUMBER: %d, for card %d, abort\n", n, card); | |
505 return 0; | |
506 } | |
507 channel = &(new_list->channels[n]); | |
508 | |
509 if(priv->is_on) //the fds are already open and we have to stop the demuxers | |
510 { | |
511 for(i = 0; i < priv->demux_fds_cnt; i++) | |
512 dvb_demux_stop(priv->demux_fds[i]); | |
513 | |
514 priv->retry = 0; | |
515 while(dvb_streaming_read(stream, buf, 4096) > 0); //empty both the stream's and driver's buffer | |
516 if(priv->card != card) | |
517 { | |
518 dvbin_close(stream); | |
24875 | 519 if(! dvb_open_devices(priv, devno, channel->pids_cnt)) |
19296 | 520 { |
521 mp_msg(MSGT_DEMUX, MSGL_ERR, "DVB_SET_CHANNEL, COULDN'T OPEN DEVICES OF CARD: %d, EXIT\n", card); | |
522 return 0; | |
523 } | |
524 } | |
525 else //close all demux_fds with pos > pids required for the new channel or open other demux_fds if we have too few | |
526 { | |
24875 | 527 if(! dvb_fix_demuxes(priv, channel->pids_cnt)) |
19296 | 528 return 0; |
529 } | |
530 } | |
531 else | |
532 { | |
24875 | 533 if(! dvb_open_devices(priv, devno, channel->pids_cnt)) |
19296 | 534 { |
535 mp_msg(MSGT_DEMUX, MSGL_ERR, "DVB_SET_CHANNEL2, COULDN'T OPEN DEVICES OF CARD: %d, EXIT\n", card); | |
536 return 0; | |
537 } | |
538 } | |
539 | |
540 priv->card = card; | |
541 priv->list = new_list; | |
542 priv->retry = 5; | |
543 new_list->current = n; | |
544 stream->fd = priv->dvr_fd; | |
545 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_SET_CHANNEL: new channel name=%s, card: %d, channel %d\n", channel->name, card, n); | |
546 | |
547 stream->eof=1; | |
548 stream_reset(stream); | |
549 | |
550 | |
20659
31b525f90395
nonsense removal: compare old and new frequency in order to skip tuning
nicodvb
parents:
19312
diff
changeset
|
551 if(channel->freq != priv->last_freq) |
19296 | 552 if (! dvb_tune(priv, channel->freq, channel->pol, channel->srate, channel->diseqc, channel->tone, |
553 channel->inv, channel->mod, channel->gi, channel->trans, channel->bw, channel->cr, channel->cr_lp, channel->hier, priv->timeout)) | |
554 return 0; | |
555 | |
20659
31b525f90395
nonsense removal: compare old and new frequency in order to skip tuning
nicodvb
parents:
19312
diff
changeset
|
556 priv->last_freq = channel->freq; |
19296 | 557 priv->is_on = 1; |
558 | |
559 //sets demux filters and restart the stream | |
560 for(i = 0; i < channel->pids_cnt; i++) | |
561 { | |
562 if(! dvb_set_ts_filt(priv->demux_fds[i], channel->pids[i], DMX_PES_OTHER)) | |
563 return 0; | |
564 } | |
565 | |
566 return 1; | |
567 } | |
568 | |
569 | |
570 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
571 int dvb_step_channel(stream_t *stream, int dir) |
19296 | 572 { |
573 int new_current; | |
574 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
|
575 dvb_priv_t *priv = stream->priv; |
19296 | 576 |
577 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_STEP_CHANNEL dir %d\n", dir); | |
578 | |
579 if(priv == NULL) | |
580 { | |
581 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_step_channel: NULL priv_ptr, quit\n"); | |
582 return 0; | |
583 } | |
584 | |
585 list = priv->list; | |
586 if(list == NULL) | |
587 { | |
588 mp_msg(MSGT_DEMUX, MSGL_ERR, "dvb_step_channel: NULL list_ptr, quit\n"); | |
589 return 0; | |
590 } | |
591 | |
592 new_current = (list->NUM_CHANNELS + list->current + (dir == DVB_CHANNEL_HIGHER ? 1 : -1)) % list->NUM_CHANNELS; | |
593 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
594 return dvb_set_channel(stream, priv->card, new_current); |
19296 | 595 } |
596 | |
597 | |
598 | |
599 | |
600 static void dvbin_close(stream_t *stream) | |
601 { | |
602 int i; | |
603 dvb_priv_t *priv = (dvb_priv_t *) stream->priv; | |
604 | |
605 for(i = priv->demux_fds_cnt-1; i >= 0; i--) | |
606 { | |
607 priv->demux_fds_cnt--; | |
608 mp_msg(MSGT_DEMUX, MSGL_V, "DVBIN_CLOSE, close(%d), fd=%d, COUNT=%d\n", i, priv->demux_fds[i], priv->demux_fds_cnt); | |
609 close(priv->demux_fds[i]); | |
610 } | |
611 close(priv->dvr_fd); | |
612 | |
613 close(priv->fe_fd); | |
27858
ec0764bddc5a
Fix condition broken in r27401 which incorrectly caused stdin to be closed after playing DVB.
reimar
parents:
27431
diff
changeset
|
614 #ifndef CONFIG_DVB_HEAD |
19296 | 615 close(priv->sec_fd); |
616 #endif | |
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
|
617 priv->fe_fd = priv->sec_fd = priv->dvr_fd = -1; |
19296 | 618 |
619 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
|
620 dvb_free_config(priv->config); |
19296 | 621 } |
622 | |
623 | |
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
|
624 static int dvb_streaming_start(stream_t *stream, struct stream_priv_s *opts, int tuner_type, char *progname) |
19296 | 625 { |
626 int i; | |
627 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
|
628 dvb_priv_t *priv = stream->priv; |
19296 | 629 |
26391
16ab100f5870
removed useless parameter :type from -dvbin (the frontend type is reported by the card)
nicodvb
parents:
26390
diff
changeset
|
630 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
|
631 opts->prog, opts->card, opts->file); |
19296 | 632 |
633 priv->is_on = 0; | |
634 | |
635 i = 0; | |
636 while((channel == NULL) && i < priv->list->NUM_CHANNELS) | |
637 { | |
638 if(! strcmp(priv->list->channels[i].name, progname)) | |
639 channel = &(priv->list->channels[i]); | |
640 | |
641 i++; | |
642 } | |
643 | |
644 if(channel != NULL) | |
645 { | |
646 priv->list->current = i-1; | |
647 mp_msg(MSGT_DEMUX, MSGL_V, "PROGRAM NUMBER %d: name=%s, freq=%u\n", i-1, channel->name, channel->freq); | |
648 } | |
649 else | |
650 { | |
651 mp_msg(MSGT_DEMUX, MSGL_ERR, "\n\nDVBIN: no such channel \"%s\"\n\n", progname); | |
652 return 0; | |
653 } | |
654 | |
655 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
656 if(!dvb_set_channel(stream, priv->card, priv->list->current)) |
19296 | 657 { |
658 mp_msg(MSGT_DEMUX, MSGL_ERR, "ERROR, COULDN'T SET CHANNEL %i: ", priv->list->current); | |
659 dvbin_close(stream); | |
660 return 0; | |
661 } | |
662 | |
663 mp_msg(MSGT_DEMUX, MSGL_V, "SUCCESSFUL EXIT from dvb_streaming_start\n"); | |
664 | |
665 return 1; | |
666 } | |
667 | |
668 | |
669 | |
670 | |
671 static int dvb_open(stream_t *stream, int mode, void *opts, int *file_format) | |
672 { | |
673 // I don't force the file format bacause, although it's almost always TS, | |
674 // there are some providers that stream an IP multicast with M$ Mpeg4 inside | |
675 struct stream_priv_s* p = (struct stream_priv_s*)opts; | |
676 dvb_priv_t *priv; | |
677 char *progname; | |
21241
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
678 int tuner_type = 0, i; |
19296 | 679 |
680 | |
681 if(mode != STREAM_READ) | |
24257 | 682 return STREAM_UNSUPPORTED; |
19296 | 683 |
23629 | 684 stream->priv = calloc(1, sizeof(dvb_priv_t)); |
19296 | 685 if(stream->priv == NULL) |
686 return STREAM_ERROR; | |
687 | |
688 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
|
689 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
|
690 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
|
691 if(priv->config == NULL) |
19296 | 692 { |
693 free(priv); | |
694 mp_msg(MSGT_DEMUX, MSGL_ERR, "DVB CONFIGURATION IS EMPTY, exit\n"); | |
695 return STREAM_ERROR; | |
696 } | |
697 | |
21241
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
698 priv->card = -1; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
699 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
|
700 { |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
701 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
|
702 { |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
703 priv->card = i; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
704 break; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
705 } |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
706 } |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
707 |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
708 if(priv->card == -1) |
19296 | 709 { |
710 free(priv); | |
711 mp_msg(MSGT_DEMUX, MSGL_ERR, "NO CONFIGURATION FOUND FOR CARD N. %d, exit\n", p->card); | |
712 return STREAM_ERROR; | |
713 } | |
714 priv->timeout = p->timeout; | |
715 | |
716 tuner_type = priv->config->cards[priv->card].type; | |
717 | |
718 if(tuner_type == 0) | |
719 { | |
720 free(priv); | |
721 mp_msg(MSGT_DEMUX, MSGL_V, "OPEN_DVB: UNKNOWN OR UNDETECTABLE TUNER TYPE, EXIT\n"); | |
722 return STREAM_ERROR; | |
723 } | |
724 | |
725 | |
726 priv->tuner_type = tuner_type; | |
727 | |
26390
b2cc442c095d
removed defunct options :vid and :aid from -dvbin (they were useless from the start)
nicodvb
parents:
26123
diff
changeset
|
728 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
|
729 p->prog, priv->card+1, priv->tuner_type); |
19296 | 730 |
731 priv->list = priv->config->cards[priv->card].list; | |
732 | |
733 if((! strcmp(p->prog, "")) && (priv->list != NULL)) | |
734 progname = priv->list->channels[0].name; | |
735 else | |
736 progname = p->prog; | |
737 | |
738 | |
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
|
739 if(! dvb_streaming_start(stream, p, tuner_type, progname)) |
19296 | 740 { |
741 free(stream->priv); | |
742 stream->priv = NULL; | |
743 return STREAM_ERROR; | |
744 } | |
745 | |
746 stream->type = STREAMTYPE_DVB; | |
747 stream->fill_buffer = dvb_streaming_read; | |
748 stream->close = dvbin_close; | |
749 m_struct_free(&stream_opts, opts); | |
750 | |
751 *file_format = DEMUXER_TYPE_MPEG_TS; | |
752 | |
753 return STREAM_OK; | |
754 } | |
755 | |
756 #define MAX_CARDS 4 | |
757 dvb_config_t *dvb_get_config(void) | |
758 { | |
759 int i, fd, type, size; | |
760 char filename[30], *conf_file, *name; | |
761 dvb_channels_list *list; | |
762 dvb_card_config_t *cards = NULL, *tmp; | |
763 dvb_config_t *conf = NULL; | |
764 | |
765 | |
23629 | 766 conf = malloc(sizeof(dvb_config_t)); |
19296 | 767 if(conf == NULL) |
768 return NULL; | |
769 | |
770 conf->priv = NULL; | |
771 conf->count = 0; | |
772 conf->cards = NULL; | |
773 for(i=0; i<MAX_CARDS; i++) | |
774 { | |
22402
963d93b2fe7c
replaced 2 instances of sprintf() with snprintf() and one instance
nicodvb
parents:
21977
diff
changeset
|
775 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
|
776 fd = open(filename, O_RDONLY|O_NONBLOCK); |
19296 | 777 if(fd < 0) |
778 { | |
779 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_CONFIG, can't open device %s, skipping\n", filename); | |
780 continue; | |
781 } | |
782 | |
783 type = dvb_get_tuner_type(fd); | |
784 close(fd); | |
785 if(type != TUNER_SAT && type != TUNER_TER && type != TUNER_CBL && type != TUNER_ATSC) | |
786 { | |
787 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_CONFIG, can't detect tuner type of card %d, skipping\n", i); | |
788 continue; | |
789 } | |
790 | |
791 switch(type) | |
792 { | |
793 case TUNER_TER: | |
794 conf_file = get_path("channels.conf.ter"); | |
795 break; | |
796 case TUNER_CBL: | |
797 conf_file = get_path("channels.conf.cbl"); | |
798 break; | |
799 case TUNER_SAT: | |
800 conf_file = get_path("channels.conf.sat"); | |
801 break; | |
802 case TUNER_ATSC: | |
803 conf_file = get_path("channels.conf.atsc"); | |
804 break; | |
805 } | |
806 | |
807 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
|
808 { |
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
809 if(conf_file) |
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
810 free(conf_file); |
19296 | 811 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
|
812 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
|
813 { |
37786c8469b2
search channels.conf in mplayer's instdir if all other searches fail; patch by foxcore gmail com
nicodvb
parents:
25692
diff
changeset
|
814 if(conf_file) |
37786c8469b2
search channels.conf in mplayer's instdir if all other searches fail; patch by foxcore gmail com
nicodvb
parents:
25692
diff
changeset
|
815 free(conf_file); |
37786c8469b2
search channels.conf in mplayer's instdir if all other searches fail; patch by foxcore gmail com
nicodvb
parents:
25692
diff
changeset
|
816 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
|
817 } |
25355
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
818 } |
19296 | 819 |
820 list = dvb_get_channels(conf_file, type); | |
25355
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
821 if(conf_file) |
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
822 free(conf_file); |
19296 | 823 if(list == NULL) |
824 continue; | |
825 | |
826 size = sizeof(dvb_card_config_t) * (conf->count + 1); | |
827 tmp = realloc(conf->cards, size); | |
828 | |
829 if(tmp == NULL) | |
830 { | |
831 fprintf(stderr, "DVB_CONFIG, can't realloc %d bytes, skipping\n", size); | |
832 continue; | |
833 } | |
834 cards = tmp; | |
835 | |
23629 | 836 name = malloc(20); |
19296 | 837 if(name==NULL) |
838 { | |
839 fprintf(stderr, "DVB_CONFIG, can't realloc 20 bytes, skipping\n"); | |
840 continue; | |
841 } | |
842 | |
843 conf->cards = cards; | |
844 conf->cards[conf->count].devno = i; | |
845 conf->cards[conf->count].list = list; | |
846 conf->cards[conf->count].type = type; | |
22402
963d93b2fe7c
replaced 2 instances of sprintf() with snprintf() and one instance
nicodvb
parents:
21977
diff
changeset
|
847 snprintf(name, 20, "DVB-%c card n. %d", type==TUNER_TER ? 'T' : (type==TUNER_CBL ? 'C' : 'S'), conf->count+1); |
19296 | 848 conf->cards[conf->count].name = name; |
849 conf->count++; | |
850 } | |
851 | |
852 if(conf->count == 0) | |
853 { | |
854 free(conf); | |
855 conf = NULL; | |
856 } | |
857 | |
858 return conf; | |
859 } | |
860 | |
861 | |
862 | |
25211 | 863 const stream_info_t stream_info_dvb = { |
19296 | 864 "Dvb Input", |
865 "dvbin", | |
866 "Nico", | |
867 "based on the code from ??? (probably Arpi)", | |
868 dvb_open, | |
869 { "dvb", NULL }, | |
870 &stream_opts, | |
871 1 // Urls are an option string | |
872 }; |