2007-09-24 15:03:38 +02:00
|
|
|
/*
|
|
|
|
* sectionfilter.h: IPTV plugin for the Video Disk Recorder
|
|
|
|
*
|
|
|
|
* See the README file for copyright information and how to reach the author.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __IPTV_SECTIONFILTER_H
|
|
|
|
#define __IPTV_SECTIONFILTER_H
|
|
|
|
|
2009-02-27 15:05:19 +01:00
|
|
|
#include <vdr/device.h>
|
2007-09-24 15:03:38 +02:00
|
|
|
|
|
|
|
#include "common.h"
|
2007-10-05 21:00:44 +02:00
|
|
|
#include "statistics.h"
|
2007-09-24 15:03:38 +02:00
|
|
|
|
2007-10-05 21:00:44 +02:00
|
|
|
class cIptvSectionFilter : public cIptvSectionStatistics {
|
2007-09-24 15:03:38 +02:00
|
|
|
private:
|
2007-09-24 19:20:58 +02:00
|
|
|
enum dmx_success {
|
2009-02-27 15:05:19 +01:00
|
|
|
DMX_OK = 0, // Received OK
|
|
|
|
DMX_LENGTH_ERROR, // Incorrect length
|
|
|
|
DMX_OVERRUN_ERROR, // Receiver ring buffer overrun
|
|
|
|
DMX_CRC_ERROR, // Incorrect CRC
|
|
|
|
DMX_FRAME_ERROR, // Frame alignment error
|
|
|
|
DMX_FIFO_ERROR, // Receiver FIFO overrun
|
|
|
|
DMX_MISSED_ERROR // Receiver missed packet
|
2007-09-24 19:20:58 +02:00
|
|
|
};
|
|
|
|
|
2007-10-05 23:52:16 +02:00
|
|
|
enum dmx_limits {
|
|
|
|
DMX_MAX_FILTER_SIZE = 18,
|
|
|
|
DMX_MAX_SECTION_SIZE = 4096,
|
2009-02-27 15:05:19 +01:00
|
|
|
DMX_MAX_SECFEED_SIZE = (DMX_MAX_SECTION_SIZE + TS_SIZE)
|
2007-10-05 23:52:16 +02:00
|
|
|
};
|
|
|
|
|
2007-09-24 19:20:58 +02:00
|
|
|
int fifoDescriptor;
|
|
|
|
int readDescriptor;
|
|
|
|
|
|
|
|
int pusi_seen;
|
|
|
|
int feedcc;
|
|
|
|
int doneq;
|
|
|
|
|
|
|
|
uint8_t *secbuf;
|
|
|
|
uint8_t secbuf_base[DMX_MAX_SECFEED_SIZE];
|
|
|
|
uint16_t secbufp;
|
|
|
|
uint16_t seclen;
|
|
|
|
uint16_t tsfeedp;
|
|
|
|
uint16_t pid;
|
2009-02-27 15:05:19 +01:00
|
|
|
|
|
|
|
int devid;
|
2007-09-24 19:20:58 +02:00
|
|
|
int id;
|
2009-02-27 15:05:19 +01:00
|
|
|
cString pipeName;
|
2007-09-24 19:20:58 +02:00
|
|
|
|
|
|
|
uint8_t filter_value[DMX_MAX_FILTER_SIZE];
|
|
|
|
uint8_t filter_mask[DMX_MAX_FILTER_SIZE];
|
|
|
|
uint8_t filter_mode[DMX_MAX_FILTER_SIZE];
|
2009-02-27 15:05:19 +01:00
|
|
|
|
2007-09-24 19:20:58 +02:00
|
|
|
uint8_t maskandmode[DMX_MAX_FILTER_SIZE];
|
|
|
|
uint8_t maskandnotmode[DMX_MAX_FILTER_SIZE];
|
2007-09-24 15:03:38 +02:00
|
|
|
|
2009-02-27 15:05:19 +01:00
|
|
|
inline uint16_t GetLength(const uint8_t *Data);
|
|
|
|
void New(void);
|
|
|
|
int Filter(void);
|
|
|
|
inline int Feed(void);
|
|
|
|
int CopyDump(const uint8_t *buf, uint8_t len);
|
2007-09-24 15:03:38 +02:00
|
|
|
|
|
|
|
public:
|
2007-09-24 19:20:58 +02:00
|
|
|
// constructor & destructor
|
2009-02-27 15:05:19 +01:00
|
|
|
cIptvSectionFilter(int Index, int DeviceIndex, u_short Pid,
|
|
|
|
u_char Tid, u_char Mask);
|
2007-09-24 19:20:58 +02:00
|
|
|
virtual ~cIptvSectionFilter();
|
2009-02-27 15:05:19 +01:00
|
|
|
void Process(const uint8_t* Data);
|
|
|
|
int GetReadDesc(void);
|
|
|
|
uint16_t GetPid(void) { return pid; }
|
2007-09-24 15:03:38 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // __IPTV_SECTIONFILTER_H
|