X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=server.cpp;h=a418d1c660d409b0ea85162696f9a33de01dc330;hp=2f7a3327079af265a0faf2469b9b8b29c2f9a308;hb=52d37b2815f4b144fbac899b7f9548353a6fbe3c;hpb=207ca0494024641f27537ad3cf047814d8092678 diff --git a/server.cpp b/server.cpp index 2f7a332..a418d1c 100644 --- a/server.cpp +++ b/server.cpp @@ -317,6 +317,13 @@ void Server::set_backlog_size(int stream_index, size_t new_size) assert(stream_index >= 0 && stream_index < ssize_t(streams.size())); streams[stream_index]->set_backlog_size(new_size); } + +void Server::set_prebuffering_bytes(int stream_index, size_t new_amount) +{ + MutexLock lock(&mutex); + assert(stream_index >= 0 && stream_index < ssize_t(streams.size())); + streams[stream_index]->prebuffering_bytes = new_amount; +} void Server::set_encoding(int stream_index, Stream::Encoding encoding) { @@ -330,6 +337,17 @@ void Server::set_header(int stream_index, const string &http_header, const strin MutexLock lock(&mutex); assert(stream_index >= 0 && stream_index < ssize_t(streams.size())); streams[stream_index]->http_header = http_header; + + if (stream_header != streams[stream_index]->stream_header) { + // We cannot start at any of the older starting points anymore, + // since they'd get the wrong header for the stream (not to mention + // that a changed header probably means the stream restarted, + // which means any client starting on the old one would probably + // stop playing properly at the change point). Next block + // should be a suitable starting point (if not, something is + // pretty strange), so it will fill up again soon enough. + streams[stream_index]->suitable_starting_points.clear(); + } streams[stream_index]->stream_header = stream_header; } @@ -461,8 +479,6 @@ sending_header_or_error_again: 0); client->state = Client::SENDING_DATA; } else { - // client->stream_pos should be -1, but it might not be, - // if we have clients from an older version. client->stream_pos = client->stream->bytes_received; client->state = Client::WAITING_FOR_KEYFRAME; } @@ -471,14 +487,15 @@ sending_header_or_error_again: } case Client::WAITING_FOR_KEYFRAME: { Stream *stream = client->stream; - if (ssize_t(client->stream_pos) > stream->last_suitable_starting_point) { + if (stream->suitable_starting_points.empty() || + client->stream_pos > stream->suitable_starting_points.back()) { // We haven't received a keyframe since this stream started waiting, // so keep on waiting for one. // This is postcondition #3. stream->put_client_to_sleep(client); return; } - client->stream_pos = stream->last_suitable_starting_point; + client->stream_pos = stream->suitable_starting_points.back(); client->state = Client::PREBUFFERING; // Fall through. } @@ -488,6 +505,7 @@ sending_header_or_error_again: assert(bytes_to_send <= stream->backlog_size); if (bytes_to_send < stream->prebuffering_bytes) { // We don't have enough bytes buffered to start this client yet. + // This is postcondition #3. stream->put_client_to_sleep(client); return; }