1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-15 04:42:04 +00:00

RTC: Refine code

This commit is contained in:
winlin 2021-01-17 20:30:10 +08:00
parent aaa3918a72
commit 09011eea3a
4 changed files with 131 additions and 6 deletions

View file

@ -400,6 +400,11 @@ SrsRtcPlayStream::SrsRtcPlayStream(SrsRtcConnection* s, const SrsContextId& cid)
SrsRtcPlayStream::~SrsRtcPlayStream() SrsRtcPlayStream::~SrsRtcPlayStream()
{ {
// TODO: FIXME: Should not do callback in de-constructor?
if (_srs_rtc_hijacker) {
_srs_rtc_hijacker->on_stop_play(session_, this, req_);
}
_srs_config->unsubscribe(this); _srs_config->unsubscribe(this);
srs_freep(nack_epp); srs_freep(nack_epp);
@ -933,16 +938,20 @@ SrsRtcPublishStream::SrsRtcPublishStream(SrsRtcConnection* session, const SrsCon
SrsRtcPublishStream::~SrsRtcPublishStream() SrsRtcPublishStream::~SrsRtcPublishStream()
{ {
if (_srs_rtc_hijacker) {
_srs_rtc_hijacker->on_stop_publish(session_, this, req);
}
// TODO: FIXME: Should remove and delete source. // TODO: FIXME: Should remove and delete source.
if (source) { if (source) {
source->set_publish_stream(NULL); source->set_publish_stream(NULL);
source->on_unpublish(); source->on_unpublish();
} }
// TODO: FIXME: Should not do callback in de-constructor?
// NOTE: on_stop_publish lead to switch io,
// it must be called after source stream unpublish (set source stream is_created=false).
// if not, it lead to republish failed.
if (_srs_rtc_hijacker) {
_srs_rtc_hijacker->on_stop_publish(session_, this, req);
}
for (int i = 0; i < (int)video_tracks_.size(); ++i) { for (int i = 0; i < (int)video_tracks_.size(); ++i) {
SrsRtcVideoRecvTrack* track = video_tracks_.at(i); SrsRtcVideoRecvTrack* track = video_tracks_.at(i);
srs_freep(track); srs_freep(track);
@ -1779,6 +1788,7 @@ srs_error_t SrsRtcConnection::add_publisher(SrsRequest* req, const SrsSdp& remot
SrsRtcStreamDescription* stream_desc = new SrsRtcStreamDescription(); SrsRtcStreamDescription* stream_desc = new SrsRtcStreamDescription();
SrsAutoFree(SrsRtcStreamDescription, stream_desc); SrsAutoFree(SrsRtcStreamDescription, stream_desc);
// TODO: FIXME: Change to api of stream desc.
if ((err = negotiate_publish_capability(req, remote_sdp, stream_desc)) != srs_success) { if ((err = negotiate_publish_capability(req, remote_sdp, stream_desc)) != srs_success) {
return srs_error_wrap(err, "publish negotiate"); return srs_error_wrap(err, "publish negotiate");
} }

View file

@ -575,6 +575,8 @@ public:
virtual srs_error_t on_before_play(SrsRtcConnection* session, SrsRequest* req) = 0; virtual srs_error_t on_before_play(SrsRtcConnection* session, SrsRequest* req) = 0;
// When start player by RTC. // When start player by RTC.
virtual srs_error_t on_start_play(SrsRtcConnection* session, SrsRtcPlayStream* player, SrsRequest* req) = 0; virtual srs_error_t on_start_play(SrsRtcConnection* session, SrsRtcPlayStream* player, SrsRequest* req) = 0;
// When stop player by RTC.
virtual void on_stop_play(SrsRtcConnection* session, SrsRtcPlayStream* player, SrsRequest* req) = 0;
// When start consuming for player for RTC. // When start consuming for player for RTC.
virtual srs_error_t on_start_consume(SrsRtcConnection* session, SrsRtcPlayStream* player, SrsRequest* req, SrsRtcConsumer* consumer) = 0; virtual srs_error_t on_start_consume(SrsRtcConnection* session, SrsRtcPlayStream* player, SrsRequest* req, SrsRtcConsumer* consumer) = 0;
}; };

View file

@ -179,6 +179,58 @@ void SrsRtpExtensionTwcc::set_sn(uint16_t sn)
has_twcc_ = true; has_twcc_ = true;
} }
SrsRtpExtensionOneByte::SrsRtpExtensionOneByte() : has_ext_(false), id_(0), value_(0)
{
}
void SrsRtpExtensionOneByte::set_id(int id)
{
id_ = id;
has_ext_ = true;
}
void SrsRtpExtensionOneByte::set_value(uint8_t value)
{
value_ = value;
has_ext_ = true;
}
srs_error_t SrsRtpExtensionOneByte::decode(SrsBuffer* buf)
{
srs_error_t err = srs_success;
if (!buf->require(2)) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 2);
}
uint8_t v = buf->read_1bytes();
id_ = (v & 0xF0) >> 4;
uint8_t len = (v & 0x0F);
if(!id_ || len != 0) {
return srs_error_new(ERROR_RTC_RTP, "invalid rtp extension id=%d, len=%d", id_, len);
}
value_ = buf->read_1bytes();
has_ext_ = true;
return err;
}
srs_error_t SrsRtpExtensionOneByte::encode(SrsBuffer* buf)
{
srs_error_t err = srs_success;
if (!buf->require(2)) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "requires %d bytes", 2);
}
uint8_t id_len = (id_ & 0x0F)<< 4 | 0x00;
buf->write_1bytes(id_len);
buf->write_1bytes(value_);
return err;
}
SrsRtpExtensions::SrsRtpExtensions() : has_ext_(false) SrsRtpExtensions::SrsRtpExtensions() : has_ext_(false)
{ {
} }
@ -252,6 +304,11 @@ srs_error_t SrsRtpExtensions::decode_0xbede(SrsBuffer* buf)
return srs_error_wrap(err, "decode twcc extension"); return srs_error_wrap(err, "decode twcc extension");
} }
has_ext_ = true; has_ext_ = true;
} else if (xtype == kRtpExtensionAudioLevel) {
if((err = audio_level_.decode(buf)) != srs_success) {
return srs_error_wrap(err, "decode audio level extension");
}
has_ext_ = true;
} else { } else {
buf->skip(1 + (len + 1)); buf->skip(1 + (len + 1));
} }
@ -263,6 +320,7 @@ srs_error_t SrsRtpExtensions::decode_0xbede(SrsBuffer* buf)
uint64_t SrsRtpExtensions::nb_bytes() uint64_t SrsRtpExtensions::nb_bytes()
{ {
int size = 4 + (twcc_.has_twcc_ext() ? twcc_.nb_bytes() : 0); int size = 4 + (twcc_.has_twcc_ext() ? twcc_.nb_bytes() : 0);
size += (audio_level_.exists() ? audio_level_.nb_bytes() : 0);
// add padding // add padding
size += (size % 4 == 0) ? 0 : (4 - size % 4); size += (size % 4 == 0) ? 0 : (4 - size % 4);
return size; return size;
@ -281,6 +339,10 @@ srs_error_t SrsRtpExtensions::encode(SrsBuffer* buf)
len += twcc_.nb_bytes(); len += twcc_.nb_bytes();
} }
if (audio_level_.exists()) {
len += audio_level_.nb_bytes();
}
int padding_count = (len % 4 == 0) ? 0 : (4 - len % 4); int padding_count = (len % 4 == 0) ? 0 : (4 - len % 4);
len += padding_count; len += padding_count;
@ -293,6 +355,12 @@ srs_error_t SrsRtpExtensions::encode(SrsBuffer* buf)
} }
} }
if (audio_level_.exists()) {
if (srs_success != (err = audio_level_.encode(buf))) {
return srs_error_wrap(err, "encode audio level extension");
}
}
// add padding // add padding
while(padding_count > 0) { while(padding_count > 0) {
buf->write_1bytes(0); buf->write_1bytes(0);
@ -331,6 +399,23 @@ srs_error_t SrsRtpExtensions::set_twcc_sequence_number(uint8_t id, uint16_t sn)
return srs_success; return srs_success;
} }
srs_error_t SrsRtpExtensions::get_audio_level(uint8_t& level)
{
if(audio_level_.exists()) {
level = audio_level_.get_value();
return srs_success;
}
return srs_error_new(ERROR_RTC_RTP_MUXER, "not find rtp extension audio level");
}
srs_error_t SrsRtpExtensions::set_audio_level(int id, uint8_t level)
{
has_ext_ = true;
audio_level_.set_id(id);
audio_level_.set_value(level);
return srs_success;
}
SrsRtpHeader::SrsRtpHeader() SrsRtpHeader::SrsRtpHeader()
{ {
padding_length = 0; padding_length = 0;

View file

@ -86,9 +86,12 @@ enum SrsRtpExtensionType
{ {
kRtpExtensionNone, kRtpExtensionNone,
kRtpExtensionTransportSequenceNumber, kRtpExtensionTransportSequenceNumber,
kRtpExtensionAudioLevel,
kRtpExtensionNumberOfExtensions // Must be the last entity in the enum. kRtpExtensionNumberOfExtensions // Must be the last entity in the enum.
}; };
const std::string kAudioLevelUri = "urn:ietf:params:rtp-hdrext:ssrc-audio-level";
struct SrsExtensionInfo struct SrsExtensionInfo
{ {
SrsRtpExtensionType type; SrsRtpExtensionType type;
@ -96,7 +99,8 @@ struct SrsExtensionInfo
}; };
const SrsExtensionInfo kExtensions[] = { const SrsExtensionInfo kExtensions[] = {
{kRtpExtensionTransportSequenceNumber, std::string("http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01")} {kRtpExtensionTransportSequenceNumber, std::string("http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01")},
{kRtpExtensionAudioLevel, kAudioLevelUri},
}; };
class SrsRtpExtensionTypes class SrsRtpExtensionTypes
@ -138,12 +142,34 @@ public:
virtual uint64_t nb_bytes(); virtual uint64_t nb_bytes();
}; };
class SrsRtpExtensionOneByte : public ISrsCodec
{
bool has_ext_;
int id_;
uint8_t value_;
public:
SrsRtpExtensionOneByte();
virtual ~SrsRtpExtensionOneByte() {}
bool exists() { return has_ext_; }
int get_id() { return id_; }
uint8_t get_value() { return value_; }
void set_id(int id);
void set_value(uint8_t value);
public:
// ISrsCodec
virtual srs_error_t decode(SrsBuffer* buf);
virtual srs_error_t encode(SrsBuffer* buf);
virtual uint64_t nb_bytes() { return 2; };
};
class SrsRtpExtensions : public ISrsCodec class SrsRtpExtensions : public ISrsCodec
{ {
private: private:
bool has_ext_; bool has_ext_;
SrsRtpExtensionTypes types_; SrsRtpExtensionTypes types_;
SrsRtpExtensionTwcc twcc_; SrsRtpExtensionTwcc twcc_;
SrsRtpExtensionOneByte audio_level_;
public: public:
SrsRtpExtensions(); SrsRtpExtensions();
virtual ~SrsRtpExtensions(); virtual ~SrsRtpExtensions();
@ -152,6 +178,8 @@ public:
void set_types_(const SrsRtpExtensionTypes* types); void set_types_(const SrsRtpExtensionTypes* types);
srs_error_t get_twcc_sequence_number(uint16_t& twcc_sn); srs_error_t get_twcc_sequence_number(uint16_t& twcc_sn);
srs_error_t set_twcc_sequence_number(uint8_t id, uint16_t sn); srs_error_t set_twcc_sequence_number(uint8_t id, uint16_t sn);
srs_error_t get_audio_level(uint8_t& level);
srs_error_t set_audio_level(int id, uint8_t level);
// ISrsCodec // ISrsCodec
public: public:
@ -257,7 +285,7 @@ public:
// Whether the packet is Audio packet. // Whether the packet is Audio packet.
bool is_audio(); bool is_audio();
// Copy the RTP packet. // Copy the RTP packet.
SrsRtpPacket2* copy(); virtual SrsRtpPacket2* copy();
// Set RTP header extensions for encoding or decoding header extension // Set RTP header extensions for encoding or decoding header extension
void set_extension_types(const SrsRtpExtensionTypes* v); void set_extension_types(const SrsRtpExtensionTypes* v);
// interface ISrsEncoder // interface ISrsEncoder