1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Merge branch 3.0release into develop

This commit is contained in:
winlin 2019-05-20 09:03:38 +08:00
commit 57aa7de332
9 changed files with 302 additions and 28 deletions

View file

@ -127,14 +127,14 @@ int main(int argc, char** argv)
END END
# compile the example ## compile the example
(cd $SRS_EXPORT_LIBRTMP_SINGLE && echo "${SRS_SINGLE_LIBRTMP_COMPILE}" && #(cd $SRS_EXPORT_LIBRTMP_SINGLE && echo "${SRS_SINGLE_LIBRTMP_COMPILE}" &&
`${SRS_SINGLE_LIBRTMP_COMPILE}` && ./example && rm -f example) #`${SRS_SINGLE_LIBRTMP_COMPILE}` && ./example && rm -f example)
ret=$?; if [[ $ret -ne 0 ]]; then #ret=$?; if [[ $ret -ne 0 ]]; then
echo "(cd $SRS_EXPORT_LIBRTMP_SINGLE && ${SRS_SINGLE_LIBRTMP_COMPILE} && ./example && rm -f example)" # echo "(cd $SRS_EXPORT_LIBRTMP_SINGLE && ${SRS_SINGLE_LIBRTMP_COMPILE} && ./example && rm -f example)"
echo -e "${RED}failed to compile example.${BLACK}" # echo -e "${RED}failed to compile example.${BLACK}"
exit $ret # exit $ret
fi #fi
# clear the files for srs-librtmp project, generated by generate-srs-librtmp-project.sh # 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) (cd $SRS_EXPORT_LIBRTMP_SINGLE && rm -rf auto $SRS_OBJS_DIR research src Makefile)

2
trunk/configure vendored
View file

@ -735,4 +735,6 @@ else
echo -e "${GREEN}Please use the srs-librtmp project: ${BLACK}" echo -e "${GREEN}Please use the srs-librtmp project: ${BLACK}"
echo -e "${GREEN} cd $SRS_EXPORT_LIBRTMP_PROJECT && make ${BLACK}" echo -e "${GREEN} cd $SRS_EXPORT_LIBRTMP_PROJECT && make ${BLACK}"
fi fi
# Change to experiment.
echo -e "${YELLOW}Warning: Notice srs-librtmp is deprecated and maybe removed in future.${BLACK}"
fi fi

View file

@ -553,10 +553,8 @@ srs_error_t SrsFormat::on_audio(int64_t timestamp, char* data, int size)
SrsBuffer* buffer = new SrsBuffer(data, size); SrsBuffer* buffer = new SrsBuffer(data, size);
SrsAutoFree(SrsBuffer, buffer); SrsAutoFree(SrsBuffer, buffer);
// audio decode // We already checked the size is positive and data is not NULL.
if (!buffer->require(1)) { srs_assert(buffer->require(1));
return srs_error_new(ERROR_HLS_DECODE_ERROR, "aac decode sound_format");
}
// @see: E.4.2 Audio Tags, video_file_format_spec_v10_1.pdf, page 76 // @see: E.4.2 Audio Tags, video_file_format_spec_v10_1.pdf, page 76
uint8_t v = buffer->read_1bytes(); 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); SrsBuffer* buffer = new SrsBuffer(data, size);
SrsAutoFree(SrsBuffer, buffer); SrsAutoFree(SrsBuffer, buffer);
// video decode // We already checked the size is positive and data is not NULL.
if (!buffer->require(1)) { srs_assert(buffer->require(1));
return srs_error_new(ERROR_HLS_DECODE_ERROR, "decode frame_type");
}
// @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78
int8_t frame_type = buffer->read_1bytes(); int8_t frame_type = buffer->read_1bytes();

View file

@ -175,6 +175,7 @@
#define ERROR_OpenSslCreateHMAC 2050 #define ERROR_OpenSslCreateHMAC 2050
#define ERROR_RTMP_STREAM_NAME_EMPTY 2051 #define ERROR_RTMP_STREAM_NAME_EMPTY 2051
#define ERROR_HTTP_HIJACK 2052 #define ERROR_HTTP_HIJACK 2052
#define ERROR_RTMP_MESSAGE_CREATE 2053
// //
// The system control message, // The system control message,
// It's not an error, but special control logic. // It's not an error, but special control logic.

View file

@ -251,11 +251,11 @@ srs_error_t SrsSharedPtrMessage::create(SrsMessageHeader* pheader, char* payload
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
if (ptr) { if (size < 0) {
srs_assert(false); return srs_error_new(ERROR_RTMP_MESSAGE_CREATE, "create message size=%d", size);
return srs_error_new(ERROR_SYSTEM_ASSERT_FAILED, "should not set the payload twice");
} }
srs_assert(!ptr);
ptr = new SrsSharedPtrPayload(); ptr = new SrsSharedPtrPayload();
// direct attach the data. // direct attach the data.

View file

@ -122,11 +122,14 @@ srs_utime_t srs_get_system_startup_time()
return _srs_system_time_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() srs_utime_t srs_update_system_time()
{ {
timeval now; timeval now;
if (gettimeofday(&now, NULL) < 0) { if (_srs_gettimeofday(&now, NULL) < 0) {
srs_warn("gettimeofday failed, ignore"); srs_warn("gettimeofday failed, ignore");
return -1; return -1;
} }

View file

@ -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. // @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); extern int srs_chunk_header_c3(int perfer_cid, uint32_t timestamp, char* cache, int nb_cache);
// For utest to mock it.
#include <sys/time.h>
typedef int (*_srs_gettimeofday_t)(struct timeval* tv, struct timezone* tz);
#endif #endif

View file

@ -47,6 +47,7 @@ MockSrsFileWriter::MockSrsFileWriter()
offset = 0; offset = 0;
err = srs_success; err = srs_success;
error_offset = 0; error_offset = 0;
opened = false;
} }
MockSrsFileWriter::~MockSrsFileWriter() MockSrsFileWriter::~MockSrsFileWriter()
@ -63,17 +64,18 @@ srs_error_t MockSrsFileWriter::open(string /*file*/)
return srs_error_copy(err); return srs_error_copy(err);
} }
opened = true;
return srs_success; return srs_success;
} }
void MockSrsFileWriter::close() void MockSrsFileWriter::close()
{ {
offset = 0; opened = false;
} }
bool MockSrsFileWriter::is_open() bool MockSrsFileWriter::is_open()
{ {
return offset >= 0; return opened;
} }
void MockSrsFileWriter::seek2(int64_t offset) void MockSrsFileWriter::seek2(int64_t offset)
@ -139,6 +141,7 @@ MockSrsFileReader::MockSrsFileReader()
data = new char[MAX_MOCK_DATA_SIZE]; data = new char[MAX_MOCK_DATA_SIZE];
size = 0; size = 0;
offset = 0; offset = 0;
opened = false;
} }
MockSrsFileReader::MockSrsFileReader(const char* src, int nb_src) MockSrsFileReader::MockSrsFileReader(const char* src, int nb_src)
@ -148,6 +151,7 @@ MockSrsFileReader::MockSrsFileReader(const char* src, int nb_src)
size = nb_src; size = nb_src;
offset = 0; offset = 0;
opened = false;
} }
MockSrsFileReader::~MockSrsFileReader() MockSrsFileReader::~MockSrsFileReader()
@ -158,6 +162,7 @@ MockSrsFileReader::~MockSrsFileReader()
srs_error_t MockSrsFileReader::open(string /*file*/) srs_error_t MockSrsFileReader::open(string /*file*/)
{ {
offset = 0; offset = 0;
opened = true;
return srs_success; return srs_success;
} }
@ -169,7 +174,7 @@ void MockSrsFileReader::close()
bool MockSrsFileReader::is_open() bool MockSrsFileReader::is_open()
{ {
return offset >= 0; return opened;
} }
int64_t MockSrsFileReader::tellg() int64_t MockSrsFileReader::tellg()
@ -842,8 +847,10 @@ VOID TEST(KernelFlvTest, FlvDecoderVideo)
VOID TEST(KernelFlvTest, FlvVSDecoderStreamClosed) VOID TEST(KernelFlvTest, FlvVSDecoderStreamClosed)
{ {
MockSrsFileReader fs; MockSrsFileReader fs;
fs.close();
SrsFlvVodStreamDecoder dec; 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); 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 * test the stream utility, access pos
*/ */
@ -2690,6 +2713,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) VOID TEST(KernelCodecTest, AudioFormat)
{ {
if (true) { if (true) {
@ -2805,6 +2861,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) VOID TEST(KernelCodecTest, VideoFormat)
{ {
if (true) { if (true) {
@ -3303,6 +3490,48 @@ VOID TEST(KernelFLVTest, CoverAll)
#endif #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) VOID TEST(KernelLogTest, CoverAll)
{ {
if (true) { if (true) {
@ -3326,8 +3555,10 @@ VOID TEST(KernelLogTest, CoverAll)
VOID TEST(KernelMp3Test, CoverAll) VOID TEST(KernelMp3Test, CoverAll)
{ {
if (true) { if (true) {
SrsMp3Transmuxer m;
MockSrsFileWriter f; MockSrsFileWriter f;
EXPECT_TRUE(srs_success == f.open(""));
SrsMp3Transmuxer m;
EXPECT_TRUE(srs_success == m.initialize(&f)); EXPECT_TRUE(srs_success == m.initialize(&f));
EXPECT_TRUE(srs_success == m.write_header()); EXPECT_TRUE(srs_success == m.write_header());
@ -3337,6 +3568,7 @@ VOID TEST(KernelMp3Test, CoverAll)
if (true) { if (true) {
SrsMp3Transmuxer m; SrsMp3Transmuxer m;
MockSrsFileWriter f; MockSrsFileWriter f;
EXPECT_TRUE(srs_success == f.open(""));
EXPECT_TRUE(srs_success == m.initialize(&f)); EXPECT_TRUE(srs_success == m.initialize(&f));
EXPECT_TRUE(srs_success == m.write_audio(0, (char*)"\x20\x01", 2)); EXPECT_TRUE(srs_success == m.write_audio(0, (char*)"\x20\x01", 2));
@ -3346,6 +3578,7 @@ VOID TEST(KernelMp3Test, CoverAll)
if (true) { if (true) {
SrsMp3Transmuxer m; SrsMp3Transmuxer m;
MockSrsFileWriter f; MockSrsFileWriter f;
EXPECT_TRUE(srs_success == f.open(""));
EXPECT_TRUE(srs_success == m.initialize(&f)); EXPECT_TRUE(srs_success == m.initialize(&f));
srs_error_t err = m.write_audio(0, (char*)"\x30\x01", 2); srs_error_t err = m.write_audio(0, (char*)"\x30\x01", 2);
@ -3370,6 +3603,7 @@ VOID TEST(KernelMp3Test, CoverAll)
if (true) { if (true) {
SrsMp3Transmuxer m; SrsMp3Transmuxer m;
MockSrsFileWriter f; MockSrsFileWriter f;
EXPECT_TRUE(srs_success == f.open(""));
EXPECT_TRUE(srs_success == m.initialize(&f)); EXPECT_TRUE(srs_success == m.initialize(&f));
f.err = srs_error_new(-1, "mock file error"); f.err = srs_error_new(-1, "mock file error");
@ -3381,6 +3615,7 @@ VOID TEST(KernelMp3Test, CoverAll)
if (true) { if (true) {
SrsMp3Transmuxer m; SrsMp3Transmuxer m;
MockSrsFileWriter f; MockSrsFileWriter f;
EXPECT_TRUE(srs_success == f.open(""));
EXPECT_TRUE(srs_success == m.initialize(&f)); EXPECT_TRUE(srs_success == m.initialize(&f));
f.err = srs_error_new(-1, "mock file error"); f.err = srs_error_new(-1, "mock file error");
@ -3433,6 +3668,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_startup_time;
extern int64_t _srs_system_time_us_cache; extern int64_t _srs_system_time_us_cache;
extern int av_toupper(int c); extern int av_toupper(int c);

View file

@ -54,6 +54,7 @@ public:
int offset; int offset;
srs_error_t err; srs_error_t err;
int error_offset; int error_offset;
bool opened;
public: public:
MockSrsFileWriter(); MockSrsFileWriter();
virtual ~MockSrsFileWriter(); virtual ~MockSrsFileWriter();
@ -78,6 +79,7 @@ public:
char* data; char* data;
int size; int size;
int offset; int offset;
bool opened;
public: public:
MockSrsFileReader(); MockSrsFileReader();
MockSrsFileReader(const char* data, int nb_data); MockSrsFileReader(const char* data, int nb_data);