|
|
|
@ -54,7 +54,7 @@ using namespace std;
|
|
|
|
|
#include <srs_app_audio_recode.hpp>
|
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|