summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/options.rst11
-rw-r--r--stream/dvbin.h2
-rw-r--r--stream/stream_dvb.c13
3 files changed, 22 insertions, 4 deletions
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index 0006cff6cd..8fdd0c83e3 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -3135,11 +3135,22 @@ DVB
Classic mplayer format channel lists are still supported (without
these improvements), and for other card types, only limited VDR
format channel list support is implemented (patches welcome).
+ For channels with dynamic PID switching or incomplete
+ ``channels.conf``, ``--dvbin-full-transponder`` or the magic PID
+ ``8192`` are recommended.
``--dvbin-timeout=<1-30>``
Maximum number of seconds to wait when trying to tune a frequency before
giving up (default: 30).
+``--dvbin-full-transponder=<yes|no>``
+ Apply no filters on program PIDs, only tune to frequency and pass full
+ transponder to demuxer. This is useful to record multiple programs
+ on a single transponder, or to work around issues in the ``channels.conf``.
+ It is also recommended to use this for channels which switch PIDs
+ on-the-fly, e.g. for regional news.
+
+ Default: ``no``
PVR
---
diff --git a/stream/dvbin.h b/stream/dvbin.h
index 2a9130e5aa..c475984450 100644
--- a/stream/dvbin.h
+++ b/stream/dvbin.h
@@ -115,6 +115,8 @@ typedef struct dvb_params {
int cfg_card;
int cfg_timeout;
char *cfg_file;
+
+ int cfg_full_transponder;
} dvb_priv_t;
diff --git a/stream/stream_dvb.c b/stream/stream_dvb.c
index e3503af697..a78ccd7eb3 100644
--- a/stream/stream_dvb.c
+++ b/stream/stream_dvb.c
@@ -78,6 +78,7 @@ const struct m_sub_options stream_dvb_conf = {
OPT_INTRANGE("card", cfg_card, 0, 1, 4),
OPT_INTRANGE("timeout", cfg_timeout, 0, 1, 30),
OPT_STRING("file", cfg_file, 0),
+ OPT_FLAG("full-transponder", cfg_full_transponder, 0),
{0}
},
.size = sizeof(struct dvb_params),
@@ -195,7 +196,7 @@ static bool parse_pid_string(struct mp_log *log, char* pid_string, dvb_channel_t
return false;
}
-static dvb_channels_list *dvb_get_channels(struct mp_log *log, 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;
@@ -376,8 +377,12 @@ static dvb_channels_list *dvb_get_channels(struct mp_log *log, char *filename, i
if(ptr->pids[cnt] == 0)
has0 = 1;
}
- if(has8192)
- {
+ /* 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;
}
@@ -968,7 +973,7 @@ dvb_config_t *dvb_get_config(stream_t *stream)
}
}
- list = dvb_get_channels(log, conf_file, type);
+ list = dvb_get_channels(log, priv->cfg_full_transponder, conf_file, type);
talloc_free(talloc_ctx);
if(list == NULL)