| // 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 |