Some ATMOS hacks.
[dcpomatic.git] / hacks / atmos / parse.py
1 #!/usr/bin/python3
2 #
3 # assuming 48kHz
4
5 import sys
6 from enum import Enum
7
8 samples = []
9 with open('ints', 'r') as f:
10     for l in f.readlines():
11         l = l.strip()
12         if l == "":
13             continue
14         x = float(l) / pow(2, 31)
15         if abs(x - 0.038) < 0.002:
16             samples.append(1)
17         elif abs(x - 0.092) < 0.002:
18             samples.append(2)
19         elif abs(x + 0.092) < 0.002:
20             samples.append(3)
21         elif abs(x + 0.038) < 0.002:
22             samples.append(4)
23         elif abs(x - 0.071) < 0.002:
24             samples.append(5)
25         elif abs(x + 0.071) < 0.002:
26             samples.append(6)
27         else:
28             print("Unknown sample %f" % x)
29             sys.exit(1)
30
31
32 class State(Enum):
33     QUIESCENT = 0
34     GOT_SYNC_FIRST = 1
35     GOT_SYNC = 2
36     AWAIT_UUID_SUB0 = 3
37     AWAIT_UUID_SUB1 = 4
38     AWAIT_UUID_SUB2 = 5
39     AWAIT_UUID_SUB3 = 6
40     AWAIT_EUI0 = 7
41     AWAIT_EUI1 = 8
42     AWAIT_EUI2 = 9
43     AWAIT_CRC0 = 10
44     AWAIT_CRC1 = 11
45     AWAIT_REMBITS = 12
46
47 i = 0
48 bits = []
49 while True:
50     four = samples[i:i+4]
51     if four == [1, 2, 2, 1] or four == [4, 3, 3, 4]:
52         bits.append(0)
53     elif four == [5, 5, 6, 6] or four == [6, 6, 5, 5]:
54         bits.append(1)
55     elif len(four) == 0:
56         break
57     else:
58         print("Unknown symbol %s" % four)
59         sys.exit(1)
60     i += 4
61
62
63 def to_int(bits):
64     i = 0
65     for b in bits:
66         i = i << 1
67         if b:
68             i |= 1
69     return i
70
71
72 i = 0
73 while True:
74     sync_word = to_int(bits[i:i+16])
75     if sync_word == 0x4d56:
76         print("Sync")
77     else:
78         print("Out of sync")
79     i += 16
80
81     edit_rate = to_int(bits[i:i+4])
82     if edit_rate == 0:
83         print("24fps")
84     else:
85         print("Unknown edit rate")
86     i += 4
87
88     # Reserved
89     i += 2
90
91     print("UUID sub index: %d" % to_int(bits[i:i+2]))
92     i += 2
93
94     print("UUID sub: %8x" % to_int(bits[i:i+32]))
95     i += 32
96
97     # Edit unit index
98     print("Edit unit index: %d" % to_int(bits[i:i+24]))
99     i += 24
100
101     # CRC
102     i += 16
103
104     # Reserved
105     i += 4
106
107     # RemBits
108     if edit_rate == 0:
109         i += 25
110
111
112