void dvb_dmx_close(int dmx_fd);
void dvb_dmx_stop(int dmx_fd);
-int dvb_set_pesfilter(int dmxfd, int pid, dmx_pes_type_t type, dmx_output_t output, int buffersize);
+int dvb_set_pesfilter(int dmxfd, int pid, dmx_pes_type_t type,
+ dmx_output_t output, int buffersize);
+
+int dvb_set_section_filter(int dmxfd, int pid, unsigned filtsize,
+ unsigned char *filter,
+ unsigned char *mask,
+ unsigned char *mode,
+ unsigned int flags);
int get_pmt_pid(const char *dmxdev, int sid);
(void) ioctl(dmx_fd, DMX_STOP);
}
-int dvb_set_pesfilter(int dmxfd, int pid, dmx_pes_type_t type, dmx_output_t output, int buffersize)
+int dvb_set_pesfilter(int dmxfd, int pid, dmx_pes_type_t type,
+ dmx_output_t output, int buffersize)
{
struct dmx_pes_filter_params pesfilter;
return 0;
}
+int dvb_set_section_filter(int dmxfd, int pid, unsigned filtsize,
+ unsigned char *filter,
+ unsigned char *mask,
+ unsigned char *mode,
+ unsigned int flags)
+{
+ struct dmx_sct_filter_params sctfilter;
+
+ if (filtsize > DMX_FILTER_SIZE)
+ filtsize = DMX_FILTER_SIZE;
+
+ memset(&sctfilter, 0, sizeof(sctfilter));
+
+ sctfilter.pid = pid;
+
+ if (filter)
+ memcpy(sctfilter.filter.filter, filter, filtsize);
+ if (mask)
+ memcpy(sctfilter.filter.mask, mask, filtsize);
+ if (mode)
+ memcpy(sctfilter.filter.mode, mode, filtsize);
+
+ sctfilter.flags = flags;
+
+ if (ioctl(dmxfd, DMX_SET_FILTER, &sctfilter) == -1) {
+ fprintf(stderr, "DMX_SET_FILTER failed (PID = 0x%04x): %d %m\n",
+ pid, errno);
+ return -1;
+ }
+
+ return 0;
+}
+
int get_pmt_pid(const char *dmxdev, int sid)
{
int patfd, count;
uint8_t *buf = NULL;
uint8_t *tbl = NULL;
ssize_t table_length = 0;
+ uint8_t mask = 0xff;
/* variables for section handling */
int start_id = -1;
int first_section = -1;
int last_section = -1;
int sections = 0;
- struct dmx_sct_filter_params f;
struct dvb_table_header *h;
if (!table)
// FIXME: verify known table
- memset(&f, 0, sizeof(f));
- f.pid = pid;
- f.filter.filter[0] = tid;
- f.filter.mask[0] = 0xff;
- f.timeout = 0;
- f.flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC;
- if (ioctl(dmx_fd, DMX_SET_FILTER, &f) == -1) {
- dvb_perror("dvb_read_section: ioctl DMX_SET_FILTER failed");
+ if (dvb_set_section_filter(dmx_fd, pid, 1, &tid, &mask, NULL,
+ DMX_IMMEDIATE_START | DMX_CHECK_CRC))
return -1;
- }
if (parms->verbose)
dvb_log("Parsing table ID %d, program ID %d", tid, pid);