From 812d8d35caad6283bb6ba10c881607002b7cd137 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 12 Apr 2016 19:21:30 +0200 Subject: [PATCH] Set one fence less in the case of non-zerocopy H.264 encoding. --- h264encode.cpp | 14 ++++++++------ h264encode.h | 2 +- mixer.cpp | 5 +---- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/h264encode.cpp b/h264encode.cpp index f4f6432..c923f47 100644 --- a/h264encode.cpp +++ b/h264encode.cpp @@ -196,7 +196,7 @@ public: ~H264EncoderImpl(); void add_audio(int64_t pts, vector audio); bool begin_frame(GLuint *y_tex, GLuint *cbcr_tex); - void end_frame(RefCountedGLsync fence, int64_t pts, const vector &input_frames); + RefCountedGLsync end_frame(int64_t pts, const vector &input_frames); void shutdown(); private: @@ -1879,7 +1879,7 @@ void H264EncoderImpl::add_audio(int64_t pts, vector audio) frame_queue_nonempty.notify_all(); } -void H264EncoderImpl::end_frame(RefCountedGLsync fence, int64_t pts, const vector &input_frames) +RefCountedGLsync H264EncoderImpl::end_frame(int64_t pts, const vector &input_frames) { assert(!is_shutdown); @@ -1909,16 +1909,18 @@ void H264EncoderImpl::end_frame(RefCountedGLsync fence, int64_t pts, const vecto glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT | GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT); check_error(); - fence = RefCountedGLsync(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0); - check_error(); } + RefCountedGLsync fence = RefCountedGLsync(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0); + check_error(); + { unique_lock lock(frame_queue_mutex); pending_video_frames[current_storage_frame] = PendingFrame{ fence, input_frames, pts }; ++current_storage_frame; } frame_queue_nonempty.notify_all(); + return fence; } void H264EncoderImpl::shutdown() @@ -2147,9 +2149,9 @@ bool H264Encoder::begin_frame(GLuint *y_tex, GLuint *cbcr_tex) return impl->begin_frame(y_tex, cbcr_tex); } -void H264Encoder::end_frame(RefCountedGLsync fence, int64_t pts, const vector &input_frames) +RefCountedGLsync H264Encoder::end_frame(int64_t pts, const vector &input_frames) { - impl->end_frame(fence, pts, input_frames); + return impl->end_frame(pts, input_frames); } void H264Encoder::shutdown() diff --git a/h264encode.h b/h264encode.h index 0d70524..43a56c6 100644 --- a/h264encode.h +++ b/h264encode.h @@ -50,7 +50,7 @@ public: void add_audio(int64_t pts, std::vector audio); bool begin_frame(GLuint *y_tex, GLuint *cbcr_tex); - void end_frame(RefCountedGLsync fence, int64_t pts, const std::vector &input_frames); + RefCountedGLsync end_frame(int64_t pts, const std::vector &input_frames); void shutdown(); // Blocking. private: diff --git a/mixer.cpp b/mixer.cpp index 4e3d486..08d2d01 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -795,11 +795,8 @@ void Mixer::render_one_frame() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - RefCountedGLsync fence(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0); - check_error(); - const int64_t av_delay = TIMEBASE / 10; // Corresponds to the fixed delay in resampling_queue.h. TODO: Make less hard-coded. - h264_encoder->end_frame(fence, pts_int + av_delay, theme_main_chain.input_frames); + RefCountedGLsync fence = h264_encoder->end_frame(pts_int + av_delay, theme_main_chain.input_frames); // The live frame just shows the RGBA texture we just rendered. // It owns rgba_tex now. -- 2.39.2