From f7994b85eb7de12b6ade169a3a8413990716093e Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 15 May 2019 08:44:38 +0800 Subject: [PATCH 1/5] Cover more kernel codec. --- trunk/src/kernel/srs_kernel_codec.cpp | 12 +- trunk/src/utest/srs_utest_kernel.cpp | 164 ++++++++++++++++++++++++++ 2 files changed, 168 insertions(+), 8 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index 267435ca9..7351573c0 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -553,10 +553,8 @@ srs_error_t SrsFormat::on_audio(int64_t timestamp, char* data, int size) SrsBuffer* buffer = new SrsBuffer(data, size); SrsAutoFree(SrsBuffer, buffer); - // audio decode - if (!buffer->require(1)) { - return srs_error_new(ERROR_HLS_DECODE_ERROR, "aac decode sound_format"); - } + // We already checked the size is positive and data is not NULL. + srs_assert(buffer->require(1)); // @see: E.4.2 Audio Tags, video_file_format_spec_v10_1.pdf, page 76 uint8_t v = buffer->read_1bytes(); @@ -599,10 +597,8 @@ srs_error_t SrsFormat::on_video(int64_t timestamp, char* data, int size) SrsBuffer* buffer = new SrsBuffer(data, size); SrsAutoFree(SrsBuffer, buffer); - // video decode - if (!buffer->require(1)) { - return srs_error_new(ERROR_HLS_DECODE_ERROR, "decode frame_type"); - } + // We already checked the size is positive and data is not NULL. + srs_assert(buffer->require(1)); // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 int8_t frame_type = buffer->read_1bytes(); diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 87a1a721e..1898c533a 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -2690,6 +2690,39 @@ VOID TEST(KernelCodecTest, AVFrame) } } +VOID TEST(KernelCodecTest, IsSequenceHeaderSpecial) +{ + if (true) { + SrsFormat f; + EXPECT_FALSE(f.is_avc_sequence_header()); + + f.vcodec = new SrsVideoCodecConfig(); + f.video = new SrsVideoFrame(); + EXPECT_FALSE(f.is_avc_sequence_header()); + + f.vcodec->id = SrsVideoCodecIdAVC; + EXPECT_FALSE(f.is_avc_sequence_header()); + + f.video->avc_packet_type = SrsVideoAvcFrameTraitSequenceHeader; + EXPECT_TRUE(f.is_avc_sequence_header()); + } + + if (true) { + SrsFormat f; + EXPECT_FALSE(f.is_avc_sequence_header()); + + f.vcodec = new SrsVideoCodecConfig(); + f.video = new SrsVideoFrame(); + EXPECT_FALSE(f.is_avc_sequence_header()); + + f.vcodec->id = SrsVideoCodecIdHEVC; + EXPECT_FALSE(f.is_avc_sequence_header()); + + f.video->avc_packet_type = SrsVideoAvcFrameTraitSequenceHeader; + EXPECT_TRUE(f.is_avc_sequence_header()); + } +} + VOID TEST(KernelCodecTest, AudioFormat) { if (true) { @@ -2805,6 +2838,137 @@ VOID TEST(KernelCodecTest, AudioFormat) } } +VOID TEST(KernelCodecTest, VideoFormatSepcial) +{ + srs_error_t err; + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + HELPER_EXPECT_FAILED(f.on_video(0, (char*)"\x17", 1)); + HELPER_EXPECT_FAILED(f.on_video(0, (char*)"\x27", 1)); + } + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + uint8_t buf[] = { + 0x17, // 1, Keyframe; 7, AVC. + 0x00, // 0, Sequence header. + 0x00, 0x00, 0x00, // Timestamp. + }; + HELPER_EXPECT_FAILED(f.on_video(0, (char*)buf, sizeof(buf))); + } + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + uint8_t buf[] = { + 0x17, // 1, Keyframe; 7, AVC. + 0x00, // 0, Sequence header. + 0x00, 0x00, 0x00, // Timestamp. + // AVC extra data, SPS/PPS. + 0x00, 0x00, 0x00, 0x00, + 0x02, // lengthSizeMinusOne + 0x00, + }; + HELPER_EXPECT_FAILED(f.on_video(0, (char*)buf, sizeof(buf))); + } + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + uint8_t buf[] = { + 0x17, // 1, Keyframe; 7, AVC. + 0x00, // 0, Sequence header. + 0x00, 0x00, 0x00, // Timestamp. + // AVC extra data, SPS/PPS. + 0x00, 0x00, 0x00, 0x00, + 0x00, // lengthSizeMinusOne + 0x00, // SPS + }; + HELPER_EXPECT_FAILED(f.on_video(0, (char*)buf, sizeof(buf))); + } + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + uint8_t buf[] = { + 0x17, // 1, Keyframe; 7, AVC. + 0x00, // 0, Sequence header. + 0x00, 0x00, 0x00, // Timestamp. + // AVC extra data, SPS/PPS. + 0x00, 0x00, 0x00, 0x00, + 0x00, // lengthSizeMinusOne + 0x01, // SPS + }; + HELPER_EXPECT_FAILED(f.on_video(0, (char*)buf, sizeof(buf))); + } + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + uint8_t buf[] = { + 0x17, // 1, Keyframe; 7, AVC. + 0x00, // 0, Sequence header. + 0x00, 0x00, 0x00, // Timestamp. + // AVC extra data, SPS/PPS. + 0x00, 0x00, 0x00, 0x00, + 0x00, // lengthSizeMinusOne + 0x01, 0x00, 0x00, // SPS, empty + }; + HELPER_EXPECT_FAILED(f.on_video(0, (char*)buf, sizeof(buf))); + } + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + uint8_t buf[] = { + 0x17, // 1, Keyframe; 7, AVC. + 0x00, // 0, Sequence header. + 0x00, 0x00, 0x00, // Timestamp. + // AVC extra data, SPS/PPS. + 0x00, 0x00, 0x00, 0x00, + 0x00, // lengthSizeMinusOne + 0x01, 0x00, 0x00, // SPS, empty + 0x00, // PPS + }; + HELPER_EXPECT_FAILED(f.on_video(0, (char*)buf, sizeof(buf))); + } + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + uint8_t buf[] = { + 0x17, // 1, Keyframe; 7, AVC. + 0x00, // 0, Sequence header. + 0x00, 0x00, 0x00, // Timestamp. + // AVC extra data, SPS/PPS. + 0x00, 0x00, 0x00, 0x00, + 0x00, // lengthSizeMinusOne + 0x01, 0x00, 0x00, // SPS + 0x01, // PPS + }; + HELPER_EXPECT_FAILED(f.on_video(0, (char*)buf, sizeof(buf))); + } + + if (true) { + SrsFormat f; + EXPECT_TRUE(srs_success == f.initialize()); + uint8_t buf[] = { + 0x17, // 1, Keyframe; 7, AVC. + 0x00, // 0, Sequence header. + 0x00, 0x00, 0x00, // Timestamp. + // AVC extra data, SPS/PPS. + 0x00, 0x00, 0x00, 0x00, + 0x00, // lengthSizeMinusOne + 0x01, 0x00, 0x00, // SPS, empty + 0x01, 0x00, 0x00, // PPS, empty + }; + HELPER_EXPECT_SUCCESS(f.on_video(0, (char*)buf, sizeof(buf))); + } +} + VOID TEST(KernelCodecTest, VideoFormat) { if (true) { From 8b595c4cdf787e8770d9b2cc97b36a8d5543a907 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 15 May 2019 08:57:46 +0800 Subject: [PATCH 2/5] Cover more kernel time. --- trunk/src/kernel/srs_kernel_utility.cpp | 5 +++- trunk/src/kernel/srs_kernel_utility.hpp | 4 ++++ trunk/src/utest/srs_utest_kernel.cpp | 31 +++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 085d74331..d0f19d86c 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -122,11 +122,14 @@ srs_utime_t srs_get_system_startup_time() return _srs_system_time_startup_time; } +// For utest to mock it. +_srs_gettimeofday_t _srs_gettimeofday = ::gettimeofday; + srs_utime_t srs_update_system_time() { timeval now; - if (gettimeofday(&now, NULL) < 0) { + if (_srs_gettimeofday(&now, NULL) < 0) { srs_warn("gettimeofday failed, ignore"); return -1; } diff --git a/trunk/src/kernel/srs_kernel_utility.hpp b/trunk/src/kernel/srs_kernel_utility.hpp index 56bb78771..99a3fdc6a 100644 --- a/trunk/src/kernel/srs_kernel_utility.hpp +++ b/trunk/src/kernel/srs_kernel_utility.hpp @@ -161,5 +161,9 @@ extern int srs_chunk_header_c0(int perfer_cid, uint32_t timestamp, int32_t paylo // @return the size of header. 0 if cache not enough. extern int srs_chunk_header_c3(int perfer_cid, uint32_t timestamp, char* cache, int nb_cache); +// For utest to mock it. +#include +typedef int (*_srs_gettimeofday_t)(struct timeval* tv, struct timezone* tz); + #endif diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 1898c533a..f3d580861 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -3597,6 +3597,37 @@ VOID TEST(KernelUtilityTest, CoverBitsBufferAll) } } +extern _srs_gettimeofday_t _srs_gettimeofday; +int mock_gettimeofday(struct timeval* /*tp*/, struct timezone* /*tzp*/) { + return -1; +} + +class MockTime +{ +private: + _srs_gettimeofday_t ot; +public: + MockTime(_srs_gettimeofday_t t = NULL) { + ot = _srs_gettimeofday; + if (t) { + _srs_gettimeofday = t; + } + } + virtual ~MockTime() { + if (ot) { + _srs_gettimeofday = ot; + } + } +}; + +VOID TEST(KernelUtilityTest, CoverTimeSpecial) +{ + if (true) { + MockTime _mt(mock_gettimeofday); + EXPECT_TRUE(-1 == srs_update_system_time()); + } +} + extern int64_t _srs_system_time_startup_time; extern int64_t _srs_system_time_us_cache; extern int av_toupper(int c); From 9cdd506b4f993bbbd61e7ad2be3ca6f5356327e8 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 17 May 2019 08:14:26 +0800 Subject: [PATCH 3/5] Deprecated srs-librtmp. --- trunk/auto/generate-srs-librtmp-single.sh | 16 ++++++++-------- trunk/configure | 2 ++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/trunk/auto/generate-srs-librtmp-single.sh b/trunk/auto/generate-srs-librtmp-single.sh index f0e173951..6def4b9a4 100755 --- a/trunk/auto/generate-srs-librtmp-single.sh +++ b/trunk/auto/generate-srs-librtmp-single.sh @@ -127,14 +127,14 @@ int main(int argc, char** argv) END -# compile the example -(cd $SRS_EXPORT_LIBRTMP_SINGLE && echo "${SRS_SINGLE_LIBRTMP_COMPILE}" && -`${SRS_SINGLE_LIBRTMP_COMPILE}` && ./example && rm -f example) -ret=$?; if [[ $ret -ne 0 ]]; then - echo "(cd $SRS_EXPORT_LIBRTMP_SINGLE && ${SRS_SINGLE_LIBRTMP_COMPILE} && ./example && rm -f example)" - echo -e "${RED}failed to compile example.${BLACK}" - exit $ret -fi +## compile the example +#(cd $SRS_EXPORT_LIBRTMP_SINGLE && echo "${SRS_SINGLE_LIBRTMP_COMPILE}" && +#`${SRS_SINGLE_LIBRTMP_COMPILE}` && ./example && rm -f example) +#ret=$?; if [[ $ret -ne 0 ]]; then +# echo "(cd $SRS_EXPORT_LIBRTMP_SINGLE && ${SRS_SINGLE_LIBRTMP_COMPILE} && ./example && rm -f example)" +# echo -e "${RED}failed to compile example.${BLACK}" +# exit $ret +#fi # clear the files for srs-librtmp project, generated by generate-srs-librtmp-project.sh (cd $SRS_EXPORT_LIBRTMP_SINGLE && rm -rf auto $SRS_OBJS_DIR research src Makefile) diff --git a/trunk/configure b/trunk/configure index 421b51ab6..a324d6905 100755 --- a/trunk/configure +++ b/trunk/configure @@ -735,4 +735,6 @@ else echo -e "${GREEN}Please use the srs-librtmp project: ${BLACK}" echo -e "${GREEN} cd $SRS_EXPORT_LIBRTMP_PROJECT && make ${BLACK}" fi + # Change to experiment. + echo -e "${YELLOW}Warning: Notice srs-librtmp is deprecated and maybe removed in future.${BLACK}" fi From dd4ccfab79b1fbf64279f0f6e9319dcc319f4fc6 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 20 May 2019 08:45:42 +0800 Subject: [PATCH 4/5] Cover shared ptr message. --- trunk/src/kernel/srs_kernel_error.hpp | 1 + trunk/src/kernel/srs_kernel_flv.cpp | 10 +++---- trunk/src/utest/srs_utest_kernel.cpp | 42 +++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 3427dc4a0..45a7751c7 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -175,6 +175,7 @@ #define ERROR_OpenSslCreateHMAC 2050 #define ERROR_RTMP_STREAM_NAME_EMPTY 2051 #define ERROR_HTTP_HIJACK 2052 +#define ERROR_RTMP_MESSAGE_CREATE 2053 // // The system control message, // It's not an error, but special control logic. diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index 2feb3fdf7..59ca14806 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -250,12 +250,12 @@ srs_error_t SrsSharedPtrMessage::create(SrsCommonMessage* msg) srs_error_t SrsSharedPtrMessage::create(SrsMessageHeader* pheader, char* payload, int size) { srs_error_t err = srs_success; - - if (ptr) { - srs_assert(false); - return srs_error_new(ERROR_SYSTEM_ASSERT_FAILED, "should not set the payload twice"); + + if (size < 0) { + return srs_error_new(ERROR_RTMP_MESSAGE_CREATE, "create message size=%d", size); } - + + srs_assert(!ptr); ptr = new SrsSharedPtrPayload(); // direct attach the data. diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index f3d580861..537231583 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -3467,6 +3467,48 @@ VOID TEST(KernelFLVTest, CoverAll) #endif } +VOID TEST(KernelFLVTest, CoverSharedPtrMessage) +{ + srs_error_t err; + + if (true) { + SrsMessageHeader h; + SrsSharedPtrMessage m; + HELPER_EXPECT_SUCCESS(m.create(&h, new char[1], 1)); + } + + if (true) { + SrsMessageHeader h; + SrsSharedPtrMessage m; + HELPER_EXPECT_SUCCESS(m.create(&h, NULL, 0)); + } + + if (true) { + SrsMessageHeader h; + SrsSharedPtrMessage m; + HELPER_EXPECT_FAILED(m.create(&h, NULL, -1)); + } + + if (true) { + SrsCommonMessage cm; + cm.size = -1; + + SrsSharedPtrMessage m; + HELPER_EXPECT_FAILED(m.create(&cm)); + } + + if (true) { + SrsMessageHeader h; + h.perfer_cid = 1; + + SrsSharedPtrMessage m; + HELPER_EXPECT_SUCCESS(m.create(&h, NULL, 0)); + + EXPECT_FALSE(m.check(1)); + EXPECT_TRUE(m.check(1)); + } +} + VOID TEST(KernelLogTest, CoverAll) { if (true) { From f760c04340080374953ebadfc2772ee676baa264 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 20 May 2019 09:00:16 +0800 Subject: [PATCH 5/5] Cover FLV vod open --- trunk/src/utest/srs_utest_kernel.cpp | 41 ++++++++++++++++++++++++---- trunk/src/utest/srs_utest_kernel.hpp | 2 ++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 537231583..c988d2034 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -47,6 +47,7 @@ MockSrsFileWriter::MockSrsFileWriter() offset = 0; err = srs_success; error_offset = 0; + opened = false; } MockSrsFileWriter::~MockSrsFileWriter() @@ -62,18 +63,19 @@ srs_error_t MockSrsFileWriter::open(string /*file*/) if (err != srs_success) { return srs_error_copy(err); } - + + opened = true; return srs_success; } void MockSrsFileWriter::close() { - offset = 0; + opened = false; } bool MockSrsFileWriter::is_open() { - return offset >= 0; + return opened; } void MockSrsFileWriter::seek2(int64_t offset) @@ -139,6 +141,7 @@ MockSrsFileReader::MockSrsFileReader() data = new char[MAX_MOCK_DATA_SIZE]; size = 0; offset = 0; + opened = false; } MockSrsFileReader::MockSrsFileReader(const char* src, int nb_src) @@ -148,6 +151,7 @@ MockSrsFileReader::MockSrsFileReader(const char* src, int nb_src) size = nb_src; offset = 0; + opened = false; } MockSrsFileReader::~MockSrsFileReader() @@ -158,6 +162,7 @@ MockSrsFileReader::~MockSrsFileReader() srs_error_t MockSrsFileReader::open(string /*file*/) { offset = 0; + opened = true; return srs_success; } @@ -169,7 +174,7 @@ void MockSrsFileReader::close() bool MockSrsFileReader::is_open() { - return offset >= 0; + return opened; } int64_t MockSrsFileReader::tellg() @@ -842,8 +847,10 @@ VOID TEST(KernelFlvTest, FlvDecoderVideo) VOID TEST(KernelFlvTest, FlvVSDecoderStreamClosed) { MockSrsFileReader fs; + fs.close(); + SrsFlvVodStreamDecoder dec; - ASSERT_TRUE(srs_success == dec.initialize(&fs)); + ASSERT_FALSE(srs_success == dec.initialize(&fs)); } /** @@ -1064,6 +1071,22 @@ VOID TEST(KernelFlvTest, FlvVSDecoderSeek) EXPECT_TRUE(5 == fs.offset); } +VOID TEST(KernelFLVTest, CoverFLVVodError) +{ + srs_error_t err; + + if (true) { + SrsFlvVodStreamDecoder dec; + HELPER_EXPECT_FAILED(dec.initialize((ISrsReader*)&dec)); + } + + if (true) { + MockSrsFileReader fs; + SrsFlvVodStreamDecoder dec; + HELPER_EXPECT_FAILED(dec.initialize(&fs)); + } +} + /** * test the stream utility, access pos */ @@ -3532,8 +3555,10 @@ VOID TEST(KernelLogTest, CoverAll) VOID TEST(KernelMp3Test, CoverAll) { if (true) { - SrsMp3Transmuxer m; MockSrsFileWriter f; + EXPECT_TRUE(srs_success == f.open("")); + + SrsMp3Transmuxer m; EXPECT_TRUE(srs_success == m.initialize(&f)); EXPECT_TRUE(srs_success == m.write_header()); @@ -3543,6 +3568,7 @@ VOID TEST(KernelMp3Test, CoverAll) if (true) { SrsMp3Transmuxer m; MockSrsFileWriter f; + EXPECT_TRUE(srs_success == f.open("")); EXPECT_TRUE(srs_success == m.initialize(&f)); EXPECT_TRUE(srs_success == m.write_audio(0, (char*)"\x20\x01", 2)); @@ -3552,6 +3578,7 @@ VOID TEST(KernelMp3Test, CoverAll) if (true) { SrsMp3Transmuxer m; MockSrsFileWriter f; + EXPECT_TRUE(srs_success == f.open("")); EXPECT_TRUE(srs_success == m.initialize(&f)); srs_error_t err = m.write_audio(0, (char*)"\x30\x01", 2); @@ -3576,6 +3603,7 @@ VOID TEST(KernelMp3Test, CoverAll) if (true) { SrsMp3Transmuxer m; MockSrsFileWriter f; + EXPECT_TRUE(srs_success == f.open("")); EXPECT_TRUE(srs_success == m.initialize(&f)); f.err = srs_error_new(-1, "mock file error"); @@ -3587,6 +3615,7 @@ VOID TEST(KernelMp3Test, CoverAll) if (true) { SrsMp3Transmuxer m; MockSrsFileWriter f; + EXPECT_TRUE(srs_success == f.open("")); EXPECT_TRUE(srs_success == m.initialize(&f)); f.err = srs_error_new(-1, "mock file error"); diff --git a/trunk/src/utest/srs_utest_kernel.hpp b/trunk/src/utest/srs_utest_kernel.hpp index 73eb758bd..a08562b72 100644 --- a/trunk/src/utest/srs_utest_kernel.hpp +++ b/trunk/src/utest/srs_utest_kernel.hpp @@ -54,6 +54,7 @@ public: int offset; srs_error_t err; int error_offset; + bool opened; public: MockSrsFileWriter(); virtual ~MockSrsFileWriter(); @@ -78,6 +79,7 @@ public: char* data; int size; int offset; + bool opened; public: MockSrsFileReader(); MockSrsFileReader(const char* data, int nb_data);