aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAbylay Ospan <aospan@netup.ru>2009-11-01 16:46:53 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-12-05 15:41:11 -0500
commit26b9d6c0b0e91c84b4713da5abd16baef3963d33 (patch)
treec1db43adcc9a0d938143df9374af77807ffd4698 /drivers
parent117e1348f8b0cd91834873bb21faff827798bd8b (diff)
V4L/DVB (13271): TS speed check. Logging transport stream speed in Kbits per second
[mchehab@redhat.com: add asm/div64.h and allocate vars only if dvb_demux_speedcheck specified] Signed-off-by: Abylay Ospan <aospan@netup.ru> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/dvb/dvb-core/dvb_demux.c39
-rw-r--r--drivers/media/dvb/dvb-core/dvb_demux.h5
2 files changed, 44 insertions, 0 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c
index 91c537bca8ad..b78cfb7d1897 100644
--- a/drivers/media/dvb/dvb-core/dvb_demux.c
+++ b/drivers/media/dvb/dvb-core/dvb_demux.c
@@ -30,6 +30,7 @@
30#include <linux/string.h> 30#include <linux/string.h>
31#include <linux/crc32.h> 31#include <linux/crc32.h>
32#include <asm/uaccess.h> 32#include <asm/uaccess.h>
33#include <asm/div64.h>
33 34
34#include "dvb_demux.h" 35#include "dvb_demux.h"
35 36
@@ -44,6 +45,11 @@ module_param(dvb_demux_tscheck, int, 0644);
44MODULE_PARM_DESC(dvb_demux_tscheck, 45MODULE_PARM_DESC(dvb_demux_tscheck,
45 "enable transport stream continuity and TEI check"); 46 "enable transport stream continuity and TEI check");
46 47
48static int dvb_demux_speedcheck;
49module_param(dvb_demux_speedcheck, int, 0644);
50MODULE_PARM_DESC(dvb_demux_speedcheck,
51 "enable transport stream speed check");
52
47#define dprintk_tscheck(x...) do { \ 53#define dprintk_tscheck(x...) do { \
48 if (dvb_demux_tscheck && printk_ratelimit()) \ 54 if (dvb_demux_tscheck && printk_ratelimit()) \
49 printk(x); \ 55 printk(x); \
@@ -387,6 +393,39 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
387 u16 pid = ts_pid(buf); 393 u16 pid = ts_pid(buf);
388 int dvr_done = 0; 394 int dvr_done = 0;
389 395
396 if (dvb_demux_speedcheck) {
397 struct timespec cur_time, delta_time;
398 u64 speed_bytes, speed_timedelta;
399
400 demux->speed_pkts_cnt++;
401
402 /* show speed every SPEED_PKTS_INTERVAL packets */
403 if (!(demux->speed_pkts_cnt % SPEED_PKTS_INTERVAL)) {
404 cur_time = current_kernel_time();
405
406 if (demux->speed_last_time.tv_sec != 0 &&
407 demux->speed_last_time.tv_nsec != 0) {
408 delta_time = timespec_sub(cur_time,
409 demux->speed_last_time);
410 speed_bytes = (u64)demux->speed_pkts_cnt
411 * 188 * 8;
412 /* convert to 1024 basis */
413 speed_bytes = 1000 * div64_u64(speed_bytes,
414 1024);
415 speed_timedelta =
416 (u64)timespec_to_ns(&delta_time);
417 speed_timedelta = div64_u64(speed_timedelta,
418 1000000); /* nsec -> usec */
419 printk(KERN_INFO "TS speed %llu Kbits/sec \n",
420 div64_u64(speed_bytes,
421 speed_timedelta));
422 };
423
424 demux->speed_last_time = cur_time;
425 demux->speed_pkts_cnt = 0;
426 };
427 };
428
390 if (dvb_demux_tscheck) { 429 if (dvb_demux_tscheck) {
391 if (!demux->cnt_storage) 430 if (!demux->cnt_storage)
392 demux->cnt_storage = vmalloc(MAX_PID + 1); 431 demux->cnt_storage = vmalloc(MAX_PID + 1);
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h
index 2fe05d03240d..a7d876fd02dd 100644
--- a/drivers/media/dvb/dvb-core/dvb_demux.h
+++ b/drivers/media/dvb/dvb-core/dvb_demux.h
@@ -44,6 +44,8 @@
44 44
45#define MAX_PID 0x1fff 45#define MAX_PID 0x1fff
46 46
47#define SPEED_PKTS_INTERVAL 50000
48
47struct dvb_demux_filter { 49struct dvb_demux_filter {
48 struct dmx_section_filter filter; 50 struct dmx_section_filter filter;
49 u8 maskandmode[DMX_MAX_FILTER_SIZE]; 51 u8 maskandmode[DMX_MAX_FILTER_SIZE];
@@ -131,6 +133,9 @@ struct dvb_demux {
131 spinlock_t lock; 133 spinlock_t lock;
132 134
133 uint8_t *cnt_storage; /* for TS continuity check */ 135 uint8_t *cnt_storage; /* for TS continuity check */
136
137 struct timespec speed_last_time; /* for TS speed check */
138 uint32_t speed_pkts_cnt; /* for TS speed check */
134}; 139};
135 140
136int dvb_dmx_init(struct dvb_demux *dvbdemux); 141int dvb_dmx_init(struct dvb_demux *dvbdemux);