Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unreliable capture with ImageRecorder on Safari #335

Closed
jpanetta opened this issue Sep 14, 2020 · 3 comments
Closed

Unreliable capture with ImageRecorder on Safari #335

jpanetta opened this issue Sep 14, 2020 · 3 comments

Comments

@jpanetta
Copy link

I am trying to capture an image of a pythreejs renderer using ImageRecorder. This works reliably on Chrome, but on Safari it is extremely unreliable. I seem to be hitting some weird race condition, but I do not understand the asynchronous Javascript code involved well enough to figure what is going wrong.

Here is an example demonstrating the problem:

from pythreejs import *
ball = Mesh(geometry=SphereGeometry(),
            material=MeshLambertMaterial(color='red'))
light    = DirectionalLight(color='white', position=[3, 5, 1])
c        = PerspectiveCamera(position=[0, 5, 5], children=[light])
scene    = Scene(children=[ball, c])
renderer = Renderer(camera=c, scene=scene, controls=[OrbitControls(controlling=c)])
display(renderer)
#-----------------------------------------------
import ipywebrtc
stream = ipywebrtc.WidgetStream(widget=renderer, max_fps=30)

rec = ipywebrtc.ImageRecorder(filename='capture', format='png', stream=stream)
rec.autosave = True
#-----------------------------------------------
rec.recording = True
#-----------------------------------------------
rec.recording
# Usually still prints `True` :(

(Comments delimit notebook cells.)

I expect rec.recording = True to (a) rerender the scene, (b) capture and save an image, and (c) reset rec.recording to False. This all happens reliably on Chrome, but (b) and (c) almost always fail on Safari (no image is written, and rec.recording is still True at the end). Manually triggering a second redraw (e.g., by orbiting the view) usually causes (b) and (c) to finally happen.

As best I can tell, ImageRecorder's snapshot function hangs on the onCanPlay call. It appears the redraw requested by pythreejs here is somehow happening "too soon," but I don't understand what order everything needs to happen in.

This is tricky to debug since the capture starts working more (but not 100%) reliably when I insert breakpoints, e.g. here and here.

Do you have any ideas what might be wrong or suggestions on how to debug this? I can also submit an ipywebrtc issue, but I suspect the problem lies in pythreejs' captureStream code.

@vidartf
Copy link
Member

vidartf commented Sep 16, 2020

I'm not sure if I am able to help here (no access to Safari). Note that even if the issue is with pythreejs' code, making an issue on the ipywebrtc repo might be helpful (maybe they already know, or are able to more accurately debug the issue).

@jpanetta
Copy link
Author

Sure, I created an ipywebrtc issue here.

@jpanetta
Copy link
Author

It seems I was wrong to suspect pythreejs since I can reproduce the problem with an IntSlider. Closing this issue now--thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants