/** * test the flv encoder, * write flv header */ VOID TEST(KernelFlvTest, FlvEncoderWriteHeader) { MockSrsFileWriter fs; SrsFlvEncoder enc; ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); ASSERT_TRUE(ERROR_SUCCESS == enc.initialize(&fs)); // write header, 9bytes char flv_header[] = { 'F', 'L', 'V', // Signatures "FLV" (char)0x01, // File version (for example, 0x01 for FLV version 1) (char)0x00, // 4, audio; 1, video; 5 audio+video. (char)0x00, (char)0x00, (char)0x00, (char)0x09 // DataOffset UI32 The length of this header in bytes }; char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)0x00 }; EXPECT_TRUE(ERROR_SUCCESS == enc.write_header()); ASSERT_TRUE(9 + 4 == fs.offset); EXPECT_TRUE(srs_bytes_equals(flv_header, fs.data, 9)); EXPECT_TRUE(srs_bytes_equals(pts, fs.data + 9, 4)); // customer header flv_header[3] = 0xF0; flv_header[4] = 0xF1; flv_header[5] = 0x01; fs.mock_reset_offset(); EXPECT_TRUE(ERROR_SUCCESS == enc.write_header(flv_header)); ASSERT_TRUE(9 + 4 == fs.offset); EXPECT_TRUE(srs_bytes_equals(flv_header, fs.data, 9)); EXPECT_TRUE(srs_bytes_equals(pts, fs.data + 9, 4)); }
/** * test the flv encoder, * write video tag */ VOID TEST(KernelFlvTest, FlvEncoderWriteVideo) { MockSrsFileWriter fs; SrsFlvEncoder enc; ASSERT_TRUE(ERROR_SUCCESS == fs.open("")); ASSERT_TRUE(ERROR_SUCCESS == enc.initialize(&fs)); // 11bytes tag header char tag_header[] = { (char)9, // TagType UB [5], 9 = video (char)0x00, (char)0x00, (char)0x08, // DataSize UI24 Length of the message. (char)0x00, (char)0x00, (char)0x30, // Timestamp UI24 Time in milliseconds at which the data in this tag applies. (char)0x00, // TimestampExtended UI8 (char)0x00, (char)0x00, (char)0x00, // StreamID UI24 Always 0. }; char video[] = { (char)0x01, (char)0x02, (char)0x03, (char)0x04, (char)0x04, (char)0x03, (char)0x02, (char)0x01 }; char pts[] = { (char)0x00, (char)0x00, (char)0x00, (char)19 }; ASSERT_TRUE(ERROR_SUCCESS == enc.write_video(0x30, video, 8)); ASSERT_TRUE(11 + 8 + 4 == fs.offset); EXPECT_TRUE(srs_bytes_equals(tag_header, fs.data, 11)); EXPECT_TRUE(srs_bytes_equals(video, fs.data + 11, 8)); EXPECT_TRUE(true); // donot know why, if not add it, the print is disabled. EXPECT_TRUE(srs_bytes_equals(pts, fs.data + 11 + 8, 4)); }
int SrsDvrHssPlan::on_meta_data(SrsOnMetaDataPacket* metadata) { int ret = ERROR_SUCCESS; SrsRequest* req = _req; // new flv file std::stringstream path; path << _srs_config->get_dvr_path(req->vhost) << "/" << req->app << "/" << req->stream << ".header.flv"; SrsFileStream fs; if ((ret = fs.open_write(path.str().c_str())) != ERROR_SUCCESS) { return ret; } SrsFlvEncoder enc; if ((ret = enc.initialize(&fs)) != ERROR_SUCCESS) { return ret; } if ((ret = enc.write_header()) != ERROR_SUCCESS) { return ret; } int size = 0; char* payload = NULL; if ((ret = metadata->encode(size, payload)) != ERROR_SUCCESS) { return ret; } SrsAutoFree(char, payload); if ((ret = enc.write_metadata(payload, size)) != ERROR_SUCCESS) { return ret; } #ifdef SRS_AUTO_HTTP_CALLBACK if ((ret = on_dvr_hss_reap_flv_header(path.str())) != ERROR_SUCCESS) { return ret; } #endif return ret; }
/** * test the flv encoder, * exception: file stream not open */ VOID TEST(KernelFlvTest, FlvEncoderStreamClosed) { MockSrsFileWriter fs; SrsFlvEncoder enc; ASSERT_TRUE(ERROR_SUCCESS != enc.initialize(&fs)); }