X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fvideo_stream.h;h=05bd7a7b9453c46228ce66eb08362223ddeb40c3;hb=b44bf7cfce6a5aaffbcd1e37df39068a163438ad;hp=d4cb18eb7e91e758fc53d6e99adb90e7a2741e45;hpb=a64b7a670a29674aa4a6cb2abe2f5a29f6cc14bc;p=nageru diff --git a/futatabi/video_stream.h b/futatabi/video_stream.h index d4cb18e..05bd7a7 100644 --- a/futatabi/video_stream.h +++ b/futatabi/video_stream.h @@ -5,6 +5,7 @@ #include extern "C" { +#include #include } @@ -35,7 +36,7 @@ class YCbCrConverter; class VideoStream { public: - VideoStream(); + VideoStream(AVFormatContext *file_avctx); // nullptr if output to stream. ~VideoStream(); void start(); void stop(); @@ -98,7 +99,7 @@ private: void operator() (InterpolatedFrameResources *ifr) const { if (ifr != nullptr) { - std::unique_lock lock(ifr->owner->queue_lock); + std::lock_guard lock(ifr->owner->queue_lock); ifr->owner->interpolate_resources.emplace_back(ifr); } } @@ -120,7 +121,7 @@ private: float alpha; BorrowedInterpolatedFrameResources resources; 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. + GLuint flow_tex, output_tex, cbcr_tex; // Released in the receiving thread; not really used for anything else. flow_tex will typically even be from a previous frame. FrameOnDisk id; std::function display_func; // Called when the image is done decoding. @@ -131,9 +132,11 @@ private: std::deque frame_queue; // Under . std::condition_variable queue_changed; - std::unique_ptr stream_mux; // To HTTP. - std::string stream_mux_header; + AVFormatContext *avctx; + std::unique_ptr mux; // To HTTP, or to file. + std::string stream_mux_header; // Only used in HTTP. bool seen_sync_markers = false; + bool output_fast_forward; std::unique_ptr ycbcr_converter; std::unique_ptr ycbcr_semiplanar_converter; @@ -143,6 +146,10 @@ private: std::unique_ptr interpolate, interpolate_no_split; std::unique_ptr chroma_subsampler; + // Cached flow computation from previous frame, if any. + GLuint last_flow_tex = 0; + FrameOnDisk last_frame1, last_frame2; + std::vector last_frame; };