From: Jaroslav Kysela Date: Mon, 7 Dec 2015 19:56:27 +0000 (+0100) Subject: added noise data generators to mpegts_input and parser input X-Git-Tag: v4.2.1~1347 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=717d5618b31871bddd931ed187cbf4535545baa7;p=thirdparty%2Ftvheadend.git added noise data generators to mpegts_input and parser input --- diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 28ecadd47..3157c4a7b 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -946,6 +946,36 @@ mpegts_input_tuning_error ( mpegts_input_t *mi, mpegts_mux_t *mm ) * Data processing * *************************************************************************/ +#if 0 +static int data_noise ( mpegts_packet_t *mp ) +{ + static uint64_t off = 0, win = 4096, limit = 2*1024*1024; + uint8_t *data = mp->mp_data; + uint32_t i, p, s, len = mp->mp_len; + for (p = 0; p < len; p += 188) { + off += 188; + if (off >= limit && off < limit + win) { + if ((off & 3) == 1) { + memmove(data + p, data + p + 188, len - (p + 188)); + p -= 188; + mp->mp_len -= 188; + return 1; + } + s = ((data[2] + data[3] + data[4]) & 3) + 1; + for (i = 0; i < 188; i += s) + ((char *)data)[p+i] ^= data[10] + data[12] + data[i]; + } else if (off >= limit + win) { + off = 0; + limit = (uint64_t)data[15] * 4 * 1024; + win = (uint64_t)data[16] * 16; + } + } + return 0; +} +#else +static inline int data_noise( mpegts_packet_t *mp ) { return 0; } +#endif + static int inline get_pcr ( const uint8_t *tsb, int64_t *rpcr ) { @@ -1061,6 +1091,11 @@ mpegts_input_recv_packets len -= len2; off += len2; + if ((flags & MPEGTS_DATA_CC_RESTART) == 0 && data_noise(mp)) { + free(mp); + goto end; + } + pthread_mutex_lock(&mi->mi_input_lock); if (mmi->mmi_mux->mm_active == mmi) { TAILQ_INSERT_TAIL(&mi->mi_input_queue, mp, mp_link); @@ -1072,6 +1107,7 @@ mpegts_input_recv_packets } /* Adjust buffer */ +end: if (len && (flags & MPEGTS_DATA_CC_RESTART) == 0) sbuf_cut(sb, off); // cut off the bottom else diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index 951bdae31..7db1cdd87 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -133,6 +133,31 @@ static void parser_do_backlog(service_t *t, elementary_stream_t *st, void (*pkt_cb)(service_t *t, elementary_stream_t *st, th_pkt_t *pkt), pktbuf_t *meta); +/** + * for debugging + */ +#if 0 +static int data_noise(const uint8_t *data, int len) +{ + static uint64_t off = 0, win = 4096, limit = 1024*1024; + uint32_t i; + off += len; + if (off >= limit && off < limit + win) { + if ((off & 3) == 1) + return 1; + for (i = 0; i < len; i += 3) + ((char *)data)[i] ^= 0xa5; + } else if (off >= limit + win) { + off = 0; + limit = (uint64_t)data[15] * 4 * 1024; + win = (uint64_t)data[16] * 4; + } + return 0; +} +#else +static inline int data_noise(const uint8_t *data, int len) { return 0; } +#endif + /** * Parse raw mpeg data */ @@ -146,6 +171,9 @@ parse_mpeg_ts(service_t *t, elementary_stream_t *st, const uint8_t *data, sbuf_err(&st->es_buf, 1); } + if (data_noise(data, len)) + return; + switch(st->es_type) { case SCT_MPEG2VIDEO: parse_pes(t, st, data, len, start, parse_mpeg2video);