X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=84313e5130b0816b2a997ee9265d637781cb3aed;hb=817fffe1ef3bd87f2387395f49487cf5255d8daf;hp=5a3e203dc9dc0dd5f02c6eb2c100364313521291;hpb=4d4386716f258413132b8696315cb4efbf2c8b45;p=nageru diff --git a/mixer.h b/mixer.h index 5a3e203..84313e5 100644 --- a/mixer.h +++ b/mixer.h @@ -42,6 +42,7 @@ class ALSAOutput; class ChromaSubsampler; class DeckLinkOutput; +class MJPEGEncoder; class QSurface; class QSurfaceFormat; class TimecodeRenderer; @@ -421,6 +422,8 @@ public: theme->set_theme_menu_callback(callback); } + void wait_for_next_frame(); + private: struct CaptureCard; @@ -473,6 +476,7 @@ private: std::unique_ptr chroma_subsampler; std::unique_ptr v210_converter; std::unique_ptr video_encoder; + std::unique_ptr mjpeg_encoder; std::unique_ptr timecode_renderer; std::atomic display_timecode_in_stream{false}; @@ -482,7 +486,10 @@ private: movit::YCbCrInput *display_input; int64_t pts_int = 0; // In TIMEBASE units. - unsigned frame_num = 0; + + mutable std::mutex frame_num_mutex; + std::condition_variable frame_num_updated; + unsigned frame_num = 0; // Under . // Accumulated errors in number of 1/TIMEBASE audio samples. If OUTPUT_FREQUENCY divided by // frame rate is integer, will always stay zero. @@ -525,10 +532,15 @@ private: std::function upload_func; // Needs to be called to actually upload the texture to OpenGL. unsigned dropped_frames = 0; // Number of dropped frames before this one. std::chrono::steady_clock::time_point received_timestamp = std::chrono::steady_clock::time_point::min(); + + // Used for MJPEG encoding. (upload_func packs everything it needs + // into the functor, but would otherwise also use these.) + // width=0 or height=0 means a broken frame, ie., do not upload. + bmusb::VideoFormat video_format; + size_t y_offset, cbcr_offset; }; std::deque new_frames; - bool should_quit = false; - std::condition_variable new_frames_changed; // Set whenever new_frames (or should_quit) is changed. + std::condition_variable new_frames_changed; // Set whenever new_frames is changed. QueueLengthPolicy queue_length_policy; // Refers to the "new_frames" queue.