From: Steinar H. Gunderson Date: Tue, 22 Nov 2016 23:47:27 +0000 (+0100) Subject: Fix a thread race that would sometimes cause x264 streaming to go awry. X-Git-Tag: 1.4.2~2 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=dcb3aecf327ab8b2e0bfd9ee21b48d421248da4f;hp=7e5bd7ad06f1c565dcbea2a69ae29691399cb115;p=nageru Fix a thread race that would sometimes cause x264 streaming to go awry. --- 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;