diff --git a/trunk/src/app/srs_app_audio_recode.cpp b/trunk/src/app/srs_app_audio_recode.cpp index 77a2a440d..6e60c2e96 100644 --- a/trunk/src/app/srs_app_audio_recode.cpp +++ b/trunk/src/app/srs_app_audio_recode.cpp @@ -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 err = srs_success; - - static char decode_buffer[kPacketBufMax]; - static char resample_buffer[kFrameBufMax]; - static char encode_buffer[kPacketBufMax]; if (!dec_) { return srs_error_new(ERROR_RTC_RTP_MUXER, "dec_ nullptr"); } int decode_len = kPacketBufMax; + static char decode_buffer[kPacketBufMax]; if ((err = dec_->decode(pkt, decode_buffer, decode_len)) != srs_success) { 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_) { 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; pcm.bytes = decode_buffer; pcm.size = decode_len; int resample_len = kFrameBufMax; + static char resample_buffer[kFrameBufMax]; 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; @@ -445,8 +445,9 @@ srs_error_t SrsAudioRecode::recode(SrsSample *pkt, char **buf, int *buf_len, int int encode_len; pcm.bytes = (char *)data_; pcm.size = size_; + static char encode_buffer[kPacketBufMax]; 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); diff --git a/trunk/src/app/srs_app_rtc.cpp b/trunk/src/app/srs_app_rtc.cpp index ff3633b20..80b28ddf5 100644 --- a/trunk/src/app/srs_app_rtc.cpp +++ b/trunk/src/app/srs_app_rtc.cpp @@ -54,7 +54,7 @@ using namespace std; #include // 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; @@ -62,30 +62,27 @@ srs_error_t aac_raw_append_adts_header(SrsSharedPtrMessage* shared_audio, SrsFor return err; } - if (stream_ptr == NULL) { - return srs_error_new(ERROR_RTC_RTP_MUXER, "adts"); - } - if (format->audio->nb_samples != 1) { return srs_error_new(ERROR_RTC_RTP_MUXER, "adts"); } int nb_buf = format->audio->samples[0].size + 7; char* buf = new char[nb_buf]; - SrsBuffer* stream = new SrsBuffer(buf, nb_buf); + SrsBuffer stream(buf, nb_buf); // TODO: Add comment. - stream->write_1bytes(0xFF); - 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_channels & 0x03) << 6) | ((nb_buf >> 11) & 0x03)); - stream->write_1bytes((nb_buf >> 3) & 0xFF); - stream->write_1bytes(((nb_buf & 0x07) << 5) | 0x1F); - stream->write_1bytes(0xFC); + stream.write_1bytes(0xFF); + 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_channels & 0x03) << 6) | ((nb_buf >> 11) & 0x03)); + stream.write_1bytes((nb_buf >> 3) & 0xFF); + stream.write_1bytes(((nb_buf & 0x07) << 5) | 0x1F); + 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; } @@ -212,8 +209,6 @@ srs_error_t SrsRtpH264Muxer::packet_single_nalu(SrsSharedPtrMessage* shared_fram srs_error_t err = srs_success; 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)); SrsRtpSharedPacket* packet = new SrsRtpSharedPacket(); @@ -292,7 +287,7 @@ srs_error_t SrsRtpOpusMuxer::initialize() 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; @@ -308,9 +303,8 @@ srs_error_t SrsRtpOpusMuxer::frame_to_packet(SrsSharedPtrMessage* shared_audio, } SrsSample pkt; - pkt.bytes = stream->data(); - pkt.size = stream->pos(); - + pkt.bytes = adts_audio; + pkt.size = nn_adts_audio; if ((err = transcode->recode(&pkt, data_ptr, elen, number)) != srs_success) { return srs_error_wrap(err, "recode error"); } @@ -319,7 +313,9 @@ srs_error_t SrsRtpOpusMuxer::frame_to_packet(SrsSharedPtrMessage* shared_audio, SrsSample sample; sample.size = elen[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); @@ -463,17 +459,16 @@ srs_error_t SrsRtc::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* forma // ignore sequence header srs_assert(format->audio); - SrsBuffer* stream = NULL; - SrsAutoFree(SrsBuffer, stream); - if ((err = aac_raw_append_adts_header(shared_audio, format, &stream)) != srs_success) { + char* adts_audio = NULL; + int nn_adts_audio = 0; + // 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"); } - if (stream) { - char* stream_data = stream->data(); - SrsAutoFreeA(char, stream_data); - - return rtp_opus_muxer->frame_to_packet(shared_audio, format, stream); + if (adts_audio) { + err = rtp_opus_muxer->frame_to_packet(shared_audio, format, adts_audio, nn_adts_audio); + srs_freep(adts_audio); } return err; diff --git a/trunk/src/app/srs_app_rtc.hpp b/trunk/src/app/srs_app_rtc.hpp index 45d78c8a2..2ba18c43e 100644 --- a/trunk/src/app/srs_app_rtc.hpp +++ b/trunk/src/app/srs_app_rtc.hpp @@ -101,7 +101,7 @@ public: virtual ~SrsRtpOpusMuxer(); virtual srs_error_t initialize(); 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: srs_error_t packet_opus(SrsSharedPtrMessage* shared_frame, SrsSample* sample, std::vector& rtp_packets); };