|
@@ -30,6 +30,7 @@
|
|
|
#include <linux/string.h>
|
|
|
#include <linux/crc32.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
+#include <asm/div64.h>
|
|
|
|
|
|
#include "dvb_demux.h"
|
|
|
|
|
@@ -44,6 +45,11 @@ module_param(dvb_demux_tscheck, int, 0644);
|
|
|
MODULE_PARM_DESC(dvb_demux_tscheck,
|
|
|
"enable transport stream continuity and TEI check");
|
|
|
|
|
|
+static int dvb_demux_speedcheck;
|
|
|
+module_param(dvb_demux_speedcheck, int, 0644);
|
|
|
+MODULE_PARM_DESC(dvb_demux_speedcheck,
|
|
|
+ "enable transport stream speed check");
|
|
|
+
|
|
|
#define dprintk_tscheck(x...) do { \
|
|
|
if (dvb_demux_tscheck && printk_ratelimit()) \
|
|
|
printk(x); \
|
|
@@ -387,6 +393,39 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
|
|
|
u16 pid = ts_pid(buf);
|
|
|
int dvr_done = 0;
|
|
|
|
|
|
+ if (dvb_demux_speedcheck) {
|
|
|
+ struct timespec cur_time, delta_time;
|
|
|
+ u64 speed_bytes, speed_timedelta;
|
|
|
+
|
|
|
+ demux->speed_pkts_cnt++;
|
|
|
+
|
|
|
+ /* show speed every SPEED_PKTS_INTERVAL packets */
|
|
|
+ if (!(demux->speed_pkts_cnt % SPEED_PKTS_INTERVAL)) {
|
|
|
+ cur_time = current_kernel_time();
|
|
|
+
|
|
|
+ if (demux->speed_last_time.tv_sec != 0 &&
|
|
|
+ demux->speed_last_time.tv_nsec != 0) {
|
|
|
+ delta_time = timespec_sub(cur_time,
|
|
|
+ demux->speed_last_time);
|
|
|
+ speed_bytes = (u64)demux->speed_pkts_cnt
|
|
|
+ * 188 * 8;
|
|
|
+ /* convert to 1024 basis */
|
|
|
+ speed_bytes = 1000 * div64_u64(speed_bytes,
|
|
|
+ 1024);
|
|
|
+ speed_timedelta =
|
|
|
+ (u64)timespec_to_ns(&delta_time);
|
|
|
+ speed_timedelta = div64_u64(speed_timedelta,
|
|
|
+ 1000000); /* nsec -> usec */
|
|
|
+ printk(KERN_INFO "TS speed %llu Kbits/sec \n",
|
|
|
+ div64_u64(speed_bytes,
|
|
|
+ speed_timedelta));
|
|
|
+ };
|
|
|
+
|
|
|
+ demux->speed_last_time = cur_time;
|
|
|
+ demux->speed_pkts_cnt = 0;
|
|
|
+ };
|
|
|
+ };
|
|
|
+
|
|
|
if (dvb_demux_tscheck) {
|
|
|
if (!demux->cnt_storage)
|
|
|
demux->cnt_storage = vmalloc(MAX_PID + 1);
|