Mercurial > mplayer.hg
annotate stream/stream_dvb.c @ 26625:5b89b42f6d50
Only compile and use libmpeg2 AltiVec code when AltiVec is available. The
AltiVec code needs -maltivec to compile, but then AltiVec instructions
appear in other places of the code causing MPlayer to sigill.
Somehow upstream libmpeg2 manages not to sigill under what appear to be
the same circumstances. Enlightenment welcome.
author | diego |
---|---|
date | Sat, 03 May 2008 15:23:22 +0000 |
parents | 16ab100f5870 |
children | 14c5017f40d2 |
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> | |
37 #include <sys/poll.h> | |
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; | |
291 #ifdef HAVE_DVB_HEAD | |
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; | |
361 #ifdef HAVE_DVB_HEAD | |
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; | |
384 #ifdef HAVE_DVB_HEAD | |
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); | |
614 #ifdef HAVE_DVB | |
615 close(priv->sec_fd); | |
616 #endif | |
617 | |
618 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
|
619 dvb_free_config(priv->config); |
19296 | 620 } |
621 | |
622 | |
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
|
623 static int dvb_streaming_start(stream_t *stream, struct stream_priv_s *opts, int tuner_type, char *progname) |
19296 | 624 { |
625 int i; | |
626 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
|
627 dvb_priv_t *priv = stream->priv; |
19296 | 628 |
26391
16ab100f5870
removed useless parameter :type from -dvbin (the frontend type is reported by the card)
nicodvb
parents:
26390
diff
changeset
|
629 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
|
630 opts->prog, opts->card, opts->file); |
19296 | 631 |
632 priv->is_on = 0; | |
633 | |
634 i = 0; | |
635 while((channel == NULL) && i < priv->list->NUM_CHANNELS) | |
636 { | |
637 if(! strcmp(priv->list->channels[i].name, progname)) | |
638 channel = &(priv->list->channels[i]); | |
639 | |
640 i++; | |
641 } | |
642 | |
643 if(channel != NULL) | |
644 { | |
645 priv->list->current = i-1; | |
646 mp_msg(MSGT_DEMUX, MSGL_V, "PROGRAM NUMBER %d: name=%s, freq=%u\n", i-1, channel->name, channel->freq); | |
647 } | |
648 else | |
649 { | |
650 mp_msg(MSGT_DEMUX, MSGL_ERR, "\n\nDVBIN: no such channel \"%s\"\n\n", progname); | |
651 return 0; | |
652 } | |
653 | |
654 | |
25377
31e0937ebe38
dvb cleanup: call dvb_(set|step)_channel() without dereferencing stream->priv (1000l to me)
nicodvb
parents:
25355
diff
changeset
|
655 if(!dvb_set_channel(stream, priv->card, priv->list->current)) |
19296 | 656 { |
657 mp_msg(MSGT_DEMUX, MSGL_ERR, "ERROR, COULDN'T SET CHANNEL %i: ", priv->list->current); | |
658 dvbin_close(stream); | |
659 return 0; | |
660 } | |
661 | |
662 mp_msg(MSGT_DEMUX, MSGL_V, "SUCCESSFUL EXIT from dvb_streaming_start\n"); | |
663 | |
664 return 1; | |
665 } | |
666 | |
667 | |
668 | |
669 | |
670 static int dvb_open(stream_t *stream, int mode, void *opts, int *file_format) | |
671 { | |
672 // I don't force the file format bacause, although it's almost always TS, | |
673 // there are some providers that stream an IP multicast with M$ Mpeg4 inside | |
674 struct stream_priv_s* p = (struct stream_priv_s*)opts; | |
675 dvb_priv_t *priv; | |
676 char *progname; | |
21241
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
677 int tuner_type = 0, i; |
19296 | 678 |
679 | |
680 if(mode != STREAM_READ) | |
24257 | 681 return STREAM_UNSUPPORTED; |
19296 | 682 |
23629 | 683 stream->priv = calloc(1, sizeof(dvb_priv_t)); |
19296 | 684 if(stream->priv == NULL) |
685 return STREAM_ERROR; | |
686 | |
687 priv = (dvb_priv_t *)stream->priv; | |
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
|
688 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
|
689 if(priv->config == NULL) |
19296 | 690 { |
691 free(priv); | |
692 mp_msg(MSGT_DEMUX, MSGL_ERR, "DVB CONFIGURATION IS EMPTY, exit\n"); | |
693 return STREAM_ERROR; | |
694 } | |
695 | |
21241
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
696 priv->card = -1; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
697 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
|
698 { |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
699 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
|
700 { |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
701 priv->card = i; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
702 break; |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
703 } |
6e3fb3e851ac
match exactly card number N specified, rather than the N-th actually usable
nicodvb
parents:
21034
diff
changeset
|
704 } |
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 if(priv->card == -1) |
19296 | 707 { |
708 free(priv); | |
709 mp_msg(MSGT_DEMUX, MSGL_ERR, "NO CONFIGURATION FOUND FOR CARD N. %d, exit\n", p->card); | |
710 return STREAM_ERROR; | |
711 } | |
712 priv->timeout = p->timeout; | |
713 | |
714 tuner_type = priv->config->cards[priv->card].type; | |
715 | |
716 if(tuner_type == 0) | |
717 { | |
718 free(priv); | |
719 mp_msg(MSGT_DEMUX, MSGL_V, "OPEN_DVB: UNKNOWN OR UNDETECTABLE TUNER TYPE, EXIT\n"); | |
720 return STREAM_ERROR; | |
721 } | |
722 | |
723 | |
724 priv->tuner_type = tuner_type; | |
725 | |
26390
b2cc442c095d
removed defunct options :vid and :aid from -dvbin (they were useless from the start)
nicodvb
parents:
26123
diff
changeset
|
726 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
|
727 p->prog, priv->card+1, priv->tuner_type); |
19296 | 728 |
729 priv->list = priv->config->cards[priv->card].list; | |
730 | |
731 if((! strcmp(p->prog, "")) && (priv->list != NULL)) | |
732 progname = priv->list->channels[0].name; | |
733 else | |
734 progname = p->prog; | |
735 | |
736 | |
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
|
737 if(! dvb_streaming_start(stream, p, tuner_type, progname)) |
19296 | 738 { |
739 free(stream->priv); | |
740 stream->priv = NULL; | |
741 return STREAM_ERROR; | |
742 } | |
743 | |
744 stream->type = STREAMTYPE_DVB; | |
745 stream->fill_buffer = dvb_streaming_read; | |
746 stream->close = dvbin_close; | |
747 m_struct_free(&stream_opts, opts); | |
748 | |
749 *file_format = DEMUXER_TYPE_MPEG_TS; | |
750 | |
751 return STREAM_OK; | |
752 } | |
753 | |
754 #define MAX_CARDS 4 | |
755 dvb_config_t *dvb_get_config(void) | |
756 { | |
757 int i, fd, type, size; | |
758 char filename[30], *conf_file, *name; | |
759 dvb_channels_list *list; | |
760 dvb_card_config_t *cards = NULL, *tmp; | |
761 dvb_config_t *conf = NULL; | |
762 | |
763 | |
23629 | 764 conf = malloc(sizeof(dvb_config_t)); |
19296 | 765 if(conf == NULL) |
766 return NULL; | |
767 | |
768 conf->priv = NULL; | |
769 conf->count = 0; | |
770 conf->cards = NULL; | |
771 for(i=0; i<MAX_CARDS; i++) | |
772 { | |
22402
963d93b2fe7c
replaced 2 instances of sprintf() with snprintf() and one instance
nicodvb
parents:
21977
diff
changeset
|
773 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
|
774 fd = open(filename, O_RDONLY|O_NONBLOCK); |
19296 | 775 if(fd < 0) |
776 { | |
777 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_CONFIG, can't open device %s, skipping\n", filename); | |
778 continue; | |
779 } | |
780 | |
781 type = dvb_get_tuner_type(fd); | |
782 close(fd); | |
783 if(type != TUNER_SAT && type != TUNER_TER && type != TUNER_CBL && type != TUNER_ATSC) | |
784 { | |
785 mp_msg(MSGT_DEMUX, MSGL_V, "DVB_CONFIG, can't detect tuner type of card %d, skipping\n", i); | |
786 continue; | |
787 } | |
788 | |
789 switch(type) | |
790 { | |
791 case TUNER_TER: | |
792 conf_file = get_path("channels.conf.ter"); | |
793 break; | |
794 case TUNER_CBL: | |
795 conf_file = get_path("channels.conf.cbl"); | |
796 break; | |
797 case TUNER_SAT: | |
798 conf_file = get_path("channels.conf.sat"); | |
799 break; | |
800 case TUNER_ATSC: | |
801 conf_file = get_path("channels.conf.atsc"); | |
802 break; | |
803 } | |
804 | |
805 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
|
806 { |
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
807 if(conf_file) |
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
808 free(conf_file); |
19296 | 809 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
|
810 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
|
811 { |
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(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
|
813 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
|
814 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
|
815 } |
25355
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
816 } |
19296 | 817 |
818 list = dvb_get_channels(conf_file, type); | |
25355
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
819 if(conf_file) |
3110688d2406
fix memleaks; patch by andrew calkin from gmail com
nicodvb
parents:
25242
diff
changeset
|
820 free(conf_file); |
19296 | 821 if(list == NULL) |
822 continue; | |
823 | |
824 size = sizeof(dvb_card_config_t) * (conf->count + 1); | |
825 tmp = realloc(conf->cards, size); | |
826 | |
827 if(tmp == NULL) | |
828 { | |
829 fprintf(stderr, "DVB_CONFIG, can't realloc %d bytes, skipping\n", size); | |
830 continue; | |
831 } | |
832 cards = tmp; | |
833 | |
23629 | 834 name = malloc(20); |
19296 | 835 if(name==NULL) |
836 { | |
837 fprintf(stderr, "DVB_CONFIG, can't realloc 20 bytes, skipping\n"); | |
838 continue; | |
839 } | |
840 | |
841 conf->cards = cards; | |
842 conf->cards[conf->count].devno = i; | |
843 conf->cards[conf->count].list = list; | |
844 conf->cards[conf->count].type = type; | |
22402
963d93b2fe7c
replaced 2 instances of sprintf() with snprintf() and one instance
nicodvb
parents:
21977
diff
changeset
|
845 snprintf(name, 20, "DVB-%c card n. %d", type==TUNER_TER ? 'T' : (type==TUNER_CBL ? 'C' : 'S'), conf->count+1); |
19296 | 846 conf->cards[conf->count].name = name; |
847 conf->count++; | |
848 } | |
849 | |
850 if(conf->count == 0) | |
851 { | |
852 free(conf); | |
853 conf = NULL; | |
854 } | |
855 | |
856 return conf; | |
857 } | |
858 | |
859 | |
860 | |
25211 | 861 const stream_info_t stream_info_dvb = { |
19296 | 862 "Dvb Input", |
863 "dvbin", | |
864 "Nico", | |
865 "based on the code from ??? (probably Arpi)", | |
866 dvb_open, | |
867 { "dvb", NULL }, | |
868 &stream_opts, | |
869 1 // Urls are an option string | |
870 }; |