diff options
author | Abylay Ospan <aospan@netup.ru> | 2009-11-01 16:46:53 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-12-05 15:41:11 -0500 |
commit | 26b9d6c0b0e91c84b4713da5abd16baef3963d33 (patch) | |
tree | c1db43adcc9a0d938143df9374af77807ffd4698 /drivers | |
parent | 117e1348f8b0cd91834873bb21faff827798bd8b (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.c | 39 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-core/dvb_demux.h | 5 |
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); | |||
44 | MODULE_PARM_DESC(dvb_demux_tscheck, | 45 | MODULE_PARM_DESC(dvb_demux_tscheck, |
45 | "enable transport stream continuity and TEI check"); | 46 | "enable transport stream continuity and TEI check"); |
46 | 47 | ||
48 | static int dvb_demux_speedcheck; | ||
49 | module_param(dvb_demux_speedcheck, int, 0644); | ||
50 | MODULE_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 | |||
47 | struct dvb_demux_filter { | 49 | struct 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 | ||
136 | int dvb_dmx_init(struct dvb_demux *dvbdemux); | 141 | int dvb_dmx_init(struct dvb_demux *dvbdemux); |