mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
For #307, refactor aac to opus code
This commit is contained in:
parent
6ed2a4b6cb
commit
1f2db4d746
5 changed files with 41 additions and 24 deletions
|
@ -208,7 +208,6 @@ srs_error_t SrsRtpH264Muxer::packet_single_nalu(SrsSharedPtrMessage* shared_fram
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
uint8_t header = sample->bytes[0];
|
|
||||||
srs_verbose("rtp single nalu, size=%u, seq=%u, timestamp=%lu", sample->size, sequence, (shared_frame->timestamp * 90));
|
srs_verbose("rtp single nalu, size=%u, seq=%u, timestamp=%lu", sample->size, sequence, (shared_frame->timestamp * 90));
|
||||||
|
|
||||||
SrsRtpSharedPacket* packet = new SrsRtpSharedPacket();
|
SrsRtpSharedPacket* packet = new SrsRtpSharedPacket();
|
||||||
|
@ -287,32 +286,47 @@ srs_error_t SrsRtpOpusMuxer::initialize()
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// An AAC packet may be transcoded to many OPUS packets.
|
||||||
|
const int kMaxOpusPackets = 8;
|
||||||
|
// The max size for each OPUS packet.
|
||||||
|
const int kMaxOpusPacketSize = 4096;
|
||||||
|
|
||||||
srs_error_t SrsRtpOpusMuxer::frame_to_packet(SrsSharedPtrMessage* shared_audio, SrsFormat* format, char* adts_audio, int nn_adts_audio)
|
srs_error_t SrsRtpOpusMuxer::frame_to_packet(SrsSharedPtrMessage* shared_audio, SrsFormat* format, char* adts_audio, int nn_adts_audio)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
vector<SrsRtpSharedPacket*> rtp_packets;
|
// Opus packet cache.
|
||||||
|
static char* opus_payloads[kMaxOpusPackets];
|
||||||
|
|
||||||
char* data_ptr[kArrayLength];
|
static bool initialized = false;
|
||||||
static char data_array[kArrayLength][kArrayBuffer];
|
if (!initialized) {
|
||||||
int elen[kArrayLength], number = 0;
|
initialized = true;
|
||||||
|
|
||||||
data_ptr[0] = &data_array[0][0];
|
static char opus_packets_cache[kMaxOpusPackets][kMaxOpusPacketSize];
|
||||||
for (int i = 1; i < kArrayLength; i++) {
|
opus_payloads[0] = &opus_packets_cache[0][0];
|
||||||
data_ptr[i] = data_array[i];
|
for (int i = 1; i < kMaxOpusPackets; i++) {
|
||||||
|
opus_payloads[i] = opus_packets_cache[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsSample pkt;
|
// Transcode aac packet to opus packets.
|
||||||
pkt.bytes = adts_audio;
|
SrsSample aac;
|
||||||
pkt.size = nn_adts_audio;
|
aac.bytes = adts_audio;
|
||||||
if ((err = transcode->recode(&pkt, data_ptr, elen, number)) != srs_success) {
|
aac.size = nn_adts_audio;
|
||||||
|
|
||||||
|
int nn_opus_packets = 0;
|
||||||
|
int opus_sizes[kMaxOpusPackets];
|
||||||
|
if ((err = transcode->recode(&aac, opus_payloads, opus_sizes, nn_opus_packets)) != srs_success) {
|
||||||
return srs_error_wrap(err, "recode error");
|
return srs_error_wrap(err, "recode error");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < number; i++) {
|
// Package opus packets to RTP packets.
|
||||||
|
vector<SrsRtpSharedPacket*> rtp_packets;
|
||||||
|
|
||||||
|
for (int i = 0; i < nn_opus_packets; i++) {
|
||||||
SrsSample sample;
|
SrsSample sample;
|
||||||
sample.size = elen[i];
|
sample.size = opus_sizes[i];
|
||||||
sample.bytes = data_ptr[i];
|
sample.bytes = opus_payloads[i];
|
||||||
if ((err = packet_opus(shared_audio, &sample, rtp_packets)) != srs_success) {
|
if ((err = packet_opus(shared_audio, &sample, rtp_packets)) != srs_success) {
|
||||||
return srs_error_wrap(err, "packet as opus");
|
return srs_error_wrap(err, "packet as opus");
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,8 +61,6 @@ const uint8_t kEnd = 0x40; // Fu-header end bit
|
||||||
|
|
||||||
const int kChannel = 2;
|
const int kChannel = 2;
|
||||||
const int kSamplerate = 48000;
|
const int kSamplerate = 48000;
|
||||||
const int kArrayLength = 8;
|
|
||||||
const int kArrayBuffer = 4096;
|
|
||||||
|
|
||||||
// SSRC will rewrite in srs_app_rtc_conn.cpp when send to client.
|
// SSRC will rewrite in srs_app_rtc_conn.cpp when send to client.
|
||||||
const uint32_t kAudioSSRC = 1;
|
const uint32_t kAudioSSRC = 1;
|
||||||
|
|
|
@ -532,7 +532,7 @@ class SrsSample
|
||||||
public:
|
public:
|
||||||
// The size of unit.
|
// The size of unit.
|
||||||
int size;
|
int size;
|
||||||
// The ptr of unit, user must manage it.
|
// The ptr of unit, user must free it.
|
||||||
char* bytes;
|
char* bytes;
|
||||||
// Whether is B frame.
|
// Whether is B frame.
|
||||||
bool bframe;
|
bool bframe;
|
||||||
|
|
|
@ -214,8 +214,8 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::SrsSharedPtrPayload()
|
||||||
samples = NULL;
|
samples = NULL;
|
||||||
nb_samples = 0;
|
nb_samples = 0;
|
||||||
|
|
||||||
extra_payload = NULL;
|
extra_payloads = NULL;
|
||||||
extra_size = 0;
|
nn_extra_payloads = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload()
|
SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload()
|
||||||
|
@ -225,7 +225,12 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload()
|
||||||
#endif
|
#endif
|
||||||
srs_freepa(payload);
|
srs_freepa(payload);
|
||||||
srs_freepa(samples);
|
srs_freepa(samples);
|
||||||
srs_freepa(extra_payload);
|
|
||||||
|
for (int i = 0; i < nn_extra_payloads; i++) {
|
||||||
|
SrsSample* p = extra_payloads + i;
|
||||||
|
srs_freep(p->bytes);
|
||||||
|
}
|
||||||
|
srs_freep(extra_payloads);
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsSharedPtrMessage::SrsSharedPtrMessage() : timestamp(0), stream_id(0), size(0), payload(NULL)
|
SrsSharedPtrMessage::SrsSharedPtrMessage() : timestamp(0), stream_id(0), size(0), payload(NULL)
|
||||||
|
|
|
@ -311,9 +311,9 @@ private:
|
||||||
SrsSample* samples;
|
SrsSample* samples;
|
||||||
int nb_samples;
|
int nb_samples;
|
||||||
// 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 payload, which is transformed from payload.
|
// so there must be an extra payloads, which is transformed from payload.
|
||||||
char* extra_payload;
|
SrsSample* extra_payloads;
|
||||||
int extra_size;
|
int nn_extra_payloads;
|
||||||
public:
|
public:
|
||||||
SrsSharedPtrPayload();
|
SrsSharedPtrPayload();
|
||||||
virtual ~SrsSharedPtrPayload();
|
virtual ~SrsSharedPtrPayload();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue