mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 13:50:40 +01:00

This feature is active if and only if the RTP header extension playout-delay is used with min playout delay=0 and max playout delay>0. In this case, a maximum composition delay will be calculated and attached to the video frame as a signal to use the low-latency renderer algorithm, which is landed in a separate CL in Chromium. The maximum composition delay is specified in number of frames and is calculated based on the max playout delay. The feature can be completetly disabled by specifying the field trial WebRTC-LowLatencyRenderer/enabled:false/ Bug: chromium:1138888 Change-Id: I05f461982d0632bd6e09e5d7ec1a8985dccdc61b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/190141 Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Commit-Queue: Johannes Kron <kron@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32493}
72 lines
2.3 KiB
C++
72 lines
2.3 KiB
C++
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "modules/video_coding/timestamp_map.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "modules/include/module_common_types_public.h"
|
|
|
|
namespace webrtc {
|
|
|
|
VCMTimestampMap::VCMTimestampMap(size_t capacity)
|
|
: ring_buffer_(new TimestampDataTuple[capacity]),
|
|
capacity_(capacity),
|
|
next_add_idx_(0),
|
|
next_pop_idx_(0) {}
|
|
|
|
VCMTimestampMap::~VCMTimestampMap() {}
|
|
|
|
void VCMTimestampMap::Add(uint32_t timestamp, VCMFrameInformation* data) {
|
|
ring_buffer_[next_add_idx_].timestamp = timestamp;
|
|
ring_buffer_[next_add_idx_].data = data;
|
|
next_add_idx_ = (next_add_idx_ + 1) % capacity_;
|
|
|
|
if (next_add_idx_ == next_pop_idx_) {
|
|
// Circular list full; forget oldest entry.
|
|
next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
|
|
}
|
|
}
|
|
|
|
VCMFrameInformation* VCMTimestampMap::Pop(uint32_t timestamp) {
|
|
while (!IsEmpty()) {
|
|
if (ring_buffer_[next_pop_idx_].timestamp == timestamp) {
|
|
// Found start time for this timestamp.
|
|
VCMFrameInformation* data = ring_buffer_[next_pop_idx_].data;
|
|
ring_buffer_[next_pop_idx_].data = nullptr;
|
|
next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
|
|
return data;
|
|
} else if (IsNewerTimestamp(ring_buffer_[next_pop_idx_].timestamp,
|
|
timestamp)) {
|
|
// The timestamp we are looking for is not in the list.
|
|
return nullptr;
|
|
}
|
|
|
|
// Not in this position, check next (and forget this position).
|
|
next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
|
|
}
|
|
|
|
// Could not find matching timestamp in list.
|
|
return nullptr;
|
|
}
|
|
|
|
bool VCMTimestampMap::IsEmpty() const {
|
|
return (next_add_idx_ == next_pop_idx_);
|
|
}
|
|
|
|
size_t VCMTimestampMap::Size() const {
|
|
// The maximum number of elements in the list is |capacity_| - 1. The list is
|
|
// empty if the add and pop indices are equal.
|
|
return next_add_idx_ >= next_pop_idx_
|
|
? next_add_idx_ - next_pop_idx_
|
|
: next_add_idx_ + capacity_ - next_pop_idx_;
|
|
}
|
|
|
|
} // namespace webrtc
|