mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
refine RTMP protocol stack.
This commit is contained in:
parent
ebf6203c3b
commit
be4c182d11
9 changed files with 104 additions and 1632 deletions
|
@ -372,16 +372,6 @@ int SrsRtmpClient::get_send_kbps()
|
|||
return protocol->get_send_kbps();
|
||||
}
|
||||
|
||||
int SrsRtmpClient::recv_message(SrsCommonMessage** pmsg)
|
||||
{
|
||||
return protocol->recv_message(pmsg);
|
||||
}
|
||||
|
||||
int SrsRtmpClient::send_message(ISrsMessage* msg)
|
||||
{
|
||||
return protocol->send_message(msg);
|
||||
}
|
||||
|
||||
int SrsRtmpClient::__recv_message(__SrsMessage** pmsg)
|
||||
{
|
||||
return protocol->__recv_message(pmsg);
|
||||
|
@ -462,9 +452,7 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
|
|||
|
||||
// Connect(vhost, app)
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsConnectAppPacket* pkt = new SrsConnectAppPacket();
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
pkt->command_object = SrsAmf0Any::object();
|
||||
pkt->command_object->set("app", SrsAmf0Any::str(app.c_str()));
|
||||
|
@ -478,32 +466,29 @@ int SrsRtmpClient::connect_app(string app, string tc_url)
|
|||
pkt->command_object->set("pageUrl", SrsAmf0Any::str());
|
||||
pkt->command_object->set("objectEncoding", SrsAmf0Any::number(0));
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// Set Window Acknowledgement size(2500000)
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket();
|
||||
|
||||
pkt->ackowledgement_window_size = 2500000;
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// expect connect _result
|
||||
SrsCommonMessage* msg = NULL;
|
||||
__SrsMessage* msg = NULL;
|
||||
SrsConnectAppResPacket* pkt = NULL;
|
||||
if ((ret = srs_rtmp_expect_message<SrsConnectAppResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||
if ((ret = __srs_rtmp_expect_message<SrsConnectAppResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||
srs_error("expect connect app response message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
||||
SrsAutoFree(__SrsMessage, msg, false);
|
||||
SrsAutoFree(SrsConnectAppResPacket, pkt, false);
|
||||
srs_info("get connect app response message");
|
||||
|
||||
return ret;
|
||||
|
@ -515,25 +500,22 @@ int SrsRtmpClient::create_stream(int& stream_id)
|
|||
|
||||
// CreateStream
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsCreateStreamPacket* pkt = new SrsCreateStreamPacket();
|
||||
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// CreateStream _result.
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = NULL;
|
||||
__SrsMessage* msg = NULL;
|
||||
SrsCreateStreamResPacket* pkt = NULL;
|
||||
if ((ret = srs_rtmp_expect_message<SrsCreateStreamResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||
if ((ret = __srs_rtmp_expect_message<SrsCreateStreamResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||
srs_error("expect create stream response message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
||||
SrsAutoFree(__SrsMessage, msg, false);
|
||||
SrsAutoFree(SrsCreateStreamResPacket, pkt, false);
|
||||
srs_info("get create stream response message");
|
||||
|
||||
stream_id = (int)pkt->stream_id;
|
||||
|
@ -548,13 +530,9 @@ int SrsRtmpClient::play(string stream, int stream_id)
|
|||
|
||||
// Play(stream)
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsPlayPacket* pkt = new SrsPlayPacket();
|
||||
|
||||
pkt->stream_name = stream;
|
||||
msg->set_packet(pkt, stream_id);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
|
||||
srs_error("send play stream failed. "
|
||||
"stream=%s, stream_id=%d, ret=%d",
|
||||
stream.c_str(), stream_id, ret);
|
||||
|
@ -565,15 +543,13 @@ int SrsRtmpClient::play(string stream, int stream_id)
|
|||
// SetBufferLength(1000ms)
|
||||
int buffer_length_ms = 1000;
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsUserControlPacket* pkt = new SrsUserControlPacket();
|
||||
|
||||
pkt->event_type = SrcPCUCSetBufferLength;
|
||||
pkt->event_data = stream_id;
|
||||
pkt->extra_data = buffer_length_ms;
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
srs_error("send set buffer length failed. "
|
||||
"stream=%s, stream_id=%d, bufferLength=%d, ret=%d",
|
||||
stream.c_str(), stream_id, buffer_length_ms, ret);
|
||||
|
@ -583,13 +559,9 @@ int SrsRtmpClient::play(string stream, int stream_id)
|
|||
|
||||
// SetChunkSize
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
|
||||
|
||||
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
srs_error("send set chunk size failed. "
|
||||
"stream=%s, chunk_size=%d, ret=%d",
|
||||
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
|
||||
|
@ -606,13 +578,9 @@ int SrsRtmpClient::publish(string stream, int stream_id)
|
|||
|
||||
// SetChunkSize
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
|
||||
|
||||
pkt->chunk_size = SRS_CONF_DEFAULT_CHUNK_SIZE;
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
srs_error("send set chunk size failed. "
|
||||
"stream=%s, chunk_size=%d, ret=%d",
|
||||
stream.c_str(), SRS_CONF_DEFAULT_CHUNK_SIZE, ret);
|
||||
|
@ -622,13 +590,9 @@ int SrsRtmpClient::publish(string stream, int stream_id)
|
|||
|
||||
// publish(stream)
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsPublishPacket* pkt = new SrsPublishPacket();
|
||||
|
||||
pkt->stream_name = stream;
|
||||
msg->set_packet(pkt, stream_id);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
|
||||
srs_error("send publish message failed. "
|
||||
"stream=%s, stream_id=%d, ret=%d",
|
||||
stream.c_str(), stream_id, ret);
|
||||
|
@ -647,12 +611,8 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
|||
|
||||
// SrsFMLEStartPacket
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsFMLEStartPacket* pkt = SrsFMLEStartPacket::create_release_stream(stream);
|
||||
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
srs_error("send FMLE publish "
|
||||
"release stream failed. stream=%s, ret=%d", stream.c_str(), ret);
|
||||
return ret;
|
||||
|
@ -661,12 +621,8 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
|||
|
||||
// FCPublish
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsFMLEStartPacket* pkt = SrsFMLEStartPacket::create_FC_publish(stream);
|
||||
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
srs_error("send FMLE publish "
|
||||
"FCPublish failed. stream=%s, ret=%d", stream.c_str(), ret);
|
||||
return ret;
|
||||
|
@ -675,13 +631,9 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
|||
|
||||
// CreateStream
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsCreateStreamPacket* pkt = new SrsCreateStreamPacket();
|
||||
|
||||
pkt->transaction_id = 4;
|
||||
msg->set_packet(pkt, 0);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
srs_error("send FMLE publish "
|
||||
"createStream failed. stream=%s, ret=%d", stream.c_str(), ret);
|
||||
return ret;
|
||||
|
@ -690,13 +642,14 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
|||
|
||||
// expect result of CreateStream
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = NULL;
|
||||
__SrsMessage* msg = NULL;
|
||||
SrsCreateStreamResPacket* pkt = NULL;
|
||||
if ((ret = srs_rtmp_expect_message<SrsCreateStreamResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||
if ((ret = __srs_rtmp_expect_message<SrsCreateStreamResPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
|
||||
srs_error("expect create stream response message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
SrsAutoFree(SrsCommonMessage, msg, false);
|
||||
SrsAutoFree(__SrsMessage, msg, false);
|
||||
SrsAutoFree(SrsCreateStreamResPacket, pkt, false);
|
||||
srs_info("get create stream response message");
|
||||
|
||||
stream_id = (int)pkt->stream_id;
|
||||
|
@ -704,13 +657,9 @@ int SrsRtmpClient::fmle_publish(string stream, int& stream_id)
|
|||
|
||||
// publish(stream)
|
||||
if (true) {
|
||||
SrsCommonMessage* msg = new SrsCommonMessage();
|
||||
SrsPublishPacket* pkt = new SrsPublishPacket();
|
||||
|
||||
pkt->stream_name = stream;
|
||||
msg->set_packet(pkt, stream_id);
|
||||
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
|
||||
srs_error("send FMLE publish publish failed. "
|
||||
"stream=%s, stream_id=%d, ret=%d", stream.c_str(), stream_id, ret);
|
||||
return ret;
|
||||
|
@ -778,16 +727,6 @@ int SrsRtmpServer::get_send_kbps()
|
|||
return protocol->get_send_kbps();
|
||||
}
|
||||
|
||||
int SrsRtmpServer::recv_message(SrsCommonMessage** pmsg)
|
||||
{
|
||||
return protocol->recv_message(pmsg);
|
||||
}
|
||||
|
||||
int SrsRtmpServer::send_message(ISrsMessage* msg)
|
||||
{
|
||||
return protocol->send_message(msg);
|
||||
}
|
||||
|
||||
int SrsRtmpServer::__recv_message(__SrsMessage** pmsg)
|
||||
{
|
||||
return protocol->__recv_message(pmsg);
|
||||
|
@ -841,6 +780,7 @@ int SrsRtmpServer::connect_app(SrsRequest* req)
|
|||
return ret;
|
||||
}
|
||||
SrsAutoFree(__SrsMessage, msg, false);
|
||||
SrsAutoFree(SrsConnectAppPacket, pkt, false);
|
||||
srs_info("get connect app message");
|
||||
|
||||
SrsAmf0Any* prop = NULL;
|
||||
|
@ -954,8 +894,7 @@ void SrsRtmpServer::response_connect_reject(SrsRequest *req, const char* desc)
|
|||
pkt->props->set(StatusDescription, SrsAmf0Any::str(desc));
|
||||
//pkt->props->set("objectEncoding", SrsAmf0Any::number(req->objectEncoding));
|
||||
|
||||
SrsCommonMessage* msg = (new SrsCommonMessage())->set_packet(pkt, 0);
|
||||
if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
|
||||
if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
|
||||
srs_error("send connect app response rejected message failed. ret=%d", ret);
|
||||
return;
|
||||
}
|
||||
|
@ -1197,6 +1136,8 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
|
|||
srs_info("recv FCPublish request message success.");
|
||||
|
||||
SrsAutoFree(__SrsMessage, msg, false);
|
||||
SrsAutoFree(SrsFMLEStartPacket, pkt, false);
|
||||
|
||||
fc_publish_tid = pkt->transaction_id;
|
||||
}
|
||||
// FCPublish response
|
||||
|
@ -1221,6 +1162,8 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
|
|||
srs_info("recv createStream request message success.");
|
||||
|
||||
SrsAutoFree(__SrsMessage, msg, false);
|
||||
SrsAutoFree(SrsCreateStreamPacket, pkt, false);
|
||||
|
||||
create_stream_tid = pkt->transaction_id;
|
||||
}
|
||||
// createStream response
|
||||
|
@ -1244,6 +1187,7 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
|
|||
srs_info("recv publish request message success.");
|
||||
|
||||
SrsAutoFree(__SrsMessage, msg, false);
|
||||
SrsAutoFree(SrsPublishPacket, pkt, false);
|
||||
}
|
||||
// publish response onFCPublish(NetStream.Publish.Start)
|
||||
if (true) {
|
||||
|
|
|
@ -164,8 +164,6 @@ public:
|
|||
virtual int64_t get_send_bytes();
|
||||
virtual int get_recv_kbps();
|
||||
virtual int get_send_kbps();
|
||||
virtual int recv_message(SrsCommonMessage** pmsg);
|
||||
virtual int send_message(ISrsMessage* msg);
|
||||
virtual int __recv_message(__SrsMessage** pmsg);
|
||||
virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
|
||||
virtual int __send_and_free_message(__SrsMessage* msg);
|
||||
|
@ -213,8 +211,6 @@ public:
|
|||
virtual int64_t get_send_bytes();
|
||||
virtual int get_recv_kbps();
|
||||
virtual int get_send_kbps();
|
||||
virtual int recv_message(SrsCommonMessage** pmsg);
|
||||
virtual int send_message(ISrsMessage* msg);
|
||||
virtual int __recv_message(__SrsMessage** pmsg);
|
||||
virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
|
||||
virtual int __send_and_free_message(__SrsMessage* msg);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -40,11 +40,8 @@ class ISrsProtocolReaderWriter;
|
|||
class SrsBuffer;
|
||||
class SrsPacket;
|
||||
class SrsStream;
|
||||
class SrsCommonMessage;
|
||||
class SrsChunkStream;
|
||||
class SrsAmf0Object;
|
||||
class SrsAmf0Any;
|
||||
class ISrsMessage;
|
||||
class SrsMessageHeader;
|
||||
class __SrsMessage;
|
||||
class __SrsChunkStream;
|
||||
|
@ -112,7 +109,6 @@ private:
|
|||
std::map<double, std::string> requests;
|
||||
// peer in
|
||||
private:
|
||||
std::map<int, SrsChunkStream*> chunk_streams;
|
||||
// TODO: FIXME: rename to chunk_streams
|
||||
std::map<int, __SrsChunkStream*> __chunk_streams;
|
||||
SrsStream* decode_stream;
|
||||
|
@ -220,58 +216,9 @@ private:
|
|||
* when message sentout, update the context.
|
||||
*/
|
||||
virtual int __on_send_message(__SrsMessage* msg, SrsPacket* packet);
|
||||
public:
|
||||
/**
|
||||
* recv a message with raw/undecoded payload from peer.
|
||||
* the payload is not decoded, use srs_rtmp_expect_message<T> if requires
|
||||
* specifies message.
|
||||
* @pmsg, user must free it. NULL if not success.
|
||||
* @remark, only when success, user can use and must free the pmsg.
|
||||
*/
|
||||
virtual int recv_message(SrsCommonMessage** pmsg);
|
||||
/**
|
||||
* send out message with encoded payload to peer.
|
||||
* use the message encode method to encode to payload,
|
||||
* then sendout over socket.
|
||||
* @msg this method will free it whatever return value.
|
||||
*/
|
||||
virtual int send_message(ISrsMessage* msg);
|
||||
private:
|
||||
/**
|
||||
* when recv message, update the context.
|
||||
*/
|
||||
virtual int on_recv_message(SrsCommonMessage* msg);
|
||||
virtual int response_acknowledgement_message();
|
||||
virtual int response_ping_message(int32_t timestamp);
|
||||
/**
|
||||
* when message sentout, update the context.
|
||||
*/
|
||||
virtual int on_send_message(ISrsMessage* msg);
|
||||
/**
|
||||
* try to recv interlaced message from peer,
|
||||
* return error if error occur and nerver set the pmsg,
|
||||
* return success and pmsg set to NULL if no entire message got,
|
||||
* return success and pmsg set to entire message if got one.
|
||||
*/
|
||||
virtual int recv_interlaced_message(SrsCommonMessage** pmsg);
|
||||
/**
|
||||
* read the chunk basic header(fmt, cid) from chunk stream.
|
||||
* user can discovery a SrsChunkStream by cid.
|
||||
* @bh_size return the chunk basic header size, to remove the used bytes when finished.
|
||||
*/
|
||||
virtual int read_basic_header(char& fmt, int& cid, int& bh_size);
|
||||
/**
|
||||
* read the chunk message header(timestamp, payload_length, message_type, stream_id)
|
||||
* from chunk stream and save to SrsChunkStream.
|
||||
* @mh_size return the chunk message header size, to remove the used bytes when finished.
|
||||
*/
|
||||
virtual int read_message_header(SrsChunkStream* chunk, char fmt, int bh_size, int& mh_size);
|
||||
/**
|
||||
* read the chunk payload, remove the used bytes in buffer,
|
||||
* if got entire message, set the pmsg.
|
||||
* @payload_size read size in this roundtrip, generally a chunk size or left message size.
|
||||
*/
|
||||
virtual int read_message_payload(SrsChunkStream* chunk, int bh_size, int mh_size, int& payload_size, SrsCommonMessage** pmsg);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -338,44 +285,6 @@ public:
|
|||
void initialize_video(int size, u_int32_t time, int stream);
|
||||
};
|
||||
|
||||
/**
|
||||
* incoming chunk stream maybe interlaced,
|
||||
* use the chunk stream to cache the input RTMP chunk streams.
|
||||
*/
|
||||
class SrsChunkStream
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* represents the basic header fmt,
|
||||
* which used to identify the variant message header type.
|
||||
*/
|
||||
char fmt;
|
||||
/**
|
||||
* represents the basic header cid,
|
||||
* which is the chunk stream id.
|
||||
*/
|
||||
int cid;
|
||||
/**
|
||||
* cached message header
|
||||
*/
|
||||
SrsMessageHeader header;
|
||||
/**
|
||||
* whether the chunk message header has extended timestamp.
|
||||
*/
|
||||
bool extended_timestamp;
|
||||
/**
|
||||
* partially read message.
|
||||
*/
|
||||
SrsCommonMessage* msg;
|
||||
/**
|
||||
* decoded msg count, to identify whether the chunk stream is fresh.
|
||||
*/
|
||||
int64_t msg_count;
|
||||
public:
|
||||
SrsChunkStream(int _cid);
|
||||
virtual ~SrsChunkStream();
|
||||
};
|
||||
|
||||
/**
|
||||
* incoming chunk stream maybe interlaced,
|
||||
* use the chunk stream to cache the input RTMP chunk streams.
|
||||
|
@ -479,156 +388,6 @@ public:
|
|||
virtual __SrsSharedPtrMessage* copy();
|
||||
};
|
||||
|
||||
/**
|
||||
* message to output.
|
||||
*/
|
||||
class ISrsMessage
|
||||
{
|
||||
// 4.1. Message Header
|
||||
public:
|
||||
SrsMessageHeader header;
|
||||
// 4.2. Message Payload
|
||||
public:
|
||||
/**
|
||||
* The other part which is the payload is the actual data that is
|
||||
* contained in the message. For example, it could be some audio samples
|
||||
* or compressed video data. The payload format and interpretation are
|
||||
* beyond the scope of this document.
|
||||
*/
|
||||
int32_t size;
|
||||
int8_t* payload;
|
||||
public:
|
||||
ISrsMessage();
|
||||
virtual ~ISrsMessage();
|
||||
public:
|
||||
/**
|
||||
* whether message canbe decoded.
|
||||
* only update the context when message canbe decoded.
|
||||
*/
|
||||
virtual bool can_decode() = 0;
|
||||
/**
|
||||
* encode functions.
|
||||
*/
|
||||
public:
|
||||
/**
|
||||
* get the perfered cid(chunk stream id) which sendout over.
|
||||
*/
|
||||
virtual int get_perfer_cid() = 0;
|
||||
/**
|
||||
* encode the packet to message payload bytes.
|
||||
* @remark there exists empty packet, so maybe the payload is NULL.
|
||||
*/
|
||||
virtual int encode_packet() = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* common RTMP message defines in rtmp.part2.Message-Formats.pdf.
|
||||
* cannbe parse and decode.
|
||||
*/
|
||||
class SrsCommonMessage : public ISrsMessage
|
||||
{
|
||||
private:
|
||||
disable_default_copy(SrsCommonMessage);
|
||||
// decoded message payload.
|
||||
private:
|
||||
SrsStream* stream;
|
||||
SrsPacket* packet;
|
||||
public:
|
||||
SrsCommonMessage();
|
||||
virtual ~SrsCommonMessage();
|
||||
public:
|
||||
virtual bool can_decode();
|
||||
/**
|
||||
* decode functions.
|
||||
*/
|
||||
public:
|
||||
/**
|
||||
* decode packet from message payload.
|
||||
*/
|
||||
// TODO: use protocol to decode it.
|
||||
virtual int decode_packet(SrsProtocol* protocol);
|
||||
/**
|
||||
* whether msg has decoded packet.
|
||||
*/
|
||||
virtual bool has_packet();
|
||||
/**
|
||||
* get the decoded packet which decoded by decode_packet().
|
||||
* @remark, user never free the pkt, the message will auto free it.
|
||||
*/
|
||||
virtual SrsPacket* get_packet();
|
||||
/**
|
||||
* encode functions.
|
||||
*/
|
||||
public:
|
||||
/**
|
||||
* get the perfered cid(chunk stream id) which sendout over.
|
||||
*/
|
||||
virtual int get_perfer_cid();
|
||||
/**
|
||||
* set the encoded packet to encode_packet() to payload.
|
||||
* @stream_id, the id of stream which is created by createStream.
|
||||
* @remark, user never free the pkt, the message will auto free it.
|
||||
* @return message itself.
|
||||
*/
|
||||
// TODO: refine the send methods.
|
||||
virtual SrsCommonMessage* set_packet(SrsPacket* pkt, int stream_id);
|
||||
/**
|
||||
* encode the packet to message payload bytes.
|
||||
* @remark there exists empty packet, so maybe the payload is NULL.
|
||||
*/
|
||||
virtual int encode_packet();
|
||||
};
|
||||
|
||||
/**
|
||||
* shared ptr message.
|
||||
* for audio/video/data message that need less memory copy.
|
||||
* and only for output.
|
||||
*/
|
||||
class SrsSharedPtrMessage : public ISrsMessage
|
||||
{
|
||||
private:
|
||||
struct SrsSharedPtr
|
||||
{
|
||||
char* payload;
|
||||
int size;
|
||||
int perfer_cid;
|
||||
int shared_count;
|
||||
|
||||
SrsSharedPtr();
|
||||
virtual ~SrsSharedPtr();
|
||||
};
|
||||
SrsSharedPtr* ptr;
|
||||
public:
|
||||
SrsSharedPtrMessage();
|
||||
virtual ~SrsSharedPtrMessage();
|
||||
public:
|
||||
virtual bool can_decode();
|
||||
public:
|
||||
/**
|
||||
* set the shared payload.
|
||||
* we will detach the payload of source,
|
||||
* so ensure donot use it before.
|
||||
*/
|
||||
virtual int initialize(SrsCommonMessage* source);
|
||||
/**
|
||||
* set the shared payload.
|
||||
* use source header, and specified param payload.
|
||||
*/
|
||||
virtual int initialize(SrsMessageHeader* source, char* payload, int size);
|
||||
virtual SrsSharedPtrMessage* copy();
|
||||
public:
|
||||
/**
|
||||
* get the perfered cid(chunk stream id) which sendout over.
|
||||
*/
|
||||
virtual int get_perfer_cid();
|
||||
/**
|
||||
* ignored.
|
||||
* for shared message, nothing should be done.
|
||||
* use initialize() to set the data.
|
||||
*/
|
||||
virtual int encode_packet();
|
||||
};
|
||||
|
||||
/**
|
||||
* the decoded message payload.
|
||||
* @remark we seperate the packet from message,
|
||||
|
@ -1374,44 +1133,6 @@ protected:
|
|||
* if need to set timeout, use set timeout of SrsProtocol.
|
||||
*/
|
||||
template<class T>
|
||||
int srs_rtmp_expect_message(SrsProtocol* protocol, SrsCommonMessage** pmsg, T** ppacket)
|
||||
{
|
||||
*pmsg = NULL;
|
||||
*ppacket = NULL;
|
||||
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
while (true) {
|
||||
SrsCommonMessage* msg = NULL;
|
||||
if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) {
|
||||
srs_error("recv message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
srs_verbose("recv message success.");
|
||||
|
||||
if ((ret = msg->decode_packet(protocol)) != ERROR_SUCCESS) {
|
||||
delete msg;
|
||||
srs_error("decode message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
T* pkt = dynamic_cast<T*>(msg->get_packet());
|
||||
if (!pkt) {
|
||||
delete msg;
|
||||
srs_trace("drop message(type=%d, size=%d, time=%"PRId64", sid=%d).",
|
||||
msg->header.message_type, msg->header.payload_length,
|
||||
msg->header.timestamp, msg->header.stream_id);
|
||||
continue;
|
||||
}
|
||||
|
||||
*pmsg = msg;
|
||||
*ppacket = pkt;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
template<class T>
|
||||
int __srs_rtmp_expect_message(SrsProtocol* protocol, __SrsMessage** pmsg, T** ppacket)
|
||||
{
|
||||
*pmsg = NULL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue