- if (encoding == Stream::STREAM_ENCODING_RAW) {
- queued_data.append(string(data, data + bytes));
- } else if (encoding == STREAM_ENCODING_METACUBE) {
- metacube_block_header hdr;
- memcpy(hdr.sync, METACUBE_SYNC, sizeof(hdr.sync));
+ // We could do a binary search here (std::lower_bound), but it seems
+ // overkill for removing what's probably only a few points.
+ while (!suitable_starting_points.empty() &&
+ bytes_received - suitable_starting_points[0] > backlog_size) {
+ suitable_starting_points.pop_front();
+ }
+}
+
+void Stream::add_data_deferred(const char *data, size_t bytes, uint16_t metacube_flags)
+{
+ // For regular output, we don't want to send the client twice
+ // (it's already sent out together with the HTTP header).
+ // However, for Metacube output, we need to send it so that
+ // the Cubemap instance in the other end has a chance to update it.
+ // It may come twice in its stream, but Cubemap doesn't care.
+ if (encoding == Stream::STREAM_ENCODING_RAW &&
+ (metacube_flags & METACUBE_FLAGS_HEADER) != 0) {
+ return;
+ }
+
+ MutexLock lock(&queued_data_mutex);
+
+ DataElement data_element;
+ data_element.metacube_flags = metacube_flags;
+
+ if (encoding == Stream::STREAM_ENCODING_METACUBE) {
+ // Add a Metacube block header before the data.
+ metacube2_block_header hdr;
+ memcpy(hdr.sync, METACUBE2_SYNC, sizeof(hdr.sync));