From: Jaroslav Kysela Date: Tue, 5 May 2015 07:32:08 +0000 (+0200) Subject: mpegts: another PID subscription shuffling X-Git-Tag: v4.1~61 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=625027927402f6d34c34673d86133177ffa2c8d9;p=thirdparty%2Ftvheadend.git mpegts: another PID subscription shuffling --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 1204526f0..f3c437880 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -388,6 +388,9 @@ struct mpegts_mux uint16_t mm_onid; uint16_t mm_tsid; + int mm_update_pids_flag; + gtimer_t mm_update_pids_timer; + /* * Services */ @@ -868,6 +871,8 @@ mpegts_mux_find_pid(mpegts_mux_t *mm, int pid, int create) return mm->mm_last_mp; } +void mpegts_mux_update_pids ( mpegts_mux_t *mm ); + void mpegts_input_recv_packets (mpegts_input_t *mi, mpegts_mux_instance_t *mmi, sbuf_t *sb, int64_t *pcr, uint16_t *pcr_pid); diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 2b4ed6f2b..77228cabe 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -2537,5 +2537,5 @@ psi_tables_install ( mpegts_input_t *mi, mpegts_mux_t *mm, break; } - mi->mi_update_pids(mi, mm); + mpegts_mux_update_pids(mm); } diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 63446348f..541c24641 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -453,6 +453,7 @@ mpegts_input_open_pid mpegts_mux_nice_name(mm, buf, sizeof(buf)); tvhdebug("mpegts", "%s - open PID %s subscription [%04x/%p]", buf, (type & MPS_TABLES) ? "tables" : "fullmux", type, owner); + mm->mm_update_pids_flag = 1; } } else if (!RB_INSERT_SORTED(&mp->mp_subs, mps, mps_link, mpegts_mps_cmp)) { mp->mp_type |= type; @@ -461,6 +462,7 @@ mpegts_input_open_pid mpegts_mux_nice_name(mm, buf, sizeof(buf)); tvhdebug("mpegts", "%s - open PID %04X (%d) [%d/%p]", buf, mp->mp_pid, mp->mp_pid, type, owner); + mm->mm_update_pids_flag = 1; } else { free(mps); mp = NULL; @@ -493,6 +495,7 @@ mpegts_input_close_pid mpegts_input_close_pids(mi, mm, owner, 0); LIST_REMOVE(mps, mps_svcraw_link); free(mps); + mm->mm_update_pids_flag = 1; mask = pid == MPEGTS_FULLMUX_PID ? MPS_ALL : MPS_TABLES; LIST_FOREACH(mps, &mm->mm_all_subs, mps_svcraw_link) if (mps->mps_type & mask) break; @@ -514,6 +517,7 @@ mpegts_input_close_pid LIST_REMOVE(mps, mps_svcraw_link); RB_REMOVE(&mp->mp_subs, mps, mps_link); free(mps); + mm->mm_update_pids_flag = 1; } } if (!RB_FIRST(&mp->mp_subs)) { @@ -623,9 +627,7 @@ mpegts_input_open_service ( mpegts_input_t *mi, mpegts_service_t *s, int flags, MT_CRC, s->s_pmt_pid, MPS_WEIGHT_PMT); } - pthread_mutex_lock(&mi->mi_output_lock); - mi->mi_update_pids(mi, mm); - pthread_mutex_unlock(&mi->mi_output_lock); + mpegts_mux_update_pids(mm); } void @@ -681,9 +683,9 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s ) } pthread_mutex_unlock(&s->s_stream_mutex); - mi->mi_update_pids(mi, mm); pthread_mutex_unlock(&mi->mi_output_lock); + mpegts_mux_update_pids(mm); /* Stop mux? */ s->s_dvb_mux->mm_stop(s->s_dvb_mux, 0, SM_CODE_OK); @@ -979,7 +981,6 @@ static void mpegts_input_table_waiting ( mpegts_input_t *mi, mpegts_mux_t *mm ) { mpegts_table_t *mt; - int update = 0; if (!mm || !mm->mm_active) return; @@ -993,7 +994,6 @@ mpegts_input_table_waiting ( mpegts_input_t *mi, mpegts_mux_t *mm ) mt->mt_subscribed = 1; pthread_mutex_unlock(&mm->mm_tables_lock); mpegts_input_open_pid(mi, mm, mt->mt_pid, mpegts_table_type(mt), mt->mt_weight, mt); - update = 1; } else { pthread_mutex_unlock(&mm->mm_tables_lock); } @@ -1003,7 +1003,6 @@ mpegts_input_table_waiting ( mpegts_input_t *mi, mpegts_mux_t *mm ) mt->mt_subscribed = 0; pthread_mutex_unlock(&mm->mm_tables_lock); mpegts_input_close_pid(mi, mm, mt->mt_pid, mpegts_table_type(mt), mt->mt_weight, mt); - update = 1; } else { pthread_mutex_unlock(&mm->mm_tables_lock); } @@ -1015,8 +1014,6 @@ mpegts_input_table_waiting ( mpegts_input_t *mi, mpegts_mux_t *mm ) } mpegts_table_consistency_check(mm); pthread_mutex_unlock(&mm->mm_tables_lock); - if (update) - mi->mi_update_pids(mi, mm); } #if ENABLE_TSDEBUG @@ -1258,8 +1255,20 @@ mpegts_input_thread ( void * p ) /* Process */ pthread_mutex_lock(&mi->mi_output_lock); mpegts_input_table_waiting(mi, mp->mp_mux); + if (mp->mp_mux && mp->mp_mux->mm_update_pids_flag) { + pthread_mutex_unlock(&mi->mi_output_lock); + pthread_mutex_lock(&global_lock); + mpegts_mux_update_pids(mp->mp_mux); + pthread_mutex_unlock(&global_lock); + pthread_mutex_lock(&mi->mi_output_lock); + } mpegts_input_process(mi, mp); pthread_mutex_unlock(&mi->mi_output_lock); + if (mp->mp_mux && mp->mp_mux->mm_update_pids_flag) { + pthread_mutex_lock(&global_lock); + mpegts_mux_update_pids(mp->mp_mux); + pthread_mutex_unlock(&global_lock); + } /* Cleanup */ free(mp); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 376913035..2938097ae 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -635,6 +635,9 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf ) service_destroy((service_t*)s, delconf); } + /* Stop PID timer */ + gtimer_disarm(&mm->mm_update_pids_timer); + /* Free memory */ idnode_unlink(&mm->mm_id); free(mm->mm_crid_authority); @@ -775,6 +778,29 @@ mpegts_mux_stop ( mpegts_mux_t *mm, int force, int reason ) mm->mm_fastscan_muxes = NULL; } +static void +mpegts_mux_update_pids_cb ( void *aux ) +{ + mpegts_mux_t *mm = aux; + mpegts_input_t *mi; + + if (mm && mm->mm_active) { + mi = mm->mm_active->mmi_input; + if (mi) { + pthread_mutex_lock(&mi->mi_output_lock); + mi->mi_update_pids(mi, mm); + pthread_mutex_unlock(&mi->mi_output_lock); + } + } +} + +void +mpegts_mux_update_pids ( mpegts_mux_t *mm ) +{ + if (mm && mm->mm_active) + gtimer_arm(&mm->mm_update_pids_timer, mpegts_mux_update_pids_cb, mm, 0); +} + void mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt, int subscribe ) { @@ -809,7 +835,6 @@ mpegts_mux_open_table ( mpegts_mux_t *mm, mpegts_table_t *mt, int subscribe ) pthread_mutex_unlock(&mm->mm_tables_lock); pthread_mutex_lock(&mi->mi_output_lock); mpegts_input_open_pid(mi, mm, mt->mt_pid, mpegts_table_type(mt), mt->mt_weight, mt); - mi->mi_update_pids(mi, mm); pthread_mutex_unlock(&mi->mi_output_lock); pthread_mutex_lock(&mm->mm_tables_lock); mpegts_table_release(mt); @@ -830,7 +855,6 @@ mpegts_mux_unsubscribe_table ( mpegts_mux_t *mm, mpegts_table_t *mt ) pthread_mutex_unlock(&mm->mm_tables_lock); pthread_mutex_lock(&mi->mi_output_lock); mpegts_input_close_pid(mi, mm, mt->mt_pid, mpegts_table_type(mt), mt->mt_weight, mt); - mi->mi_update_pids(mi, mm); pthread_mutex_unlock(&mi->mi_output_lock); pthread_mutex_lock(&mm->mm_tables_lock); mpegts_table_release(mt); diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 28d73ee2c..0a2f6a154 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -776,8 +776,8 @@ mpegts_service_raw_update_pids(mpegts_service_t *t, mpegts_apids_t *pids) } } pthread_mutex_unlock(&t->s_stream_mutex); - mi->mi_update_pids(mi, mm); pthread_mutex_unlock(&mi->mi_output_lock); + mpegts_mux_update_pids(mm); } else { pthread_mutex_lock(&t->s_stream_mutex); x = t->s_pids;