From 4cc48d9f7e6574a259990976a205034c61c135aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Thu, 25 Mar 2010 20:49:19 +0000 Subject: [PATCH] A single PMT PID can carry tables for multiple services. So, support that. Fixes ticket #174 --- src/dvb/dvb.h | 3 +-- src/dvb/dvb_tables.c | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 5d7636de..e440091c 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -323,8 +323,7 @@ void dvb_table_init(th_dvb_adapter_t *tda); void dvb_table_add_default(th_dvb_mux_instance_t *tdmi); -void dvb_table_add_transport(th_dvb_mux_instance_t *tdmi, th_transport_t *t, - int pmt_pid); +void dvb_table_add_pmt(th_dvb_mux_instance_t *tdmi, int pmt_pid); void dvb_table_flush_all(th_dvb_mux_instance_t *tdmi); diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index 00aa6865..19aa47d4 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -816,7 +816,7 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, if(service != 0 && pmt != 0) { t = dvb_transport_find(tdmi, service, pmt, NULL); - dvb_table_add_transport(tdmi, t, pmt); + dvb_table_add_pmt(tdmi, pmt); } ptr += 4; len -= 4; @@ -1246,11 +1246,13 @@ static int dvb_pmt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, uint8_t tableid, void *opaque) { - th_transport_t *t = opaque; - - pthread_mutex_lock(&t->tht_stream_mutex); - psi_parse_pmt(t, ptr, len, 1, 1); - pthread_mutex_unlock(&t->tht_stream_mutex); + th_transport_t *t; + + LIST_FOREACH(t, &tdmi->tdmi_transports, tht_group_link) { + pthread_mutex_lock(&t->tht_stream_mutex); + psi_parse_pmt(t, ptr, len, 1, 1); + pthread_mutex_unlock(&t->tht_stream_mutex); + } return 0; } @@ -1361,18 +1363,16 @@ dvb_table_add_default(th_dvb_mux_instance_t *tdmi) * Setup FD + demux for a services PMT */ void -dvb_table_add_transport(th_dvb_mux_instance_t *tdmi, th_transport_t *t, - int pmt_pid) +dvb_table_add_pmt(th_dvb_mux_instance_t *tdmi, int pmt_pid) { struct dmx_sct_filter_params *fp; char pmtname[100]; - snprintf(pmtname, sizeof(pmtname), "PMT(%d), service:%d", - pmt_pid, t->tht_dvb_service_id); + snprintf(pmtname, sizeof(pmtname), "PMT(%d)", pmt_pid); fp = dvb_fparams_alloc(); fp->filter.filter[0] = 0x02; fp->filter.mask[0] = 0xff; - tdt_add(tdmi, fp, dvb_pmt_callback, t, pmtname, + tdt_add(tdmi, fp, dvb_pmt_callback, tdmi, pmtname, TDT_CRC | TDT_QUICKREQ, pmt_pid, NULL); }