From: Jaroslav Kysela Date: Sun, 4 Mar 2018 23:37:53 +0000 (+0100) Subject: mpegts service: fix the pid weight updates for raw services X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=730d4282ba235743eb5b23d8c4af8983dd7c0609;p=thirdparty%2Ftvheadend.git mpegts service: fix the pid weight updates for raw services --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 9855d85eb..3605251cc 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -1017,6 +1017,10 @@ mpegts_pid_t * mpegts_input_open_pid int mpegts_input_close_pid ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, void *owner ); +mpegts_pid_t * mpegts_input_update_pid_weight + ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, int weight, + void *owner ); + void mpegts_input_close_pids ( mpegts_input_t *mi, mpegts_mux_t *mm, void *owner, int all ); diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 24b0c8a93..fe09f3e4b 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -624,6 +624,39 @@ mpegts_input_close_pid return 0; } +mpegts_pid_t * +mpegts_input_update_pid_weight + ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, int weight, + void *owner ) +{ + mpegts_pid_sub_t *mps, skel; + mpegts_pid_t *mp; + assert(owner != NULL); + lock_assert(&mi->mi_output_lock); + if (!(mp = mpegts_mux_find_pid(mm, pid, 0))) + return NULL; + if (pid == MPEGTS_FULLMUX_PID || pid == MPEGTS_TABLES_PID) { + LIST_FOREACH(mps, &mm->mm_all_subs, mps_svcraw_link) + if (mps->mps_owner == owner) break; + if (mps == NULL) return NULL; + tvhdebug(LS_MPEGTS, "%s - update PID %s weight %d subscription [%04x/%p]", + mm->mm_nicename, pid == MPEGTS_TABLES_PID ? "tables" : "fullmux", + weight, type, owner); + mps->mps_weight = weight; + } else { + skel.mps_type = type; + skel.mps_weight = -1; + skel.mps_owner = owner; + mps = RB_FIND(&mp->mp_subs, &skel, mps_link, mpegts_mps_cmp); + if (mps == NULL) return NULL; + tvhdebug(LS_MPEGTS, "%s - update PID %04X (%d) weight %d [%d/%p]", + mm->mm_nicename, mp->mp_pid, mp->mp_pid, weight, type, owner); + mps->mps_weight = weight; + mm->mm_update_pids_flag = 1; + } + return mp; +} + elementary_stream_t * mpegts_input_open_service_pid ( mpegts_input_t *mi, mpegts_mux_t *mm, diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 37dfc4fea..01ac0e2db 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -993,6 +993,12 @@ mpegts_service_raw_update_pids(mpegts_service_t *t, mpegts_apids_t *pids) pi = &add.pids[i]; mpegts_input_open_pid(mi, mm, pi->pid, MPS_RAW, pi->weight, t, 0); } + if (p) { + for (i = 0; i < p->count; i++) { + pi = &p->pids[i]; + mpegts_input_update_pid_weight(mi, mm, pi->pid, MPS_RAW, pi->weight, t); + } + } mpegts_pid_done(&add); mpegts_pid_done(&del); }