summaryrefslogtreecommitdiff
path: root/hacks/atmos/parse.py
blob: e43af2879fde67f95c5f2b5c6adabe0db2e50e33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/python3
#
# assuming 48kHz

import sys
from enum import Enum

samples = []
with open('ints', 'r') as f:
    for l in f.readlines():
        l = l.strip()
        if l == "":
            continue
        x = float(l) / pow(2, 31)
        if abs(x - 0.038) < 0.002:
            samples.append(1)
        elif abs(x - 0.092) < 0.002:
            samples.append(2)
        elif abs(x + 0.092) < 0.002:
            samples.append(3)
        elif abs(x + 0.038) < 0.002:
            samples.append(4)
        elif abs(x - 0.071) < 0.002:
            samples.append(5)
        elif abs(x + 0.071) < 0.002:
            samples.append(6)
        else:
            print("Unknown sample %f" % x)
            sys.exit(1)


class State(Enum):
    QUIESCENT = 0
    GOT_SYNC_FIRST = 1
    GOT_SYNC = 2
    AWAIT_UUID_SUB0 = 3
    AWAIT_UUID_SUB1 = 4
    AWAIT_UUID_SUB2 = 5
    AWAIT_UUID_SUB3 = 6
    AWAIT_EUI0 = 7
    AWAIT_EUI1 = 8
    AWAIT_EUI2 = 9
    AWAIT_CRC0 = 10
    AWAIT_CRC1 = 11
    AWAIT_REMBITS = 12

i = 0
bits = []
while True:
    four = samples[i:i+4]
    if four == [1, 2, 2, 1] or four == [4, 3, 3, 4]:
        bits.append(0)
    elif four == [5, 5, 6, 6] or four == [6, 6, 5, 5]:
        bits.append(1)
    elif len(four) == 0:
        break
    else:
        print("Unknown symbol %s" % four)
        sys.exit(1)
    i += 4


def to_int(bits):
    i = 0
    for b in bits:
        i = i << 1
        if b:
            i |= 1
    return i


i = 0
while True:
    sync_word = to_int(bits[i:i+16])
    if sync_word == 0x4d56:
        print("Sync")
    else:
        print("Out of sync")
    i += 16

    edit_rate = to_int(bits[i:i+4])
    if edit_rate == 0:
        print("24fps")
    else:
        print("Unknown edit rate")
    i += 4

    # Reserved
    i += 2

    print("UUID sub index: %d" % to_int(bits[i:i+2]))
    i += 2

    print("UUID sub: %8x" % to_int(bits[i:i+32]))
    i += 32

    # Edit unit index
    print("Edit unit index: %d" % to_int(bits[i:i+24]))
    i += 24

    # CRC
    i += 16

    # Reserved
    i += 4

    # RemBits
    if edit_rate == 0:
        i += 25