From: Jaroslav Kysela Date: Fri, 19 Jan 2018 09:55:57 +0000 (+0100) Subject: mpegts input: add mpegts_input_postdemux() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9718e8e01d05cecad56db4c9126185e2eb8f3572;p=thirdparty%2Ftvheadend.git mpegts input: add mpegts_input_postdemux() --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 44297d7f1..32694faf0 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -993,6 +993,9 @@ void mpegts_input_recv_packets (mpegts_input_t *mi, mpegts_mux_instance_t *mmi, sbuf_t *sb, int flags, mpegts_pcr_t *pcr); +void mpegts_input_postdemux + ( mpegts_input_t *mi, mpegts_mux_t *mm, uint8_t *data, int len ); + int mpegts_input_get_weight ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags, int weight ); int mpegts_input_get_priority ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ); int mpegts_input_get_grace ( mpegts_input_t *mi, mpegts_mux_t *mm ); diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index bf2f410b5..4fc96fdc7 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -1352,7 +1352,7 @@ mpegts_input_process pid &= 0x1FFF; - /* Ignore NUL packets */ + /* Ignore NULL packets */ if (pid == 0x1FFF) { #if ENABLE_TSDEBUG tsdebug_check_tspkt(mm, tsb, llen); @@ -1502,6 +1502,82 @@ done: return llen; } +/* + * Demux again data from one mpeg-ts stream. + * Might be used for hardware descramblers. + */ +void +mpegts_input_postdemux + ( mpegts_input_t *mi, mpegts_mux_t *mm, uint8_t *tsb, int len ) +{ + uint16_t pid; + int llen, type = 0; + mpegts_pid_t *mp; + mpegts_pid_sub_t *mps; + service_t *s; + elementary_stream_t *st; + mpegts_mux_instance_t *mmi; + + pthread_mutex_lock(&mi->mi_output_lock); + if (mm == NULL || (mmi = mm->mm_active) == NULL) + goto unlock; + + assert(mm == mmi->mmi_mux); + + /* Process */ + assert((len % 188) == 0); + while (len > 0) { + + /* + * mask + * 0 - 0xFF - sync word 0x47 + * 1 - 0x80 - transport error + * 1 - 0x1F - pid high + * 2 - 0xFF - pid low + * 3 - 0xC0 - scrambled + * 3 - 0x10 - CC check + */ + llen = mpegts_word_count(tsb, len, 0xFF9FFFD0); + + pid = (tsb[1] << 8) | tsb[2]; + + pid &= 0x1FFF; + + /* Ignore NULL packets */ + if (pid == 0x1FFF) + goto done; + + /* Find PID */ + if ((mp = mpegts_mux_find_pid(mm, pid, 0))) { + + type = mp->mp_type; + + /* Stream service data */ + if (type & MPS_SERVICE) { + LIST_FOREACH(mps, &mp->mp_svc_subs, mps_svcraw_link) { + s = mps->mps_owner; + st = service_stream_find(s, pid); + ts_recv_packet0((mpegts_service_t*)s, st, tsb, llen); + } + } else + /* Stream table data */ + if (type & MPS_STREAM) { + LIST_FOREACH(s, &mm->mm_transports, s_active_link) { + if (s->s_type != STYPE_STD) continue; + ts_recv_packet0((mpegts_service_t*)s, NULL, tsb, llen); + } + } + + } + +done: + tsb += llen; + len -= llen; + } +unlock: + pthread_mutex_unlock(&mi->mi_output_lock); +} + static void * mpegts_input_thread ( void * p ) {