From dcb3aecf327ab8b2e0bfd9ee21b48d421248da4f Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 23 Nov 2016 00:47:27 +0100 Subject: [PATCH] Fix a thread race that would sometimes cause x264 streaming to go awry. --- x264_encoder.cpp | 1 + x264_encoder.h | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/x264_encoder.cpp b/x264_encoder.cpp index f339e8c..f909f55 100644 --- a/x264_encoder.cpp +++ b/x264_encoder.cpp @@ -194,6 +194,7 @@ void X264Encoder::encoder_thread_func() // No exit; it's not fatal. } init_x264(); + x264_init_done = true; bool frames_left; diff --git a/x264_encoder.h b/x264_encoder.h index c71cba2..f607a91 100644 --- a/x264_encoder.h +++ b/x264_encoder.h @@ -16,6 +16,7 @@ #ifndef _X264ENCODE_H #define _X264ENCODE_H 1 +#include #include #include #include @@ -48,7 +49,12 @@ public: // Does not block. void add_frame(int64_t pts, int64_t duration, const uint8_t *data); - std::string get_global_headers() const { return global_headers; } + std::string get_global_headers() const { + while (!x264_init_done) { + sched_yield(); + } + return global_headers; + } void change_bitrate(unsigned rate_kbit) { new_bitrate_kbit = rate_kbit; @@ -75,6 +81,7 @@ private: std::string buffered_sei; // Will be output before first frame, if any. std::thread encoder_thread; + std::atomic x264_init_done{false}; std::atomic should_quit{false}; x264_t *x264; std::unique_ptr speed_control; -- 2.39.2