For , refine audio transcode buffer

pull/1753/head
winlin
parent 7ffe4aacb8
commit 6ed2a4b6cb

@ -388,16 +388,13 @@ srs_error_t SrsAudioRecode::initialize()
srs_error_t SrsAudioRecode::recode(SrsSample *pkt, char **buf, int *buf_len, int &n) srs_error_t SrsAudioRecode::recode(SrsSample *pkt, char **buf, int *buf_len, int &n)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
static char decode_buffer[kPacketBufMax];
static char resample_buffer[kFrameBufMax];
static char encode_buffer[kPacketBufMax];
if (!dec_) { if (!dec_) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "dec_ nullptr"); return srs_error_new(ERROR_RTC_RTP_MUXER, "dec_ nullptr");
} }
int decode_len = kPacketBufMax; int decode_len = kPacketBufMax;
static char decode_buffer[kPacketBufMax];
if ((err = dec_->decode(pkt, decode_buffer, decode_len)) != srs_success) { if ((err = dec_->decode(pkt, decode_buffer, decode_len)) != srs_success) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "decode error"); return srs_error_new(ERROR_RTC_RTP_MUXER, "decode error");
} }
@ -412,15 +409,18 @@ srs_error_t SrsAudioRecode::recode(SrsSample *pkt, char **buf, int *buf_len, int
if (!resample_) { if (!resample_) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "SrsAudioResample failed"); return srs_error_new(ERROR_RTC_RTP_MUXER, "SrsAudioResample failed");
} }
resample_->initialize(); if ((err = resample_->initialize()) != srs_success) {
return srs_error_wrap(err, "init resample");
}
} }
SrsSample pcm; SrsSample pcm;
pcm.bytes = decode_buffer; pcm.bytes = decode_buffer;
pcm.size = decode_len; pcm.size = decode_len;
int resample_len = kFrameBufMax; int resample_len = kFrameBufMax;
static char resample_buffer[kFrameBufMax];
if ((err = resample_->resample(&pcm, resample_buffer, resample_len)) != srs_success) { if ((err = resample_->resample(&pcm, resample_buffer, resample_len)) != srs_success) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "decode error"); return srs_error_new(ERROR_RTC_RTP_MUXER, "resample error");
} }
n = 0; n = 0;
@ -445,8 +445,9 @@ srs_error_t SrsAudioRecode::recode(SrsSample *pkt, char **buf, int *buf_len, int
int encode_len; int encode_len;
pcm.bytes = (char *)data_; pcm.bytes = (char *)data_;
pcm.size = size_; pcm.size = size_;
static char encode_buffer[kPacketBufMax];
if ((err = enc_->encode(&pcm, encode_buffer, encode_len)) != srs_success) { if ((err = enc_->encode(&pcm, encode_buffer, encode_len)) != srs_success) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "decode error"); return srs_error_new(ERROR_RTC_RTP_MUXER, "encode error");
} }
memcpy(buf[n], encode_buffer, encode_len); memcpy(buf[n], encode_buffer, encode_len);

