summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Freyermuth <o.freyermuth@googlemail.com>2017-10-08 18:05:18 +0200
committerOliver Freyermuth <o.freyermuth@googlemail.com>2017-10-09 20:06:29 +0200
commitadd0cbea2ab77bc0462a9da9517d6596f216ba83 (patch)
tree31a13086bc91a7ebb0dee3f728387c91f450ab96
parente46338c66a6ded23c364d79d5beb2432980cba19 (diff)
downloadmpv-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.c50
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.