From 98706f793e514ee9619e9f873d2af24577aa329a Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 17 Jan 2019 16:01:43 +0800 Subject: [PATCH] Support Opus audio-level --- trunk/src/kernel/srs_kernel_codec.hpp | 11 ++++++--- trunk/src/libs/srs_librtmp.cpp | 33 +++++++++++++++++++-------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index 214411208..d1a0e867d 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -164,7 +164,7 @@ std::string srs_audio_codec_id2str(SrsAudioCodecId codec); /** * The audio AAC frame trait(characteristic). * @doc video_file_format_spec_v10_1.pdf, page 77, E.4.2 Audio Tags - * AACPacketType IF SoundFormat == 10 UI8 + * AACPacketType IF SoundFormat == 10 or 13 UI8 * The following values are defined: * 0 = AAC sequence header * 1 = AAC raw @@ -172,11 +172,16 @@ std::string srs_audio_codec_id2str(SrsAudioCodecId codec); enum SrsAudioAacFrameTrait { // set to the max value to reserved, for array map. - SrsAudioAacFrameTraitReserved = 2, - SrsAudioAacFrameTraitForbidden = 2, + SrsAudioAacFrameTraitReserved = 0xff, + SrsAudioAacFrameTraitForbidden = 0xff, SrsAudioAacFrameTraitSequenceHeader = 0, SrsAudioAacFrameTraitRawData = 1, + + // For Opus, the frame trait, may has more than one traits. + SrsAudioOpusFrameTraitRaw = 2, + SrsAudioOpusFrameTraitSamplingRate = 4, + SrsAudioOpusFrameTraitAudioLevel = 8, }; /** diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp index 1880ae0e4..2bfbbcea0 100644 --- a/trunk/src/libs/srs_librtmp.cpp +++ b/trunk/src/libs/srs_librtmp.cpp @@ -2363,7 +2363,7 @@ char srs_utils_flv_audio_sound_format(char* data, int size) char srs_utils_flv_audio_sound_rate(char* data, int size) { - if (size < 2) { + if (size < 3) { return -1; } @@ -2372,8 +2372,14 @@ char srs_utils_flv_audio_sound_rate(char* data, int size) // For Opus, the first UINT8 is sampling rate. uint8_t sound_format = (data[0] >> 4) & 0x0f; - if (sound_format == 13) { - sound_rate = data[1]; + if (sound_format != SrsAudioCodecIdOpus) { + return sound_rate; + } + + // The FrameTrait for AAC or Opus. + uint8_t frame_trait = data[1]; + if ((frame_trait&SrsAudioOpusFrameTraitSamplingRate) == SrsAudioOpusFrameTraitSamplingRate) { + sound_rate = data[2]; } return sound_rate; @@ -2409,16 +2415,13 @@ char srs_utils_flv_audio_aac_packet_type(char* data, int size) return -1; } - if (srs_utils_flv_audio_sound_format(data, size) != 10) { - return -1; - } - - uint8_t aac_packet_type = data[1]; - if (aac_packet_type > 1) { + uint8_t sound_format = srs_utils_flv_audio_sound_format(data, size); + if (sound_format != SrsAudioCodecIdAAC && sound_format != SrsAudioCodecIdOpus) { return -1; } - return aac_packet_type; + uint8_t frame_trait = data[1]; + return frame_trait; } char* srs_human_amf0_print(srs_amf0_t amf0, char** pdata, int* psize) @@ -2624,6 +2627,16 @@ const char* srs_human_flv_audio_aac_packet_type2string(char aac_packet_type) switch (aac_packet_type) { case 0: return sps_pps; case 1: return raw; + + // See enum SrsAudioAacFrameTrait + // For Opus, the frame trait, may has more than one traits. + case 2: return "RAW"; + case 4: return "SR"; + case 8: return "AL"; + case 6: return "RAW|SR"; + case 10: return "RAW|AL"; + case 14: return "RAW|SR|AL"; + default: return unknown; }