Ticket #5750: pcr_diff.py

File pcr_diff.py, 1.3 KB (added by xzerth, 10 years ago)

pcr_diff.py

Line 
1#!/usr/bin/env python2
2
3from sys import argv, exit
4
5def readts(filename):
6 with open(filename, 'rb') as ts:
7 while True:
8 pack = ts.read(188)
9 if len(pack) == 188:
10 yield bytearray(pack)
11 else:
12 break
13
14def pcr2ms(pcr):
15 return round(pcr * 1e3/27e6, 3)
16
17def decode_pcr(buff):
18 pcr = 0
19 pcr |= buff[0] << 25
20 pcr |= buff[1] << 17
21 pcr |= buff[2] << 9
22 pcr |= buff[3] << 1
23 pcr |= buff[4] >> 7
24 pcr *= 300
25 ext = ((buff[4] & 1) << 8) | buff[5]
26 pcr += ext
27 return pcr
28
29def get_packet_pcr(pack):
30 adapt = (pack[3] >> 4) & 0x03
31 if adapt == 1:
32 return
33 adapt_len = pack[4]
34 if adapt_len and (pack[5] & 0x10):
35 return decode_pcr(pack[6:])
36 return
37
38if __name__ == '__main__':
39 try:
40 script, filename = argv
41 except ValueError:
42 print('Bad commandline, usage:')
43 print('\tpcr_diff.py filename')
44 exit(1)
45
46 prev_pcr = 0
47 for pack in readts(filename):
48 # parse a packet
49 if pack[0] != 0x47:
50 print('Bad sync byte:', pack[0])
51 continue
52 pid = (pack[1] << 8 | pack[2]) & 0x1FFF
53 pcr = get_packet_pcr(pack)
54 if pcr is None:
55 continue
56 print("pid: {} pcr: {} pcr delta (ms): {}".format(pid, pcr, pcr2ms(pcr - prev_pcr)))
57 prev_pcr = pcr