|
9 | 9 | #include <srs_kernel_buffer.hpp>
|
10 | 10 | #include <srs_kernel_error.hpp>
|
11 | 11 | #include <srs_core_autofree.hpp>
|
| 12 | +#include <srs_kernel_utility.hpp> |
12 | 13 |
|
13 | 14 | VOID TEST(SrsAVCTest, H264ParseAnnexb)
|
14 | 15 | {
|
@@ -599,3 +600,91 @@ VOID TEST(SrsAVCTest, AACMuxToFLV)
|
599 | 600 | }
|
600 | 601 | }
|
601 | 602 |
|
| 603 | +#ifdef SRS_H265 |
| 604 | + |
| 605 | +VOID TEST(SrsAVCTest, HevcMultiPPS) |
| 606 | +{ |
| 607 | + srs_error_t err; |
| 608 | + |
| 609 | + vector<uint8_t> vps = { |
| 610 | + 0x40, 0x01, 0x0c, 0x06, 0x3f, 0x3f, 0x22, 0x20, 0x00, 0x00, 0x03, 0x00, 0x3f, |
| 611 | + 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x00, 0x18, 0x3f, 0x24, |
| 612 | + }; |
| 613 | + |
| 614 | + vector<uint8_t> sps = { |
| 615 | + 0x42, 0x01, 0x06, 0x22, 0x20, 0x00, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, |
| 616 | + 0x3f, 0x00, 0x00, 0x3f, 0x01, 0x3f, 0x20, 0x02, 0x1c, 0x4d, 0x3f, 0x3f, 0x3f, 0x42, 0x3f, 0x53, 0x3f, |
| 617 | + 0x3f, 0x01, 0x01, 0x01, 0x04, 0x00, 0x00, 0x0f, 0x3f, 0x00, 0x01, 0x3f, 0x3f, 0x3f, 0x68, 0x3f, 0x3f, |
| 618 | + 0x00, 0x1f, 0x3a, 0x00, 0x0f, 0x3f, 0x04, 0x00, 0x3e, 0x74, 0x00, 0x1f, 0x3a, 0x08, 0x00, 0x7c, 0x3f, |
| 619 | + 0x00, 0x3e, 0x74, 0x10, 0x00, 0x3f, 0x3f, 0x00, 0x7c, 0x3f, 0x5c, 0x20, 0x10, 0x40 |
| 620 | + }; |
| 621 | + |
| 622 | + vector<uint8_t> pps_1 = { |
| 623 | + 0x44, 0x01, 0x74, 0x18, 0xc2, 0xb8, 0x33, 0x3f, 0x7d, 0x75, 0x3f, 0x42, 0x28, 0x3f, 0x6b, 0x3f, 0x3f, |
| 624 | + 0x11, 0x47, 0x7d, 0x72, 0x79, 0x3e, 0x4f, 0x3f, 0x3f, 0x51, 0x3f, 0x3f, 0x20, 0x3f, 0x3f, 0x3f, 0x10, |
| 625 | + 0x63, 0x3f, 0x0a, 0x0e, 0x3f, 0x04, 0x42, 0x3f, 0x3f, 0x3f, 0x34, 0x22, 0x3f, 0x3f, 0x3f, 0x3f, 0x7d, |
| 626 | + 0x7e, 0x4f, 0x3f, 0x3f, 0x7c, 0x57, 0x3f, 0x3f, 0x3f, 0x10, 0x41, 0x21, 0x14, 0x41, 0x3f, 0x3f, 0x3c, |
| 627 | + 0x3f, 0x5f, 0x3f, 0x3f, 0x28, 0x3f, 0x73, 0x10, 0x44, 0x49, 0x47, 0x08, 0x31, 0xc4, 0x85, 0x06, 0x46, |
| 628 | + 0x3f, 0x21, 0x02, 0x41, 0x54, 0x1a, 0x11, 0x45, 0x13, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x11, |
| 629 | + 0x3f, 0x5e, 0x3b, 0x3f, 0x30, 0x41, 0x04, 0x3f, 0x51, 0x06, 0x3f, 0x3f, 0x3f, 0x7d, 0x7e, 0x4f, 0x3f, |
| 630 | + 0x3f, 0x1d, 0x3f, 0x41, 0x11, 0x25, 0x1c, 0x20, 0x3f, 0x12, 0x14, 0x19, 0x1a, 0x08, 0x3f, 0x09, 0x05, |
| 631 | + 0x50, 0x69, 0x14, 0x4f, 0x3f, 0x4f, 0x27, 0x3f, 0x3f, 0x3f, 0x28, 0x3f, 0x73, 0x10, 0xd3, 0x94, 0x71, |
| 632 | + 0x3f, 0x73, 0x3f, 0x05, 0x45, 0x3f, 0x01, 0x02, 0x41, 0x54, 0x18, 0x24 |
| 633 | + }; |
| 634 | + |
| 635 | + vector<uint8_t> pps_2 = { |
| 636 | + 0x44, 0x01, 0x25, 0x06, 0x30, 0x3f, 0x0c, 0x3f, 0x4a, 0x3f, 0x3f, 0x49, 0x08, 0x3f, 0x15, 0x6b, 0x3f, |
| 637 | + 0x3f, 0x11, 0x4c, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x46, 0x3b, 0x3f, 0x3f, 0x22, 0x4a, |
| 638 | + 0x30, 0x51, 0x3f, 0x2c, 0x2c, 0x32, 0x34, 0x11, 0x08, 0x12, 0x0a, 0x3f, 0xd0, 0x8a, 0x29, 0x56, 0x3f, |
| 639 | + 0x3c, 0x3f, 0x5f, 0x3f, 0x3f, 0x3f, 0x1f, 0x15, 0x3f, 0x3f, 0x63, 0x04, 0x10, 0x4c, 0x45, 0x35, 0x49, |
| 640 | + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x77, 0x31, 0x04, 0x44, 0x3f, 0x60, 0x3f, 0x1c, 0x58, |
| 641 | + 0x58, 0x64, 0x68, 0x22, 0x10, 0x24, 0x15, 0x41, 0x3f, 0x14, 0x42, 0x55, 0x3f, 0x4f, 0x27, 0x3f, 0x3f, |
| 642 | + 0x3f, 0x3f, 0x47, 0x3f, 0x78, 0x3f, 0x18, 0x3f, 0x04, 0x13, 0x11, 0x4d, 0x52, 0x64, 0x3f, 0x3f, 0x3f, |
| 643 | + 0x7e, 0x4f, 0x3f, 0x3f, 0x1d, 0x3f, 0x41, 0x11, 0x25, 0x18, 0x28, 0x3f, 0x16, 0x16, 0x19, 0x1a, 0x08, |
| 644 | + 0x3f, 0x09, 0x05, 0x50, 0x69, 0x10, 0x3f, 0x6b, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x11, 0x3f, 0x5e, |
| 645 | + 0x3b, 0x3f, 0x30, 0x41, 0x04, 0x3f |
| 646 | + }; |
| 647 | + |
| 648 | + vector<uint8_t> start_code = {0x00, 0x00, 0x00, 0x01}; |
| 649 | + |
| 650 | + string hevc_sh; |
| 651 | + hevc_sh.append((const char*)start_code.data(), start_code.size()); |
| 652 | + hevc_sh.append((const char*)vps.data(), vps.size()); |
| 653 | + hevc_sh.append((const char*)start_code.data(), start_code.size()); |
| 654 | + hevc_sh.append((const char*)sps.data(), sps.size()); |
| 655 | + hevc_sh.append((const char*)start_code.data(), start_code.size()); |
| 656 | + hevc_sh.append((const char*)pps_1.data(), pps_1.size()); |
| 657 | + hevc_sh.append((const char*)start_code.data(), start_code.size()); |
| 658 | + hevc_sh.append((const char*)pps_2.data(), pps_2.size()); |
| 659 | + |
| 660 | + SrsBuffer stream((char*)hevc_sh.data(), hevc_sh.size()); |
| 661 | + |
| 662 | + SrsRawHEVCStream hs; |
| 663 | + char* frame = NULL; |
| 664 | + int frame_size = 0; |
| 665 | + |
| 666 | + HELPER_ASSERT_SUCCESS(hs.annexb_demux(&stream, &frame, &frame_size)); |
| 667 | + EXPECT_TRUE(hs.is_vps(frame, frame_size)); |
| 668 | + EXPECT_EQ(frame_size, vps.size()); |
| 669 | + EXPECT_TRUE(srs_bytes_equals(frame, vps.data(), frame_size)); |
| 670 | + |
| 671 | + HELPER_ASSERT_SUCCESS(hs.annexb_demux(&stream, &frame, &frame_size)); |
| 672 | + EXPECT_TRUE(hs.is_sps(frame, frame_size)); |
| 673 | + EXPECT_EQ(frame_size, sps.size()); |
| 674 | + EXPECT_TRUE(srs_bytes_equals(frame, sps.data(), frame_size)); |
| 675 | + |
| 676 | + HELPER_ASSERT_SUCCESS(hs.annexb_demux(&stream, &frame, &frame_size)); |
| 677 | + EXPECT_TRUE(hs.is_pps(frame, frame_size)); |
| 678 | + EXPECT_EQ(frame_size, pps_1.size()); |
| 679 | + EXPECT_TRUE(srs_bytes_equals(frame, pps_1.data(), frame_size)); |
| 680 | + |
| 681 | + HELPER_ASSERT_SUCCESS(hs.annexb_demux(&stream, &frame, &frame_size)); |
| 682 | + EXPECT_TRUE(hs.is_pps(frame, frame_size)); |
| 683 | + EXPECT_EQ(frame_size, pps_2.size()); |
| 684 | + EXPECT_TRUE(srs_bytes_equals(frame, pps_2.data(), frame_size)); |
| 685 | + |
| 686 | + EXPECT_TRUE(stream.empty()); |
| 687 | +} |
| 688 | + |
| 689 | +#endif |
| 690 | + |
0 commit comments