8000 test self._fbo · Android-for-Python/Camera4Kivy@e331bc4 · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Nov 14, 2023. It is now read-only.

Commit e331bc4

Browse files
test self._fbo
Fix "AttributeError: 'PreviewCameraX' object has no attribute '_fbo'". In case where user connects Android camera too early
1 parent acb9c1e commit e331bc4

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

src/camera4kivy/preview_camerax.py

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def __init__(self, **kwargs):
5050
self.enable_zoom_gesture = False
5151
self.enable_focus_gesture = False
5252
self.block_pipeline = True
53+
self._fbo = None
5354

5455
##############################
5556
# Lifecycle events
@@ -415,7 +416,7 @@ def _create_pipeline(self, texture_size, rotation):
415416

416417
def block_and_clear_pipeline(self):
417418
self.block_pipeline = True
418-
if self._camera and self._fbo.texture:
419+
if self._camera and self._fbo and self._fbo.texture:
419420
tex_size = self._fbo.texture.size
420421
buf = bytes([255] * tex_size[0] * tex_size[1] * 4)
421422
self._fbo.texture.blit_buffer(buf, colorfmt='rgba',
@@ -425,7 +426,8 @@ def block_and_clear_pipeline(self):
425426

426427
def _schedule_pipeline(self):
427428
self._deschedule_pipeline()
428-
if self._camera and self._camera_texture and self._fbo.texture:
429+
if self._camera and self._camera_texture and self._fbo and\
430+
self._fbo.texture:
429431
self._set_surface_provider(True)
430432
self.block_pipeline = False
431433
self._update_ev = Clock.schedule_interval(self._update_pipeline,
@@ -438,7 +440,7 @@ def _deschedule_pipeline(self):
438440
self._update_ev = None
439441

440442
def _update_pipeline(self, dt):
441-
if self._camera.imageReady() and not self.block_pipeline:
443+
if self._camera.imageReady() and self._fbo and not self.block_pipeline:
442444
self._camera_texture_cb.ask_update()
443445
self._fbo.draw()
444446
self._analyze_texture()
@@ -452,23 +454,24 @@ def _set_surface_provider(self, enable):
452454
# Run on mainthread because required by Kivy canvas
453455
@mainthread
454456
def _update_canvas(self):
455-
tex = self._fbo.texture.get_region(*self.crop)
457+
if self._fbo:
458+
tex = self._fbo.texture.get_region(*self.crop)
456459

457-
# moved from create_fbo
458-
if self.facing == 'front':
459-
view_size = (-self.view_size[0], self.view_size[1])
460-
view_pos = (self.view_pos[0] + self.view_size[0],
461-
self.view_pos[1])
462-
else:
463-
view_size = self.view_size
464-
view_pos = self.view_pos
460+
# moved from create_fbo
461+
if self.facing == 'front':
462+
view_size = (-self.view_size[0], self.view_size[1])
463+
view_pos = (self.view_pos[0] + self.view_size[0],
464+
self.view_pos[1])
465+
else:
466+
view_size = self.view_size
467+
view_pos = self.view_pos
465468

466-
self.canvas.clear()
467-
with self.canvas:
468-
Color(1,1,1,1)
469-
Rectangle(texture= tex, size = view_size, pos = view_pos)
470-
if self.canvas_callback:
471-
self.canvas_callback(tex, view_size, view_pos)
469+
self.canvas.clear()
470+
with self.canvas:
471+
Color(1,1,1,1)
472+
Rectangle(texture= tex, size = view_size, pos = view_pos)
473+
if self.canvas_callback:
474+
self.canvas_callback(tex, view_size, view_pos)
472475

473476
#######################################
474477
# Storage Location
@@ -554,7 +557,7 @@ def _filename_callback(self, file_id):
554557
self.callback(str(file_id))
555558

556559
def _analyze_texture(self):
557-
if not self.enable_data and self._analyze_callback:
560+
if not self.enable_data and self._fbo and self._analyze_callback:
558561
tex = self._fbo.texture.get_region(*self.crop)
559562
self._analyze_callback(tex, self.view_pos,
560563
self.tscale, self.facing=='front')

0 commit comments

Comments
 (0)
0