private void CommitAndroid(RenderTexture framebuffer, long timestamp) { /* * Because Android is terrible at everything, we have to *break* the IMediaRecorder contract and directly * send the framebuffer texture to the native recorder for encoding. We wouldn't have to do this if * Android OEM's properly implemented PBO's, WHICH SHOULD NOT BLOCK with `glReadPixels`. So infuriating. */ var nativeRecorder = ((mediaRecorder as IAbstractRecorder).recorder as MediaRecorderAndroid).recorder; var textureID = framebuffer.GetNativeTexturePtr().ToInt32(); if (mediaRecorder is MP4Recorder || mediaRecorder is HEVCRecorder) // GIFRecorder can't use this trick { using (var dispatcher = new RenderDispatcher()) dispatcher.Dispatch(() => { AndroidJNI.AttachCurrentThread(); lock (this) if (!disposed) { nativeRecorder.Call(@"encodeFrame", textureID, timestamp); } }); } else { CommitSync(framebuffer, timestamp); // For GIFRecorder, do standard readback } }
public GLESReadback(bool deferred) { this.deferred = deferred; dispatcher = new RenderDispatcher(); GPUFence = GPUFence ?? new AndroidJavaClass(@"com.yusufolokoba.natrender.GPUFence"); DispatchUtility.onFrame += OnFrame; }
public void Dispose() { Texture2D.Destroy(readbackBuffer); lock (this) disposed = true; using (var dispatcher = new RenderDispatcher()) dispatcher.Dispatch(() => MTLReadbackDispose(readbackiOS)); }
public override void StartPreview(Action <Texture> startCallback, Action <long> frameCallback) { this.startCallback = startCallback; this.frameCallback = frameCallback; DispatchUtility.onPause += OnPause; DispatchUtility.onOrient += OnOrient; OnOrient(DispatchUtility.orientation); this.cameraDelegate = new DeviceCameraDelegate(this); using (var dispatcher = new RenderDispatcher()) dispatcher.Dispatch(() => device.Call(@"startPreview", cameraDelegate)); }
public MediaRecorderAndroid(AndroidJavaObject recorder, int width, int height, string recordingPath, Action <string> callback) : base(@"com.yusufolokoba.natcorder.RecordingDelegate") { this.recorder = recorder; this.width = width; this.height = height; this.callback = callback; this.readbackContext = new GLESReadback(true); // Start recording using (var dispatcher = new RenderDispatcher()) dispatcher.Dispatch(() => recorder.Call(@"startRecording", recordingPath, this)); }
private void CommitiOS(RenderTexture framebuffer, long timestamp) { var _ = framebuffer.colorBuffer; var texturePtr = framebuffer.GetNativeTexturePtr(); Action <IntPtr> commitFrame = pixelBuffer => { lock (this) if (!disposed) { mediaRecorder.CommitFrame(pixelBuffer, timestamp); } }; using (var dispatcher = new RenderDispatcher()) dispatcher.Dispatch(() => MTLReadbackReadback(readbackiOS, texturePtr, OnReadback, (IntPtr)GCHandle.Alloc(commitFrame, GCHandleType.Normal))); }
public override void StopPreview() { using (var dispatcher = new RenderDispatcher()) dispatcher.Dispatch(() => device.Call(@"stopPreview")); Texture2D.Destroy(previewTexture); previewTexture = null; cameraDelegate = null; DispatchUtility.onOrient -= OnOrient; if (!retainPauseSubsription) { DispatchUtility.onPause -= OnPause; startCallback = null; frameCallback = null; } }
private static void StartWindow() { var dispatcher = new RenderDispatcher(); var wnd = new BaseWindow(); wnd.Title = "NetGL Contructor"; wnd.Content = new Main(); wnd.Show(); wnd.Closed += (s, ea) => { dispatcher.Shutdown(); }; Log.Info("starting Constructor main loop"); dispatcher.Run(); }