#ifndef MEDIA_GPU_V4L2_TEST_H265_DPB_H_
#define MEDIA_GPU_V4L2_TEST_H265_DPB_H_
#include <set>
#include <vector>
#include "base/memory/ref_counted.h"
#include "media/parsers/h265_parser.h"
#include "ui/gfx/geometry/rect.h"
namespace media::v4l2_test {
class H265Picture : public base::RefCountedThreadSafe<H265Picture> {
public:
REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
using Vector = std::vector<scoped_refptr<H265Picture>>;
H265Picture();
H265Picture(const H265Picture&) = delete;
H265Picture& operator=(const H265Picture&) = delete;
enum ReferenceType {
kUnused = 0,
kShortTermCurrBefore = 1,
kShortTermCurrAfter = 2,
kShortTermFoll = 3,
kLongTermCurr = 4,
kLongTermFoll = 5,
};
static std::string GetReferenceName(ReferenceType ref) {
if (ref == kUnused) {
return "Unused";
} else if (ref == kLongTermCurr || ref == kLongTermFoll) {
return "LongTerm";
} else {
return "ShortTerm";
}
}
bool IsLongTermRef() const {
return reference_type_ == kLongTermCurr || reference_type_ == kLongTermFoll;
}
bool IsShortTermRef() const {
return reference_type_ == kShortTermCurrBefore ||
reference_type_ == kShortTermCurrAfter ||
reference_type_ == kShortTermFoll;
}
bool IsUnused() const { return reference_type_ == kUnused; }
const gfx::Rect visible_rect() const { return visible_rect_; }
void set_visible_rect(const gfx::Rect& rect) { visible_rect_ = rect; }
int nal_unit_type_;
bool no_rasl_output_flag_{false};
bool no_output_of_prior_pics_flag_{false};
bool pic_output_flag_{false};
bool valid_for_prev_tid0_pic_{false};
int slice_pic_order_cnt_lsb_{0};
int pic_order_cnt_msb_{0};
int pic_order_cnt_val_{0};
bool irap_pic_;
bool first_picture_;
bool processed_{false};
ReferenceType reference_type_{kUnused};
bool outputted_{false};
uint64_t ref_ts_nsec_ = 0;
int capture_queue_buffer_id_ = -1;
protected:
friend class base::RefCountedThreadSafe<H265Picture>;
virtual ~H265Picture();
private:
gfx::Rect visible_rect_;
};
class H265DPB {
public:
H265DPB();
H265DPB(const H265DPB&) = delete;
H265DPB& operator=(const H265DPB&) = delete;
~H265DPB();
void SetMaxNumPics(size_t max_num_pics);
size_t MaxNumPics() const { return max_num_pics_; }
void Clear();
void StorePicture(scoped_refptr<H265Picture> pic);
void MarkAllUnusedForReference();
void DeleteUnused();
int GetReferencePicCount();
scoped_refptr<H265Picture> GetPicByPocAndMark(int poc,
H265Picture::ReferenceType ref);
scoped_refptr<H265Picture>
GetPicByPocMaskedAndMark(int poc, int mask, H265Picture::ReferenceType ref);
void AppendPendingOutputPics(H265Picture::Vector* out);
void AppendReferencePics(H265Picture::Vector* out);
std::set<uint32_t> GetBufferIdsInUse() const;
size_t Size() const { return pics_.size(); }
bool IsFull() const { return pics_.size() >= max_num_pics_; }
private:
H265Picture::Vector pics_;
size_t max_num_pics_{0};
};
}
#endif