For #307, refactor aac to opus code

pull/1753/head
winlin 5 years ago
parent 6ed2a4b6cb
commit 1f2db4d746

@ -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…
Cancel
Save