blob: 85a856dc003337e6441ce899be574c8f505a9c08 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdint.h>
#include "media/video/h265_parser.h"
#include "media/video/h265_poc.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace media {
class H265POCTest : public testing::Test {
public:
H265POCTest() : sps_(), pps_(), slice_hdr_() {}
H265POCTest(const H265POCTest&) = delete;
H265POCTest& operator=(const H265POCTest&) = delete;
protected:
void ComputePOC() {
poc_ = h265_poc_.ComputePicOrderCnt(&sps_, &pps_, slice_hdr_);
}
int32_t poc_;
H265SPS sps_;
H265PPS pps_;
H265SliceHeader slice_hdr_;
H265POC h265_poc_;
};
TEST_F(H265POCTest, PicOrderCnt) {
sps_.log2_max_pic_order_cnt_lsb_minus4 = 7;
pps_.temporal_id = 0;
// Initial I frame with POC 0.
slice_hdr_.nal_unit_type = H265NALU::IDR_N_LP;
slice_hdr_.irap_pic = true;
slice_hdr_.slice_pic_order_cnt_lsb = 0;
ComputePOC();
ASSERT_EQ(0, poc_);
// P frame with POC lsb 4.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 4;
ComputePOC();
ASSERT_EQ(4, poc_);
// B frame with POC lsb 2.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 2;
ComputePOC();
ASSERT_EQ(2, poc_);
// B frame with POC lsb 1.
slice_hdr_.nal_unit_type = H265NALU::TSA_N;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 1;
ComputePOC();
ASSERT_EQ(1, poc_);
// B frame with POC lsb 3.
slice_hdr_.nal_unit_type = H265NALU::TSA_N;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 3;
ComputePOC();
ASSERT_EQ(3, poc_);
// P frame with POC lsb 8.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 8;
ComputePOC();
ASSERT_EQ(8, poc_);
// B Ref frame with POC lsb 6.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 6;
ComputePOC();
ASSERT_EQ(6, poc_);
// B frame with POC lsb 5.
slice_hdr_.nal_unit_type = H265NALU::TSA_N;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 5;
ComputePOC();
ASSERT_EQ(5, poc_);
// B frame with POC lsb 7.
slice_hdr_.nal_unit_type = H265NALU::TSA_N;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 7;
ComputePOC();
ASSERT_EQ(7, poc_);
// P frame with POC lsb 12.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 12;
ComputePOC();
ASSERT_EQ(12, poc_);
// B frame with POC lsb 10.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 10;
ComputePOC();
ASSERT_EQ(10, poc_);
// B frame with POC lsb 9.
slice_hdr_.nal_unit_type = H265NALU::TSA_N;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 9;
ComputePOC();
ASSERT_EQ(9, poc_);
// B frame with POC lsb 11.
slice_hdr_.nal_unit_type = H265NALU::TSA_N;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 11;
ComputePOC();
ASSERT_EQ(11, poc_);
// P frame with POC lsb 16.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 16;
ComputePOC();
ASSERT_EQ(16, poc_);
// B frame with POC lsb 14.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 14;
ComputePOC();
ASSERT_EQ(14, poc_);
// B frame with POC lsb 13.
slice_hdr_.nal_unit_type = H265NALU::TSA_N;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 13;
ComputePOC();
ASSERT_EQ(13, poc_);
// B frame with POC lsb 15.
slice_hdr_.nal_unit_type = H265NALU::TSA_N;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 15;
ComputePOC();
ASSERT_EQ(15, poc_);
};
TEST_F(H265POCTest, PicOrderCntInOrder) {
sps_.log2_max_pic_order_cnt_lsb_minus4 = 12;
pps_.temporal_id = 0;
// Initial I frame with POC 0.
slice_hdr_.nal_unit_type = H265NALU::IDR_W_RADL;
slice_hdr_.irap_pic = true;
slice_hdr_.slice_pic_order_cnt_lsb = 0;
ComputePOC();
ASSERT_EQ(0, poc_);
// P frame with POC lsb 1.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 1;
ComputePOC();
ASSERT_EQ(1, poc_);
// P frame with POC lsb 2.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 2;
ComputePOC();
ASSERT_EQ(2, poc_);
// P frame with POC lsb 3.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 3;
ComputePOC();
ASSERT_EQ(3, poc_);
// P frame with POC lsb 4.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 4;
ComputePOC();
ASSERT_EQ(4, poc_);
// P frame with POC lsb 5.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 5;
ComputePOC();
ASSERT_EQ(5, poc_);
// P frame with POC lsb 6.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 6;
ComputePOC();
ASSERT_EQ(6, poc_);
// P frame with POC lsb 7.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 7;
ComputePOC();
ASSERT_EQ(7, poc_);
// P frame with POC lsb 8.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 8;
ComputePOC();
ASSERT_EQ(8, poc_);
// P frame with POC lsb 9.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 9;
ComputePOC();
ASSERT_EQ(9, poc_);
// P frame with POC lsb 10.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 10;
ComputePOC();
ASSERT_EQ(10, poc_);
// P frame with POC lsb 11.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 11;
ComputePOC();
ASSERT_EQ(11, poc_);
// P frame with POC lsb 12.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 12;
ComputePOC();
ASSERT_EQ(12, poc_);
// P frame with POC lsb 13.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 13;
ComputePOC();
ASSERT_EQ(13, poc_);
// P frame with POC lsb 14.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 14;
ComputePOC();
ASSERT_EQ(14, poc_);
// P frame with POC lsb 15.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 15;
ComputePOC();
ASSERT_EQ(15, poc_);
// P frame with POC lsb 16.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 16;
ComputePOC();
ASSERT_EQ(16, poc_);
// P frame with POC lsb 17.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 17;
ComputePOC();
ASSERT_EQ(17, poc_);
// P frame with POC lsb 18.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 18;
ComputePOC();
ASSERT_EQ(18, poc_);
// P frame with POC lsb 19.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 19;
ComputePOC();
ASSERT_EQ(19, poc_);
// P frame with POC lsb 20.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 20;
ComputePOC();
ASSERT_EQ(20, poc_);
// P frame with POC lsb 21.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 21;
ComputePOC();
ASSERT_EQ(21, poc_);
// P frame with POC lsb 22.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 22;
ComputePOC();
ASSERT_EQ(22, poc_);
// P frame with POC lsb 23.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 23;
ComputePOC();
ASSERT_EQ(23, poc_);
// P frame with POC lsb 24.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 24;
ComputePOC();
ASSERT_EQ(24, poc_);
// P frame with POC lsb 25.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 25;
ComputePOC();
ASSERT_EQ(25, poc_);
// P frame with POC lsb 26.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 26;
ComputePOC();
ASSERT_EQ(26, poc_);
// P frame with POC lsb 27.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 27;
ComputePOC();
ASSERT_EQ(27, poc_);
// P frame with POC lsb 28.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 28;
ComputePOC();
ASSERT_EQ(28, poc_);
// P frame with POC lsb 29.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 29;
ComputePOC();
ASSERT_EQ(29, poc_);
// I frame with POC 0.
slice_hdr_.nal_unit_type = H265NALU::IDR_W_RADL;
slice_hdr_.irap_pic = true;
slice_hdr_.slice_pic_order_cnt_lsb = 0;
ComputePOC();
ASSERT_EQ(0, poc_);
// P frame with POC lsb 1.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 1;
ComputePOC();
ASSERT_EQ(1, poc_);
// P frame with POC lsb 2.
slice_hdr_.nal_unit_type = H265NALU::TRAIL_R;
slice_hdr_.irap_pic = false;
slice_hdr_.slice_pic_order_cnt_lsb = 2;
ComputePOC();
ASSERT_EQ(2, poc_);
};
} // namespace media