From 936e0d378e5eceb18d1dc4e11a09a8b0ae930ae2 Mon Sep 17 00:00:00 2001 From: Hamad Kadmany Date: Thu, 17 Jan 2013 17:36:17 +0200 Subject: [PATCH] media: dvb: Report error statistics in new PES events Report counters for transport error indicator, continuity-counter errors and total number of TS packet constructing a PES in the PES events so that applications can decide whether to decode or drop the packet based on the errors information. Change-Id: I8680163783a12c4f2518cd83fa0b3c7dfa882c34 Signed-off-by: Hamad Kadmany --- drivers/media/dvb/dvb-core/demux.h | 5 +++- drivers/media/dvb/dvb-core/dmxdev.c | 10 +++++++ drivers/media/dvb/dvb-core/dvb_demux.c | 38 +++++++++++++++++++------- drivers/media/dvb/dvb-core/dvb_demux.h | 5 +++- include/linux/dvb/dmx.h | 14 +++++++++- 5 files changed, 59 insertions(+), 13 deletions(-) diff --git a/drivers/media/dvb/dvb-core/demux.h b/drivers/media/dvb/dvb-core/demux.h index 042ba370611..844c65fdc8a 100644 --- a/drivers/media/dvb/dvb-core/demux.h +++ b/drivers/media/dvb/dvb-core/demux.h @@ -7,7 +7,7 @@ * Copyright (c) 2000 Nokia Research Center * Tampere, FINLAND * - * Copyright (c) 2012, Code Aurora Forum. All rights reserved. + * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -100,6 +100,9 @@ struct dmx_data_ready { int disc_indicator_set; int pes_length_mismatch; u64 stc; + u32 tei_counter; + u32 cont_err_counter; + u32 ts_packets_num; } pes_end; struct { diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c index f5a505cb193..bddbb5f7a42 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.c +++ b/drivers/media/dvb/dvb-core/dmxdev.c @@ -1861,6 +1861,9 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, event.params.pes.flags = 0; event.params.pes.stc = 0; + event.params.pes.transport_error_indicator_counter = 0; + event.params.pes.continuity_error_counter = 0; + event.params.pes.ts_packets_num = 0; dvb_dmxdev_add_event(events, &event); events->current_event_data_size = 0; @@ -2109,6 +2112,13 @@ static int dvb_dmxdev_ts_event_cb(struct dmx_ts_feed *feed, DMX_FILTER_PES_LENGTH_ERROR; event.params.pes.stc = dmx_data_ready->pes_end.stc; + event.params.pes.transport_error_indicator_counter = + dmx_data_ready->pes_end.tei_counter; + event.params.pes.continuity_error_counter = + dmx_data_ready->pes_end.cont_err_counter; + event.params.pes.ts_packets_num = + dmx_data_ready->pes_end.ts_packets_num; + dvb_dmxdev_add_event(events, &event); events->current_event_data_size = 0; diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c index eea83c27b35..488f42c93ce 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.c +++ b/drivers/media/dvb/dvb-core/dvb_demux.c @@ -5,7 +5,7 @@ * & Marcus Metzler * for convergence integrated media GmbH * - * Copyright (c) 2012, Code Aurora Forum. All rights reserved. + * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -127,15 +127,15 @@ static inline int dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed, { int count = payload(buf); int p; - //int ccok; - //u8 cc; + int ccok; + u8 cc; + struct dmx_data_ready data; if (count == 0) return -1; p = 188 - count; - /* cc = buf[3] & 0x0f; if (feed->first_cc) ccok = 1; @@ -144,26 +144,41 @@ static inline int dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed, feed->first_cc = 0; feed->cc = cc; - if (!ccok) - printk("missed packet!\n"); - */ /* PUSI ? */ if (buf[1] & 0x40) { - if (feed->pusi_seen) + if (feed->pusi_seen) { /* We had seen PUSI before, this means * that previous PES can be closed now. */ - feed->cb.ts(NULL, 0, NULL, 0, - &feed->feed.ts, DMX_OK_PES_END); + data.status = DMX_OK_PES_END; + data.data_length = 0; + data.pes_end.start_gap = 0; + data.pes_end.actual_length = feed->peslen; + data.pes_end.disc_indicator_set = 0; + data.pes_end.pes_length_mismatch = 0; + data.pes_end.stc = 0; + data.pes_end.tei_counter = feed->pes_tei_counter; + data.pes_end.cont_err_counter = + feed->pes_cont_err_counter; + data.pes_end.ts_packets_num = feed->pes_ts_packets_num; + feed->data_ready_cb.ts(&feed->feed.ts, &data); + } feed->pusi_seen = 1; feed->peslen = 0; + feed->pes_tei_counter = 0; + feed->pes_ts_packets_num = 0; + feed->pes_cont_err_counter = 0; } if (feed->pusi_seen == 0) return 0; + feed->pes_ts_packets_num++; + feed->pes_cont_err_counter += !ccok; + feed->pes_tei_counter += (buf[1] & 0x80) ? 1 : 0; + feed->peslen += count; return feed->cb.ts(&buf[p], count, NULL, 0, &feed->feed.ts, DMX_OK); @@ -1243,6 +1258,9 @@ static int dvbdmx_allocate_ts_feed(struct dmx_demux *dmx, feed->demux = demux; feed->pid = 0xffff; feed->peslen = 0; + feed->pes_tei_counter = 0; + feed->pes_ts_packets_num = 0; + feed->pes_cont_err_counter = 0; feed->buffer = NULL; feed->tsp_out_format = DMX_TSP_FORMAT_188; memset(&feed->indexing_params, 0, diff --git a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h index 2e4a468029f..5e98ea1db4e 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.h +++ b/drivers/media/dvb/dvb-core/dvb_demux.h @@ -4,7 +4,7 @@ * Copyright (C) 2000-2001 Marcus Metzler & Ralph Metzler * for convergence integrated media GmbH * - * Copyright (c) 2012, Code Aurora Forum. All rights reserved. + * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -105,6 +105,9 @@ struct dvb_demux_feed { int pusi_seen; /* prevents feeding of garbage from previous section */ u32 peslen; + u32 pes_tei_counter; + u32 pes_cont_err_counter; + u32 pes_ts_packets_num; struct list_head list_head; unsigned int index; /* a unique index for each feed (can be used as hardware pid filter index) */ diff --git a/include/linux/dvb/dmx.h b/include/linux/dvb/dmx.h index 460cba33540..53bbd5e36a7 100644 --- a/include/linux/dvb/dmx.h +++ b/include/linux/dvb/dmx.h @@ -5,7 +5,7 @@ * & Ralph Metzler * for convergence integrated media GmbH * - * Copyright (c) 2012, Code Aurora Forum. All rights reserved. + * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -250,6 +250,18 @@ struct dmx_pes_event_info { /* Flags passed in filter events */ __u32 flags; + + /* + * Number of TS packets with Transport Error Indicator (TEI) + * found while constructing the PES. + */ + __u32 transport_error_indicator_counter; + + /* Number of continuity errors found while constructing the PES */ + __u32 continuity_error_counter; + + /* Total number of TS packets holding the PES */ + __u32 ts_packets_num; }; /* Section info associated with DMX_EVENT_NEW_SECTION event */