@ -54,7 +54,7 @@ using namespace std;
#include <srs_app_audio_recode.hpp> #include <srs_app_audio_recode.hpp>
// TODO: Add this function into SrsRtpMux class. // TODO: Add this function into SrsRtpMux class.
srs_error_t aac_raw_append_adts_header(SrsSharedPtrMessage* shared_audio, SrsFormat* format, SrsBuffer** stream_ptr) srs_error_t aac_raw_append_adts_header(SrsSharedPtrMessage* shared_audio, SrsFormat* format, char** pbuf, int* pnn_buf)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
@ -62,30 +62,27 @@ srs_error_t aac_raw_append_adts_header(SrsSharedPtrMessage* shared_audio, SrsFor
return err; return err;
} }
if (stream_ptr == NULL) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "adts");
}
if (format->audio->nb_samples != 1) { if (format->audio->nb_samples != 1) {
return srs_error_new(ERROR_RTC_RTP_MUXER, "adts"); return srs_error_new(ERROR_RTC_RTP_MUXER, "adts");
} }
int nb_buf = format->audio->samples[0].size + 7; int nb_buf = format->audio->samples[0].size + 7;
char* buf = new char[nb_buf]; char* buf = new char[nb_buf];
SrsBuffer* stream = new SrsBuffer(buf, nb_buf); SrsBuffer stream(buf, nb_buf);
// TODO: Add comment. // TODO: Add comment.
stream->write_1bytes(0xFF); stream.write_1bytes(0xFF);
stream->write_1bytes(0xF9); stream.write_1bytes(0xF9);
stream->write_1bytes(((format->acodec->aac_object - 1) << 6) | ((format->acodec->aac_sample_rate & 0x0F) << 2) | ((format->acodec->aac_channels & 0x04) >> 2)); stream.write_1bytes(((format->acodec->aac_object - 1) << 6) | ((format->acodec->aac_sample_rate & 0x0F) << 2) | ((format->acodec->aac_channels & 0x04) >> 2));
stream->write_1bytes(((format->acodec->aac_channels & 0x03) << 6) | ((nb_buf >> 11) & 0x03)); stream.write_1bytes(((format->acodec->aac_channels & 0x03) << 6) | ((nb_buf >> 11) & 0x03));
stream->write_1bytes((nb_buf >> 3) & 0xFF); stream.write_1bytes((nb_buf >> 3) & 0xFF);
stream->write_1bytes(((nb_buf & 0x07) << 5) | 0x1F); stream.write_1bytes(((nb_buf & 0x07) << 5) | 0x1F);
stream->write_1bytes(0xFC); stream.write_1bytes(0xFC);
stream->write_bytes(format->audio->samples[0].bytes, format->audio->samples[0].size); stream.write_bytes(format->audio->samples[0].bytes, format->audio->samples[0].size);
*stream_ptr = stream; *pbuf = buf;
*pnn_buf = nb_buf;
return err; return err;
} }
@ -212,8 +209,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]; uint8_t header = sample->bytes[0];
uint8_t nal_type = header & kNalTypeMask;
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();
@ -292,7 +287,7 @@ srs_error_t SrsRtpOpusMuxer::initialize()
return err; return err;
} }
srs_error_t SrsRtpOpusMuxer::frame_to_packet(SrsSharedPtrMessage* shared_audio, SrsFormat* format, SrsBuffer* stream) 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;
@ -308,9 +303,8 @@ srs_error_t SrsRtpOpusMuxer::frame_to_packet(SrsSharedPtrMessage* shared_audio,
} }
SrsSample pkt; SrsSample pkt;
pkt.bytes = stream->data(); pkt.bytes = adts_audio;
pkt.size = stream->pos(); pkt.size = nn_adts_audio;
if ((err = transcode->recode(&pkt, data_ptr, elen, number)) != srs_success) { if ((err = transcode->recode(&pkt, data_ptr, elen, number)) != srs_success) {
return srs_error_wrap(err, "recode error"); return srs_error_wrap(err, "recode error");
} }
@ -319,7 +313,9 @@ srs_error_t SrsRtpOpusMuxer::frame_to_packet(SrsSharedPtrMessage* shared_audio,
SrsSample sample; SrsSample sample;
sample.size = elen[i]; sample.size = elen[i];
sample.bytes = data_ptr[i]; sample.bytes = data_ptr[i];
packet_opus(shared_audio, &sample, rtp_packets); if ((err = packet_opus(shared_audio, &sample, rtp_packets)) != srs_success) {
return srs_error_wrap(err, "packet as opus");
}
} }
shared_audio->set_rtp_packets(rtp_packets); shared_audio->set_rtp_packets(rtp_packets);
@ -463,17 +459,16 @@ srs_error_t SrsRtc::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* forma
// ignore sequence header // ignore sequence header
srs_assert(format->audio); srs_assert(format->audio);
SrsBuffer* stream = NULL; char* adts_audio = NULL;
SrsAutoFree(SrsBuffer, stream); int nn_adts_audio = 0;
if ((err = aac_raw_append_adts_header(shared_audio, format, &stream)) != srs_success) { // TODO: FIXME: Reserve 7 bytes header when create shared message.
if ((err = aac_raw_append_adts_header(shared_audio, format, &adts_audio, &nn_adts_audio)) != srs_success) {
return srs_error_wrap(err, "aac append header"); return srs_error_wrap(err, "aac append header");
} }
if (stream) { if (adts_audio) {
char* stream_data = stream->data(); err = rtp_opus_muxer->frame_to_packet(shared_audio, format, adts_audio, nn_adts_audio);
SrsAutoFreeA(char, stream_data); srs_freep(adts_audio);
return rtp_opus_muxer->frame_to_packet(shared_audio, format, stream);
} }
return err; return err;

@ -101,7 +101,7 @@ public:
virtual ~SrsRtpOpusMuxer(); virtual ~SrsRtpOpusMuxer();
virtual srs_error_t initialize(); virtual srs_error_t initialize();
public: public:
srs_error_t frame_to_packet(SrsSharedPtrMessage* shared_audio, SrsFormat* format, SrsBuffer* stream); srs_error_t frame_to_packet(SrsSharedPtrMessage* shared_audio, SrsFormat* format, char* adts_audio, int nn_adts_audio);
private: private:
srs_error_t packet_opus(SrsSharedPtrMessage* shared_frame, SrsSample* sample, std::vector<SrsRtpSharedPacket*>& rtp_packets); srs_error_t packet_opus(SrsSharedPtrMessage* shared_frame, SrsSample* sample, std::vector<SrsRtpSharedPacket*>& rtp_packets);
}; };

Loading…
Cancel
Save