blob: 0ef46b4152494ba63eacdd73149acf55dff1a2bf [file] [log] [blame]
/*
* Copyright (c) 2022, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 2 Clause License and
* the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
* was not distributed with this source code in the LICENSE file, you can
* obtain it at www.aomedia.org/license/software. If the Alliance for Open
* Media Patent License 1.0 was not distributed with this source code in the
* PATENTS file, you can obtain it at www.aomedia.org/license/patent.
*/
#include <deque>
#include <iostream>
#include <vector>
#include "av1/ratectrl_qmode_interface.h"
namespace aom {
enum class RefUpdateType { kForward, kBackward, kLast, kNone };
class RefFrameManager {
public:
explicit RefFrameManager(int max_ref_frames)
: max_ref_frames_(max_ref_frames) {
forward_max_size_ = max_ref_frames - 2;
Reset();
}
~RefFrameManager() = default;
RefFrameManager(const RefFrameManager &) = delete;
RefFrameManager &operator=(const RefFrameManager &) = delete;
friend std::ostream &operator<<(std::ostream &os,
const RefFrameManager &rfm) {
os << "=" << std::endl;
os << "forward: ";
for (const auto &ref_idx : rfm.forward_stack_) {
os << rfm.ref_frame_table_[ref_idx].order_idx << " ";
}
os << std::endl;
os << "backward: ";
for (const auto &ref_idx : rfm.backward_queue_) {
os << rfm.ref_frame_table_[ref_idx].order_idx << " ";
}
os << std::endl;
os << "last: ";
for (const auto &ref_idx : rfm.last_queue_) {
os << rfm.ref_frame_table_[ref_idx].order_idx << " ";
}
os << std::endl;
return os;
}
void Reset();
int AllocateRefIdx();
void UpdateOrder(int order_idx);
int ColocatedRefIdx(int order_idx);
int ForwardMaxSize() const { return forward_max_size_; }
int MaxRefFrames() const { return max_ref_frames_; }
void UpdateFrame(GopFrame *gop_frame, RefUpdateType ref_update_type,
EncodeRefMode encode_ref_mode);
private:
// TODO(angiebird): // Make RefFrameTable comply with max_ref_frames_
int max_ref_frames_;
int forward_max_size_;
RefFrameTable ref_frame_table_;
std::deque<int> free_ref_idx_list_;
std::vector<int> forward_stack_;
std::deque<int> backward_queue_;
std::deque<int> last_queue_;
};
} // namespace aom