Skip to content

Commit f91de56

Browse files
committed
Improve RLE performance; add progress bar
1 parent 65cb8c3 commit f91de56

File tree

3 files changed

+46
-31
lines changed

3 files changed

+46
-31
lines changed

bin2hpm/hpm_conv.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ def hpm_conv(img_data, compression_enable, **kwargs):
3030
# Compress data if compression enabled
3131
if compression_enable:
3232
enc_data = rle.encode(img_data)
33-
print('Verifying compressed data...', end='')
33+
print('Verifying compressed data...')
3434
if rle.decode(enc_data) != img_data:
3535
print(f'RLE compression verify mismatch', file=sys.stderr)
3636
sys.exit(-1)
37-
print('OK\n')
37+
print('RLE compression verify OK\n')
3838

3939
img_comp_hdr = b'COMPRESSED\x00'
4040
img_comp_hdr += int.to_bytes(len(img_data), length=4, byteorder='big')

bin2hpm/rle.py

+43-29
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
# #
1111
###########################################################################
1212

13+
from tqdm import tqdm
14+
1315
RLE_MAX_BLKSIZE = 128
1416

1517

@@ -18,34 +20,40 @@ def to_byte(b):
1820

1921

2022
def encode(data):
21-
def check_block(data):
23+
def check_block(data, k):
2224
n = 1
23-
while len(data) > n and data[n] == data[0] and n < RLE_MAX_BLKSIZE:
25+
while (len(data) - k) > n and data[k+n] == data[k] and n < RLE_MAX_BLKSIZE:
2426
n += 1
25-
return n, data[0]
27+
return n, data[k]
2628

2729
print('Performing RLE compression ...')
2830
orig_len = len(data)
2931

3032
result = b''
31-
while len(data):
32-
tmp = b''
33-
while len(data) and len(tmp) < RLE_MAX_BLKSIZE:
34-
n, val = check_block(data)
35-
if n > 2:
36-
data = data[n:]
37-
break
38-
elif n == 2:
39-
n = 1
40-
data = data[n:]
41-
tmp += to_byte(val)
42-
if len(tmp):
43-
result += to_byte(len(tmp) - 1)
44-
result += tmp
45-
if n < 2:
46-
continue
47-
result += to_byte((n - 2) | 0x80)
48-
result += to_byte(val)
33+
with tqdm(total=orig_len, unit='B', unit_scale=True, leave=False) as pbar:
34+
k = 0
35+
last_k = k
36+
while k < len(data):
37+
tmp = b''
38+
while k < len(data) and len(tmp) < RLE_MAX_BLKSIZE:
39+
n, val = check_block(data, k)
40+
if n > 2:
41+
k += n
42+
break
43+
elif n == 2:
44+
n = 1
45+
k += n
46+
tmp += to_byte(val)
47+
pbar.update(k - last_k)
48+
last_k = k
49+
50+
if len(tmp):
51+
result += to_byte(len(tmp) - 1)
52+
result += tmp
53+
if n < 2:
54+
continue
55+
result += to_byte((n - 2) | 0x80)
56+
result += to_byte(val)
4957

5058
comp_len = len(result)
5159
comp_ratio = 100 * comp_len / orig_len
@@ -56,12 +64,18 @@ def check_block(data):
5664

5765
def decode(data):
5866
result = b''
59-
while (len(data)):
60-
if data[0] & 0x80:
61-
result += to_byte(data[1]) * ((data[0] & 0x7f) + 2)
62-
data = data[2:]
63-
else:
64-
l = data[0] + 1
65-
result += data[1:l+1]
66-
data = data[l+1:]
67+
with tqdm(total=len(data), unit='B', unit_scale=True, leave=False) as pbar:
68+
k = 0
69+
last_k = k
70+
while k < len(data):
71+
if data[k] & 0x80:
72+
result += to_byte(data[k+1]) * ((data[k] & 0x7f) + 2)
73+
k += 2
74+
else:
75+
l = data[k] + 1
76+
result += data[k+1:k+l+1]
77+
k += l+1
78+
pbar.update(k - last_k)
79+
last_k = k
80+
6781
return result

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
tqdm>=4.61.0

0 commit comments

Comments
 (0)