summaryrefslogtreecommitdiff
path: root/libdvbmpeg/DVB.hh
diff options
context:
space:
mode:
Diffstat (limited to 'libdvbmpeg/DVB.hh')
-rw-r--r--libdvbmpeg/DVB.hh446
1 files changed, 446 insertions, 0 deletions
diff --git a/libdvbmpeg/DVB.hh b/libdvbmpeg/DVB.hh
new file mode 100644
index 0000000..e713bee
--- /dev/null
+++ b/libdvbmpeg/DVB.hh
@@ -0,0 +1,446 @@
+#ifndef _DVB_DEV_HH_
+#define _DVB_DEV_HH_
+
+extern "C" {
+#include <asm/errno.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <sys/un.h>
+#include <time.h>
+#include <unistd.h>
+
+#define NEWSTRUCT
+#include <channel.h>
+}
+
+#include <sstream>
+#include <iostream>
+#include <iomanip>
+using namespace std;
+
+#include <osd.hh>
+#include <devices.hh>
+
+#ifndef MAXNAM
+#define MAXNAM 80
+#endif
+
+
+
+#define FRONT_DVBS 1
+#define FRONT_DVBC 2
+#define FRONT_DVBT 3
+
+#define VTXDIR "/var/vtx"
+
+#define DEC(N) dec << setw(N) << setfill('0')
+#define HEX(N) hex << setw(N) << setfill('0')
+
+#define MAXSECSIZE 4096
+
+#define NK 10
+enum {LNB=0,DIS,ROTOR,TRANS,CHAN,BOU,SAT,PICS,SWI,NTW};
+static const int nums[]={LNB,DIS,ROTOR,TRANS,CHAN,BOU,SAT,PICS,SWI,NTW};
+static const int maxs[]={ 32, 32, 32, 512,16384,512,100, 50, 10, 100};
+
+#define MAX_TRANS_CHAN 1024
+
+enum{DVB_ORIG=0, DVB_NOKIA, DVB_XML, DVB_SATCO};
+
+typedef struct frontend_stat_s{
+ fe_status_t status;
+ uint16_t snr;
+ uint16_t strength;
+ uint32_t ber;
+ uint32_t u_blocks;
+} frontend_stat;
+
+
+extern uint8_t hamtab[256];
+extern uint8_t invtab[256];
+
+#define MAX_MAG 8
+typedef struct mag_struct_ {
+ int valid;
+ int magn;
+ uint8_t flags;
+ uint8_t lang;
+ int pnum,sub;
+ uint8_t pagebuf[25*40];
+} magazin_t;
+
+
+class DVB {
+public:
+ int no_open;
+ int fd_frontend;
+ int fd_demuxa;
+ int fd_demuxv;
+ int fd_demuxpcr;
+ int fd_demuxtt;
+ int fdvb;
+
+ int minor;
+ int adapter;
+ int max_tpid;
+ int max_satid;
+ int max_chanid;
+
+ frontend_stat festat;
+
+ struct dvb_diseqc_master_cmd dcmd;
+ fe_sec_tone_mode_t tone;
+ fe_sec_voltage_t voltage;
+ int burst;
+ struct dmx_pes_filter_params pesFilterParamsV;
+ struct dmx_pes_filter_params pesFilterParamsA;
+ struct dmx_pes_filter_params pesFilterParamsP;
+ struct dmx_pes_filter_params pesFilterParamsTT;
+ struct dvb_frontend_parameters front_param;
+ int front_type;
+ int dvr_enabled;
+ OSD osd;
+ uint32_t transponder_freq;
+ char transponder_pol;
+ uint32_t transponder_srate;
+
+
+
+ fe_status_t status;
+ uint32_t ber, uncorrected_blocks;
+ uint16_t snr, signal;
+
+
+ struct Lnb *lnbs;
+ struct DiSEqC *diseqcs;
+ struct Rotor *rotors;
+ struct Transponder *tps;
+ struct Channel *chans;
+ struct Bouquet *bouqs;
+ struct Sat *sats;
+ struct Picture *pics;
+ struct Switch *swis;
+ struct Network *ntws;
+ int num[NK];
+ int oldsec;
+ int tryit;
+ int oldpol;
+
+ char *vtxdir;
+ magazin_t magazin[MAX_MAG];
+
+ DVB(){
+ no_open = 0;
+ max_tpid = 0;
+ max_satid = 0;
+ max_chanid = 0;
+ minor = 0;
+
+ fd_frontend = -1;
+ fd_demuxa = -1;
+ fd_demuxpcr = -1;
+ fd_demuxv = -1;
+ fd_demuxtt = -1;
+ fdvb = -1;
+ vtxdir = NULL;
+ transponder_freq=0;
+ transponder_pol=0;
+ transponder_srate=0;
+ }
+
+ DVB(int i){
+ if (i >= 0)
+ no_open = 0;
+ else
+ no_open = 1;
+ max_tpid = 0;
+ max_satid = 0;
+ max_chanid = 0;
+
+ fd_frontend = -1;
+ fd_demuxa = -1;
+ fd_demuxpcr = -1;
+ fd_demuxv = -1;
+ fd_demuxtt = -1;
+ fdvb = -1;
+ vtxdir = NULL;
+ transponder_freq=0;
+ transponder_pol=0;
+ transponder_srate=0;
+
+ init("","",i);
+ }
+
+ DVB(char *a, char *b) {
+ max_tpid = 0;
+ max_satid = 0;
+ max_chanid = 0;
+
+ fd_frontend = -1;
+ fd_demuxa = -1;
+ fd_demuxpcr = -1;
+ fd_demuxv = -1;
+ fd_demuxtt = -1;
+
+ fdvb = -1;
+ vtxdir = NULL;
+ init(a,b,0);
+ }
+
+ ~DVB();
+
+ void use_osd(int fd = -1){
+ char dvn[32];
+ if (no_open) return;
+ if (fd < 0) fd = 0;
+ sprintf(dvn,OSD_DEV,adapter,fd);
+ fdvb = open(dvn, O_RDWR);
+
+ if (fdvb >= 0){
+ cerr << dvn << " for OSD" << endl;
+ osd.init(fdvb);
+ } else perror("osd");
+ osd.Open(80, 500, 640, 540, 2, 0, 2);
+ osd.SetColor(0, 0, 0, 0, 255);
+ osd.SetColor(1, 240, 240, 240, 255);
+ osd.Show();
+ }
+
+ void set_vtxdir(char *newname){
+ if (!newname) return;
+ if (vtxdir) free(vtxdir);
+ vtxdir = (char *) malloc(sizeof(char)*(strlen(newname)+1));
+ if (vtxdir)
+ strncpy(vtxdir, newname, strlen(newname));
+ }
+
+ void close_osd(){
+ osd.Close(fdvb);
+ close(fdvb);
+ }
+
+ int DVR_enabled(){
+ if (no_open) return -1;
+ return dvr_enabled;
+ }
+
+ void enable_DVR(){
+ if (no_open) return;
+ dvr_enabled = 1;
+ }
+
+ void enable_DVR_other(){
+ if (no_open) return;
+ dvr_enabled = 2;
+ }
+
+ void disable_DVR(){
+ if (no_open) return;
+ dvr_enabled = 0;
+ }
+
+ void init(char *a="/dev/video0", char *b="/dev/vbi0",int adapt=0,
+ int minor = 0);
+
+
+ inline void init(char *a, char *b){
+ if (no_open) return;
+ init(a,b,0,0);
+ }
+
+ int check_frontend();
+
+ void set_apid(ushort apid);
+ void set_vpid(ushort vpid);
+ void set_pcrpid(ushort vpid);
+ void set_ttpid(ushort ttpid);
+ int set_apid_fd(ushort apid, int fd);
+ int set_vpid_fd(ushort vpid, int fd);
+ int set_ttpid_fd(ushort ttpid, int fd);
+ int set_pcrpid_fd(ushort pcrpid, int fd);
+ int set_otherpid_fd(ushort otherpid, int fd);
+
+
+ int set_lnb(int dis);
+ void set_diseqc_nb(int nr);
+ int set_front(void);
+ void get_front(void);
+
+ void scan_pf_eit(int chnr,
+ int (*callback)(uint8_t *data, int l, int pnr,
+ int c_n, uint8_t *t));
+
+ void scan_pf_eit(Channel *chan,
+ int (*callback)(uint8_t *data, int l, int pnr,
+ int c_n, uint8_t *t));
+ void scan_pf_eit(int chnr);
+
+
+ int search_in_TP(Transponder &tp, int show=1, int verbose=0);
+ int search_in_TP(uint16_t tpid, uint16_t satid, int show=1,
+ int verbose=0);
+ int scan_TP(uint16_t tpid, uint16_t satid, int timeout=-1, int verbose=0);
+
+ int GetSection(uint8_t *buf,
+ uint16_t PID, uint8_t TID, uint16_t TIDExt,
+ uint16_t FilterTIDExt,
+ uint8_t secnum, uint8_t &msecnum);
+ int GetSection(uint8_t *buf,
+ uint16_t PID, uint8_t *filter, uint8_t *mask,
+ uint8_t secnum, uint8_t &msecnum);
+ int GetSection(uint8_t *buf, ushort PID, uint8_t sec,
+ uint8_t secnum, uint8_t &msecnum);
+ int SetFilter(uint16_t pid, uint8_t *filter,
+ uint8_t *mask,
+ uint32_t timeout, uint32_t flags);
+ uint16_t SetFilter(uint16_t pid, uint16_t section, uint16_t mode);
+ int CloseFilter(int h);
+
+
+ void bar2(int x, int y, int w, int h, int val, int col1, int col2);
+
+ int SetTP(unsigned int, unsigned int);
+ int scan(void);
+ int scan_all_tps(void);
+ int scan_lnb(struct Lnb &);
+ int scan_cable(Sat &sat);
+ int scan_sat(struct Sat &);
+ int scan_tp(struct Transponder &);
+
+ int AddLNB(int id, int t, uint l1, uint l2, uint sl,
+ int dnr, int dis, int sw);
+ int AddSat(Sat &sat);
+ int AddSat(int satid, unsigned int lnbid, char *name, uint fmin, uint fmax);
+ int AddTP(Transponder &tp);
+ int AddChannel(Channel &chan);
+ int parse_descriptor(Channel *chan, uint8_t *data, int length);
+ int parse_pmt(Channel *chan, uint8_t *data);
+ int parse_pat(Channel *chan, uint8_t *data);
+
+ int check_pids(Channel *chan);
+ void check_all_pids();
+ void scan_sdt(Channel *chan);
+ int scan_sdts(int *chs, int n);
+
+ int channel_num(void) {
+ return num[CHAN];
+ };
+
+ int channel_change(int n) {
+ return 0;
+ };
+ int SetChannel(uint16_t, uint16_t, uint16_t, uint16_t);
+ int SetChannel(Channel *chan, char* apref=NULL, uint16_t *apidp=NULL,
+ uint16_t *vpidp=NULL) ;
+ int SetChannel(int chnr, char *apref=NULL, uint16_t *apidp=NULL,
+ uint16_t *vpidp=NULL);
+ int GetChannel(int chnr, struct channel *);
+ int NumChannel(void) {
+ return num[CHAN];
+ }
+ int tune_it(struct dvb_frontend_parameters *qpsk);
+ void find_satid(Channel &chan);
+ int check_input_format(istream &ins);
+ void read_original(istream &ins);
+ int get_all_progs(uint16_t *progbuf, uint16_t *pnrbuf, int length);
+ uint16_t find_pnr(uint16_t vpid, uint16_t apid);
+ int get_pids(uint16_t prog_pid, uint16_t *vpid, uint16_t *apids,
+ uint16_t *ttpid, uint8_t *apids_name=NULL);
+ void AddECM(Channel *chan, uint8_t *data, int length);
+ int check_ecm(Channel *chan);
+ void add_vtx_line(magazin_t *mag, int line, uint8_t *data, int pnr);
+
+ friend ostream &operator<<(ostream &stream, DVB &x);
+ friend istream &operator>>(istream &stream, DVB &x);
+
+};
+
+#define NOKIA_MAX_SAT 4
+class nokiaconv{
+public:
+ DVB *dvb;
+ struct lnb_sat_l{
+ int n;
+ int diseqc[NOKIA_MAX_SAT];
+ char sat_names[NOKIA_MAX_SAT][MAXNAM+1];
+ int satid[NOKIA_MAX_SAT];
+ } lnb_sat;
+
+ nokiaconv(DVB *d){
+ dvb = d;
+ }
+
+ friend istream &operator>>(istream &stream, nokiaconv &x);
+};
+
+#define XML_MAX_SAT 4
+class xmlconv{
+public:
+ DVB *dvb;
+ struct lnb_sat_l{
+ int n;
+ int diseqc[XML_MAX_SAT];
+ char sat_names[XML_MAX_SAT][MAXNAM+1];
+ int satid[XML_MAX_SAT];
+ } lnb_sat;
+
+ xmlconv(DVB *d){
+ dvb = d;
+ }
+ int read_stream(istream &ins, int nchan);
+ int read_desc(istream &ins, int nchan);
+ int read_serv(istream &ins, int ctp, int csat);
+ int read_trans(istream &ins, int satid);
+ int read_sat(istream &ins, int satid = -1);
+ int skip_tag(istream &ins, char *tag);
+ int read_iso639(istream &ins, int nchan, int apids);
+
+ friend istream &operator>>(istream &stream, xmlconv &x);
+};
+
+
+
+#define SATCO_MAX_SAT 10
+class satcoconv{
+public:
+ DVB *dvb;
+ int nlnb;
+
+ satcoconv(DVB *d){
+ dvb = d;
+ }
+
+ friend istream &operator>>(istream &stream, satcoconv &x);
+};
+
+void hdump(uint8_t *buf, int n);
+int get_dvbrc(char *path, DVB &dv, int dev, int len);
+int set_dvbrc(char *path, DVB &dv, int dev, int len);
+void dvb2txt(char *out, char *in, int len);
+int set_sfront(int fdf, uint32_t freq, uint32_t pol, uint32_t sr , int snum, fe_code_rate_t fec);
+void set_pes_filt(int fd,uint16_t pes_pid);
+void set_diseqc(int fdf, int snum, fe_sec_voltage_t v, fe_sec_tone_mode_t t);
+int tune(int fdf, uint32_t freq, uint32_t sr, fe_code_rate_t fec);
+int set_sfront(int fdf, uint32_t freq, uint32_t pol, uint32_t sr , int snum,
+ fe_code_rate_t fec);
+
+
+struct in_addr getaddress (const char *name);
+int tcp_client_connect(const char *hostname, int sckt);
+int udp_client_connect(const char *filename);
+void client_send_msg(int fd, uint8_t *msg, int size);
+int chck_frontend (int fefd, frontend_stat *festat);
+
+uint8_t deham(uint8_t x, uint8_t y);
+
+#endif