summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2023-10-20 21:17:22 +0200
committersfan5 <sfan5@live.de>2023-10-21 11:07:59 +0200
commit490af95c10e15b33b1a3605ee16805b8e4bf73eb (patch)
tree712fbdbeabbf76c17946fc0ea1d3945fa66c5f86 /stream
parentc78c33bf7c10e81eebc4b4c1b66d0d74306887de (diff)
downloadmpv-490af95c10e15b33b1a3605ee16805b8e4bf73eb.tar.bz2
mpv-490af95c10e15b33b1a3605ee16805b8e4bf73eb.tar.xz
dvbin: do a big cleanup on code style and functions
Diffstat (limited to 'stream')
-rw-r--r--stream/dvb_tune.c106
-rw-r--r--stream/dvbin.h2
-rw-r--r--stream/stream_dvb.c541
3 files changed, 300 insertions, 349 deletions
diff --git a/stream/dvb_tune.c b/stream/dvb_tune.c
index 7731a4cbf7..d18f70f7a9 100644
--- a/stream/dvb_tune.c
+++ b/stream/dvb_tune.c
@@ -82,13 +82,13 @@ unsigned int dvb_get_tuner_delsys_mask(int fe_fd, struct mp_log *log)
mp_err(log, "DVBv5: FE_GET_PROPERTY(DTV_ENUM_DELSYS) error: %d\n", errno);
return ret_mask;
}
- unsigned int i, delsys_count = prop[0].u.buffer.len;
+ unsigned int delsys_count = prop[0].u.buffer.len;
if (delsys_count == 0) {
mp_err(log, "DVBv5: Frontend returned no delivery systems!\n");
return ret_mask;
}
mp_verbose(log, "DVBv5: Number of supported delivery systems: %d\n", delsys_count);
- for (i = 0; i < delsys_count; i++) {
+ for (unsigned int i = 0; i < delsys_count; i++) {
delsys = (unsigned int)prop[0].u.buffer.data[i];
DELSYS_SET(ret_mask, delsys);
mp_verbose(log, " %s\n", get_dvb_delsys(delsys));
@@ -100,29 +100,29 @@ unsigned int dvb_get_tuner_delsys_mask(int fe_fd, struct mp_log *log)
int dvb_open_devices(dvb_priv_t *priv, unsigned int adapter,
unsigned int frontend, unsigned int demux_cnt)
{
- unsigned int i;
- char frontend_dev[PATH_MAX], dvr_dev[PATH_MAX], demux_dev[PATH_MAX];
- dvb_state_t* state = priv->state;
+ dvb_state_t *state = priv->state;
+ char frontend_dev[100], dvr_dev[100], demux_dev[100];
snprintf(frontend_dev, sizeof(frontend_dev), "/dev/dvb/adapter%u/frontend%u", adapter, frontend);
snprintf(dvr_dev, sizeof(dvr_dev), "/dev/dvb/adapter%u/dvr0", adapter);
snprintf(demux_dev, sizeof(demux_dev), "/dev/dvb/adapter%u/demux0", adapter);
+
MP_VERBOSE(priv, "Opening frontend device %s\n", frontend_dev);
state->fe_fd = open(frontend_dev, O_RDWR | O_NONBLOCK | O_CLOEXEC);
if (state->fe_fd < 0) {
MP_ERR(priv, "Error opening frontend device: %d\n", errno);
return 0;
}
+
state->demux_fds_cnt = 0;
MP_VERBOSE(priv, "Opening %d demuxers\n", demux_cnt);
- for (i = 0; i < demux_cnt; i++) {
+ for (unsigned int i = 0; i < demux_cnt; i++) {
state->demux_fds[i] = open(demux_dev, O_RDWR | O_NONBLOCK | O_CLOEXEC);
if (state->demux_fds[i] < 0) {
MP_ERR(priv, "Error opening demux0: %d\n", errno);
return 0;
- } else {
- state->demux_fds_cnt++;
}
+ state->demux_fds_cnt++;
}
state->dvr_fd = open(dvr_dev, O_RDONLY | O_NONBLOCK | O_CLOEXEC);
@@ -134,31 +134,29 @@ int dvb_open_devices(dvb_priv_t *priv, unsigned int adapter,
return 1;
}
-
int dvb_fix_demuxes(dvb_priv_t *priv, unsigned int cnt)
{
- int i;
- char demux_dev[PATH_MAX];
-
- dvb_state_t* state = priv->state;
+ dvb_state_t *state = priv->state;
+ char demux_dev[100];
snprintf(demux_dev, sizeof(demux_dev), "/dev/dvb/adapter%d/demux0",
state->adapters[state->cur_adapter].devno);
+
MP_VERBOSE(priv, "Changing demuxer count %d -> %d\n", state->demux_fds_cnt, cnt);
if (state->demux_fds_cnt >= cnt) {
- for (i = state->demux_fds_cnt - 1; i >= (int)cnt; i--) {
+ for (int i = state->demux_fds_cnt - 1; i >= (int)cnt; i--) {
close(state->demux_fds[i]);
}
state->demux_fds_cnt = cnt;
} else {
- for (i = state->demux_fds_cnt; i < cnt; i++) {
+ for (int i = state->demux_fds_cnt; i < cnt; i++) {
state->demux_fds[i] = open(demux_dev,
O_RDWR | O_NONBLOCK | O_CLOEXEC);
if (state->demux_fds[i] < 0) {
MP_ERR(priv, "Error opening demux0: %d\n", errno);
return 0;
- } else
- state->demux_fds_cnt++;
+ }
+ state->demux_fds_cnt++;
}
}
@@ -198,12 +196,10 @@ int dvb_get_pmt_pid(dvb_priv_t *priv, int devno, int service_id)
{
/* We need special filters on the demux,
so open one locally, and close also here. */
- char demux_dev[PATH_MAX];
+ char demux_dev[100];
snprintf(demux_dev, sizeof(demux_dev), "/dev/dvb/adapter%d/demux0", devno);
- struct dmx_sct_filter_params fparams;
-
- memset(&fparams, 0x00, sizeof(fparams));
+ struct dmx_sct_filter_params fparams = {0};
fparams.pid = 0;
fparams.filter.filter[0] = 0x00;
fparams.filter.mask[0] = 0xff;
@@ -223,7 +219,6 @@ int dvb_get_pmt_pid(dvb_priv_t *priv, int devno, int service_id)
}
int bytes_read;
- int section_length;
unsigned char buft[4096];
unsigned char *bufptr = buft;
@@ -231,9 +226,8 @@ int dvb_get_pmt_pid(dvb_priv_t *priv, int devno, int service_id)
bool pat_read = false;
while (!pat_read) {
- if (((bytes_read =
- read(pat_fd, bufptr,
- sizeof(buft))) < 0) && errno == EOVERFLOW)
+ bytes_read = read(pat_fd, bufptr, sizeof(buft));
+ if (bytes_read < 0 && errno == EOVERFLOW)
bytes_read = read(pat_fd, bufptr, sizeof(buft));
if (bytes_read < 0) {
MP_ERR(priv, "PAT: read error: %d", errno);
@@ -241,7 +235,7 @@ int dvb_get_pmt_pid(dvb_priv_t *priv, int devno, int service_id)
return -1;
}
- section_length = ((bufptr[1] & 0x0f) << 8) | bufptr[2];
+ int section_length = ((bufptr[1] & 0x0f) << 8) | bufptr[2];
if (bytes_read != section_length + 3)
continue;
@@ -285,17 +279,16 @@ static void print_status(dvb_priv_t *priv, fe_status_t festatus)
static int check_status(dvb_priv_t *priv, int fd_frontend, int tmout)
{
- int32_t strength;
fe_status_t festatus;
- struct pollfd pfd[1];
- int ok = 0, locks = 0;
- int tm1, tm2;
+ bool ok = false;
+ int locks = 0;
+ struct pollfd pfd[1];
pfd[0].fd = fd_frontend;
pfd[0].events = POLLPRI;
MP_VERBOSE(priv, "Getting frontend status\n");
- tm1 = tm2 = (int)mp_time_sec();
+ int tm1 = (int)mp_time_sec();
while (!ok) {
festatus = 0;
if (poll(pfd, 1, tmout * 1000) > 0) {
@@ -307,34 +300,35 @@ static int check_status(dvb_priv_t *priv, int fd_frontend, int tmout)
}
}
usleep(10000);
- tm2 = (int)mp_time_sec();
+ int tm2 = (int)mp_time_sec();
if ((festatus & FE_TIMEDOUT) || (locks >= 2) || (tm2 - tm1 >= tmout))
- ok = 1;
+ ok = true;
}
- if (festatus & FE_HAS_LOCK) {
- strength = 0;
- if (ioctl(fd_frontend, FE_READ_BER, &strength) >= 0)
- MP_VERBOSE(priv, "Bit error rate: %d\n", strength);
-
- strength = 0;
- if (ioctl(fd_frontend, FE_READ_SIGNAL_STRENGTH, &strength) >= 0)
- MP_VERBOSE(priv, "Signal strength: %d\n", strength);
-
- strength = 0;
- if (ioctl(fd_frontend, FE_READ_SNR, &strength) >= 0)
- MP_VERBOSE(priv, "SNR: %d\n", strength);
-
- strength = 0;
- if (ioctl(fd_frontend, FE_READ_UNCORRECTED_BLOCKS, &strength) >= 0)
- MP_VERBOSE(priv, "UNC: %d\n", strength);
-
- print_status(priv, festatus);
- } else {
+ if (!(festatus & FE_HAS_LOCK)) {
MP_ERR(priv, "Not able to lock to the signal on the given frequency, "
"timeout: %d\n", tmout);
return -1;
}
+
+ int32_t strength = 0;
+ if (ioctl(fd_frontend, FE_READ_BER, &strength) >= 0)
+ MP_VERBOSE(priv, "Bit error rate: %d\n", strength);
+
+ strength = 0;
+ if (ioctl(fd_frontend, FE_READ_SIGNAL_STRENGTH, &strength) >= 0)
+ MP_VERBOSE(priv, "Signal strength: %d\n", strength);
+
+ strength = 0;
+ if (ioctl(fd_frontend, FE_READ_SNR, &strength) >= 0)
+ MP_VERBOSE(priv, "SNR: %d\n", strength);
+
+ strength = 0;
+ if (ioctl(fd_frontend, FE_READ_UNCORRECTED_BLOCKS, &strength) >= 0)
+ MP_VERBOSE(priv, "UNC: %d\n", strength);
+
+ print_status(priv, festatus);
+
return 0;
}
@@ -410,8 +404,7 @@ static int tune_it(dvb_priv_t *priv, int fd_frontend, unsigned int delsys,
fe_code_rate_t LP_CodeRate, fe_hierarchy_t hier,
int timeout)
{
- int hi_lo = 0, bandwidth_hz = 0;
- dvb_state_t* state = priv->state;
+ dvb_state_t *state = priv->state;
MP_VERBOSE(priv, "tune_it: fd_frontend %d, %s freq %lu, srate %lu, "
"pol %c, diseqc %u\n", fd_frontend,
@@ -432,7 +425,8 @@ static int tune_it(dvb_priv_t *priv, int fd_frontend, unsigned int delsys,
}
}
- /* Prepare params, be verbose. */
+ /* Prepare params, be verbose. */
+ int hi_lo = 0, bandwidth_hz = 0;
switch (delsys) {
case SYS_DVBT2:
case SYS_DVBT:
@@ -644,7 +638,7 @@ int dvb_tune(dvb_priv_t *priv, unsigned int delsys,
MP_INFO(priv, "Tuning to %s frequency %lu Hz\n",
get_dvb_delsys(delsys), (long unsigned int) freq);
- dvb_state_t* state = priv->state;
+ dvb_state_t *state = priv->state;
int ris = tune_it(priv, state->fe_fd, delsys, freq, srate, pol,
stream_id, specInv, diseqc, modulation,
diff --git a/stream/dvbin.h b/stream/dvbin.h
index 7c179bf77b..3daf7470de 100644
--- a/stream/dvbin.h
+++ b/stream/dvbin.h
@@ -79,7 +79,7 @@ typedef struct {
int dvr_fd;
int demux_fd[3], demux_fds[DMX_FILTER_SIZE], demux_fds_cnt;
- int is_on;
+ bool is_on;
int retry;
unsigned int last_freq;
bool switching_channel;
diff --git a/stream/stream_dvb.c b/stream/stream_dvb.c
index 7d68c1ec01..d776e7b18b 100644
--- a/stream/stream_dvb.c
+++ b/stream/stream_dvb.c
@@ -62,7 +62,6 @@
#endif
#define CHANNEL_LINE_LEN 256
-#define min(a, b) ((a) <= (b) ? (a) : (b))
#define OPT_BASE_STRUCT dvb_opts_t
@@ -89,102 +88,99 @@ 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 fe_code_rate_t parse_fec(const char *cr)
+{
+ if (!strcmp(cr, "FEC_1_2")) {
+ return FEC_1_2;
+ } else if (!strcmp(cr, "FEC_2_3")) {
+ return FEC_2_3;
+ } else if (!strcmp(cr, "FEC_3_4")) {
+ return FEC_3_4;
+ } else if (!strcmp(cr, "FEC_4_5")) {
+ return FEC_4_5;
+ } else if (!strcmp(cr, "FEC_5_6")) {
+ return FEC_5_6;
+ } else if (!strcmp(cr, "FEC_6_7")) {
+ return FEC_6_7;
+ } else if (!strcmp(cr, "FEC_7_8")) {
+ return FEC_7_8;
+ } else if (!strcmp(cr, "FEC_8_9")) {
+ return FEC_8_9;
+ } else if (!strcmp(cr, "FEC_NONE")) {
+ return FEC_NONE;
}
+ return FEC_NONE;
+}
+
+static fe_modulation_t parse_vdr_modulation(const char** modstring)
+{
+ const static struct { const char *s; fe_modulation_t v; } table[] = {
+ { "16", QAM_16 },
+ { "32", QAM_32 },
+ { "64", QAM_64 },
+ { "128", QAM_128 },
+ { "256", QAM_256 },
+ { "998", QAM_AUTO },
+ { "2", QPSK },
+ { "5", PSK_8 },
+ { "6", APSK_16 },
+ { "7", APSK_32 },
+ { "10", VSB_8 },
+ { "11", VSB_16 },
+ { "12", DQPSK },
+ };
+ for (int i = 0; i < MP_ARRAY_SIZE(table); i++) {
+ if (!strncmp(*modstring, table[i].s, strlen(table[i].s))) {
+ *modstring += strlen(table[i].s);
+ return table[i].v;
+ }
+ }
+ return QAM_AUTO;
}
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_x2 = true;
- } else {
- ptr->is_dvb_x2 = 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;
- case 'M':
- vdr_par++;
- ptr->mod = parse_vdr_modulation(&vdr_par);
- break;
- default:
- vdr_par++;
+ if (!vdr_par_str[0])
+ return;
+ 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++;
+ ptr->is_dvb_x2 = *vdr_par == '1';
+ 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++;
+ ptr->inv = (*vdr_par == '1') ? INVERSION_ON : INVERSION_OFF;
+ vdr_par++;
+ break;
+ case 'M':
+ vdr_par++;
+ ptr->mod = parse_vdr_modulation(&vdr_par);
+ break;
+ default:
+ vdr_par++;
}
}
}
@@ -214,38 +210,36 @@ static char *dvb_strtok_r(char *s, const char *sep, char **p)
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 = NULL;
- 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 (!pid_string[0])
+ return false;
+ 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 = NULL;
+ 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");
+ break;
+ }
+ 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++;
}
- if (pcnt > 0)
- return true;
+ pidPart = dvb_strtok_r(NULL, tokens, &savePtr);
}
- return false;
+ return pcnt > 0;
}
static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
@@ -256,18 +250,10 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
int delsys, unsigned int delsys_mask)
{
dvb_channels_list_t *list = list_add;
- FILE *f;
- char line[CHANNEL_LINE_LEN], *colon;
if (!filename)
return list;
- int fields, cnt, k;
- int has8192, has0;
- dvb_channel_t *ptr, 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";
@@ -279,7 +265,8 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
mp_verbose(log, "Reading config file %s for type %s\n",
filename, get_dvb_delsys(delsys));
- if ((f = fopen(filename, "r")) == NULL) {
+ FILE *f = fopen(filename, "r");
+ if (!f) {
mp_fatal(log, "Can't open file %s\n", filename);
return list;
}
@@ -287,34 +274,42 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
if (!list)
list = talloc_zero(NULL, dvb_channels_list_t);
- ptr = &chn;
while (!feof(f)) {
- if (fgets(line, CHANNEL_LINE_LEN, f) == NULL)
+ char line[CHANNEL_LINE_LEN];
+ if (!fgets(line, CHANNEL_LINE_LEN, f))
continue;
- if ((line[0] == '#') || (strlen(line) == 0))
+ if (line[0] == '#' || strlen(line) == 0)
continue;
- memset(ptr, 0x00, sizeof(dvb_channel_t));
+ dvb_channel_t chn = {0};
+ dvb_channel_t *ptr = &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];
+
vpid_str[0] = apid_str[0] = tpid_str[0] = 0;
vdr_loc_str[0] = vdr_par_str[0] = 0;
- 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 = talloc_strndup(list, line, channel_name_length);
- } else {
+ char *colon = strchr(line, ':');
+ if (!colon)
continue;
+ int 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 namelen = k;
+ if (bouquet_sep && bouquet_sep < colon)
+ namelen = bouquet_sep - line;
+ ptr->name = talloc_strndup(list, line, namelen);
}
+
k++;
+
ptr->pids_cnt = 0;
ptr->freq = 0;
ptr->service_id = -1;
@@ -333,7 +328,7 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
ptr->trans = TRANSMISSION_MODE_AUTO;
// Check if VDR-type channels.conf-line - then full line is consumed by the scan.
- int num_chars = 0;
+ int fields, 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,
@@ -356,11 +351,11 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
// Frequency in VDR-style config files is in MHz for DVB-S,
// and may be in MHz, kHz or Hz for DVB-C and DVB-T.
// General rule to get useful units is to multiply by 1000 until value is larger than 1000000.
- while (ptr->freq < 1000000UL) {
- ptr->freq *= 1000UL;
+ while (ptr->freq < 1000000U) {
+ ptr->freq *= 1000U;
}
// Symbol rate in VDR-style config files is divided by 1000.
- ptr->srate *= 1000UL;
+ ptr->srate *= 1000U;
switch (delsys) {
case SYS_DVBT:
case SYS_DVBT2:
@@ -470,8 +465,8 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
vpid_str,
apid_str);
ptr->pol = mp_toupper(ptr->pol);
- ptr->freq *= 1000UL;
- ptr->srate *= 1000UL;
+ ptr->freq *= 1000U;
+ ptr->srate *= 1000U;
if (ptr->diseqc > 4)
continue;
if (ptr->diseqc > 0)
@@ -525,12 +520,12 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
ptr->pids_cnt++;
}
- has8192 = has0 = 0;
- for (cnt = 0; cnt < ptr->pids_cnt; cnt++) {
+ bool has8192 = false, has0 = false;
+ for (int cnt = 0; cnt < ptr->pids_cnt; cnt++) {
if (ptr->pids[cnt] == 8192)
- has8192 = 1;
+ has8192 = true;
if (ptr->pids[cnt] == 0)
- has0 = 1;
+ has0 = true;
}
/* 8192 is the pseudo-PID for full TP dump,
@@ -546,7 +541,7 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
}
mp_verbose(log, " PIDS: ");
- for (cnt = 0; cnt < ptr->pids_cnt; cnt++)
+ for (int cnt = 0; cnt < ptr->pids_cnt; cnt++)
mp_verbose(log, " %d ", ptr->pids[cnt]);
mp_verbose(log, "\n");
@@ -562,26 +557,7 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
ptr->inv = INVERSION_OFF;
}
-
- 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;
- }
+ ptr->cr = parse_fec(cr);
}
switch (delsys) {
@@ -658,26 +634,7 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
ptr->gi = GUARD_INTERVAL_1_4;
}
- 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;
- } else if (!strcmp(tmp_lcr, "FEC_7_8")) {
- ptr->cr_lp = FEC_7_8;
- } else if (!strcmp(tmp_lcr, "FEC_NONE")) {
- ptr->cr_lp = FEC_NONE;
- }
-
+ ptr->cr_lp = parse_fec(tmp_lcr);
if (!strcmp(tmp_hier, "HIERARCHY_1")) {
ptr->hier = HIERARCHY_1;
@@ -702,23 +659,24 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
static int dvb_streaming_read(stream_t *stream, void *buffer, int size)
{
- struct pollfd pfds[1];
- int pos = 0, tries, rk, fd;
- dvb_priv_t *priv = (dvb_priv_t *) stream->priv;
+ dvb_priv_t *priv = stream->priv;
dvb_state_t *state = priv->state;
+ int pos = 0;
+ int tries = state->retry;
+ const int fd = state->dvr_fd;
MP_TRACE(stream, "dvb_streaming_read(%d)\n", size);
- tries = state->retry;
- fd = state->dvr_fd;
+ struct pollfd pfds[1];
+ pfds[0].fd = fd;
+ pfds[0].events = POLLIN | POLLPRI;
+
while (pos < size) {
- rk = read(fd, (char *)buffer + pos, (size - pos));
+ int rk = read(fd, (char *)buffer + pos, (size - pos));
if (rk <= 0) {
if (pos || tries == 0)
break;
- tries --;
- pfds[0].fd = fd;
- pfds[0].events = POLLIN | POLLPRI;
+ tries--;
if (poll(pfds, 1, 2000) <= 0) {
MP_ERR(stream, "dvb_streaming_read: failed with "
"errno %d when reading %d bytes\n", errno, size - pos);
@@ -742,27 +700,24 @@ static int dvb_streaming_read(stream_t *stream, void *buffer, int size)
int dvb_set_channel(stream_t *stream, unsigned int adapter, unsigned int n)
{
- dvb_channels_list_t *new_list;
- dvb_channel_t *channel;
dvb_priv_t *priv = stream->priv;
- char buf[4096];
- dvb_state_t *state = (dvb_state_t *) priv->state;
- int devno;
- int i;
+ dvb_state_t *state = priv->state;
assert(adapter < state->adapters_count);
- devno = state->adapters[adapter].devno;
- new_list = state->adapters[adapter].list;
+ int devno = state->adapters[adapter].devno;
+ dvb_channels_list_t *new_list = state->adapters[adapter].list;
assert(n < new_list->NUM_CHANNELS);
- channel = &(new_list->channels[n]);
+ dvb_channel_t *channel = &(new_list->channels[n]);
if (state->is_on) { //the fds are already open and we have to stop the demuxers
/* Remove all demuxes. */
dvb_fix_demuxes(priv, 0);
state->retry = 0;
- //empty both the stream's and driver's buffer
+ // empty both the stream's and driver's buffer
+ char buf[4096];
while (dvb_streaming_read(stream, buf, sizeof(buf)) > 0) {}
+
if (state->cur_adapter != adapter ||
state->cur_frontend != channel->frontend) {
dvbin_close(stream);
@@ -800,7 +755,7 @@ int dvb_set_channel(stream_t *stream, unsigned int adapter, unsigned int n)
return 0;
}
- state->is_on = 1;
+ state->is_on = true;
state->last_freq = channel->freq;
state->cur_adapter = adapter;
state->cur_frontend = channel->frontend;
@@ -808,7 +763,7 @@ int dvb_set_channel(stream_t *stream, unsigned int adapter, unsigned int n)
if (channel->service_id != -1) {
/* We need the PMT-PID in addition.
If it has not yet beem resolved, do it now. */
- for (i = 0; i < channel->pids_cnt; i++) {
+ for (int i = 0; i < channel->pids_cnt; i++) {
if (channel->pids[i] == -1) {
MP_VERBOSE(stream, "dvb_set_channel: PMT-PID for service %d "
"not resolved yet, parsing PAT...\n",
@@ -816,21 +771,22 @@ int dvb_set_channel(stream_t *stream, unsigned int adapter, unsigned int n)
int pmt_pid = dvb_get_pmt_pid(priv, adapter, channel->service_id);
MP_VERBOSE(stream, "found PMT-PID: %d\n", pmt_pid);
channel->pids[i] = pmt_pid;
+ break;
}
}
}
// sets demux filters and restart the stream
- for (i = 0; i < channel->pids_cnt; i++) {
+ for (int i = 0; i < channel->pids_cnt; i++) {
if (channel->pids[i] == -1) {
// In case PMT was not resolved, skip it here.
MP_ERR(stream, "dvb_set_channel: PMT-PID not found, "
"teletext decoding may fail.\n");
- } else {
- if (!dvb_set_ts_filt(priv, state->demux_fds[i], channel->pids[i],
- DMX_PES_OTHER))
- return 0;
+ continue;
}
+ if (!dvb_set_ts_filt(priv, state->demux_fds[i], channel->pids[i],
+ DMX_PES_OTHER))
+ return 0;
}
return 1;
@@ -838,13 +794,12 @@ int dvb_set_channel(stream_t *stream, unsigned int adapter, unsigned int n)
static int dvbin_stream_control(struct stream *s, int cmd, void *arg)
{
- dvb_priv_t *priv = (dvb_priv_t *) s->priv;
+ dvb_priv_t *priv = s->priv;
dvb_state_t *state = priv->state;
- dvb_channels_list_t *list = NULL;
if (state->cur_adapter >= state->adapters_count)
return STREAM_ERROR;
- list = state->adapters[state->cur_adapter].list;
+ dvb_channels_list_t *list = state->adapters[state->cur_adapter].list;
switch (cmd) {
case STREAM_CTRL_GET_METADATA: {
@@ -860,16 +815,16 @@ static int dvbin_stream_control(struct stream *s, int cmd, void *arg)
void dvbin_close(stream_t *stream)
{
- dvb_priv_t *priv = (dvb_priv_t *) stream->priv;
+ dvb_priv_t *priv = stream->priv;
dvb_state_t *state = priv->state;
if (state->switching_channel && state->is_on) {
- // Prevent state destruction, reset channel-switch.
- state->switching_channel = false;
- pthread_mutex_lock(&global_dvb_state_lock);
- global_dvb_state->stream_used = false;
- pthread_mutex_unlock(&global_dvb_state_lock);
- return;
+ // Prevent state destruction, reset channel-switch.
+ state->switching_channel = false;
+ pthread_mutex_lock(&global_dvb_state_lock);
+ global_dvb_state->stream_used = false;
+ pthread_mutex_unlock(&global_dvb_state_lock);
+ return;
}
for (int i = state->demux_fds_cnt - 1; i >= 0; i--) {
@@ -880,7 +835,7 @@ void dvbin_close(stream_t *stream)
close(state->fe_fd);
state->fe_fd = state->dvr_fd = -1;
- state->is_on = 0;
+ state->is_on = false;
state->cur_adapter = -1;
state->cur_frontend = -1;
@@ -891,16 +846,15 @@ void dvbin_close(stream_t *stream)
static int dvb_streaming_start(stream_t *stream, char *progname)
{
- int i;
- dvb_channel_t *channel = NULL;
dvb_priv_t *priv = stream->priv;
dvb_state_t *state = priv->state;
- dvb_channels_list_t *list;
- if (progname == NULL)
+ if (!progname)
return 0;
- list = state->adapters[state->cur_adapter].list;
+ dvb_channels_list_t *list = state->adapters[state->cur_adapter].list;
+ dvb_channel_t *channel = NULL;
+ int i;
for (i = 0; i < list->NUM_CHANNELS; i ++) {
if (!strcmp(list->channels[i].name, progname)) {
channel = &(list->channels[i]);
@@ -908,16 +862,16 @@ static int dvb_streaming_start(stream_t *stream, char *progname)
}
}
- if (channel == NULL) {
+ if (!channel) {
MP_ERR(stream, "no such channel \"%s\"\n", progname);
return 0;
}
-
list->current = i;
// When switching channels, cfg_channel_switch_offset
// keeps the offset to the initially chosen channel.
- list->current = (list->NUM_CHANNELS + list->current + priv->opts->cfg_channel_switch_offset) % list->NUM_CHANNELS;
+ list->current = (list->NUM_CHANNELS + list->current +
+ priv->opts->cfg_channel_switch_offset) % list->NUM_CHANNELS;
channel = &(list->channels[list->current]);
MP_INFO(stream, "Tuning to channel \"%s\"...\n", channel->name);
MP_VERBOSE(stream, "Program number %d: name=\"%s\", freq=%u\n", i,
@@ -934,28 +888,29 @@ static int dvb_streaming_start(stream_t *stream, char *progname)
void dvb_update_config(stream_t *stream)
{
dvb_priv_t *priv = stream->priv;
- int now = (int)(mp_time_sec()*10);
+ dvb_state_t *state = priv->state;
// Throttle the check to at maximum once every 0.1 s.
- if (now != priv->opts_check_time) {
- priv->opts_check_time = now;
- if (m_c