diff options
author | Oliver Freyermuth <o.freyermuth@googlemail.com> | 2017-10-08 18:05:18 +0200 |
---|---|---|
committer | Oliver Freyermuth <o.freyermuth@googlemail.com> | 2017-10-09 20:06:29 +0200 |
commit | add0cbea2ab77bc0462a9da9517d6596f216ba83 (patch) | |
tree | 31a13086bc91a7ebb0dee3f728387c91f450ab96 | |
parent | e46338c66a6ded23c364d79d5beb2432980cba19 (diff) | |
download | mpv-add0cbea2ab77bc0462a9da9517d6596f216ba83.tar.bz2 mpv-add0cbea2ab77bc0462a9da9517d6596f216ba83.tar.xz |
dvb: Implement parsing of modulation for VDR-style channels config.
This is required for ATSC cable / terrestrial support.
Signed-off-by: Oliver Freyermuth <o.freyermuth@googlemail.com>
-rw-r--r-- | stream/stream_dvb.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/stream/stream_dvb.c b/stream/stream_dvb.c index 856c9a7ffd..3f0a10db7b 100644 --- a/stream/stream_dvb.c +++ b/stream/stream_dvb.c @@ -86,6 +86,50 @@ const struct m_sub_options stream_dvb_conf = { void dvbin_close(stream_t *stream); +static fe_modulation_t parse_vdr_modulation(const char** modstring) { + if (!strncmp(*modstring, "16", 2)) { + (*modstring)+=2; + return QAM_16; + } else if (!strncmp(*modstring, "32", 2)) { + (*modstring)+=2; + return QAM_32; + } else if (!strncmp(*modstring, "64", 2)) { + (*modstring)+=2; + return QAM_64; + } else if (!strncmp(*modstring, "128", 3)) { + (*modstring)+=3; + return QAM_128; + } else if (!strncmp(*modstring, "256", 3)) { + (*modstring)+=3; + return QAM_256; + } else if (!strncmp(*modstring, "998", 3)) { + (*modstring)+=3; + return QAM_AUTO; + } else if (!strncmp(*modstring, "2", 1)) { + (*modstring)++; + return QPSK; + } else if (!strncmp(*modstring, "5", 1)) { + (*modstring)++; + return PSK_8; + } else if (!strncmp(*modstring, "6", 1)) { + (*modstring)++; + return APSK_16; + } else if (!strncmp(*modstring, "7", 1)) { + (*modstring)++; + return APSK_32; + } else if (!strncmp(*modstring, "10", 2)) { + (*modstring)+=2; + return VSB_8; + } else if (!strncmp(*modstring, "11", 2)) { + (*modstring)+=2; + return VSB_16; + } else if (!strncmp(*modstring, "12", 2)) { + (*modstring)+=2; + return DQPSK; + } else { + return QAM_AUTO; + } +} static void parse_vdr_par_string(const char *vdr_par_str, dvb_channel_t *ptr) { @@ -131,6 +175,10 @@ static void parse_vdr_par_string(const char *vdr_par_str, dvb_channel_t *ptr) } vdr_par++; break; + case 'M': + vdr_par++; + ptr->mod = parse_vdr_modulation(&vdr_par); + break; default: vdr_par++; } @@ -299,6 +347,8 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log, &num_chars); if (num_chars == strlen(&line[k])) { + // Modulation parsed here, not via old xine-parsing path. + mod[0] = '\0'; // It's a VDR-style config line. parse_vdr_par_string(vdr_par_str, ptr); // Units in VDR-style config files are divided by 1000. |