summaryrefslogtreecommitdiffstats
path: root/stream/dvbin.h
blob: 3daf7470de81ce1e34aa6eee64ed275324938a0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* Imported from the dvbstream project
 *
 * Modified for use with MPlayer, for details see the changelog at
 * http://svn.mplayerhq.hu/mplayer/trunk/
 * $Id$
 */

#ifndef MPLAYER_DVBIN_H
#define MPLAYER_DVBIN_H

#include "config.h"
#include "stream.h"

#if !HAVE_GPL
#error GPL only
#endif

#define SLOF (11700 * 1000UL)
#define LOF1 (9750 * 1000UL)
#define LOF2 (10600 * 1000UL)

#include <inttypes.h>
#include <linux/dvb/dmx.h>
#include <linux/dvb/frontend.h>
#include <linux/dvb/version.h>

#define MAX_ADAPTERS 16
#define MAX_FRONTENDS 8

#if DVB_API_VERSION < 5 || DVB_API_VERSION_MINOR < 8
#error DVB support requires a non-ancient kernel
#endif

#define DVB_CHANNEL_LOWER -1
#define DVB_CHANNEL_HIGHER 1

#ifndef DMX_FILTER_SIZE
#define DMX_FILTER_SIZE 32
#endif

typedef struct {
    char *name;
    unsigned int freq, srate, diseqc;
    char pol;
    unsigned int tpid, dpid1, dpid2, progid, ca, pids[DMX_FILTER_SIZE], pids_cnt;
    bool is_dvb_x2; /* Used only in dvb_get_channels() and parse_vdr_par_string(), use delsys. */
    unsigned int frontend;
    unsigned int delsys;
    unsigned int stream_id;
    unsigned int service_id;
    fe_spectral_inversion_t inv;
    fe_modulation_t mod;
    fe_transmit_mode_t trans;
    fe_bandwidth_t bw;
    fe_guard_interval_t gi;
    fe_code_rate_t cr, cr_lp;
    fe_hierarchy_t hier;
} dvb_channel_t;

typedef struct {
    unsigned int NUM_CHANNELS;
    unsigned int current;
    dvb_channel_t *channels;
} dvb_channels_list_t;

typedef struct {
    int devno;
    unsigned int delsys_mask[MAX_FRONTENDS];
    dvb_channels_list_t *list;
} dvb_adapter_config_t;

typedef struct {
    unsigned int adapters_count;
    dvb_adapter_config_t *adapters;
    unsigned int cur_adapter;
    unsigned int cur_frontend;

    int fe_fd;
    int dvr_fd;
    int demux_fd[3], demux_fds[DMX_FILTER_SIZE], demux_fds_cnt;

    bool is_on;
    int retry;
    unsigned int last_freq;
    bool switching_channel;
    bool stream_used;
} dvb_state_t;

typedef struct {
    char *cfg_prog;
    int cfg_devno;
    int cfg_timeout;
    char *cfg_file;
    bool cfg_full_transponder;
    int cfg_channel_switch_offset;
} dvb_opts_t;

typedef struct {
    struct mp_log *log;

    dvb_state_t *state;

    char *prog;
    int devno;

    int opts_check_time;
    dvb_opts_t *opts;
    struct m_config_cache *opts_cache;
} dvb_priv_t;


/* Keep in sync with enum fe_delivery_system. */
#define SYS_DVB__COUNT__            (SYS_DVBC_ANNEX_C + 1)


#define DELSYS_BIT(__bit)        (((unsigned int)1) << (__bit))

#define DELSYS_SET(__mask, __bit)                                       \
    (__mask) |= DELSYS_BIT((__bit))

#define DELSYS_IS_SET(__mask, __bit)                                    \
    (0 != ((__mask) & DELSYS_BIT((__bit))))


#define DELSYS_SUPP_MASK                                                \
    (                                                                   \
        DELSYS_BIT(SYS_DVBC_ANNEX_A) |                                  \
        DELSYS_BIT(SYS_DVBT) |                                          \
        DELSYS_BIT(SYS_DVBS) |                                          \
        DELSYS_BIT(SYS_DVBS2) |                                         \
        DELSYS_BIT(SYS_ATSC) |                                          \
        DELSYS_BIT(SYS_DVBC_ANNEX_B) |                                  \
        DELSYS_BIT(SYS_DVBT2) |                                         \
        DELSYS_BIT(SYS_ISDBT) |                                         \
        DELSYS_BIT(SYS_DVBC_ANNEX_C)                                    \
    )

void dvb_update_config(stream_t *);
int dvb_parse_path(stream_t *);
int dvb_set_channel(stream_t *, unsigned int, unsigned int);
dvb_state_t *dvb_get_state(stream_t *);

#endif /* MPLAYER_DVBIN_H */