Keep the HLS backlog even if the stream header changes.
[cubemap] / stream.h
index 5d570fded6f6bec0a2387d12b845466d61eee1cf..931da2aa236e941ad72833a3af0d12cdbfac2ec2 100644 (file)
--- a/stream.h
+++ b/stream.h
@@ -46,6 +46,9 @@ struct Stream {
        // Changes the backlog size, restructuring the data as needed.
        void set_backlog_size(size_t new_size);
 
+       // You should hold the owning Server's <mutex>, since it calls add_data_raw().
+       void set_header(const std::string &new_http_header, const std::string &new_stream_header);
+
        // Mutex protecting <queued_data> and <queued_data_last_starting_point>.
        // Note that if you want to hold both this and the owning server's
        // <mutex> you will need to take <mutex> before this one.
@@ -112,7 +115,15 @@ struct Stream {
        // from points N-3..N-2.
        struct FragmentStart {
                uint64_t byte_position;
-               double pts;
+               double pts;  // Unused if begins_header is true.
+
+               // Whether the fragment started at this position is a stream header or not.
+               // Note that headers are stored _after_ the fragments they are headers for,
+               // so that they rotate out of the backlog last (and also because they are
+               // conveniently written then). The most current header is _not_ stored
+               // in the backlog; it is stored in stream_header. Only when replaced
+               // is it committed to the backlog and gets an entry here.
+               bool begins_header;
        };
        std::deque<FragmentStart> fragments;
        uint64_t first_fragment_index = 0, discontinuity_counter = 0;