CI: Cover kernel ts

pull/1651/head
winlin 6 years ago
parent 3f59c7885e
commit 8eccfeceb9

@ -298,7 +298,7 @@ srs_error_t SrsTsContext::decode(SrsBuffer* stream, ISrsTsHandler* handler)
return err; return err;
} }
srs_error_t SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsVideoCodecId vc, SrsAudioCodecId ac) srs_error_t SrsTsContext::encode(ISrsStreamWriter* writer, SrsTsMessage* msg, SrsVideoCodecId vc, SrsAudioCodecId ac)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
@ -380,7 +380,7 @@ void SrsTsContext::set_sync_byte(int8_t sb)
sync_byte = sb; sync_byte = sb;
} }
srs_error_t SrsTsContext::encode_pat_pmt(SrsFileWriter* writer, int16_t vpid, SrsTsStream vs, int16_t apid, SrsTsStream as) srs_error_t SrsTsContext::encode_pat_pmt(ISrsStreamWriter* writer, int16_t vpid, SrsTsStream vs, int16_t apid, SrsTsStream as)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
@ -441,7 +441,7 @@ srs_error_t SrsTsContext::encode_pat_pmt(SrsFileWriter* writer, int16_t vpid, Sr
return err; return err;
} }
srs_error_t SrsTsContext::encode_pes(SrsFileWriter* writer, SrsTsMessage* msg, int16_t pid, SrsTsStream sid, bool pure_audio) srs_error_t SrsTsContext::encode_pes(ISrsStreamWriter* writer, SrsTsMessage* msg, int16_t pid, SrsTsStream sid, bool pure_audio)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
@ -2543,7 +2543,7 @@ srs_error_t SrsTsPayloadPMT::psi_encode(SrsBuffer* stream)
return err; return err;
} }
SrsTsContextWriter::SrsTsContextWriter(SrsFileWriter* w, SrsTsContext* c, SrsAudioCodecId ac, SrsVideoCodecId vc) SrsTsContextWriter::SrsTsContextWriter(ISrsStreamWriter* w, SrsTsContext* c, SrsAudioCodecId ac, SrsVideoCodecId vc)
{ {
writer = w; writer = w;
context = c; context = c;
@ -2568,7 +2568,10 @@ srs_error_t SrsTsContextWriter::open(string p)
// reset the context for a new ts start. // reset the context for a new ts start.
context->reset(); context->reset();
if ((err = writer->open(path)) != srs_success) { SrsFileWriter* fw = dynamic_cast<SrsFileWriter*>(writer);
srs_assert(fw);
if ((err = fw->open(path)) != srs_success) {
return srs_error_wrap(err, "ts: open writer"); return srs_error_wrap(err, "ts: open writer");
} }
@ -2607,7 +2610,10 @@ srs_error_t SrsTsContextWriter::write_video(SrsTsMessage* video)
void SrsTsContextWriter::close() void SrsTsContextWriter::close()
{ {
writer->close(); SrsFileWriter* fw = dynamic_cast<SrsFileWriter*>(writer);
srs_assert(fw);
fw->close();
} }
SrsVideoCodecId SrsTsContextWriter::video_codec() SrsVideoCodecId SrsTsContextWriter::video_codec()
@ -3011,7 +3017,7 @@ SrsTsTransmuxer::~SrsTsTransmuxer()
srs_freep(context); srs_freep(context);
} }
srs_error_t SrsTsTransmuxer::initialize(SrsFileWriter* fw) srs_error_t SrsTsTransmuxer::initialize(ISrsStreamWriter* fw)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
@ -3021,10 +3027,6 @@ srs_error_t SrsTsTransmuxer::initialize(SrsFileWriter* fw)
srs_assert(fw); srs_assert(fw);
if (!fw->is_open()) {
return srs_error_new(ERROR_KERNEL_FLV_STREAM_CLOSED, "ts: stream is not open");
}
writer = fw; writer = fw;
srs_freep(tscw); srs_freep(tscw);

