diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index a63186b81..4298e7b5f 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -653,7 +653,7 @@ srs_error_t SrsVideoFrame::add_sample(char* bytes, int size) } SrsVideoCodecConfig* c = vcodec(); - if (size <= 0) return err; + if (!bytes || size <= 0) return err; // For HEVC(H.265), try to parse the IDR from NALUs. if (c && c->id == SrsVideoCodecIdHEVC) { @@ -1157,8 +1157,8 @@ srs_error_t SrsFormat::hevc_demux_vps_rbsp(char* rbsp, int nb_rbsp) // vps_video_parameter_set_id u(4) int vps_video_parameter_set_id = bs.read_bits(4); - if (vps_video_parameter_set_id < 0 || vps_video_parameter_set_id > 16) { - return err; + if (vps_video_parameter_set_id < 0 || vps_video_parameter_set_id > SrsHevcMax_VPS_COUNT) { + return srs_error_new(ERROR_HEVC_DECODE_ERROR, "vps id out of range: %d", vps_video_parameter_set_id); } // select table @@ -1331,6 +1331,9 @@ srs_error_t SrsFormat::hevc_demux_sps_rbsp(char* rbsp, int nb_rbsp) if ((err = bs.read_bits_ue(sps_seq_parameter_set_id)) != srs_success) { return srs_error_wrap(err, "sps_seq_parameter_set_id"); } + if (sps_seq_parameter_set_id < 0 || sps_seq_parameter_set_id >= SrsHevcMax_SPS_COUNT) { + return srs_error_new(ERROR_HEVC_DECODE_ERROR, "sps id out of range: %d", sps_seq_parameter_set_id); + } // for sps_table SrsHevcDecoderConfigurationRecord *dec_conf_rec = &(vcodec->hevc_dec_conf_record_); @@ -1503,8 +1506,8 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp) if ((err = bs.read_bits_ue(pps_pic_parameter_set_id)) != srs_success) { return srs_error_wrap(err, "pps_pic_parameter_set_id"); } - if (pps_pic_parameter_set_id < 0 || pps_pic_parameter_set_id > 256) { - return err; + if (pps_pic_parameter_set_id < 0 || pps_pic_parameter_set_id >= SrsHevcMax_PPS_COUNT) { + return srs_error_new(ERROR_HEVC_DECODE_ERROR, "pps id out of range: %d", pps_pic_parameter_set_id); } // select table diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index 6332d1d8e..256a0213d 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -490,6 +490,20 @@ struct SrsHevcHvccNalu { std::vector nal_data_vec; }; +/** + * HEVC Common Max define. + * @doc ITU-T-H.265-2021.pdf + */ +// @see F.7.3.2.1: vps_video_parameter_set_id is u(4). +// @doc ITU-T-H.265-2021.pdf, page 464. +const int SrsHevcMax_VPS_COUNT = 16; +// @see 7.4.3.2.1: sps_seq_parameter_set_id is in [0, 15]. +// @doc ITU-T-H.265-2021.pdf, page 95. +const int SrsHevcMax_SPS_COUNT = 16; +// @see 7.4.3.3.1: pps_pic_parameter_set_id is in [0, 63]. +// @doc ITU-T-H.265-2021.pdf, page 102. +const int SrsHevcMax_PPS_COUNT = 64; + /** * Profile, tier and level * @see 7.3.3 Profile, tier and level syntax @@ -903,9 +917,9 @@ struct SrsHevcDecoderConfigurationRecord uint8_t length_size_minus_one; std::vector nalu_vec; - SrsHevcRbspVps vps_table[16]; - SrsHevcRbspSps sps_table[32]; - SrsHevcRbspPps pps_table[256]; + SrsHevcRbspVps vps_table[SrsHevcMax_VPS_COUNT]; + SrsHevcRbspSps sps_table[SrsHevcMax_SPS_COUNT]; + SrsHevcRbspPps pps_table[SrsHevcMax_PPS_COUNT]; }; #endif diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 72e90646a..77ce5348c 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -3457,22 +3457,22 @@ VOID TEST(KernelCodecTest, AVFrame) if (true) { SrsAudioFrame f; - SrsAudioCodecConfig cc; - HELPER_EXPECT_SUCCESS(f.initialize(&cc)); + SrsAudioCodecConfig* cc = new SrsAudioCodecConfig(); + SrsAutoFree(SrsAudioCodecConfig, cc); + HELPER_EXPECT_SUCCESS(f.initialize(cc)); EXPECT_TRUE(f.acodec() != NULL); - + HELPER_EXPECT_SUCCESS(f.add_sample((char*)1, 10)); EXPECT_TRUE((char*)1 == f.samples[0].bytes); EXPECT_TRUE(10 == f.samples[0].size); EXPECT_TRUE(1 == f.nb_samples); - + HELPER_EXPECT_SUCCESS(f.add_sample((char*)2, 20)); EXPECT_TRUE((char*)2 == f.samples[1].bytes); EXPECT_TRUE(20 == f.samples[1].size); EXPECT_TRUE(2 == f.nb_samples); } - if (true) { SrsAudioFrame f; EXPECT_TRUE(0 == f.nb_samples); @@ -3483,23 +3483,24 @@ VOID TEST(KernelCodecTest, AVFrame) HELPER_EXPECT_SUCCESS(f.add_sample(NULL, 1)); EXPECT_TRUE(0 == f.nb_samples); } - + if (true) { SrsAudioFrame f; for (int i = 0; i < SrsMaxNbSamples; i++) { HELPER_EXPECT_SUCCESS(f.add_sample((char*)(int64_t)(i + 1), i*10 + 1)); } - + srs_error_t err = f.add_sample((char*)1, 1); HELPER_EXPECT_FAILED(err); } if (true) { SrsVideoFrame f; - SrsVideoCodecConfig cc; - HELPER_EXPECT_SUCCESS(f.initialize(&cc)); + SrsVideoCodecConfig* cc = new SrsVideoCodecConfig(); + SrsAutoFree(SrsVideoCodecConfig, cc); + HELPER_EXPECT_SUCCESS(f.initialize(cc)); EXPECT_TRUE(f.vcodec() != NULL); - + HELPER_EXPECT_SUCCESS(f.add_sample((char*)"\x05", 1)); EXPECT_TRUE(f.has_idr == true); EXPECT_TRUE(f.first_nalu_type == SrsAvcNaluTypeIDR); @@ -3507,44 +3508,48 @@ VOID TEST(KernelCodecTest, AVFrame) if (true) { SrsVideoFrame f; - SrsVideoCodecConfig cc; - HELPER_EXPECT_SUCCESS(f.initialize(&cc)); + SrsVideoCodecConfig* cc = new SrsVideoCodecConfig(); + SrsAutoFree(SrsVideoCodecConfig, cc); + HELPER_EXPECT_SUCCESS(f.initialize(cc)); EXPECT_TRUE(f.vcodec() != NULL); - + HELPER_EXPECT_SUCCESS(f.add_sample((char*)"\x07", 1)); EXPECT_TRUE(f.has_sps_pps == true); } if (true) { SrsVideoFrame f; - SrsVideoCodecConfig cc; - HELPER_EXPECT_SUCCESS(f.initialize(&cc)); + SrsVideoCodecConfig* cc = new SrsVideoCodecConfig(); + SrsAutoFree(SrsVideoCodecConfig, cc); + HELPER_EXPECT_SUCCESS(f.initialize(cc)); EXPECT_TRUE(f.vcodec() != NULL); - + HELPER_EXPECT_SUCCESS(f.add_sample((char*)"\x08", 1)); EXPECT_TRUE(f.has_sps_pps == true); } - + if (true) { SrsVideoFrame f; - SrsVideoCodecConfig cc; - HELPER_EXPECT_SUCCESS(f.initialize(&cc)); + SrsVideoCodecConfig* cc = new SrsVideoCodecConfig(); + SrsAutoFree(SrsVideoCodecConfig, cc); + HELPER_EXPECT_SUCCESS(f.initialize(cc)); EXPECT_TRUE(f.vcodec() != NULL); - + HELPER_EXPECT_SUCCESS(f.add_sample((char*)"\x09", 1)); EXPECT_TRUE(f.has_aud == true); } - + if (true) { SrsVideoFrame f; - SrsVideoCodecConfig cc; - HELPER_EXPECT_SUCCESS(f.initialize(&cc)); + SrsVideoCodecConfig* cc = new SrsVideoCodecConfig(); + SrsAutoFree(SrsVideoCodecConfig, cc); + HELPER_EXPECT_SUCCESS(f.initialize(cc)); EXPECT_TRUE(f.vcodec() != NULL); for (int i = 0; i < SrsMaxNbSamples; i++) { HELPER_EXPECT_SUCCESS(f.add_sample((char*)"\x05", 1)); } - + srs_error_t err = f.add_sample((char*)"\x05", 1); HELPER_EXPECT_FAILED(err); } @@ -4830,11 +4835,11 @@ VOID TEST(KernelUtilityTest, CoverBitsBufferAll) uint32_t v = 0; srs_error_t err = bb.read_bits_ue(v); HELPER_EXPECT_SUCCESS(err); - EXPECT_EQ(1280, v); + EXPECT_EQ(1280, (int)v); err = bb.read_bits_ue(v); HELPER_EXPECT_SUCCESS(err); - EXPECT_EQ(720, v); + EXPECT_EQ(720, (int)v); } if (true) {