blob: d3c6bd48dbdebe241d3974517cb640b5af7e9463 [file] [log] [blame]
/*
* Copyright (c) 2023 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 TEST_PC_E2E_ANALYZER_VIDEO_DVQA_FRAMES_STORAGE_H_
#define TEST_PC_E2E_ANALYZER_VIDEO_DVQA_FRAMES_STORAGE_H_
#include <cstdint>
#include <unordered_map>
#include <vector>
#include "absl/types/optional.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "api/video/video_frame.h"
#include "system_wrappers/include/clock.h"
namespace webrtc {
// Stores video frames for DefaultVideoQualityAnalyzer. Frames are cleaned up
// when the time elapsed from their capture time exceeds `max_storage_duration`.
class FramesStorage {
public:
FramesStorage(TimeDelta max_storage_duration, Clock* clock)
: max_storage_duration_(max_storage_duration), clock_(clock) {}
FramesStorage(const FramesStorage&) = delete;
FramesStorage& operator=(const FramesStorage&) = delete;
FramesStorage(FramesStorage&&) = default;
FramesStorage& operator=(FramesStorage&&) = default;
// Adds frame to the storage. It is guaranteed to be stored at least
// `max_storage_duration` from `captured_time`.
//
// Complexity: O(log(n))
void Add(const VideoFrame& frame, Timestamp captured_time);
// Complexity: O(1)
absl::optional<VideoFrame> Get(uint16_t frame_id);
// Removes the frame identified by `frame_id` from the storage. No error
// happens in case there isn't a frame identified by `frame_id`.
//
// Complexity: O(log(n))
void Remove(uint16_t frame_id);
private:
struct HeapNode {
VideoFrame frame;
Timestamp captured_time;
};
void RemoveInternal(uint16_t frame_id);
void Heapify(size_t index);
void HeapifyUp(size_t index);
void HeapifyDown(size_t index);
// Complexity: O(#(of too old frames) * log(n))
void RemoveTooOldFrames();
TimeDelta max_storage_duration_;
Clock* clock_;
std::unordered_map<uint16_t, size_t> frame_id_index_;
// Min-heap based on HeapNode::captured_time.
std::vector<HeapNode> heap_;
};
} // namespace webrtc
#endif // TEST_PC_E2E_ANALYZER_VIDEO_DVQA_FRAMES_STORAGE_H_