@ -38,7 +38,7 @@
class SrsBuffer; class SrsBuffer;
class SrsTsMessageCache; class SrsTsMessageCache;
class SrsTsContextWriter; class SrsTsContextWriter;
class SrsFileWriter; class ISrsStreamWriter;
class SrsFileReader; class SrsFileReader;
class SrsFormat; class SrsFormat;
class SrsSimpleStream; class SrsSimpleStream;
@ -403,7 +403,7 @@ public:
* @param vc the video codec, write the PAT/PMT table when changed. * @param vc the video codec, write the PAT/PMT table when changed.
* @param ac the audio codec, write the PAT/PMT table when changed. * @param ac the audio codec, write the PAT/PMT table when changed.
*/ */
virtual srs_error_t encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsVideoCodecId vc, SrsAudioCodecId ac); virtual srs_error_t encode(ISrsStreamWriter* writer, SrsTsMessage* msg, SrsVideoCodecId vc, SrsAudioCodecId ac);
// drm methods // drm methods
public: public:
/** /**
@ -412,8 +412,8 @@ public:
*/ */
virtual void set_sync_byte(int8_t sb); virtual void set_sync_byte(int8_t sb);
private: private:
virtual srs_error_t encode_pat_pmt(SrsFileWriter* writer, int16_t vpid, SrsTsStream vs, int16_t apid, SrsTsStream as); virtual srs_error_t encode_pat_pmt(ISrsStreamWriter* writer, int16_t vpid, SrsTsStream vs, int16_t apid, SrsTsStream as);
virtual srs_error_t encode_pes(SrsFileWriter* writer, SrsTsMessage* msg, int16_t pid, SrsTsStream sid, bool pure_audio); virtual srs_error_t encode_pes(ISrsStreamWriter* writer, SrsTsMessage* msg, int16_t pid, SrsTsStream sid, bool pure_audio);
}; };
/** /**
@ -1543,10 +1543,10 @@ private:
SrsAudioCodecId acodec; SrsAudioCodecId acodec;
private: private:
SrsTsContext* context; SrsTsContext* context;
SrsFileWriter* writer; ISrsStreamWriter* writer;
std::string path; std::string path;
public: public:
SrsTsContextWriter(SrsFileWriter* w, SrsTsContext* c, SrsAudioCodecId ac, SrsVideoCodecId vc); SrsTsContextWriter(ISrsStreamWriter* w, SrsTsContext* c, SrsAudioCodecId ac, SrsVideoCodecId vc);
virtual ~SrsTsContextWriter(); virtual ~SrsTsContextWriter();
public: public:
/** /**
@ -1628,7 +1628,7 @@ private:
class SrsTsTransmuxer class SrsTsTransmuxer
{ {
private: private:
SrsFileWriter* writer; ISrsStreamWriter* writer;
private: private:
SrsFormat* format; SrsFormat* format;
SrsTsMessageCache* tsmc; SrsTsMessageCache* tsmc;
@ -1642,7 +1642,7 @@ public:
* initialize the underlayer file stream. * initialize the underlayer file stream.
* @param fw the writer to use for ts encoder, user must free it. * @param fw the writer to use for ts encoder, user must free it.
*/ */
virtual srs_error_t initialize(SrsFileWriter* fw); virtual srs_error_t initialize(ISrsStreamWriter* fw);
public: public:
/** /**
* write audio/video packet. * write audio/video packet.

@ -243,14 +243,19 @@ srs_error_t MockSrsCodec::decode(SrsBuffer* /*buf*/)
MockTsHandler::MockTsHandler() MockTsHandler::MockTsHandler()
{ {
msg = NULL;
} }
MockTsHandler::~MockTsHandler() MockTsHandler::~MockTsHandler()
{ {
srs_freep(msg);
} }
srs_error_t MockTsHandler::on_ts_message(SrsTsMessage* /*msg*/) srs_error_t MockTsHandler::on_ts_message(SrsTsMessage* m)
{ {
srs_freep(msg);
msg = m->detach();
return srs_success; return srs_success;
} }
@ -3201,7 +3206,7 @@ VOID TEST(KernelUtilityTest, CoverTimeUtilityAll)
} }
} }
VOID TEST(KernelTSTest, CoverBasicUtility) VOID TEST(KernelTSTest, CoverContextUtility)
{ {
if (true) { if (true) {
EXPECT_STREQ("Reserved", srs_ts_stream2string(SrsTsStreamReserved).c_str()); EXPECT_STREQ("Reserved", srs_ts_stream2string(SrsTsStreamReserved).c_str());
@ -3238,6 +3243,9 @@ VOID TEST(KernelTSTest, CoverBasicUtility)
SrsTsMessage* cp = m.detach(); SrsTsMessage* cp = m.detach();
EXPECT_TRUE(cp != NULL); EXPECT_TRUE(cp != NULL);
srs_freep(cp); srs_freep(cp);
ctx.reset();
EXPECT_FALSE(ctx.ready);
} }
if (true) { if (true) {
@ -3294,6 +3302,44 @@ VOID TEST(KernelTSTest, CoverBasicUtility)
EXPECT_TRUE(m.completed(0)); EXPECT_TRUE(m.completed(0));
} }
if (true) {
SrsTsMessage m;
EXPECT_TRUE(m.completed(1));
EXPECT_TRUE(!m.completed(0));
m.PES_packet_length = 8;
SrsBuffer b((char*)"\x00\x01\x02\x03", 4);
int nb_bytes = 0;
EXPECT_TRUE(srs_success == m.dump(&b, &nb_bytes));
EXPECT_EQ(4, nb_bytes);
b.skip(-4);
EXPECT_TRUE(srs_success == m.dump(&b, &nb_bytes));
EXPECT_EQ(4, nb_bytes);
EXPECT_TRUE(m.completed(0));
}
if (true) {
MockTsHandler* h = new MockTsHandler();
srs_freep(h);
SrsTsContext ctx;
EXPECT_TRUE(!ctx.is_pure_audio());
ctx.set(100, SrsTsPidApplyPAT);
ctx.set(101, SrsTsPidApplyPMT);
ctx.set(102, SrsTsPidApplyVideo);
ctx.set(102, SrsTsPidApplyVideo);
ctx.on_pmt_parsed();
EXPECT_TRUE(!ctx.is_pure_audio());
EXPECT_EQ(100, ctx.get(100)->pid);
}
if (true) { if (true) {
MockTsHandler* h = new MockTsHandler(); MockTsHandler* h = new MockTsHandler();
srs_freep(h); srs_freep(h);
@ -3309,6 +3355,48 @@ VOID TEST(KernelTSTest, CoverBasicUtility)
EXPECT_TRUE(ctx.is_pure_audio()); EXPECT_TRUE(ctx.is_pure_audio());
EXPECT_EQ(100, ctx.get(100)->pid); EXPECT_EQ(100, ctx.get(100)->pid);
EXPECT_TRUE(NULL == ctx.get(200));
}
if (true) {
SrsTsContext ctx;
EXPECT_EQ(0x47, ctx.sync_byte);
ctx.set_sync_byte(0x01);
EXPECT_EQ(0x01, ctx.sync_byte);
}
}
VOID TEST(KernelTSTest, CoverContextCodec)
{
SrsTsContext ctx;
MockTsHandler h;
if (true) {
SrsBuffer b;
EXPECT_TRUE(srs_success == ctx.decode(&b, &h));
EXPECT_TRUE(NULL == h.msg);
}
if (true) {
SrsBuffer b((char*)"\x00", 1);
srs_error_t err = ctx.decode(&b, &h);
EXPECT_TRUE(srs_success != err);
srs_freep(err);
}
if (true) {
MockSrsFileWriter f;
SrsTsMessage m;
srs_error_t err = ctx.encode(&f, &m, SrsVideoCodecIdDisabled, SrsAudioCodecIdDisabled);
EXPECT_TRUE(srs_success != err);
srs_freep(err);
err = ctx.encode(&f, &m, SrsVideoCodecIdHEVC, SrsAudioCodecIdOpus);
EXPECT_TRUE(srs_success != err);
srs_freep(err);
} }
} }

@ -110,11 +110,13 @@ public:
class MockTsHandler : public ISrsTsHandler class MockTsHandler : public ISrsTsHandler
{ {
public:
SrsTsMessage* msg;
public: public:
MockTsHandler(); MockTsHandler();
virtual ~MockTsHandler(); virtual ~MockTsHandler();
public: public:
virtual srs_error_t on_ts_message(SrsTsMessage* msg); virtual srs_error_t on_ts_message(SrsTsMessage* m);
}; };
#endif #endif

Loading…
Cancel
Save