[dvblast-devel] [PATCH 14/20] demux: Add per pid information and counters.
Georgi Chorbadzhiyski
gf at unixsol.org
Mon Sep 5 09:52:49 CEST 2011
---
demux.c | 38 ++++++++++++++++++++++++++++++++++++++
dvblast.h | 16 ++++++++++++++++
2 files changed, 54 insertions(+), 0 deletions(-)
diff --git a/demux.c b/demux.c
index 95162cf..b661cc0 100644
--- a/demux.c
+++ b/demux.c
@@ -67,6 +67,11 @@ typedef struct ts_pid_t
and should be outputed in all services */
bool b_emm;
+ /* PID info and stats */
+ mtime_t i_bytes_ts;
+ unsigned long i_packets_passed;
+ ts_pid_info_t info;
+
/* biTStream PSI section gathering */
uint8_t *p_psi_buffer;
uint16_t i_psi_buffer_used;
@@ -266,6 +271,24 @@ static void demux_Handle( block_t *p_ts )
return;
}
+ if ( i_pid != PADDING_PID )
+ p_pids[i_pid].info.i_scrambling = ts_get_scrambling( p_ts->p_ts );
+
+ p_pids[i_pid].info.i_last_packet_ts = i_wallclock;
+ p_pids[i_pid].info.i_packets++;
+
+ p_pids[i_pid].i_packets_passed++;
+
+ /* Calculate bytes_per_sec */
+ if ( i_wallclock > p_pids[i_pid].i_bytes_ts + 1000000 ) {
+ p_pids[i_pid].info.i_bytes_per_sec = p_pids[i_pid].i_packets_passed * TS_SIZE;
+ p_pids[i_pid].i_packets_passed = 0;
+ p_pids[i_pid].i_bytes_ts = i_wallclock;
+ }
+
+ if ( p_pids[i_pid].info.i_first_packet_ts == 0 )
+ p_pids[i_pid].info.i_first_packet_ts = i_wallclock;
+
if ( i_pid != PADDING_PID && p_pids[i_pid].i_last_cc != -1
&& !ts_check_duplicate( i_cc, p_pids[i_pid].i_last_cc )
&& ts_check_discontinuity( i_cc, p_pids[i_pid].i_last_cc ) )
@@ -274,6 +297,8 @@ static void demux_Handle( block_t *p_ts )
uint16_t i_sid = 0;
const char *pid_desc = get_pid_desc(i_pid, &i_sid);
+ p_pids[i_pid].info.i_cc_errors++;
+
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 );
@@ -297,6 +322,8 @@ static void demux_Handle( block_t *p_ts )
uint16_t i_sid = 0;
const char *pid_desc = get_pid_desc(i_pid, &i_sid);
+ p_pids[i_pid].info.i_transport_errors++;
+
msg_Warn( NULL, "transport_error_indicator on pid %hu (%s, sid %u)",
i_pid, pid_desc, i_sid );
switch ( i_print_type )
@@ -2801,3 +2828,14 @@ uint8_t *demux_get_packed_PMT( uint16_t i_sid, unsigned int *pi_pack_size ) {
}
return NULL;
}
+
+inline void demux_get_PID_info( uint16_t i_pid, uint8_t *p_data ) {
+ ts_pid_info_t *p_info = (ts_pid_info_t *)p_data;
+ *p_info = p_pids[i_pid].info;
+}
+
+inline void demux_get_PIDS_info( uint8_t *p_data ) {
+ int i_pid;
+ for (i_pid = 0; i_pid < MAX_PIDS; i_pid++ )
+ demux_get_PID_info( i_pid, p_data + ( i_pid * sizeof(ts_pid_info_t) ) );
+}
diff --git a/dvblast.h b/dvblast.h
index f7f82dc..2547ee9 100644
--- a/dvblast.h
+++ b/dvblast.h
@@ -132,6 +132,20 @@ typedef struct output_t
uint16_t i_tsid;
} output_t;
+typedef struct ts_pid_info {
+ mtime_t i_first_packet_ts; /* Time of the first seen packet */
+ mtime_t i_last_packet_ts; /* Time of the last seen packet */
+ unsigned long i_packets; /* How much packets have been seen */
+ unsigned long i_cc_errors; /* Countinuity counter errors */
+ unsigned long i_transport_errors; /* Transport errors */
+ unsigned long i_bytes_per_sec; /* How much bytes were process last second */
+ uint8_t i_scrambling; /* Scrambling bits from the last ts packet */
+ /* 0 = Not scrambled
+ 1 = Reserved for future use
+ 2 = Scrambled with even key
+ 3 = Scrambled with odd key */
+} ts_pid_info_t;
+
extern int i_syslog;
extern int i_verbose;
extern output_t **pp_outputs;
@@ -244,6 +258,8 @@ uint8_t *demux_get_current_packed_CAT( unsigned int *pi_pack_size );
uint8_t *demux_get_current_packed_NIT( unsigned int *pi_pack_size );
uint8_t *demux_get_current_packed_SDT( unsigned int *pi_pack_size );
uint8_t *demux_get_packed_PMT( uint16_t service_id, unsigned int *pi_pack_size );
+void demux_get_PID_info( uint16_t i_pid, uint8_t *p_data );
+void demux_get_PIDS_info( uint8_t *p_data );
output_t *output_Create( const output_config_t *p_config );
int output_Init( output_t *p_output, const output_config_t *p_config );
--
1.7.5.1
More information about the dvblast-devel
mailing list