/** * Continue processing of transport stream packets */ static void ts_recv_packet0 (mpegts_service_t *t, elementary_stream_t *st, const uint8_t *tsb) { int off, pusi, cc, error; service_set_streaming_status_flags((service_t*)t, TSS_MUX_PACKETS); if(streaming_pad_probe_type(&t->s_streaming_pad, SMT_MPEGTS)) ts_remux(t, tsb); if (!st) return; error = !!(tsb[1] & 0x80); pusi = !!(tsb[1] & 0x40); /* Check CC */ if(tsb[3] & 0x10) { cc = tsb[3] & 0xf; if(st->es_cc != -1 && cc != st->es_cc) { /* Let the hardware to stabilize and don't flood the log */ if (t->s_start_time + 1 < dispatch_clock && tvhlog_limit(&st->es_cc_log, 10)) tvhwarn("TS", "%s Continuity counter error (total %zi)", service_component_nicename(st), st->es_cc_log.count); avgstat_add(&t->s_cc_errors, 1, dispatch_clock); avgstat_add(&st->es_cc_errors, 1, dispatch_clock); // Mark as error if this is not the first packet of a payload if(!pusi) error |= 0x2; } st->es_cc = (cc + 1) & 0xf; } off = tsb[3] & 0x20 ? tsb[4] + 5 : 4; switch(st->es_type) { case SCT_CA: break; default: if(!streaming_pad_probe_type(&t->s_streaming_pad, SMT_PACKET)) break; if(st->es_type == SCT_TELETEXT) teletext_input(t, st, tsb); if(off > 188) break; if(t->s_status == SERVICE_RUNNING) parse_mpeg_ts((service_t*)t, st, tsb + off, 188 - off, pusi, error); break; } }
/** * Continue processing of transport stream packets */ static void ts_recv_packet0 (mpegts_service_t *t, elementary_stream_t *st, const uint8_t *tsb) { int off, pusi, cc, error, ccerr; service_set_streaming_status_flags((service_t*)t, TSS_MUX_PACKETS); if(streaming_pad_probe_type(&t->s_streaming_pad, SMT_MPEGTS)) ts_remux(t, tsb); if (!st) return; ccerr = 0; error = !!(tsb[1] & 0x80); pusi = !!(tsb[1] & 0x40); /* Check CC */ if(tsb[3] & 0x10) { cc = tsb[3] & 0xf; if(st->es_cc != -1 && cc != st->es_cc) { ccerr = 1; /* Incorrect CC */ limitedlog(&st->es_loglimit_cc, "TS", service_component_nicename(st), "Continuity counter error"); avgstat_add(&t->s_cc_errors, 1, dispatch_clock); avgstat_add(&st->es_cc_errors, 1, dispatch_clock); // Mark as error if this is not the first packet of a payload if(!pusi) error |= 0x2; } st->es_cc = (cc + 1) & 0xf; } off = tsb[3] & 0x20 ? tsb[4] + 5 : 4; switch(st->es_type) { case SCT_CA: if(st->es_section == NULL) st->es_section = calloc(1, sizeof(mpegts_psi_section_t)); mpegts_psi_section_reassemble(st->es_section, tsb, 0, ccerr, got_ca_section, st); break; default: if(!streaming_pad_probe_type(&t->s_streaming_pad, SMT_PACKET)) break; if(st->es_type == SCT_TELETEXT) teletext_input(t, st, tsb); if(off > 188) break; if(t->s_status == SERVICE_RUNNING) parse_mpeg_ts((service_t*)t, st, tsb + off, 188 - off, pusi, error); break; } }