// // Created by Marc Rousavy on 25.08.23. // #pragma once #include "OpenGLContext.h" #include "OpenGLRenderer.h" #include "PassThroughShader.h" #include #include #include #include #include #include namespace vision { using namespace facebook; class VideoPipeline : public jni::HybridClass { public: static auto constexpr kJavaDescriptor = "Lcom/mrousavy/camera/core/VideoPipeline;"; static jni::local_ref initHybrid(jni::alias_ref jThis, int width, int height); static void registerNatives(); public: ~VideoPipeline(); // -> SurfaceTexture input int getInputTextureId(); // <- MediaRecorder output void setRecordingSessionOutputSurface(jobject surface); void removeRecordingSessionOutputSurface(); // Frame callbacks void onBeforeFrame(); void onFrame(jni::alias_ref transformMatrix); private: // Private constructor. Use `create(..)` to create new instances. explicit VideoPipeline(jni::alias_ref jThis, int width, int height); private: // Input Surface Texture std::optional _inputTexture = std::nullopt; int _width = 0; int _height = 0; // Output Contexts std::shared_ptr _context = nullptr; std::unique_ptr _recordingSessionOutput = nullptr; private: friend HybridBase; jni::global_ref _javaPart; static constexpr auto TAG = "VideoPipeline"; }; } // namespace vision