1 /** 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef AUDIO_AMRFMT_H_INCLUDED 18 #define AUDIO_AMRFMT_H_INCLUDED 19 20 #include <ImsMediaDefine.h> 21 #include <stdint.h> 22 23 #define IMSAMR_FRAME_BYTES 34 24 25 #define EVS_COMPACT_PRIMARY_PAYLOAD_NUM 13 26 #define EVS_COMPACT_AMRWBIO_PAYLOAD_NUM 10 27 #define EVS_COMPACT_PAYLOAD_MAX_NUM 32 28 29 #define AUDIO_STOP_TIMEOUT 1000 30 31 enum kImsAudioFrameEntype 32 { 33 kImsAudioFrameGsmSid = 0, /* GSM HR, FR or EFR : silence descriptor */ 34 kImsAudioFrameGsmSpeechGood, /* GSM HR, FR or EFR : good speech frame */ 35 kImsAudioFrameGsmBfi, /* GSM HR, FR or EFR : bad frame indicator */ 36 kImsAudioFrameGsmInvalidSid, /* GSM HR : invalid SID frame */ 37 kImsAudioFrameAmrSpeechGood, /* AMR : good speech frame */ 38 kImsAudioFrameAmrSpeechDegraded, /* AMR : degraded speech frame */ 39 kImsAudioFrameAmrOnSet, /* AMR : onset */ 40 kImsAudioFrameAmrSpeechBad, /* AMR : bad speech frame */ 41 kImsAudioFrameAmrSidFirst, /* AMR : first silence descriptor */ 42 kImsAudioFrameAmrSidUpdate, /* AMR : successive silence descriptor */ 43 kImsAudioFrameAmrSidBad, /* AMR : bad silence descriptor frame */ 44 kImsAudioFrameAmrNoData, /* AMR : Nothing to Transmit */ 45 kImsAudioFrameAmrSpeechLost, /* downlink speech lost */ 46 kImsAudioFrameMax 47 }; 48 49 enum kImsAudioAmrMode 50 { 51 kImsAudioAmrMode475 = 0, /* 4.75 kbit/s */ 52 kImsAudioAmrMode515 = 1, /* 5.15 kbit/s */ 53 kImsAudioAmrMode590 = 2, /* 5.90 kbit/s */ 54 kImsAudioAmrMode670 = 3, /* 6.70 kbit/s */ 55 kImsAudioAmrMode740 = 4, /* 7.40 kbit/s */ 56 kImsAudioAmrMode795 = 5, /* 7.95 kbit/s */ 57 kImsAudioAmrMode1020 = 6, /* 10.20 kbit/s */ 58 kImsAudioAmrMode1220 = 7, /* 12.20 kbit/s, also used for GSM EFR */ 59 kImsAudioAmrModeSID = 8, /* AMR SID */ 60 /* 9~13: for future use */ 61 kImsAudioAmrModeSPL = 14, /* Speech Lost frame */ 62 kImsAudioAmrModeNoData = 15, /* No Data */ 63 kImsAudioAmrModeEVRC0 = 0, /* Indicates vocoder data was blanked. */ 64 kImsAudioAmrModeEVRC8, /* Indicates rate 1/8 vocoder data. */ 65 kImsAudioAmrModeEVRC4, /* Indicates rate 1/4 vocoder data. */ 66 kImsAudioAmrModeEVRC2, /* Indicates rate 1/2 vocoder data. */ 67 kImsAudioAmrModeEVRC1, /* Indicates rate 1 vocoder data. */ 68 kImsAudioAmrModeEVRCERASURE, /* Indicates frame erasure */ 69 kImsAudioAmrModeEVRCERR, /* Indicates invalid vocoder data. */ 70 kImsAudioAmrModeMax 71 }; 72 73 enum kImsAudioAmrWbMode 74 { 75 kImsAudioAmrWbMode660 = 0, /* 6.60 kbit/s */ 76 kImsAudioAmrWbMode885 = 1, /* 8.85 kbit/s */ 77 kImsAudioAmrWbMode1265 = 2, /* 12.65 kbit/s */ 78 kImsAudioAmrWbMode1425 = 3, /* 14.25 kbit/s */ 79 kImsAudioAmrWbMode1585 = 4, /* 15.85 kbit/s */ 80 kImsAudioAmrWbMode1825 = 5, /* 18.25 kbit/s */ 81 kImsAudioAmrWbMode1985 = 6, /* 19.85 kbit/s */ 82 kImsAudioAmrWbMode2305 = 7, /* 23.05 kbit/s */ 83 kImsAudioAmrWbMode2385 = 8, /* 23.85 kbit/s */ 84 kImsAudioAmrWbModeSID = 9, /* AMRWB SID */ 85 /* 10~13: for future use */ 86 kImsAudioAmrWbModeSPL = 14, /* AMRWB Speech Lost frame */ 87 kImsAudioAmrWbModeNoData = 15, /* AMRWB No Data */ 88 kImsAudioAmrWbModeMax 89 }; 90 91 enum kImsAudioEvsMode 92 { 93 kImsAudioEvsAmrWbIoMode660 = 0, /* 6.60 kbps AMR-IO*/ 94 kImsAudioEvsAmrWbIoMode885 = 1, /* 8.85 kbps AMR-IO*/ 95 kImsAudioEvsAmrWbIoMode1265 = 2, /* 12.65 kbps AMR-IO */ 96 kImsAudioEvsAmrWbIoMode1425 = 3, /* 14.25 kbps AMR-IO */ 97 kImsAudioEvsAmrWbIoMode1585 = 4, /* 15.85 kbps AMR-IO */ 98 kImsAudioEvsAmrWbIoMode1825 = 5, /* 18.25 kbps AMR-IO */ 99 kImsAudioEvsAmrWbIoMode1985 = 6, /* 19.85 kbps AMR-IO */ 100 kImsAudioEvsAmrWbIoMode2305 = 7, /* 23.05 kbps AMR-IO */ 101 kImsAudioEvsAmrWbIoMode2385 = 8, /* 23.85 kbps AMR-IO */ 102 kImsAudioEvsPrimaryMode5900 = 9, /* 5.9 kbps, EVS Primary */ 103 kImsAudioEvsPrimaryMode7200 = 10, /* 7.2 kbps, EVS Primary */ 104 kImsAudioEvsPrimaryMode8000 = 11, /* 8.0 kbps, EVS Primary */ 105 kImsAudioEvsPrimaryMode9600 = 12, /* 9.6 kbps, EVS Primary */ 106 kImsAudioEvsPrimaryMode13200 = 13, /* 13.2 kbps, EVS Primary */ 107 kImsAudioEvsPrimaryMode16400 = 14, /* 16.4 kbps, EVS Primary */ 108 kImsAudioEvsPrimaryMode24400 = 15, /* 24.4 kbps, EVS Primary */ 109 kImsAudioEvsPrimaryMode32000 = 16, /* 32.0 kbps, EVS Primary */ 110 kImsAudioEvsPrimaryMode48000 = 17, /* 48.0 kbps, EVS Primary */ 111 kImsAudioEvsPrimaryMode64000 = 18, /* 64.0 kbps, EVS Primary */ 112 kImsAudioEvsPrimaryMode96000 = 19, /* 96.0 kbps, EVS Primary */ 113 kImsAudioEvsPrimaryMode128000 = 20, /* 128.0 kbps, EVS Primary */ 114 kImsAudioEvsPrimaryModeSID = 21, /* 2.4 kbps, EVS Primary SID */ 115 kImsAudioEvsPrimaryModeSpeechLost = 22, /* SPEECH LOST */ 116 kImsAudioEvsPrimaryModeNoData = 23, /* NO DATA */ 117 kImsAudioEvsModeMax 118 }; 119 120 // TODO: need to remove this with respective changes 121 enum kImsAudioEvsAmrWbIoMode 122 { 123 kImsAudioEvsAmrWbIoMode0660 = 0, /* 6.60 kbit/s */ 124 kImsAudioEvsAmrWbIoMode0885 = 1, /* 8.85 kbit/s */ 125 kImsAudioEvsAmrWbIoMode01265 = 2, /* 12.65 kbit/s */ 126 kImsAudioEvsAmrWbIoMode01425 = 3, /* 14.25 kbit/s */ 127 kImsAudioEvsAmrWbIoMode01585 = 4, /* 15.85 kbit/s */ 128 kImsAudioEvsAmrWbIoMode01825 = 5, /* 18.25 kbit/s */ 129 kImsAudioEvsAmrWbIoMode01985 = 6, /* 19.85 kbit/s */ 130 kImsAudioEvsAmrWbIoMode02305 = 7, /* 23.05 kbit/s */ 131 kImsAudioEvsAmrWbIoMode02385 = 8, /* 23.85 kbit/s */ 132 kImsAudioEvsAmrWbIoModeSID = 9, /* AMRWB SID */ 133 /* 10~13: for future use */ 134 kImsAudioEvsAmrWbIoModeSPL = 14, /* AMRWB Speech Lost frame */ 135 kImsAudioEvsAmrWbIoModeNoData = 15, /* AMRWB No Data */ 136 kImsAudioEvsAmrWbIoModeMax 137 }; 138 139 class ImsMediaAudioUtil 140 { 141 public: 142 static int32_t ConvertCodecType(int32_t type); 143 static int32_t ConvertEvsCodecMode(int32_t evsMode); 144 static uint32_t ConvertAmrModeToLen(uint32_t mode); 145 static uint32_t ConvertAmrModeToBitLen(uint32_t mode); 146 static uint32_t ConvertLenToAmrMode(uint32_t nLen); 147 static void ConvertEvsBandwidthToStr(kEvsBandwidth bandwidth, char* nBandwidth, uint32_t nLen); 148 static uint32_t ConvertAmrWbModeToLen(uint32_t mode); 149 static uint32_t ConvertAmrWbModeToBitLen(uint32_t mode); 150 static uint32_t ConvertLenToAmrWbMode(uint32_t nLen); 151 static uint32_t ConvertLenToEVSAudioMode(uint32_t nLen); 152 static uint32_t ConvertLenToEVSAMRIOAudioMode(uint32_t nLen); 153 static uint32_t ConvertEVSAudioModeToBitLen(uint32_t mode); 154 static uint32_t ConvertEVSAMRIOAudioModeToBitLen(uint32_t mode); 155 static uint32_t ConvertAmrModeToBitrate(uint32_t mode); 156 static uint32_t ConvertAmrWbModeToBitrate(uint32_t mode); 157 static uint32_t GetMaximumAmrMode(int32_t bitmask); 158 static uint32_t GetMaximumEvsMode(int32_t bitmask); 159 static uint32_t GetBitrateEVS(int mode); 160 static kRtpPyaloadHeaderMode ConvertEVSPayloadMode( 161 uint32_t nDataSize, kEvsCodecMode* pEVSCodecMode, uint32_t* pEVSCompactId); 162 static kEvsCodecMode CheckEVSCodecMode(const uint32_t nAudioFrameLength); 163 static int32_t ConvertEVSModeToBitRate(const int32_t mode); 164 static kEvsBandwidth FindMaxEvsBandwidthFromRange(const int32_t EvsBandwidthRange); 165 static bool CheckEVSPrimaryHeaderFullModeFromSize(uint32_t size); 166 }; 167 168 #endif // AUDIO_AMRFMT_H_INCLUDED 169