X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=video_stream.h;h=f05a10a5b3b2c839087145596df1f9f2d9f2d029;hb=44e59d9e9aac7082e1bab9f5b492e439b12d0fea;hp=953e28e661934b16105f429261494796344918b2;hpb=e6f5343ffeaab71cee601f1a78937525e1947fef;p=nageru diff --git a/video_stream.h b/video_stream.h index 953e28e..f05a10a 100644 --- a/video_stream.h +++ b/video_stream.h @@ -19,12 +19,13 @@ extern "C" { #include "ref_counted_gl_sync.h" +class ChromaSubsampler; class DISComputeFlow; -class GrayscaleConversion; class Interpolate; class Mux; class QSurface; class QSurfaceFormat; +class YCbCrConverter; class VideoStream { public: @@ -49,6 +50,7 @@ private: struct InterpolatedFrameResources { GLuint input_tex; // Layered (contains both input frames). GLuint gray_tex; // Same. + GLuint cb_tex, cr_tex; GLuint input_fbos[2]; // For rendering to the two layers of input_tex. GLuint pbo; // For reading the data back. void *pbo_contents; // Persistently mapped. @@ -66,8 +68,8 @@ private: int64_t input_second_pts; float alpha; InterpolatedFrameResources resources; - GLuint output_tex; RefCountedGLsync fence; // Set when the interpolated image is read back to the CPU. + GLuint flow_tex, output_tex, cbcr_tex; // Released in the receiving thread; not really used for anything else. }; std::deque frame_queue; // Under . std::mutex queue_lock; @@ -77,15 +79,12 @@ private: std::string stream_mux_header; bool seen_sync_markers = false; - QSurface *gl_surface; - std::unique_ptr ycbcr_convert_chain; // TODO: Have a separate version with resample, for scaling? - movit::YCbCrInput *ycbcr_input; - movit::YCbCrFormat ycbcr_format; + std::unique_ptr ycbcr_converter; // Frame interpolation. - std::unique_ptr gray; std::unique_ptr compute_flow; std::unique_ptr interpolate; + std::unique_ptr chroma_subsampler; }; #endif // !defined(_VIDEO_STREAM_H)