mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Support fast padding
This commit is contained in:
parent
e4eb501c57
commit
cf52390cf2
7 changed files with 37 additions and 6 deletions
|
@ -195,15 +195,19 @@ srs_error_t SrsRtpOpusMuxer::transcode(SrsSharedPtrMessage* shared_audio, char*
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nn_max_extra_payload = 0;
|
||||||
SrsSample samples[nn_opus_packets];
|
SrsSample samples[nn_opus_packets];
|
||||||
for (int i = 0; i < nn_opus_packets; i++) {
|
for (int i = 0; i < nn_opus_packets; i++) {
|
||||||
SrsSample* p = samples + i;
|
SrsSample* p = samples + i;
|
||||||
p->size = opus_sizes[i];
|
p->size = opus_sizes[i];
|
||||||
p->bytes = new char[p->size];
|
p->bytes = new char[p->size];
|
||||||
memcpy(p->bytes, opus_payloads[i], p->size);
|
memcpy(p->bytes, opus_payloads[i], p->size);
|
||||||
|
|
||||||
|
nn_max_extra_payload = srs_max(nn_max_extra_payload, p->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_audio->set_extra_payloads(samples, nn_opus_packets);
|
shared_audio->set_extra_payloads(samples, nn_opus_packets);
|
||||||
|
shared_audio->set_max_extra_payload(nn_max_extra_payload);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -830,7 +830,7 @@ srs_error_t SrsRtcSenderThread::messages_to_packets(
|
||||||
|
|
||||||
for (int i = 0; i < nn_extra_payloads; i++) {
|
for (int i = 0; i < nn_extra_payloads; i++) {
|
||||||
SrsSample* sample = msg->extra_payloads() + i;
|
SrsSample* sample = msg->extra_payloads() + i;
|
||||||
if ((err = packet_opus(sample, packets)) != srs_success) {
|
if ((err = packet_opus(sample, packets, msg->nn_max_extra_payloads())) != srs_success) {
|
||||||
return srs_error_wrap(err, "opus package");
|
return srs_error_wrap(err, "opus package");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1003,7 +1003,7 @@ srs_error_t SrsRtcSenderThread::send_packets_gso(SrsRtcPackets& packets)
|
||||||
srs_trace("#%d, Padding %d bytes %d=>%d, packets %d, max_padding %d", packets.debug_id,
|
srs_trace("#%d, Padding %d bytes %d=>%d, packets %d, max_padding %d", packets.debug_id,
|
||||||
padding, nn_packet, nn_packet + padding, nn_packets, max_padding);
|
padding, nn_packet, nn_packet + padding, nn_packets, max_padding);
|
||||||
#endif
|
#endif
|
||||||
packet->set_padding(padding);
|
packet->add_padding(padding);
|
||||||
nn_packet += padding;
|
nn_packet += padding;
|
||||||
packets.nn_paddings++;
|
packets.nn_paddings++;
|
||||||
packets.nn_padding_bytes += padding;
|
packets.nn_padding_bytes += padding;
|
||||||
|
@ -1232,7 +1232,7 @@ srs_error_t SrsRtcSenderThread::packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPac
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtcSenderThread::packet_opus(SrsSample* sample, SrsRtcPackets& packets)
|
srs_error_t SrsRtcSenderThread::packet_opus(SrsSample* sample, SrsRtcPackets& packets, int nn_max_payload)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
@ -1247,6 +1247,18 @@ srs_error_t SrsRtcSenderThread::packet_opus(SrsSample* sample, SrsRtcPackets& pa
|
||||||
raw->payload = sample->bytes;
|
raw->payload = sample->bytes;
|
||||||
raw->nn_payload = sample->size;
|
raw->nn_payload = sample->size;
|
||||||
|
|
||||||
|
if (max_padding > 0) {
|
||||||
|
if (sample->size < nn_max_payload && nn_max_payload - sample->size < max_padding) {
|
||||||
|
int padding = nn_max_payload - sample->size;
|
||||||
|
packet->set_padding(padding);
|
||||||
|
|
||||||
|
#if defined(SRS_DEBUG)
|
||||||
|
srs_trace("#%d, Fast Padding %d bytes %d=>%d, SN=%d, max_payload %d, max_padding %d", packets.debug_id,
|
||||||
|
padding, sample->size, sample->size + padding, packet->rtp_header.get_sequence(), nn_max_payload, max_padding);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: FIXME: Why 960? Need Refactoring?
|
// TODO: FIXME: Why 960? Need Refactoring?
|
||||||
audio_timestamp += 960;
|
audio_timestamp += 960;
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,6 @@ private:
|
||||||
bool merge_nalus;
|
bool merge_nalus;
|
||||||
bool gso;
|
bool gso;
|
||||||
int max_padding;
|
int max_padding;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SrsRtcSenderThread(SrsRtcSession* s, SrsUdpMuxSocket* u, int parent_cid);
|
SrsRtcSenderThread(SrsRtcSession* s, SrsUdpMuxSocket* u, int parent_cid);
|
||||||
virtual ~SrsRtcSenderThread();
|
virtual ~SrsRtcSenderThread();
|
||||||
|
@ -218,7 +217,7 @@ private:
|
||||||
srs_error_t send_packets(SrsRtcPackets& packets);
|
srs_error_t send_packets(SrsRtcPackets& packets);
|
||||||
srs_error_t send_packets_gso(SrsRtcPackets& packets);
|
srs_error_t send_packets_gso(SrsRtcPackets& packets);
|
||||||
private:
|
private:
|
||||||
srs_error_t packet_opus(SrsSample* sample, SrsRtcPackets& packets);
|
srs_error_t packet_opus(SrsSample* sample, SrsRtcPackets& packets, int nn_max_payload);
|
||||||
private:
|
private:
|
||||||
srs_error_t packet_fu_a(SrsSharedPtrMessage* msg, SrsSample* sample, int fu_payload_size, SrsRtcPackets& packets);
|
srs_error_t packet_fu_a(SrsSharedPtrMessage* msg, SrsSample* sample, int fu_payload_size, SrsRtcPackets& packets);
|
||||||
srs_error_t packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPackets& packets);
|
srs_error_t packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPackets& packets);
|
||||||
|
|
|
@ -218,6 +218,7 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::SrsSharedPtrPayload()
|
||||||
|
|
||||||
extra_payloads = NULL;
|
extra_payloads = NULL;
|
||||||
nn_extra_payloads = 0;
|
nn_extra_payloads = 0;
|
||||||
|
nn_max_extra_payloads = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -310,10 +310,14 @@ private:
|
||||||
int nn_samples;
|
int nn_samples;
|
||||||
// For RTC video, whether NALUs has IDR.
|
// For RTC video, whether NALUs has IDR.
|
||||||
bool has_idr;
|
bool has_idr;
|
||||||
|
public:
|
||||||
// For RTC audio, we may need to transcode AAC to opus,
|
// For RTC audio, we may need to transcode AAC to opus,
|
||||||
// so there must be an extra payloads, which is transformed from payload.
|
// so there must be an extra payloads, which is transformed from payload.
|
||||||
SrsSample* extra_payloads;
|
SrsSample* extra_payloads;
|
||||||
int nn_extra_payloads;
|
int nn_extra_payloads;
|
||||||
|
// The max size payload in extras.
|
||||||
|
// @remark For GSO to fast guess the best padding.
|
||||||
|
int nn_max_extra_payloads;
|
||||||
#endif
|
#endif
|
||||||
public:
|
public:
|
||||||
SrsSharedPtrPayload();
|
SrsSharedPtrPayload();
|
||||||
|
@ -363,6 +367,9 @@ public:
|
||||||
void set_extra_payloads(SrsSample* payloads, int nn_payloads);
|
void set_extra_payloads(SrsSample* payloads, int nn_payloads);
|
||||||
int nn_extra_payloads() { return ptr->nn_extra_payloads; }
|
int nn_extra_payloads() { return ptr->nn_extra_payloads; }
|
||||||
SrsSample* extra_payloads() { return ptr->extra_payloads; }
|
SrsSample* extra_payloads() { return ptr->extra_payloads; }
|
||||||
|
// The max extra payload size.
|
||||||
|
void set_max_extra_payload(int v) { ptr->nn_max_extra_payloads = v; }
|
||||||
|
int nn_max_extra_payloads() { return ptr->nn_max_extra_payloads; }
|
||||||
// Whether samples has idr.
|
// Whether samples has idr.
|
||||||
bool has_idr() { return ptr->has_idr; }
|
bool has_idr() { return ptr->has_idr; }
|
||||||
void set_has_idr(bool v) { ptr->has_idr = v; }
|
void set_has_idr(bool v) { ptr->has_idr = v; }
|
||||||
|
|
|
@ -199,6 +199,12 @@ void SrsRtpPacket2::set_padding(int size)
|
||||||
padding = size;
|
padding = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SrsRtpPacket2::add_padding(int size)
|
||||||
|
{
|
||||||
|
rtp_header.set_padding(padding + size > 0);
|
||||||
|
padding += size;
|
||||||
|
}
|
||||||
|
|
||||||
void SrsRtpPacket2::reset()
|
void SrsRtpPacket2::reset()
|
||||||
{
|
{
|
||||||
rtp_header.reset();
|
rtp_header.reset();
|
||||||
|
|
|
@ -91,8 +91,10 @@ public:
|
||||||
SrsRtpPacket2();
|
SrsRtpPacket2();
|
||||||
virtual ~SrsRtpPacket2();
|
virtual ~SrsRtpPacket2();
|
||||||
public:
|
public:
|
||||||
// Append size of bytes as padding.
|
// Set the padding of RTP packet.
|
||||||
void set_padding(int size);
|
void set_padding(int size);
|
||||||
|
// Increase the padding of RTP packet.
|
||||||
|
void add_padding(int size);
|
||||||
// Reset RTP packet.
|
// Reset RTP packet.
|
||||||
void reset();
|
void reset();
|
||||||
// Reuse the cached raw message as payload.
|
// Reuse the cached raw message as payload.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue