[dvblast-devel] [PATCH] Add useful info in TS discontinuity and transport_error warnings
Georgi Chorbadzhiyski
gf at unixsol.org
Thu Aug 18 23:01:02 CEST 2011
Before this patch TS discontinuity and transport_error warnings
were missing vital info that can help to pinpoint stream problems.
The messages were looking like this:
warning: TS discontinuity
warning: transport_error_indicator on pid 1234
With this patch a lot useful info is added to the messages. PID,
how much continuity counters differ, service id and stream type.
The changed messages look like this:
transport_error_indicator on pid %hu
warning: TS discontinuity on pid 514 expected_cc 1 got 11 (H.264/14496-10 video (MPEG-4/AVC), sid 2005)
warning: TS discontinuity on pid 48 expected_cc 15 got 12 (EMM, sid 0)
warning: TS discontinuity on pid 774 expected_cc 0 got 2 (13818-3 audio (MPEG-2), sid 2015)
warning: TS discontinuity on pid 0 expected_cc 11 got 12 (PAT, sid 0)
warning: TS discontinuity on pid 2000 expected_cc 13 got 14 (PMT, sid 2020)
warning: transport_error_indicator on pid 2000 (PMT, sid 2020)
The patch is against trunk.
--
Georgi Chorbadzhiyski
http://georgi.unixsol.org/
-------------- next part --------------
From 07b36c1286d369f3963f25c099b7459cbb8206bc Mon Sep 17 00:00:00 2001
From: Georgi Chorbadzhiyski <gf at unixsol.org>
Date: Thu, 18 Aug 2011 22:05:12 +0300
Subject: [PATCH] Add useful info in TS discontinuity and transport_error warnings
Before this patch TS discontinuity and transport_error warnings
were missing vital info that can help to pinpoint stream problems.
The messages were looking like this:
warning: TS discontinuity
warning: transport_error_indicator on pid 1234
With this patch a lot useful info is added to the messages. PID,
how much continuity counters differ, service id and stream type.
The changed messages look like this:
transport_error_indicator on pid %hu
warning: TS discontinuity on pid 514 expected_cc 1 got 11 (H.264/14496-10 video (MPEG-4/AVC), sid 2005)
warning: TS discontinuity on pid 48 expected_cc 15 got 12 (EMM, sid 0)
warning: TS discontinuity on pid 774 expected_cc 0 got 2 (13818-3 audio (MPEG-2), sid 2015)
warning: TS discontinuity on pid 0 expected_cc 11 got 12 (PAT, sid 0)
warning: TS discontinuity on pid 2000 expected_cc 13 got 14 (PMT, sid 2020)
warning: transport_error_indicator on pid 2000 (PMT, sid 2020)
---
trunk/demux.c | 195 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 187 insertions(+), 8 deletions(-)
diff --git a/trunk/demux.c b/trunk/demux.c
index dad5293..654d306 100644
--- a/trunk/demux.c
+++ b/trunk/demux.c
@@ -126,6 +126,7 @@ static void NewPMT( output_t *p_output );
static void NewNIT( output_t *p_output );
static void NewSDT( output_t *p_output );
static void HandlePSIPacket( uint8_t *p_ts, mtime_t i_dts );
+static const char *get_pid_desc(uint16_t i_pid, uint16_t *i_sid);
/*****************************************************************************
* demux_Open
@@ -225,15 +226,22 @@ static void demux_Handle( block_t *p_ts )
&& !ts_check_duplicate( i_cc, p_pids[i_pid].i_last_cc )
&& ts_check_discontinuity( i_cc, p_pids[i_pid].i_last_cc ) )
{
- msg_Warn( NULL, "TS discontinuity" );
+ unsigned int expected_cc = (p_pids[i_pid].i_last_cc + 1) & 0x0f;
+ uint16_t i_sid = 0;
+ const char *pid_desc = get_pid_desc(i_pid, &i_sid);
+
+ msg_Warn( NULL, "TS discontinuity on pid %4hu expected_cc %2u got %2u (%s, sid %d)",
+ i_pid, expected_cc, i_cc, pid_desc, i_sid );
+
switch ( i_print_type )
{
case PRINT_XML:
- printf("<ERROR type=\"invalid_discontinuity\" pid=\"%hu\"/>\n",
- i_pid);
+ printf("<ERROR type=\"invalid_discontinuity\" pid=\"%hu\" expected_cc=\"%u\" got_cc=\"%u\" pid_carries=\"%s\" sid=\"%u\" />\n",
+ i_pid, expected_cc, i_cc, pid_desc, i_sid );
break;
case PRINT_TEXT:
- printf("TS discontinuity (PID=%hu)", i_pid);
+ printf("TS discontinuity (PID=%hu) (expected_cc=%u) (got_cc=%u) (PID_carries=%s) (sid=%d)",
+ i_pid, expected_cc, i_cc, pid_desc, i_sid );
break;
default:
break;
@@ -242,15 +250,20 @@ static void demux_Handle( block_t *p_ts )
if ( ts_get_transporterror( p_ts->p_ts ) )
{
- msg_Warn( NULL, "transport_error_indicator" );
+ uint16_t i_sid = 0;
+ const char *pid_desc = get_pid_desc(i_pid, &i_sid);
+
+ msg_Warn( NULL, "transport_error_indicator on pid %hu (%s, sid %u)",
+ i_pid, pid_desc, i_sid );
switch ( i_print_type )
{
case PRINT_XML:
- printf("<ERROR type=\"transport_error\" pid=\"%hu\"/>\n",
- i_pid);
+ printf("<ERROR type=\"transport_error\" pid=\"%hu\" pid_carries=\"%s\" sid=\"%u\" />\n",
+ i_pid, pid_desc, i_sid );
break;
case PRINT_TEXT:
- printf("transport_error_indicator (PID=%hu)", i_pid);
+ printf("transport_error_indicator (PID=%hu) (PID_carries=%s) (sid=%u)",
+ i_pid, pid_desc, i_sid );
break;
default:
break;
@@ -2548,3 +2561,169 @@ static void HandlePSIPacket( uint8_t *p_ts, mtime_t i_dts )
HandleSection( i_pid, p_section, i_dts );
}
}
+
+/*****************************************************************************
+ * PID info functions
+ *****************************************************************************/
+static const char *h222_stream_type_desc(uint8_t i_stream_type) {
+ /* See ISO/IEC 13818-1 : 2000 (E) | Table 2-29 - Stream type assignments, Page 66 (48) */
+ if (i_stream_type == 0 || (i_stream_type > 0x1c && i_stream_type < 0x7e))
+ return "Reserved stream";
+ switch (i_stream_type) {
+ case 0x01: return "11172-2 video (MPEG-1)";
+ case 0x02: return "H.262/13818-2 video (MPEG-2) or 11172-2 constrained video";
+ case 0x03: return "11172-3 audio (MPEG-1)";
+ case 0x04: return "13818-3 audio (MPEG-2)";
+ case 0x05: return "H.222.0/13818-1 private sections";
+ case 0x06: return "H.222.0/13818-1 PES private data";
+ case 0x07: return "13522 MHEG";
+ case 0x08: return "H.222.0/13818-1 Annex A - DSM CC";
+ case 0x09: return "H.222.1";
+ case 0x0A: return "13818-6 type A";
+ case 0x0B: return "13818-6 type B";
+ case 0x0C: return "13818-6 type C";
+ case 0x0D: return "13818-6 type D";
+ case 0x0E: return "H.222.0/13818-1 auxiliary";
+ case 0x0F: return "13818-7 Audio with ADTS transport syntax";
+ case 0x10: return "14496-2 Visual (MPEG-4 part 2 video)";
+ case 0x11: return "14496-3 Audio with LATM transport syntax (14496-3/AMD 1)";
+ case 0x12: return "14496-1 SL-packetized or FlexMux stream in PES packets";
+ case 0x13: return "14496-1 SL-packetized or FlexMux stream in 14496 sections";
+ case 0x14: return "ISO/IEC 13818-6 Synchronized Download Protocol";
+ case 0x15: return "Metadata in PES packets";
+ case 0x16: return "Metadata in metadata_sections";
+ case 0x17: return "Metadata in 13818-6 Data Carousel";
+ case 0x18: return "Metadata in 13818-6 Object Carousel";
+ case 0x19: return "Metadata in 13818-6 Synchronized Download Protocol";
+ case 0x1A: return "13818-11 MPEG-2 IPMP stream";
+ case 0x1B: return "H.264/14496-10 video (MPEG-4/AVC)";
+ case 0x42: return "AVS Video";
+ case 0x7F: return "IPMP stream";
+ default : return "Unknown stream";
+ }
+}
+
+static const char *get_pid_desc(uint16_t i_pid, uint16_t *i_sid) {
+ int i, j, k;
+ uint8_t i_last_section;
+ uint8_t *p_desc;
+ uint16_t i_nit_pid = NIT_PID, i_pcr_pid = 0;
+
+ /* Simple cases */
+ switch (i_pid)
+ {
+ case 0x00: return "PAT";
+ case 0x01: return "CAT";
+ case 0x11: return "SDT";
+ case 0x12: return "EPG";
+ case 0x14: return "TDT/TOT";
+ }
+
+ /* Detect NIT pid */
+ if ( psi_table_validate( pp_current_pat_sections ) )
+ {
+ i_last_section = psi_table_get_lastsection( pp_current_pat_sections );
+ for ( i = 0; i <= i_last_section; i++ )
+ {
+ uint8_t *p_section = psi_table_get_section( pp_current_pat_sections, i );
+ uint8_t *p_program;
+
+ j = 0;
+ while ( (p_program = pat_get_program( p_section, j++ )) != NULL )
+ {
+ /* Programs with PID == 0 are actually NIT */
+ if ( patn_get_program( p_program ) == 0 )
+ {
+ i_nit_pid = patn_get_pid( p_program );
+ break;
+ }
+ }
+ }
+ }
+
+ /* Detect EMM pids */
+ if ( b_enable_emm && psi_table_validate( pp_current_cat_sections ) )
+ {
+ i_last_section = psi_table_get_lastsection( pp_current_cat_sections );
+ for ( i = 0; i <= i_last_section; i++ )
+ {
+ uint8_t *p_section = psi_table_get_section( pp_current_cat_sections, i );
+
+ j = 0;
+ uint8_t *p_cat_descs = cat_alloc_descs( p_section );
+ while ( (p_desc = descs_get_desc( p_cat_descs, j++ )) != NULL )
+ {
+ if ( desc_get_tag( p_desc ) != 0x09 || !desc09_validate( p_desc ) )
+ continue;
+
+ if ( desc09_get_pid( p_desc ) == i_pid ) {
+ cat_free_descs( p_cat_descs );
+ return "EMM";
+ }
+ }
+ cat_free_descs( p_cat_descs );
+ }
+ }
+
+ /* Detect streams in PMT */
+ for ( k = 0; k < i_nb_sids; k++ )
+ {
+ sid_t *p_sid = pp_sids[k];
+ if ( p_sid->i_pmt_pid == i_pid )
+ {
+ if ( i_sid )
+ *i_sid = p_sid->i_sid;
+ return "PMT";
+ }
+
+ if ( p_sid->i_sid && p_sid->p_current_pmt != NULL )
+ {
+ uint8_t *p_current_pmt = p_sid->p_current_pmt;
+ uint8_t *p_current_es;
+
+ /* The PCR PID can be alone or PCR can be carried in some other PIDs (mostly video)
+ so just remember the pid and if it is alone it will be reported as PCR, otherwise
+ stream type of the PID will be reported */
+ if ( i_pid == pmt_get_pcrpid( p_current_pmt ) ) {
+ if ( i_sid )
+ *i_sid = p_sid->i_sid;
+ i_pcr_pid = pmt_get_pcrpid( p_current_pmt );
+ }
+
+ /* Look for ECMs */
+ j = 0;
+ while ((p_desc = descs_get_desc( pmt_get_descs( p_current_pmt ), j++ )) != NULL)
+ {
+ if ( desc_get_tag( p_desc ) != 0x09 || !desc09_validate( p_desc ) )
+ continue;
+
+ if ( desc09_get_pid( p_desc ) == i_pid ) {
+ if ( i_sid )
+ *i_sid = p_sid->i_sid;
+ return "ECM";
+ }
+ }
+
+ /* Detect stream types */
+ j = 0;
+ while ( (p_current_es = pmt_get_es( p_current_pmt, j++ )) != NULL )
+ {
+ if ( pmtn_get_pid( p_current_es ) == i_pid )
+ {
+ if ( i_sid )
+ *i_sid = p_sid->i_sid;
+ return h222_stream_type_desc( pmtn_get_streamtype( p_current_es ) );
+ }
+ }
+ }
+ }
+
+ /* Are there any other PIDs? */
+ if (i_pid == i_nit_pid)
+ return "NIT";
+
+ if (i_pid == i_pcr_pid)
+ return "PCR";
+
+ return "...";
+}
--
1.7.5.1
More information about the dvblast-devel
mailing list