mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
add miss files. fix bug #60: support aggregate message
This commit is contained in:
parent
f6dd1371bf
commit
8388da6325
12 changed files with 247 additions and 3 deletions
|
@ -214,6 +214,15 @@ int SrsEdgeIngester::process_publish_message(SrsMessage* msg)
|
|||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// process aggregate packet
|
||||
if (msg->header.is_aggregate()) {
|
||||
if ((ret = source->on_aggregate(msg)) != ERROR_SUCCESS) {
|
||||
srs_error("source process aggregate message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// process onMetaData
|
||||
if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
|
||||
|
|
|
@ -724,6 +724,15 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsMessage* msg, boo
|
|||
return ret;
|
||||
}
|
||||
|
||||
// process aggregate packet
|
||||
if (msg->header.is_aggregate()) {
|
||||
if ((ret = source->on_aggregate(msg)) != ERROR_SUCCESS) {
|
||||
srs_error("source process aggregate message failed. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
// process onMetaData
|
||||
if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
|
||||
SrsPacket* pkt = NULL;
|
||||
|
|
|
@ -469,6 +469,7 @@ SrsSource::SrsSource(SrsRequest* req)
|
|||
play_edge = new SrsPlayEdge();
|
||||
publish_edge = new SrsPublishEdge();
|
||||
gop_cache = new SrsGopCache();
|
||||
aggregate_stream = new SrsStream();
|
||||
|
||||
_srs_config->subscribe(this);
|
||||
atc = _srs_config->get_atc(_req->vhost);
|
||||
|
@ -498,6 +499,7 @@ SrsSource::~SrsSource()
|
|||
srs_freep(play_edge);
|
||||
srs_freep(publish_edge);
|
||||
srs_freep(gop_cache);
|
||||
srs_freep(aggregate_stream);
|
||||
|
||||
#ifdef SRS_AUTO_HLS
|
||||
srs_freep(hls);
|
||||
|
@ -1069,6 +1071,105 @@ int SrsSource::on_video(SrsMessage* video)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int SrsSource::on_aggregate(SrsMessage* msg)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
SrsStream* stream = aggregate_stream;
|
||||
if ((ret = stream->initialize((char*)msg->payload, msg->size)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
while (!stream->empty()) {
|
||||
if (!stream->require(1)) {
|
||||
ret = ERROR_RTMP_AGGREGATE;
|
||||
srs_error("invalid aggregate message type. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
int8_t type = stream->read_1bytes();
|
||||
|
||||
if (!stream->require(3)) {
|
||||
ret = ERROR_RTMP_AGGREGATE;
|
||||
srs_error("invalid aggregate message size. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
int32_t data_size = stream->read_3bytes();
|
||||
|
||||
if (data_size < 0) {
|
||||
ret = ERROR_RTMP_AGGREGATE;
|
||||
srs_error("invalid aggregate message size(negative). ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!stream->require(3)) {
|
||||
ret = ERROR_RTMP_AGGREGATE;
|
||||
srs_error("invalid aggregate message time. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
int32_t timestamp = stream->read_3bytes();
|
||||
|
||||
if (!stream->require(1)) {
|
||||
ret = ERROR_RTMP_AGGREGATE;
|
||||
srs_error("invalid aggregate message time(high). ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
int32_t time_h = stream->read_1bytes();
|
||||
|
||||
timestamp |= time_h<<24;
|
||||
timestamp &= 0x7FFFFFFF;
|
||||
|
||||
if (!stream->require(3)) {
|
||||
ret = ERROR_RTMP_AGGREGATE;
|
||||
srs_error("invalid aggregate message stream_id. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
int32_t stream_id = stream->read_3bytes();
|
||||
|
||||
if (data_size > 0 && !stream->require(data_size)) {
|
||||
ret = ERROR_RTMP_AGGREGATE;
|
||||
srs_error("invalid aggregate message data. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// to common message.
|
||||
SrsCommonMessage __o;
|
||||
SrsMessage& o = __o;
|
||||
|
||||
o.header.message_type = type;
|
||||
o.header.payload_length = data_size;
|
||||
o.header.timestamp_delta = timestamp;
|
||||
o.header.timestamp = timestamp;
|
||||
o.header.stream_id = stream_id;
|
||||
o.header.perfer_cid = msg->header.perfer_cid;
|
||||
|
||||
if (data_size > 0) {
|
||||
o.size = data_size;
|
||||
o.payload = new int8_t[o.size];
|
||||
stream->read_bytes((char*)o.payload, o.size);
|
||||
}
|
||||
|
||||
if (!stream->require(4)) {
|
||||
ret = ERROR_RTMP_AGGREGATE;
|
||||
srs_error("invalid aggregate message previous tag size. ret=%d", ret);
|
||||
return ret;
|
||||
}
|
||||
stream->read_4bytes();
|
||||
|
||||
// process parsed message
|
||||
if (o.header.is_audio()) {
|
||||
if ((ret = on_audio(&o)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
} else if (o.header.is_video()) {
|
||||
if ((ret = on_video(&o)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SrsSource::on_publish()
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
|
|
@ -57,6 +57,7 @@ class SrsDvr;
|
|||
#ifdef SRS_AUTO_TRANSCODE
|
||||
class SrsEncoder;
|
||||
#endif
|
||||
class SrsStream;
|
||||
|
||||
/**
|
||||
* time jitter detect and correct,
|
||||
|
@ -251,6 +252,8 @@ private:
|
|||
SrsGopCache* gop_cache;
|
||||
// to forward stream to other servers
|
||||
std::vector<SrsForwarder*> forwarders;
|
||||
// for aggregate message
|
||||
SrsStream* aggregate_stream;
|
||||
private:
|
||||
/**
|
||||
* the sample rate of audio in metadata.
|
||||
|
@ -307,6 +310,7 @@ public:
|
|||
virtual int on_meta_data(SrsMessage* msg, SrsOnMetaDataPacket* metadata);
|
||||
virtual int on_audio(SrsMessage* audio);
|
||||
virtual int on_video(SrsMessage* video);
|
||||
virtual int on_aggregate(SrsMessage* msg);
|
||||
/**
|
||||
* publish stream event notify.
|
||||
* @param _req the request from client, the source will deep copy it,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue