Example #1
0
        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
            }
        }
Example #2
0
 public GLESReadback(bool deferred)
 {
     this.deferred            = deferred;
     dispatcher               = new RenderDispatcher();
     GPUFence                 = GPUFence ?? new AndroidJavaClass(@"com.yusufolokoba.natrender.GPUFence");
     DispatchUtility.onFrame += OnFrame;
 }
Example #3
0
 public void Dispose()
 {
     Texture2D.Destroy(readbackBuffer);
     lock (this)
         disposed = true;
     using (var dispatcher = new RenderDispatcher())
         dispatcher.Dispatch(() => MTLReadbackDispose(readbackiOS));
 }
Example #4
0
 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));
 }
Example #5
0
 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));
 }
Example #6
0
        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)));
        }
Example #7
0
 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;
     }
 }
Example #8
0
        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();
        }