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;
|
||||
|
||||
uint8_t header = sample->bytes[0];
|
||||
srs_verbose("rtp single nalu, size=%u, seq=%u, timestamp=%lu", sample->size, sequence, (shared_frame->timestamp * 90));
|
||||
|
||||
SrsRtpSharedPacket* packet = new SrsRtpSharedPacket();
|
||||
|
@ -287,32 +286,47 @@ srs_error_t SrsRtpOpusMuxer::initialize()
|
|||
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 err = srs_success;
|
||||
|
||||
vector<SrsRtpSharedPacket*> rtp_packets;
|
||||
// Opus packet cache.
|
||||
static char* opus_payloads[kMaxOpusPackets];
|
||||
|
||||
char* data_ptr[kArrayLength];
|
||||
static char data_array[kArrayLength][kArrayBuffer];
|
||||
int elen[kArrayLength], number = 0;
|
||||
static bool initialized = false;
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
|
||||
data_ptr[0] = &data_array[0][0];
|
||||
for (int i = 1; i < kArrayLength; i++) {
|
||||
data_ptr[i] = data_array[i];
|
||||
static char opus_packets_cache[kMaxOpusPackets][kMaxOpusPacketSize];
|
||||
opus_payloads[0] = &opus_packets_cache[0][0];
|
||||
for (int i = 1; i < kMaxOpusPackets; i++) {
|
||||
opus_payloads[i] = opus_packets_cache[i];
|
||||
}
|
||||
}
|
||||
|
||||
SrsSample pkt;
|
||||
pkt.bytes = adts_audio;
|
||||
pkt.size = nn_adts_audio;
|
||||
if ((err = transcode->recode(&pkt, data_ptr, elen, number)) != srs_success) {
|
||||
// Transcode aac packet to opus packets.
|
||||
SrsSample aac;
|
||||
aac.bytes = adts_audio;
|
||||
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");
|
||||
}
|
||||
|
||||
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;
|
||||
sample.size = elen[i];
|
||||
sample.bytes = data_ptr[i];
|
||||
sample.size = opus_sizes[i];
|
||||
sample.bytes = opus_payloads[i];
|
||||
if ((err = packet_opus(shared_audio, &sample, rtp_packets)) != srs_success) {
|
||||
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 kSamplerate = 48000;
|
||||
const int kArrayLength = 8;
|
||||
const int kArrayBuffer = 4096;
|
||||
|
||||
// SSRC will rewrite in srs_app_rtc_conn.cpp when send to client.
|
||||
const uint32_t kAudioSSRC = 1;
|
||||
|
|
|
@ -532,7 +532,7 @@ class SrsSample
|
|||
public:
|
||||
// The size of unit.
|
||||
int size;
|
||||
// The ptr of unit, user must manage it.
|
||||
// The ptr of unit, user must free it.
|
||||
char* bytes;
|
||||
// Whether is B frame.
|
||||
bool bframe;
|
||||
|
|
|
@ -214,8 +214,8 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::SrsSharedPtrPayload()
|
|||
samples = NULL;
|
||||
nb_samples = 0;
|
||||
|
||||
extra_payload = NULL;
|
||||
extra_size = 0;
|
||||
extra_payloads = NULL;
|
||||
nn_extra_payloads = 0;
|
||||
}
|
||||
|
||||
SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload()
|
||||
|
@ -225,7 +225,12 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload()
|
|||
#endif
|
||||
srs_freepa(payload);
|
||||
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)
|
||||
|
|
|
@ -311,9 +311,9 @@ private:
|
|||
SrsSample* samples;
|
||||
int nb_samples;
|
||||
// For RTC audio, we may need to transcode AAC to opus,
|
||||
// so there must be an extra payload, which is transformed from payload.
|
||||
char* extra_payload;
|
||||
int extra_size;
|
||||
// so there must be an extra payloads, which is transformed from payload.
|
||||
SrsSample* extra_payloads;
|
||||
int nn_extra_payloads;
|
||||
public:
|
||||
SrsSharedPtrPayload();
|
||||
virtual ~SrsSharedPtrPayload();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue