diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index 884568f31..d9432ceb5 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -842,7 +842,7 @@ srs_error_t SrsFlvVodStreamDecoder::read_sequence_header_summary(int64_t* pstart reader->skip(data_size + SRS_FLV_PREVIOUS_TAG_SIZE); continue; } - + // if video duplicated, no audio if (is_video && got_video) { break; @@ -868,7 +868,7 @@ srs_error_t SrsFlvVodStreamDecoder::read_sequence_header_summary(int64_t* pstart if (is_audio) { srs_assert(!got_audio); got_audio = true; - + if (av_sequence_offset_start < 0) { av_sequence_offset_start = reader->tellg() - SRS_FLV_TAG_HEADER_SIZE; } diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index 6d3814f0c..49c133c31 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -143,6 +143,7 @@ MockSrsFileReader::MockSrsFileReader() size = 0; offset = 0; opened = false; + seekable = true; } MockSrsFileReader::MockSrsFileReader(const char* src, int nb_src) @@ -157,6 +158,7 @@ MockSrsFileReader::MockSrsFileReader(const char* src, int nb_src) offset = 0; opened = false; + seekable = true; } MockSrsFileReader::~MockSrsFileReader() @@ -194,6 +196,10 @@ void MockSrsFileReader::skip(int64_t _size) int64_t MockSrsFileReader::seek2(int64_t _offset) { + if (!seekable) { + return -1; + } + offset = (int)_offset; return offset; } @@ -872,6 +878,63 @@ VOID TEST(KernelFLVTest, CoverReaderErrorCase) } } +VOID TEST(KernelFLVTest, CoverVodStreamErrorCase) +{ + srs_error_t err; + + if (true) { + MockSrsFileReader r; + HELPER_EXPECT_SUCCESS(r.open("")); + + SrsFlvVodStreamDecoder d; + HELPER_EXPECT_SUCCESS(d.initialize(&r)); + } + + if (true) { + MockSrsFileReader r; + HELPER_EXPECT_SUCCESS(r.open("")); + + SrsFlvVodStreamDecoder d; + HELPER_EXPECT_SUCCESS(d.initialize(&r)); + + char header[13]; + HELPER_EXPECT_FAILED(d.read_header_ext(header)); + } + + if (true) { + MockSrsFileReader r; + HELPER_EXPECT_SUCCESS(r.open("")); + + SrsFlvVodStreamDecoder d; + HELPER_EXPECT_SUCCESS(d.initialize(&r)); + + int64_t start; + int size; + HELPER_EXPECT_FAILED(d.read_sequence_header_summary(&start, &size)); + } + + if (true) { + MockSrsFileReader r; + HELPER_EXPECT_SUCCESS(r.open("")); + + SrsFlvVodStreamDecoder d; + HELPER_EXPECT_SUCCESS(d.initialize(&r)); + + HELPER_EXPECT_FAILED(d.seek2(1)); + } + + if (true) { + MockSrsFileReader r; + HELPER_EXPECT_SUCCESS(r.open("")); + r.seekable = false; + + SrsFlvVodStreamDecoder d; + HELPER_EXPECT_SUCCESS(d.initialize(&r)); + + HELPER_EXPECT_FAILED(d.seek2(0)); + } +} + /** * test the flv decoder, * exception: file stream not open. diff --git a/trunk/src/utest/srs_utest_kernel.hpp b/trunk/src/utest/srs_utest_kernel.hpp index 53ebdb692..f50906d78 100644 --- a/trunk/src/utest/srs_utest_kernel.hpp +++ b/trunk/src/utest/srs_utest_kernel.hpp @@ -82,6 +82,8 @@ public: int size; int offset; bool opened; + // Could seek. + bool seekable; public: MockSrsFileReader(); MockSrsFileReader(const char* data, int nb_data);