webrtc_m130/api/video/frame_buffer.h
philipel 8615bf0582 Move FrameBuffer3 to api/
The webrtc::VideoStreamDecoderInterface was basically created as a public version of FrameBuffer2, but to hide the complexity of FrameBuffer2 it was also combined with decoding so that the public API could be reasonably simple to use. FrameBuffer3 has a simple API with a clear purpose, so its API can be exposed directly.

Bug: webrtc:14026
Change-Id: I81dc84b869e4d16c5e02feb5c876fbcede3d4a25
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/261181
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36781}
2022-05-05 14:34:48 +00:00

106 lines
3.6 KiB
C++

/*
* Copyright (c) 2021 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.
*/
#ifndef API_VIDEO_FRAME_BUFFER_H_
#define API_VIDEO_FRAME_BUFFER_H_
#include <map>
#include <memory>
#include <utility>
#include "absl/container/inlined_vector.h"
#include "absl/types/optional.h"
#include "api/field_trials_view.h"
#include "api/units/timestamp.h"
#include "api/video/encoded_frame.h"
#include "modules/video_coding/utility/decoded_frames_history.h"
namespace webrtc {
// The high level idea of the FrameBuffer is to order frames received from the
// network into a decodable stream. Frames are order by frame ID, and grouped
// into temporal units by timestamp. A temporal unit is decodable after all
// referenced frames outside the unit has been decoded, and a temporal unit is
// continuous if all referenced frames are directly or indirectly decodable.
// The FrameBuffer is thread-unsafe.
class FrameBuffer {
public:
struct DecodabilityInfo {
uint32_t next_rtp_timestamp;
uint32_t last_rtp_timestamp;
};
// The `max_size` determines the maxmimum number of frames the buffer will
// store, and max_decode_history determines how far back (by frame ID) the
// buffer will store if a frame was decoded or not.
FrameBuffer(int max_size,
int max_decode_history,
// TODO(hta): remove field trials!
const FieldTrialsView& field_trials);
FrameBuffer(const FrameBuffer&) = delete;
FrameBuffer& operator=(const FrameBuffer&) = delete;
~FrameBuffer() = default;
// Inserted frames may only reference backwards, and must have no duplicate
// references.
void InsertFrame(std::unique_ptr<EncodedFrame> frame);
// Mark all frames belonging to the next decodable temporal unit as decoded
// and returns them.
absl::InlinedVector<std::unique_ptr<EncodedFrame>, 4>
ExtractNextDecodableTemporalUnit();
// Drop all frames in the next decodable unit.
void DropNextDecodableTemporalUnit();
absl::optional<int64_t> LastContinuousFrameId() const;
absl::optional<int64_t> LastContinuousTemporalUnitFrameId() const;
absl::optional<DecodabilityInfo> DecodableTemporalUnitsInfo() const;
int GetTotalNumberOfContinuousTemporalUnits() const;
int GetTotalNumberOfDroppedFrames() const;
size_t CurrentSize() const;
private:
struct FrameInfo {
std::unique_ptr<EncodedFrame> encoded_frame;
bool continuous = false;
};
using FrameMap = std::map<int64_t, FrameInfo>;
using FrameIterator = FrameMap::iterator;
struct TemporalUnit {
// Both first and last are inclusive.
FrameIterator first_frame;
FrameIterator last_frame;
};
bool IsContinuous(const FrameIterator& it) const;
void PropagateContinuity(const FrameIterator& frame_it);
void FindNextAndLastDecodableTemporalUnit();
void Clear();
const bool legacy_frame_id_jump_behavior_;
const size_t max_size_;
FrameMap frames_;
absl::optional<TemporalUnit> next_decodable_temporal_unit_;
absl::optional<DecodabilityInfo> decodable_temporal_units_info_;
absl::optional<int64_t> last_continuous_frame_id_;
absl::optional<int64_t> last_continuous_temporal_unit_frame_id_;
video_coding::DecodedFramesHistory decoded_frame_history_;
int num_continuous_temporal_units_ = 0;
int num_dropped_frames_ = 0;
};
} // namespace webrtc
#endif // API_VIDEO_FRAME_BUFFER_H_