1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

RTC: Use shared message for RTP packet

This commit is contained in:
winlin 2020-05-14 14:26:19 +08:00
parent 4e1935f678
commit f794a7d3a7
8 changed files with 195 additions and 59 deletions

View file

@ -844,6 +844,36 @@ srs_error_t SrsRtcPlayer::messages_to_packets(SrsRtcSource* source, vector<SrsRt
return err;
}
srs_error_t SrsRtcPlayer::package_opus(SrsRtpPacket2* pkt)
{
srs_error_t err = srs_success;
pkt->rtp_header.set_timestamp(audio_timestamp);
pkt->rtp_header.set_sequence(audio_sequence++);
pkt->rtp_header.set_ssrc(audio_ssrc);
pkt->rtp_header.set_payload_type(audio_payload_type);
// TODO: FIXME: Padding audio to the max payload in RTP packets.
if (max_padding > 0) {
}
// TODO: FIXME: Why 960? Need Refactoring?
audio_timestamp += 960;
return err;
}
srs_error_t SrsRtcPlayer::package_video(SrsRtpPacket2* pkt)
{
srs_error_t err = srs_success;
pkt->rtp_header.set_sequence(video_sequence++);
pkt->rtp_header.set_ssrc(video_ssrc);
pkt->rtp_header.set_payload_type(video_payload_type);
return err;
}
srs_error_t SrsRtcPlayer::send_packets(std::vector<SrsRtpPacket2*>& pkts, SrsRtcOutgoingPackets& info)
{
srs_error_t err = srs_success;
@ -1159,36 +1189,6 @@ srs_error_t SrsRtcPlayer::send_packets_gso(vector<SrsRtpPacket2*>& pkts, SrsRtcO
return err;
}
srs_error_t SrsRtcPlayer::package_opus(SrsRtpPacket2* pkt)
{
srs_error_t err = srs_success;
pkt->rtp_header.set_timestamp(audio_timestamp);
pkt->rtp_header.set_sequence(audio_sequence++);
pkt->rtp_header.set_ssrc(audio_ssrc);
pkt->rtp_header.set_payload_type(audio_payload_type);
// TODO: FIXME: Padding audio to the max payload in RTP packets.
if (max_padding > 0) {
}
// TODO: FIXME: Why 960? Need Refactoring?
audio_timestamp += 960;
return err;
}
srs_error_t SrsRtcPlayer::package_video(SrsRtpPacket2* pkt)
{
srs_error_t err = srs_success;
pkt->rtp_header.set_sequence(video_sequence++);
pkt->rtp_header.set_ssrc(video_ssrc);
pkt->rtp_header.set_payload_type(video_payload_type);
return err;
}
void SrsRtcPlayer::nack_fetch(vector<SrsRtpPacket2*>& pkts, uint32_t ssrc, uint16_t seq)
{
SrsRtpPacket2* pkt = NULL;
@ -1712,7 +1712,8 @@ srs_error_t SrsRtcPublisher::on_rtp(char* buf, int nb_buf)
SrsRtpPacket2* pkt = new SrsRtpPacket2();
pkt->set_decode_handler(this);
pkt->original_bytes = buf;
pkt->original_msg = new SrsSharedPtrMessage();
pkt->original_msg->wrap(buf, nb_buf);
SrsBuffer b(buf, nb_buf);
if ((err = pkt->decode(&b)) != srs_success) {
@ -1737,7 +1738,7 @@ srs_error_t SrsRtcPublisher::on_rtp(char* buf, int nb_buf)
}
}
void SrsRtcPublisher::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsCodec** ppayload)
void SrsRtcPublisher::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload)
{
// No payload, ignore.
if (buf->empty()) {

View file

@ -257,11 +257,10 @@ public:
private:
srs_error_t send_messages(SrsRtcSource* source, std::vector<SrsRtpPacket2*>& pkts, SrsRtcOutgoingPackets& info);
srs_error_t messages_to_packets(SrsRtcSource* source, std::vector<SrsRtpPacket2*>& pkts, SrsRtcOutgoingPackets& info);
srs_error_t send_packets(std::vector<SrsRtpPacket2*>& pkts, SrsRtcOutgoingPackets& info);
srs_error_t send_packets_gso(std::vector<SrsRtpPacket2*>& pkts, SrsRtcOutgoingPackets& info);
private:
srs_error_t package_opus(SrsRtpPacket2* pkt);
srs_error_t package_video(SrsRtpPacket2* pkt);
srs_error_t send_packets(std::vector<SrsRtpPacket2*>& pkts, SrsRtcOutgoingPackets& info);
srs_error_t send_packets_gso(std::vector<SrsRtpPacket2*>& pkts, SrsRtcOutgoingPackets& info);
public:
void nack_fetch(std::vector<SrsRtpPacket2*>& pkts, uint32_t ssrc, uint16_t seq);
void simulate_nack_drop(int nn);
@ -313,7 +312,7 @@ private:
srs_error_t send_rtcp_fb_pli(uint32_t ssrc);
public:
srs_error_t on_rtp(char* buf, int nb_buf);
virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsCodec** ppayload);
virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload);
private:
srs_error_t on_audio(SrsRtpPacket2* pkt);
srs_error_t on_video(SrsRtpPacket2* pkt);

View file

@ -424,9 +424,11 @@ srs_error_t SrsRtcSource::on_rtp(SrsRtpPacket2* pkt)
{
srs_error_t err = srs_success;
SrsAutoFree(SrsRtpPacket2, pkt);
for (int i = 0; i < (int)consumers.size(); i++) {
SrsRtcConsumer* consumer = consumers.at(i);
if ((err = consumer->enqueue2(pkt)) != srs_success) {
if ((err = consumer->enqueue2(pkt->copy())) != srs_success) {
return srs_error_wrap(err, "consume message");
}
}
@ -702,8 +704,8 @@ srs_error_t SrsRtcFromRtmpBridger::package_opus(char* data, int size, SrsRtpPack
raw->nn_payload = size;
memcpy(raw->payload, data, size);
// When free the RTP packet, should free the bytes allocated here.
pkt->original_bytes = raw->payload;
pkt->original_msg = new SrsSharedPtrMessage();
pkt->original_msg->wrap(raw->payload, size);
*ppkt = pkt;
@ -846,27 +848,29 @@ srs_error_t SrsRtcFromRtmpBridger::package_stap_a(SrsRtcSource* source, SrsShare
stap->nri = (SrsAvcNaluType)header;
// Copy the SPS/PPS bytes, because it may change.
char* p = new char[sps.size() + pps.size()];
pkt->original_bytes = p;
int size = (int)(sps.size() + pps.size());
char* payload = new char[size];
pkt->original_msg = new SrsSharedPtrMessage();
pkt->original_msg->wrap(payload, size);
if (true) {
SrsSample* sample = new SrsSample();
sample->bytes = p;
sample->bytes = payload;
sample->size = (int)sps.size();
stap->nalus.push_back(sample);
memcpy(p, (char*)&sps[0], sps.size());
p += (int)sps.size();
memcpy(payload, (char*)&sps[0], sps.size());
payload += (int)sps.size();
}
if (true) {
SrsSample* sample = new SrsSample();
sample->bytes = p;
sample->bytes = payload;
sample->size = (int)pps.size();
stap->nalus.push_back(sample);
memcpy(p, (char*)&pps[0], pps.size());
p += (int)pps.size();
memcpy(payload, (char*)&pps[0], pps.size());
payload += (int)pps.size();
}
*ppkt = pkt;