diff options
author | wm4 <wm4@nowhere> | 2015-01-06 20:19:49 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-01-06 20:19:49 +0100 |
commit | c915b0b0ecb9bbe66252ab96113c8c3bc9c70eb3 (patch) | |
tree | c26188fd3bb8ddf54b4e484f791f9b9f0f78910e /stream/stream_dvb.c | |
parent | ec92ab294e68dc29ce2c179bae4e1587950da1f2 (diff) | |
download | mpv-c915b0b0ecb9bbe66252ab96113c8c3bc9c70eb3.tar.bz2 mpv-c915b0b0ecb9bbe66252ab96113c8c3bc9c70eb3.tar.xz |
dvb: uncrustify
Mostly automatic, some manual changes.
Diffstat (limited to 'stream/stream_dvb.c')
-rw-r--r-- | stream/stream_dvb.c | 1588 |
1 files changed, 799 insertions, 789 deletions
diff --git a/stream/stream_dvb.c b/stream/stream_dvb.c index 065604f7ab..66c762a75e 100644 --- a/stream/stream_dvb.c +++ b/stream/stream_dvb.c @@ -1,32 +1,32 @@ /* -dvbstream -(C) Dave Chapman <dave@dchapman.com> 2001, 2002. + dvbstream + (C) Dave Chapman <dave@dchapman.com> 2001, 2002. -Original authors: Nico, probably Arpi + Original authors: Nico, probably Arpi -Some code based on dvbstream, 0.4.3-pre3 (CVS checkout), -http://sourceforge.net/projects/dvbtools/ + Some code based on dvbstream, 0.4.3-pre3 (CVS checkout), + http://sourceforge.net/projects/dvbtools/ -Modified for use with MPlayer, for details see the changelog at -http://svn.mplayerhq.hu/mplayer/trunk/ -$Id$ + Modified for use with MPlayer, for details see the changelog at + http://svn.mplayerhq.hu/mplayer/trunk/ + $Id$ -Copyright notice: + Copyright notice: -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -55,14 +55,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "dvbin.h" #include "dvb_tune.h" - #define MAX_CHANNELS 8 #define CHANNEL_LINE_LEN 256 #define min(a, b) ((a) <= (b) ? (a) : (b)) - -//TODO: CAMBIARE list_ptr e da globale a per_priv - #define OPT_BASE_STRUCT struct dvb_params /// URL definition @@ -76,7 +72,7 @@ const struct m_sub_options stream_dvb_conf = { .opts = (const m_option_t[]) { OPT_STRING("prog", cfg_prog, 0), OPT_INTRANGE("card", cfg_card, 0, 1, 4), - OPT_INTRANGE("timeout", cfg_timeout, 0, 1, 30), + OPT_INTRANGE("timeout", cfg_timeout, 0, 1, 30), OPT_STRING("file", cfg_file, 0), OPT_FLAG("full-transponder", cfg_full_transponder, 0), {0} @@ -89,665 +85,684 @@ const struct m_sub_options stream_dvb_conf = { }, }; -static void parse_vdr_par_string(const char* vdr_par_str, dvb_channel_t* ptr) { - //FIXME: There is more information in this parameter string, especially related - // to non-DVB-S reception. - if (vdr_par_str[0]) { - const char* vdr_par = &vdr_par_str[0]; - while (vdr_par && *vdr_par) { - switch (mp_toupper(*vdr_par)) { - case 'H': - ptr->pol = 'H'; - vdr_par++; - break; - case 'V': - ptr->pol = 'V'; - vdr_par++; - break; - case 'S': - vdr_par++; - if (*vdr_par == '1') { - ptr->is_dvb_s2 = true; - } else { - ptr->is_dvb_s2 = false; - } - vdr_par++; - break; - case 'P': - vdr_par++; - char *endptr = NULL; - errno = 0; - int n = strtol(vdr_par, &endptr, 10); - if (!errno && endptr != vdr_par) { - ptr->stream_id = n; - vdr_par = endptr; - } - break; - case 'I': - vdr_par++; - if (*vdr_par == '1') { - ptr->inv = INVERSION_ON; - } else { - ptr->inv = INVERSION_OFF; +static void parse_vdr_par_string(const char *vdr_par_str, dvb_channel_t *ptr) +{ + //FIXME: There is more information in this parameter string, especially related + // to non-DVB-S reception. + if (vdr_par_str[0]) { + const char *vdr_par = &vdr_par_str[0]; + while (vdr_par && *vdr_par) { + switch (mp_toupper(*vdr_par)) { + case 'H': + ptr->pol = 'H'; + vdr_par++; + break; + case 'V': + ptr->pol = 'V'; + vdr_par++; + break; + case 'S': + vdr_par++; + if (*vdr_par == '1') { + ptr->is_dvb_s2 = true; + } else { + ptr->is_dvb_s2 = false; + } + vdr_par++; + break; + case 'P': + vdr_par++; + char *endptr = NULL; + errno = 0; + int n = strtol(vdr_par, &endptr, 10); + if (!errno && endptr != vdr_par) { + ptr->stream_id = n; + vdr_par = endptr; + } + break; + case 'I': + vdr_par++; + if (*vdr_par == '1') { + ptr->inv = INVERSION_ON; + } else { + ptr->inv = INVERSION_OFF; + } + vdr_par++; + break; + default: + vdr_par++; + } } - vdr_par++; - break; - default: - vdr_par++; - } } - } } -static char* dvb_strtok_r(char* s, const char* sep, char** p) { - if (!s && !(s = *p)) { - return NULL; - } - - /* Skip leading separators. */ - s += strspn(s, sep); - - /* s points at first non-separator, or end of string. */ - if (!*s) { - return (*p = 0); - } - - /* Move *p to next separator. */ - *p = s + strcspn(s, sep); - if (**p) { - *(*p)++ = 0; - } else { - *p = 0; - } - return s; +static char *dvb_strtok_r(char *s, const char *sep, char **p) +{ + if (!s && !(s = *p)) + return NULL; + + /* Skip leading separators. */ + s += strspn(s, sep); + + /* s points at first non-separator, or end of string. */ + if (!*s) + return *p = 0; + + /* Move *p to next separator. */ + *p = s + strcspn(s, sep); + if (**p) { + *(*p)++ = 0; + } else { + *p = 0; + } + return s; } -static bool parse_pid_string(struct mp_log *log, char* pid_string, dvb_channel_t* ptr) { - if (pid_string[0]) { - int pcnt = 0; - /** These tokens also catch vdr-style PID lists. - * They can contain 123=deu@3,124=eng+jap@4;125 - * 3 and 4 are codes for codec type, =langLeft+langRight is allowed, - * and ; may separate a dolby channel. - * With the numChars-test and the full token-list, all is handled gracefully. - */ - const char* tokens = "+,;"; - char* pidPart; - char* savePtr; - pidPart = dvb_strtok_r(pid_string, tokens, &savePtr); - while (pidPart != NULL) { - if (ptr->pids_cnt >= DMX_FILTER_SIZE-1) { - mp_verbose(log, "Maximum number of PIDs for one channel reached, ignoring further ones!\n"); - return (pcnt > 0); - } - int numChars = 0; - int pid = 0; - pcnt += sscanf(pidPart, "%d%n", &pid, &numChars); - if (numChars > 0) { - ptr->pids[ptr->pids_cnt] = pid; - ptr->pids_cnt++; - } - pidPart = dvb_strtok_r(NULL, tokens, &savePtr); - } - if (pcnt > 0) { - return true; +static bool parse_pid_string(struct mp_log *log, char *pid_string, + dvb_channel_t *ptr) +{ + if (pid_string[0]) { + int pcnt = 0; + /* These tokens also catch vdr-style PID lists. + * They can contain 123=deu@3,124=eng+jap@4;125 + * 3 and 4 are codes for codec type, =langLeft+langRight is allowed, + * and ; may separate a dolby channel. + * With the numChars-test and the full token-list, all is handled + * gracefully. + */ + const char *tokens = "+,;"; + char *pidPart; + char *savePtr; + pidPart = dvb_strtok_r(pid_string, tokens, &savePtr); + while (pidPart != NULL) { + if (ptr->pids_cnt >= DMX_FILTER_SIZE - 1) { + mp_verbose(log, "Maximum number of PIDs for one channel " + "reached, ignoring further ones!\n"); + return pcnt > 0; + } + int numChars = 0; + int pid = 0; + pcnt += sscanf(pidPart, "%d%n", &pid, &numChars); + if (numChars > 0) { + ptr->pids[ptr->pids_cnt] = pid; + ptr->pids_cnt++; + } + pidPart = dvb_strtok_r(NULL, tokens, &savePtr); + } + if (pcnt > 0) + return true; } - } - return false; + return false; } -static dvb_channels_list *dvb_get_channels(struct mp_log *log, int cfg_full_transponder, char *filename, int type) +static dvb_channels_list *dvb_get_channels(struct mp_log *log, + int cfg_full_transponder, + char *filename, + int type) { - dvb_channels_list *list; - FILE *f; - char line[CHANNEL_LINE_LEN], *colon; - - if (!filename) - return NULL; - - int fields, cnt, k; - int has8192, has0; - dvb_channel_t *ptr, *tmp, chn; - 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], tpid_str[256], - vdr_par_str[256], vdr_loc_str[256]; - const char *cbl_conf = "%d:%255[^:]:%d:%255[^:]:%255[^:]:%255[^:]:%255[^:]\n"; - const char *sat_conf = "%d:%c:%d:%d:%255[^:]:%255[^:]\n"; - const char *ter_conf = "%d:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]\n"; - const char *atsc_conf = "%d:%255[^:]:%255[^:]:%255[^:]\n"; - - const char *vdr_conf = "%d:%255[^:]:%255[^:]:%d:%255[^:]:%255[^:]:%255[^:]:%*255[^:]:%d:%*d:%*d:%*d\n%n"; - - mp_verbose(log, "CONFIG_READ FILE: %s, type: %d\n", filename, type); - if((f=fopen(filename, "r"))==NULL) - { - mp_fatal(log, "CAN'T READ CONFIG FILE %s\n", filename); - return NULL; - } + dvb_channels_list *list; + FILE *f; + char line[CHANNEL_LINE_LEN], *colon; + + if (!filename) + return NULL; + + int fields, cnt, k; + int has8192, has0; + dvb_channel_t *ptr, *tmp, chn; + 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], tpid_str[256], + vdr_par_str[256], vdr_loc_str[256]; + const char *cbl_conf = + "%d:%255[^:]:%d:%255[^:]:%255[^:]:%255[^:]:%255[^:]\n"; + const char *sat_conf = "%d:%c:%d:%d:%255[^:]:%255[^:]\n"; + const char *ter_conf = + "%d:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]:%255[^:]\n"; + const char *atsc_conf = "%d:%255[^:]:%255[^:]:%255[^:]\n"; + + const char *vdr_conf = + "%d:%255[^:]:%255[^:]:%d:%255[^:]:%255[^:]:%255[^:]:%*255[^:]:%d:%*d:%*d:%*d\n%n"; + + mp_verbose(log, "CONFIG_READ FILE: %s, type: %d\n", filename, type); + if ((f = fopen(filename, "r")) == NULL) { + mp_fatal(log, "CAN'T READ CONFIG FILE %s\n", filename); + return NULL; + } - list = malloc(sizeof(dvb_channels_list)); - if(list == NULL) - { - fclose(f); - mp_verbose(log, "DVB_GET_CHANNELS: couldn't malloc enough memory\n"); - return NULL; - } + list = malloc(sizeof(dvb_channels_list)); + if (list == NULL) { + fclose(f); + mp_verbose(log, "DVB_GET_CHANNELS: couldn't malloc enough memory\n"); + return NULL; + } - ptr = &chn; - list->NUM_CHANNELS = 0; - list->channels = NULL; - while(! feof(f)) - { - if( fgets(line, CHANNEL_LINE_LEN, f) == NULL ) - continue; - - if((line[0] == '#') || (strlen(line) == 0)) - continue; - - colon = strchr(line, ':'); - if (colon) { - k = colon - line; - if(!k) - continue; - // In some modern VDR-style configs, channel name also has bouquet after ;. - // Parse that off, we ignore it. - char* bouquet_sep = strchr(line, ';'); - int channel_name_length = k; - if (bouquet_sep && bouquet_sep < colon) { - channel_name_length = bouquet_sep - line; - } - ptr->name = malloc(channel_name_length+1); - if(! ptr->name) - continue; - av_strlcpy(ptr->name, line, channel_name_length+1); - } else { - continue; - } - k++; - vpid_str[0] = apid_str[0] = tpid_str[0] = 0; - vdr_loc_str[0] = vdr_par_str[0] = 0; - ptr->pids_cnt = 0; - ptr->freq = 0; - ptr->is_dvb_s2 = false; - ptr->service_id = -1; - ptr->stream_id = NO_STREAM_ID_FILTER; + ptr = &chn; + list->NUM_CHANNELS = 0; + list->channels = NULL; + while (!feof(f)) { + if (fgets(line, CHANNEL_LINE_LEN, f) == NULL) + continue; + + if ((line[0] == '#') || (strlen(line) == 0)) + continue; + + colon = strchr(line, ':'); + if (colon) { + k = colon - line; + if (!k) + continue; + // In some modern VDR-style configs, channel name also has bouquet after ;. + // Parse that off, we ignore it. + char *bouquet_sep = strchr(line, ';'); + int channel_name_length = k; + if (bouquet_sep && bouquet_sep < colon) + channel_name_length = bouquet_sep - line; + ptr->name = malloc(channel_name_length + 1); + if (!ptr->name) + continue; + av_strlcpy(ptr->name, line, channel_name_length + 1); + } else { + continue; + } + k++; + vpid_str[0] = apid_str[0] = tpid_str[0] = 0; + vdr_loc_str[0] = vdr_par_str[0] = 0; + ptr->pids_cnt = 0; + ptr->freq = 0; + ptr->is_dvb_s2 = false; + ptr->service_id = -1; + ptr->stream_id = NO_STREAM_ID_FILTER; + ptr->inv = INVERSION_AUTO; + + // Check if VDR-type channels.conf-line - then full line is consumed by the scan. + int num_chars = 0; + fields = sscanf(&line[k], vdr_conf, + &ptr->freq, vdr_par_str, vdr_loc_str, &ptr->srate, + vpid_str, apid_str, tpid_str, &ptr->service_id, + &num_chars); + + if (num_chars == strlen(&line[k])) { + // It's a VDR-style config line. + parse_vdr_par_string(vdr_par_str, ptr); + // We still need the special SAT-handling here. + if (type != TUNER_TER && type != TUNER_CBL && type != TUNER_ATSC) { + ptr->freq *= 1000UL; + ptr->srate *= 1000UL; + ptr->tone = -1; ptr->inv = INVERSION_AUTO; - - // Check if VDR-type channels.conf-line - then full line is consumed by the scan. - int num_chars = 0; - fields = sscanf(&line[k], vdr_conf, - &ptr->freq, vdr_par_str, vdr_loc_str, &ptr->srate, vpid_str, apid_str, tpid_str, &ptr->service_id, &num_chars); - - if (num_chars == strlen(&line[k])) { - // It's a VDR-style config line. - parse_vdr_par_string(vdr_par_str, ptr); - // We still need the special SAT-handling here. - if (type != TUNER_TER && type != TUNER_CBL && type != TUNER_ATSC) { - ptr->freq *= 1000UL; - ptr->srate *= 1000UL; - ptr->tone = -1; - ptr->inv = INVERSION_AUTO; - ptr->cr = FEC_AUTO; - - if (vdr_loc_str[0]) { - // In older vdr config format, this field contained the DISEQc information. - // If it is numeric, assume that's it. - int diseqc_info = 0; - int valid_digits = 0; - if (sscanf(vdr_loc_str, "%d%n", &diseqc_info, &valid_digits) == 1) { + ptr->cr = FEC_AUTO; + + if (vdr_loc_str[0]) { + // In older vdr config format, this field contained the DISEQc information. + // If it is numeric, assume that's it. + int diseqc_info = 0; + int valid_digits = 0; + if (sscanf(vdr_loc_str, "%d%n", &diseqc_info, + &valid_digits) == 1) + { if (valid_digits == strlen(vdr_loc_str)) { - ptr->diseqc = diseqc_info; - if((ptr->diseqc > 4) || (ptr->diseqc < 0)) - continue; - if(ptr->diseqc > 0) - ptr->diseqc--; + ptr->diseqc = diseqc_info; + if ((ptr->diseqc > 4) || (ptr->diseqc < 0)) + continue; + if (ptr->diseqc > 0) + ptr->diseqc--; } - } } - - mp_verbose(log, "SAT, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d, SRATE: %d, POL: %c, DISEQC: %d, S2: %s, StreamID: %d, SID: %d", - list->NUM_CHANNELS, fields, ptr->name, ptr->freq, ptr->srate, ptr->pol, ptr->diseqc, - ptr->is_dvb_s2 ? "yes" : "no", ptr->stream_id, ptr->service_id); - } else { - mp_verbose(log, "VDR, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d, SRATE: %d", - list->NUM_CHANNELS, fields, ptr->name, ptr->freq, ptr->srate); - } - } else if (type == TUNER_TER) { - fields = sscanf(&line[k], ter_conf, - &ptr->freq, inv, bw, cr, tmp_lcr, mod, - transm, gi, tmp_hier, vpid_str, apid_str); - mp_verbose(log, "TER, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d", - list->NUM_CHANNELS, fields, ptr->name, ptr->freq); - } else if (type == TUNER_CBL) { - fields = sscanf(&line[k], cbl_conf, - &ptr->freq, inv, &ptr->srate, - cr, mod, vpid_str, apid_str); - mp_verbose(log, "CBL, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d, SRATE: %d", - list->NUM_CHANNELS, fields, ptr->name, ptr->freq, ptr->srate); } + + mp_verbose(log, "SAT, NUM: %d, NUM_FIELDS: %d, NAME: %s, " + "FREQ: %d, SRATE: %d, POL: %c, DISEQC: %d, S2: %s, " + "StreamID: %d, SID: %d", list->NUM_CHANNELS, + fields, ptr->name, ptr->freq, ptr->srate, ptr->pol, + ptr->diseqc, ptr->is_dvb_s2 ? "yes" : "no", + ptr->stream_id, ptr->service_id); + } else { + mp_verbose(log, "VDR, NUM: %d, NUM_FIELDS: %d, NAME: %s, " + "FREQ: %d, SRATE: %d", list->NUM_CHANNELS, fields, + ptr->name, ptr->freq, ptr->srate); + } + } else if (type == TUNER_TER) { + fields = sscanf(&line[k], ter_conf, + &ptr->freq, inv, bw, cr, tmp_lcr, mod, + transm, gi, tmp_hier, vpid_str, apid_str); + mp_verbose(log, "TER, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d", + list->NUM_CHANNELS, fields, ptr->name, ptr->freq); + } else if (type == TUNER_CBL) { + fields = sscanf(&line[k], cbl_conf, + &ptr->freq, inv, &ptr->srate, + cr, mod, vpid_str, apid_str); + mp_verbose(log, "CBL, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d, " + "SRATE: %d", list->NUM_CHANNELS, fields, ptr->name, + ptr->freq, ptr->srate); + } #ifdef DVB_ATSC - else if (type == TUNER_ATSC) - { - fields = sscanf(&line[k], atsc_conf, - &ptr->freq, mod, vpid_str, apid_str); - mp_verbose(log, "ATSC, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d\n", - list->NUM_CHANNELS, fields, ptr->name, ptr->freq); - } + else if (type == TUNER_ATSC) { + fields = sscanf(&line[k], atsc_conf, + &ptr->freq, mod, vpid_str, apid_str); + mp_verbose(log, "ATSC, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d\n", + list->NUM_CHANNELS, fields, ptr->name, ptr->freq); + } #endif - else //SATELLITE - { - fields = sscanf(&line[k], sat_conf, - &ptr->freq, &ptr->pol, &ptr->diseqc, &ptr->srate, vpid_str, apid_str); - ptr->pol = mp_toupper(ptr->pol); - ptr->freq *= 1000UL; - ptr->srate *= 1000UL; - ptr->tone = -1; - ptr->inv = INVERSION_AUTO; - ptr->cr = FEC_AUTO; - if((ptr->diseqc > 4) || (ptr->diseqc < 0)) - continue; - if(ptr->diseqc > 0) - ptr->diseqc--; - mp_verbose(log, "SAT, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d, SRATE: %d, POL: %c, DISEQC: %d", - list->NUM_CHANNELS, fields, ptr->name, ptr->freq, ptr->srate, ptr->pol, ptr->diseqc); - } - - if (parse_pid_string(log, vpid_str, ptr)) { - fields++; - } - if (parse_pid_string(log, apid_str, ptr)) { - fields++; - } - /* If we do not know the service_id, PMT can not be extracted. - Teletext decoding will fail without PMT. */ - if (ptr->service_id != -1) { - if (parse_pid_string(log, tpid_str, ptr)) { - fields++; - } - } - - - if((fields < 2) || (ptr->pids_cnt <= 0) || (ptr->freq == 0) || (strlen(ptr->name) == 0)) - continue; - - /* Add some PIDs which are mandatory in DVB, - * and contain human-readable helpful data. */ - - /* This is the STD, the service description table. - * It contains service names and such, ffmpeg decodes it. */ - ptr->pids[ptr->pids_cnt] = 0x0011; - ptr->pids_cnt++; + else { //SATELLITE + fields = sscanf(&line[k], sat_conf, + &ptr->freq, &ptr->pol, &ptr->diseqc, &ptr->srate, + vpid_str, + apid_str); + ptr->pol = mp_toupper(ptr->pol); + ptr->freq *= 1000UL; + ptr->srate *= 1000UL; + ptr->tone = -1; + ptr->inv = INVERSION_AUTO; + ptr->cr = FEC_AUTO; + if ((ptr->diseqc > 4) || (ptr->diseqc < 0)) + continue; + if (ptr->diseqc > 0) + ptr->diseqc--; + mp_verbose(log, "SAT, NUM: %d, NUM_FIELDS: %d, NAME: %s, FREQ: %d, " + "SRATE: %d, POL: %c, DISEQC: %d", + list->NUM_CHANNELS, fields, ptr->name, ptr->freq, + ptr->srate, ptr->pol, ptr->diseqc); + } - /* This is the EIT, which contains EPG data. - * ffmpeg can not decode it (yet), but e.g. VLC - * shows what was recorded. */ - ptr->pids[ptr->pids_cnt] = 0x0012; - ptr->pids_cnt++; + if (parse_pid_string(log, vpid_str, ptr)) + fields++; + if (parse_pid_string(log, apid_str, ptr)) + fields++; + /* If we do not know the service_id, PMT can not be extracted. + Teletext decoding will fail without PMT. */ + if (ptr->service_id != -1) { + if (parse_pid_string(log, tpid_str, ptr)) + fields++; + } - if (ptr->service_id != -1) { - /* We have the PMT-PID in addition. - This will be found later, when we tune to the channel. - Push back here to create the additional demux. */ - ptr->pids[ptr->pids_cnt] = -1; // Placeholder. - ptr->pids_cnt++; - } - - has8192 = has0 = 0; - for(cnt = 0; cnt < ptr->pids_cnt; cnt++) - { - if(ptr->pids[cnt] == 8192) - has8192 = 1; - if(ptr->pids[cnt] == 0) - has0 = 1; - } - - /* 8192 is the pseudo-PID for full TP dump, - enforce that if requested. */ - if (!has8192 && cfg_full_transponder) { - has8192 = 1; - } - if (has8192) { - ptr->pids[0] = 8192; - ptr->pids_cnt = 1; - } else if (!has0) { - ptr->pids[ptr->pids_cnt] = 0; //PID 0 is the PAT - ptr->pids_cnt++; - } - mp_verbose(log, " PIDS: "); - for(cnt = 0; cnt < ptr->pids_cnt; cnt++) - mp_verbose(log, " %d ", ptr->pids[cnt]); - mp_verbose(log, "\n"); - - if((type == TUNER_TER) || (type == TUNER_CBL)) - { - if(! strcmp(inv, "INVERSION_ON")) - ptr->inv = INVERSION_ON; - else if(! strcmp(inv, "INVERSION_OFF")) - ptr->inv = INVERSION_OFF; - else - ptr->inv = INVERSION_AUTO; - - - if(! strcmp(cr, "FEC_1_2")) - ptr->cr =FEC_1_2; - else if(! strcmp(cr, "FEC_2_3")) - ptr->cr =FEC_2_3; - else if(! strcmp(cr, "FEC_3_4")) - ptr->cr =FEC_3_4; - else if(! strcmp(cr, "FEC_4_5")) - ptr->cr =FEC_4_5; - else if(! strcmp(cr, "FEC_6_7")) - ptr->cr =FEC_6_7; - else if(! strcmp(cr, "FEC_8_9")) - ptr->cr =FEC_8_9; - else if(! strcmp(cr, "FEC_5_6")) - ptr->cr =FEC_5_6; - else if(! strcmp(cr, "FEC_7_8")) - ptr->cr =FEC_7_8; - else if(! strcmp(cr, "FEC_NONE")) - ptr->cr =FEC_NONE; - else ptr->cr =FEC_AUTO; - } + if ((fields < 2) || (ptr->pids_cnt <= 0) || (ptr->freq == 0) || + (strlen(ptr->name) == 0)) + continue; + + /* Add some PIDs which are mandatory in DVB, + * and contain human-readable helpful data. */ + + /* This is the STD, the service description table. + * It contains service names and such, ffmpeg decodes it. */ + ptr->pids[ptr->pids_cnt] = 0x0011; + ptr->pids_cnt++; + /* This is the EIT, which contains EPG data. + * ffmpeg can not decode it (yet), but e.g. VLC + * shows what was recorded. */ + ptr->pids[ptr->pids_cnt] = 0x0012; + ptr->pids_cnt++; + + if (ptr->service_id != -1) { + /* We have the PMT-PID in addition. + This will be found later, when we tune to the channel. + Push back here to create the additional demux. */ + ptr->pids[ptr->pids_cnt] = -1; // Placeholder. + ptr->pids_cnt++; + } + + has8192 = has0 = 0; + for (cnt = 0; cnt < ptr->pids_cnt; cnt++) { + if (ptr->pids[cnt] == 8192) + has8192 = 1; + if (ptr->pids[cnt] == 0) + has0 = 1; + } - if((type == TUNER_TER) || (type == TUNER_CBL) || (type == TUNER_ATSC)) - { - if(! strcmp(mod, "QAM_128")) - ptr->mod = QAM_128; - else if(! strcmp(mod, "QAM_256")) - ptr->mod = QAM_256; - else if(! strcmp(mod, "QAM_64")) - ptr->mod = QAM_64; - else if(! strcmp(mod, "QAM_32")) - ptr->mod = QAM_32; - else if(! strcmp(mod, "QAM_16")) - ptr->mod = QAM_16; + /* 8192 is the pseudo-PID for full TP dump, + enforce that if requested. */ + if (!has8192 && cfg_full_transponder) + has8192 = 1; + if (has8192) { + ptr->pids[0] = 8192; + ptr->pids_cnt = 1; + } else if (!has0) { + ptr->pids[ptr->pids_cnt] = 0; //PID 0 is the PAT + ptr->pids_cnt++; + } + + mp_verbose(log, " PIDS: "); + for (cnt = 0; cnt < ptr->pids_cnt; cnt++) + mp_verbose(log, " %d ", ptr->pids[cnt]); + mp_verbose(log, "\n"); + + if ((type == TUNER_TER) || (type == TUNER_CBL)) { + if (!strcmp(inv, "INVERSION_ON")) { + ptr->inv = INVERSION_ON; + } else if (!strcmp(inv, "INVERSION_OFF")) { + ptr->inv = INVERSION_OFF; + } else { + ptr->inv = INVERSION_AUTO; + } + + + if (!strcmp(cr, "FEC_1_2")) { + ptr->cr = FEC_1_2; + } else if (!strcmp(cr, "FEC_2_3")) { + ptr->cr = FEC_2_3; + } else if (!strcmp(cr, "FEC_3_4")) { + ptr->cr = FEC_3_4; + } else if (!strcmp(cr, "FEC_4_5")) { + ptr->cr = FEC_4_5; + } else if (!strcmp(cr, "FEC_6_7")) { + ptr->cr = FEC_6_7; + } else if (!strcmp(cr, "FEC_8_9")) { + ptr->cr = FEC_8_9; + } else if (!strcmp(cr, "FEC_5_6")) { + ptr->cr = FEC_5_6; + } else if (!strcmp(cr, "FEC_7_8")) { + ptr->cr = FEC_7_8; + } else if (!strcmp(cr, "FEC_NONE")) { + ptr->cr = FEC_NONE; + } else { + ptr->cr = FEC_AUTO; + } + } + + + if (type == TUNER_TER || type == TUNER_CBL || type == TUNER_ATSC) { + if (!strcmp(mod, "QAM_128")) { + ptr->mod = QAM_128; + } else if (!strcmp(mod, "QAM_256")) { + ptr->mod = QAM_256; + } else if (!strcmp(mod, "QAM_64")) { + ptr->mod = QAM_64; + } else if (!strcmp(mod, "QAM_32")) { + ptr->mod = QAM_32; + } else if (!strcmp(mod, "QAM_16")) { + ptr->mod = QAM_16; #ifdef DVB_ATSC - else if(! strcmp(mod, "VSB_8") || ! strcmp(mod, "8VSB")) - ptr->mod = VSB_8; - else if(! strcmp(mod, "VSB_16") || !strcmp(mod, "16VSB")) - ptr->mod = VSB_16; - else if(! strcmp(mod, "QAM_AUTO")) - ptr->mod = QAM_AUTO; + } else if (!strcmp(mod, "VSB_8") || !strcmp(mod, "8VSB")) { + ptr->mod = VSB_8; + } else if (!strcmp(mod, "VSB_16") || !strcmp(mod, "16VSB")) { + ptr->mod = VSB_16; + } else if (!strcmp(mod, "QAM_AUTO")) { + ptr->mod = QAM_AUTO; + } #endif - } + } - if(type == TUNER_TER) - { - if(! strcmp(bw, "BANDWIDTH_6_MHZ")) - ptr->bw = BANDWIDTH_6_MHZ; - else if(! strcmp(bw, "BANDWIDTH_7_MHZ")) - ptr->bw = BANDWIDTH_7_MHZ; - else if(! strcmp(bw, "BANDWIDTH_8_MHZ")) - ptr->bw = BANDWIDTH_8_MHZ; - - - if(! strcmp(transm, "TRANSMISSION_MODE_2K")) - ptr->trans = TRANSMISSION_MODE_2K; - else if(! strcmp(transm, "TRANSMISSION_MODE_8K")) - ptr->trans = TRANSMISSION_MODE_8K; - else if(! strcmp(transm, "TRANSMISSION_MODE_AUTO")) - ptr->trans = TRANSMISSION_MODE_AUTO; - - if(! strcmp(gi, "GUARD_INTERVAL_1_32")) - ptr->gi = GUARD_INTERVAL_1_32; - else if(! strcmp(gi, "GUARD_INTERVAL_1_16")) - ptr->gi = GUARD_INTERVAL_1_16; - else if(! strcmp(gi, "GUARD_INTERVAL_1_8")) - ptr->gi = GUARD_INTERVAL_1_8; - else if(! strcmp(gi, "GUARD_INTERVAL_1_4")) - ptr->gi = GUARD_INTERVAL_1_4; - else ptr->gi = GUARD_INTERVAL_AUTO; - - if(! strcmp(tmp_lcr, "FEC_1_2")) - ptr->cr_lp =FEC_1_2; - else if(! strcmp(tmp_lcr, "FEC_2_3")) - ptr->cr_lp =FEC_2_3; - else if(! strcmp(tmp_lcr, "FEC_3_4")) - ptr->cr_lp =FEC_3_4; - else if(! strcmp(tmp_lcr, "FEC_4_5")) - ptr->cr_lp =FEC_4_5; - else if(! strcmp(tmp_lcr, "FEC_6_7")) - ptr->cr_lp =FEC_6_7; - else if(! strcmp(tmp_lcr, "FEC_8_9")) - ptr->cr_lp =FEC_8_9; - else if(! strcmp(tmp_lcr, "FEC_5_6")) - ptr->cr_lp =FEC_5_6; |