static void
ts_recv_packet0(th_transport_t *t, th_stream_t *st, const uint8_t *tsb)
{
- int off, pusi, cc, err = 0;
+ int off, pusi, cc, error;
transport_set_streaming_status_flags(t, TSS_MUX_PACKETS);
if(streaming_pad_probe_type(&t->tht_streaming_pad, SMT_MPEGTS))
ts_remux(t, tsb);
+ error = !!(tsb[1] & 0x80);
+ pusi = !!(tsb[1] & 0x40);
+
/* Check CC */
if(tsb[3] & 0x10) {
"Continuity counter error");
avgstat_add(&t->tht_cc_errors, 1, dispatch_clock);
avgstat_add(&st->st_cc_errors, 1, dispatch_clock);
- err = 1;
+
+ // Mark as error if this is not the first packet of a payload
+ if(!pusi)
+ error |= 0x2;
}
st->st_cc_valid = 1;
st->st_cc = (cc + 1) & 0xf;
}
off = tsb[3] & 0x20 ? tsb[4] + 5 : 4;
- pusi = tsb[1] & 0x40;
switch(st->st_type) {
break;
if(t->tht_status == TRANSPORT_RUNNING)
- parse_mpeg_ts(t, st, tsb + off, 188 - off, pusi, err);
+ parse_mpeg_ts(t, st, tsb + off, 188 - off, pusi, error);
break;
}
}
th_stream_t *st;
int pid, n, m, r;
th_descrambler_t *td;
+ int error = 0;
if(t->tht_status != TRANSPORT_RUNNING)
return;
/* Transport Error Indicator */
limitedlog(&t->tht_loglimit_tei, "TS", transport_nicename(t),
"Transport error indicator");
- pthread_mutex_unlock(&t->tht_stream_mutex);
- return;
+ error = 1;
}
pid = (tsb[1] & 0x1f) << 8 | tsb[2];
st = transport_stream_find(t, pid);
/* Extract PCR */
- if(tsb[3] & 0x20 && tsb[4] > 0 && tsb[5] & 0x10)
+ if(tsb[3] & 0x20 && tsb[4] > 0 && tsb[5] & 0x10 && !error)
ts_extract_pcr(t, st, tsb, pcrp);
if(st == NULL) {
return;
}
- transport_set_streaming_status_flags(t, TSS_INPUT_SERVICE);
+ if(!error)
+ transport_set_streaming_status_flags(t, TSS_INPUT_SERVICE);
avgstat_add(&t->tht_rate, 188, dispatch_clock);
(t->tht_scrambled_seen && st->st_type != SCT_CA &&
st->st_type != SCT_PAT && st->st_type != SCT_PMT)) {
- t->tht_scrambled_seen = t->tht_scrambled;
+ /**
+ * Lock for descrambling, but only if packet was not in error
+ */
+ if(!error)
+ t->tht_scrambled_seen = t->tht_scrambled;
/* scrambled stream */
n = m = 0;