Skip to content

Commit 6520323

Browse files
committed
Fix: Corrupted JPEG
1 parent e24de3b commit 6520323

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

BabbleApp/camera.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from utils.misc_utils import get_camera_index_by_name, list_camera_names
1414
from enum import Enum
1515
import sys
16+
from PIL import Image
17+
from io import BytesIO
1618

1719
WAIT_TIME = 0.1
1820
BUFFER_SIZE = 32768
@@ -190,20 +192,21 @@ def get_next_packet_bounds(self):
190192
beg = -1
191193
while beg == -1:
192194
self.buffer += self.serial_connection.read(2048)
193-
beg = self.buffer.find(ETVR_HEADER)
195+
beg = self.buffer.find(b"\xff\xd8\xff")
194196
# Discard any data before the frame header.
195197
if beg > 0:
196198
self.buffer = self.buffer[beg:]
197199
beg = 0
198-
# We know exactly how long the jpeg packet is
199-
end = int.from_bytes(self.buffer[4:6], signed=False, byteorder="little")
200-
self.buffer += self.serial_connection.read(end - len(self.buffer))
200+
end = -1
201+
while end == -1:
202+
self.buffer += self.serial_connection.read(128)
203+
end = self.buffer.find(b"\xff\xd9")
201204
return beg, end
202205

203206
def get_next_jpeg_frame(self):
204207
beg, end = self.get_next_packet_bounds()
205-
jpeg = self.buffer[beg + ETVR_HEADER_LEN : end + ETVR_HEADER_LEN]
206-
self.buffer = self.buffer[end + ETVR_HEADER_LEN :]
208+
jpeg = self.buffer[beg: end + 2]
209+
self.buffer = self.buffer[end + 2 :]
207210
return jpeg
208211

209212
def get_serial_camera_picture(self, should_push):
@@ -216,10 +219,9 @@ def get_serial_camera_picture(self, should_push):
216219
jpeg = self.get_next_jpeg_frame()
217220
if jpeg:
218221
# Create jpeg frame from byte string
219-
image = cv2.imdecode(
220-
np.fromstring(jpeg, dtype=np.uint8), cv2.IMREAD_UNCHANGED
221-
)
222-
if image is None:
222+
try:
223+
image = np.array(Image.open(BytesIO(jpeg)))
224+
except Exception:
223225
print(
224226
f'{Fore.YELLOW}[{lang._instance.get_string("log.warn")}] {lang._instance.get_string("warn.frameDrop")}{Fore.RESET}'
225227
)

0 commit comments

Comments
 (0)