From 4187fa0068b7d6eac93bb4129fb94d0891d78e47 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 4 Feb 2019 15:11:41 +0800 Subject: [PATCH] CI: Cover kernel utility --- trunk/src/kernel/srs_kernel_buffer.cpp | 11 +- trunk/src/kernel/srs_kernel_buffer.hpp | 3 +- trunk/src/kernel/srs_kernel_codec.cpp | 5 +- trunk/src/kernel/srs_kernel_utility.cpp | 8 +- trunk/src/utest/srs_utest_kernel.cpp | 147 +++++++++++++++++++++--- 5 files changed, 144 insertions(+), 30 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_buffer.cpp b/trunk/src/kernel/srs_kernel_buffer.cpp index 7f919c18a..80cc6055e 100644 --- a/trunk/src/kernel/srs_kernel_buffer.cpp +++ b/trunk/src/kernel/srs_kernel_buffer.cpp @@ -251,24 +251,17 @@ void SrsBuffer::write_bytes(char* data, int size) p += size; } -SrsBitBuffer::SrsBitBuffer() +SrsBitBuffer::SrsBitBuffer(SrsBuffer* b) { cb = 0; cb_left = 0; - stream = NULL; + stream = b; } SrsBitBuffer::~SrsBitBuffer() { } -srs_error_t SrsBitBuffer::initialize(SrsBuffer* s) { - stream = s; - cb = 0; - cb_left = 0; - return srs_success; -} - bool SrsBitBuffer::empty() { if (cb_left) { return false; diff --git a/trunk/src/kernel/srs_kernel_buffer.hpp b/trunk/src/kernel/srs_kernel_buffer.hpp index 7bec0b9e9..45a5542ce 100644 --- a/trunk/src/kernel/srs_kernel_buffer.hpp +++ b/trunk/src/kernel/srs_kernel_buffer.hpp @@ -206,10 +206,9 @@ private: uint8_t cb_left; SrsBuffer* stream; public: - SrsBitBuffer(); + SrsBitBuffer(SrsBuffer* b); virtual ~SrsBitBuffer(); public: - virtual srs_error_t initialize(SrsBuffer* s); virtual bool empty(); virtual int8_t read_bit(); }; diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index 2d8073463..267435ca9 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -894,10 +894,7 @@ srs_error_t SrsFormat::avc_demux_sps_rbsp(char* rbsp, int nb_rbsp) return srs_error_new(ERROR_HLS_DECODE_ERROR, "sps the level_idc invalid"); } - SrsBitBuffer bs; - if ((err = bs.initialize(&stream)) != srs_success) { - return srs_error_wrap(err, "init bit buffer"); - } + SrsBitBuffer bs(&stream); int32_t seq_parameter_set_id = -1; if ((err = srs_avc_nalu_read_uev(&bs, seq_parameter_set_id)) != srs_success) { diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index ebd00af97..408c3e4d8 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -77,6 +77,10 @@ srs_error_t srs_avc_nalu_read_uev(SrsBitBuffer* stream, int32_t& v) v = (1 << leadingZeroBits) - 1; for (int i = 0; i < (int)leadingZeroBits; i++) { + if (stream->empty()) { + return srs_error_new(ERROR_AVC_NALU_UEV, "no bytes for leadingZeroBits=%d", leadingZeroBits); + } + int32_t b = stream->read_bit(); v += b << (leadingZeroBits - 1 - i); } @@ -97,8 +101,8 @@ srs_error_t srs_avc_nalu_read_bit(SrsBitBuffer* stream, int8_t& v) return err; } -static int64_t _srs_system_time_us_cache = 0; -static int64_t _srs_system_time_startup_time = 0; +int64_t _srs_system_time_us_cache = 0; +int64_t _srs_system_time_startup_time = 0; int64_t srs_get_system_time_ms() { diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 975014e55..602c1beff 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -1517,89 +1517,88 @@ VOID TEST(KernelUtilityTest, UtilityString) VOID TEST(KernelUtility, AvcUev) { int32_t v; - SrsBitBuffer bb; char data[32]; if (true) { data[0] = 0xff; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 1; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 1; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(0, v); } if (true) { data[0] = 0x40; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(1, v); } if (true) { data[0] = 0x60; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(2, v); } if (true) { data[0] = 0x20; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(3, v); } if (true) { data[0] = 0x28; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(4, v); } if (true) { data[0] = 0x30; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(5, v); } if (true) { data[0] = 0x38; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(6, v); } if (true) { data[0] = 0x10; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(7, v); } if (true) { data[0] = 0x12; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(8, v); } if (true) { data[0] = 0x14; - SrsBuffer buf((char*)data, 1); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 1); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(9, v); } if (true) { data[0] = 0x01; data[1] = 0x12; - SrsBuffer buf((char*)data, 2); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 2); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(128-1+9, v); } if (true) { data[0] = 0x00; data[1] = 0x91; data[2] = 0x00; - SrsBuffer buf((char*)data, 3); bb.initialize(&buf); v = 0; + SrsBuffer buf((char*)data, 3); SrsBitBuffer bb(&buf); v = 0; srs_avc_nalu_read_uev(&bb, v); EXPECT_EQ(256-1+0x22, v); } @@ -3066,3 +3065,125 @@ VOID TEST(KernelMp3Test, CoverAll) } } +VOID TEST(KernelUtilityTest, CoverBitsBufferAll) +{ + if (true) { + SrsBuffer b(NULL, 0); + SrsBitBuffer bb(&b); + + int32_t v = 0; + srs_error_t err = srs_avc_nalu_read_uev(&bb, v); + EXPECT_TRUE(srs_success != err); + srs_freep(err); + } + + if (true) { + SrsBuffer b((char*)"\x00", 1); + SrsBitBuffer bb(&b); + + int32_t v = 0; + srs_error_t err = srs_avc_nalu_read_uev(&bb, v); + EXPECT_TRUE(srs_success != err); + srs_freep(err); + } + + if (true) { + SrsBuffer b((char*)"\x00\x00\x00\x00", 4); + SrsBitBuffer bb(&b); + + int32_t v = 0; + srs_error_t err = srs_avc_nalu_read_uev(&bb, v); + EXPECT_TRUE(srs_success != err); + srs_freep(err); + } + + if (true) { + SrsBuffer b(NULL, 0); + SrsBitBuffer bb(&b); + + int8_t v = 0; + srs_error_t err = srs_avc_nalu_read_bit(&bb, v); + EXPECT_TRUE(srs_success != err); + srs_freep(err); + } +} + +extern int64_t _srs_system_time_startup_time; +extern int64_t _srs_system_time_us_cache; +extern int av_toupper(int c); + +VOID TEST(KernelUtilityTest, CoverTimeUtilityAll) +{ + _srs_system_time_us_cache = 0; + _srs_system_time_startup_time = 0; + EXPECT_TRUE(srs_get_system_startup_time_ms() > 0); + + _srs_system_time_us_cache -= 300*1000 * 1000 + 1; + EXPECT_TRUE(srs_update_system_time_ms() > 0); + + if (true) { + string host; + int port = 0; + srs_parse_hostport("[3ffe:dead:beef::1]:1935", host, port); + EXPECT_EQ(1935, port); + EXPECT_STREQ("3ffe:dead:beef::1", host.c_str()); + } + + if (true) { + string host; + int port = 0; + srs_parse_hostport("domain.com", host, port); + EXPECT_STREQ("domain.com", host.c_str()); + } + + if (true) { + string ep = srs_any_address4listener(); + EXPECT_TRUE(ep == "0.0.0.0" || ep == "::"); + } + + if (true) { + string host; + int port = 0; + srs_parse_endpoint("[3ffe:dead:beef::1]:1935", host, port); + EXPECT_EQ(1935, port); + EXPECT_STREQ("3ffe:dead:beef::1", host.c_str()); + } + + if (true) { + string host; + int port = 0; + srs_parse_endpoint("domain.com:1935", host, port); + EXPECT_EQ(1935, port); + EXPECT_STREQ("domain.com", host.c_str()); + } + + if (true) { + string host; + int port = 0; + srs_parse_endpoint("1935", host, port); + EXPECT_EQ(1935, port); + EXPECT_TRUE(host == "0.0.0.0" || host == "::"); + } + + if (true) { + EXPECT_STREQ("1.00", srs_float2str(1).c_str()); + EXPECT_STREQ("on", srs_bool2switch(true).c_str()); + EXPECT_STREQ("off", srs_bool2switch(false).c_str()); + } + + if (true) { + vector flags; + flags.push_back("e"); + flags.push_back("wo"); + vector ss = srs_string_split("hello, world", flags); + EXPECT_EQ(3, (int)ss.size()); + EXPECT_STREQ("h", ss.at(0).c_str()); + EXPECT_STREQ("llo, ", ss.at(1).c_str()); + EXPECT_STREQ("rld", ss.at(2).c_str()); + } + + if (true) { + EXPECT_EQ('H', av_toupper('h')); + } +} +