1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 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 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 /**************************************************************************************** 19 Portions of this file are derived from the following 3GPP standard: 20 21 3GPP TS 26.073 22 ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23 Available from http://www.3gpp.org 24 25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26 Permission to distribute, modify and use this file under the standard license 27 terms listed above has been obtained from the copyright holder. 28 ****************************************************************************************/ 29 #ifndef __GSMAMR_ENCODER_WRAPPER_H__ 30 #define __GSMAMR_ENCODER_WRAPPER_H__ 31 32 //---------------------------------------------------------------------------- 33 // INCLUDES 34 //---------------------------------------------------------------------------- 35 #include "oscl_base.h" 36 37 class TInputAudioStream 38 { 39 public: 40 // Pointer to buffer containing the audio samples. 41 // The application is required to allocate this buffer. 42 uint8* iSampleBuffer; 43 44 // Number of samples in bytes contained in iSampleBuffer 45 int32 iSampleLength; 46 47 // Mode of operation (the same as bit rate) 48 // For example, "GSM_AMR_4_75" (for 4.75 kbps) for GSM-AMR 49 int32 iMode; 50 51 // Start time when samples were taken 52 uint64 iStartTime; 53 54 // End time when samples were taken 55 uint64 iStopTime; 56 }; 57 58 59 class TOutputAudioStream 60 { 61 public: 62 // Pointer to buffer containing encoded audio samples 63 uint8* iBitStreamBuffer; 64 65 // Number of sample frames encoded and are contained in the buffer 66 int32 iNumSampleFrames; 67 68 // Size in bytes of each encoded sample frame; 69 // This variable may point to an array if the sample frame sizes are 70 // variable. For example: 71 // iSampleFrameSize[0] = 23 (frame size of frame #1) 72 // iSampleFrameSize[1] = 12 (frame size of frame #2) 73 // . . . 74 // iSampleFrameSize[iNumSampleFrames] = 10 (frame size of last frame) 75 int32* iSampleFrameSize; 76 77 // Start time of the encoded samples contained in the bit stream buffer 78 uint32 iStartTime; 79 80 // Stop time of encoded samples contained in the bit stream buffer 81 uint32 iStopTime; 82 }; 83 84 class TEncodeProperties 85 { 86 public: 87 // ///////////////////////////////////////////// 88 // Input stream properties (uncompressed audio) 89 // ///////////////////////////////////////////// 90 91 enum EInterleaveMode 92 { 93 EINTERLEAVE_LR, // interleaved left-right 94 EGROUPED_LR, // non-interleaved left-right 95 ENUM_INTERLEAVE_MODES // number of modes supported 96 }; 97 98 // DESCRIPTION: Number of bits per sample. For example, set it to "16" 99 // bits for PCM. 100 // USAGE: The authoring application is required to fill this in. 101 // The CAEI uses the value for encoding. 102 int32 iInBitsPerSample; 103 104 // DESCRIPTION: Sampling rate of the input samples in Hz. 105 // For example, set it to "22050" Hz. 106 // USAGE: The authoring application is required to fill this in. 107 // If sampling rate is not known until CAEI is initialized, 108 // use '0'. The CAEI uses the value for encoding. 109 uint32 iInSamplingRate; 110 111 // DESCRIPTION: Clock rate or time scale to be used for the input timestamps 112 // (ticks per secs). For example, "22050" ticks/sec. 113 // USAGE: The authoring application is required to fill this in. 114 // If sampling rate is not known until CAEI is initialized, 115 // use '0'. The CAEI uses the value for encoding. 116 uint32 iInClockRate; 117 118 // DESCRIPTION: Number of input channels:1=Mono,2=Stereo.(Mono uses 1 channel; 119 // Stereo uses 2 channels). 120 // USAGE: The authoring application is required to fill this in. 121 // The CAEI uses the value for encoding. 122 uint8 iInNumChannels; 123 124 // DESCRIPTION: Whether to interleave or not the multi-channel input samples: 125 // EINTERLEAVE_LR = LRLRLRLRLR (interleaved left-right) 126 // EGROUPED_LR = LLLLLL...RRRRRR (non-interleaved left-right) 127 // USAGE: The authoring application is required to fill this in. 128 // The CAEI uses the value for encoding. 129 EInterleaveMode iInInterleaveMode; 130 131 // DESCRIPTION: Desired Sampling rate for a given bitrate combination: 132 // For example, set it to "16000" Hz if the encoding 16kbps 133 // mono/stereo or 24 kbps stereo 134 // USAGE: The authoring application is required to fill this in. 135 // The CAEI uses the value for encoding. 136 uint32 iDesiredSamplingRate; 137 138 public: 139 // //////////////////////////////////////////// 140 // Output stream properties (compressed audio) 141 // //////////////////////////////////////////// 142 143 // DESCRIPTION: Mode of operation (the same as bit rate). For example, 144 // "GSM_AMR_4_75" (for 4.75 kbps). 145 // USAGE: The authoring application is required to fill this in. 146 // The CAEI uses the value to configure the codec library. 147 int32 iMode; 148 149 // DESCRIPTION: Bit order format: 150 // TRUE = MSB..................LSB 151 // d7 d6 d5 d4 d3 d2 d1 d0 152 // FALSE = MSB..................LSB 153 // d0 d1 d2 d3 d4 d5 d6 d7 154 // USAGE: The authoring application is required to fill this in. 155 // The CAEI will use the value to setup the codec library. 156 int32 iBitStreamFormat; 157 158 // DESCRIPTION: Audio object type for the output bitstream; only applies 159 // to AAC codec 160 // USAGE: The application is required to fill this in. 161 // The CADI will use the value to setup the codec library. 162 int32 iAudioObjectType; 163 164 // DESCRIPTION: Final sampling frequency used when encoding in Hz. 165 // For example, "44100" Hz. 166 // USAGE: If the input sampling rate is not appropriate (e.g., 167 // the codec requires a different sampling frequency), 168 // the CAEI will fill this in with the final sampling 169 // rate. The CAEI will perform resampling if the 170 // input sampling frequency is not the same as the output 171 // sampling frequency. 172 uint32 iOutSamplingRate; 173 174 // DESCRIPTION: Number of output channels:1=Mono,2=Stereo. (Mono uses 1 175 // channel; Stereo uses 2 channels). 176 // USAGE: The CAEI will fill this in if it needs to convert 177 // the input samples to what is required by the codec. 178 uint8 iOutNumChannels; 179 180 // DESCRIPTION: Clock rate or time scale used for the timestamps (ticks per secs) 181 // For example, "8000" ticks/sec. 182 // USAGE: The CAEI will fill this in if the input data will be 183 // resampled. 184 uint32 iOutClockRate; 185 }; 186 187 188 189 /** 190 ** This class encodes audio samples using the GSM-AMR algorithm. 191 ** This codec operates on a 20-msec frame duration corresponding to 160 192 ** samples at the sampling frequency of 8000 samples/sec. The size of a frame 193 ** is 320 bytes. For each 20-ms frame, a bit-rate of 4.75, 5.15, 5.90, 6.70, 194 ** 7.40, 7.95, 10.2, or 12.2 kbits/sec can be produced. 195 ** 196 ** Sample usage: 197 ** ------------ 198 ** // create a GSM-AMR encoder object 199 ** CGsmAmrEncoder* myAppEncoder = OSCL_NEW(CGsmAmrEncoder, ()); 200 ** // set input parameters 201 ** TEncodeProperties myProps; 202 ** myProps.iInSamplingRate = 8000; 203 ** myProps.iInBitsPerSample = 16; 204 ** myProps.iOutBitRate = CGsmAmrEncoder::GSM_AMR_12_2; 205 ** myAppEncoder->InitializeEncoder(myProps, 2000); 206 ** 207 ** // encode a sample block 208 ** myAppEncoder->Encode(myInput, myOutput); 209 ** 210 // // done encoding so cleanup 211 ** myAppEncoder->CleanupEncoder(); 212 ** OSCL_DELETE(myAppEncoder); 213 ** 214 */ 215 216 class CPvGsmAmrEncoder 217 { 218 public: 219 //! Constructor -- creates a GSM-AMR encoder object 220 OSCL_IMPORT_REF CPvGsmAmrEncoder(); 221 222 //! Destructor -- destroys the GSM-AMR encoder object 223 OSCL_IMPORT_REF ~CPvGsmAmrEncoder(); 224 225 /** 226 * This function initializes the GSM-AMR encoder. 227 * @param "aMaxOutputBufferSize" "the maximum buffer size for the output buffer when Encode() gets called" 228 * @param "aProps" "TEncodeProperties based pointer for the input encoding setting. if aProps=NULL, then 229 * default settings will be set" 230 * @return 0 for the correct operation, and -1 for the wrong operation 231 */ 232 OSCL_IMPORT_REF int32 InitializeEncoder(int32 aMaxOutputBufferSize, 233 TEncodeProperties* aProps = NULL); 234 235 /** 236 * This function initializes the GSM-AMR encoder. 237 * @param "aInStream" "TInputAudioStream based reference object that contains the input buffer and buffer size and timestamp info" 238 * @param "aOutStream" "TOutputAudioStream based reference object that contains the output buffer for compressed data 239 * @return 0 for the correct operation, and -1 for the wrong operation 240 */ 241 OSCL_IMPORT_REF int32 Encode(TInputAudioStream& aInStream, 242 TOutputAudioStream& aOutStream); 243 244 /** 245 * This function cleans up the encoder workspace when done encoding. 246 */ 247 OSCL_IMPORT_REF int32 CleanupEncoder(); 248 249 /** 250 * This function reset the encoder workspace. 251 */ 252 OSCL_IMPORT_REF int32 Reset(); 253 254 255 public: 256 // GSM AMR modes 257 // ** values should be the same as the Mode enum specified by AMR library 258 enum GSM_AMR_MODES 259 { 260 GSM_AMR_4_75, 261 GSM_AMR_5_15, 262 GSM_AMR_5_90, 263 GSM_AMR_6_70, 264 GSM_AMR_7_40, 265 GSM_AMR_7_95, 266 GSM_AMR_10_2, 267 GSM_AMR_12_2, 268 GSM_AMR_DTX, 269 GSM_AMR_N_MODES /* number of (SPC) modes */ 270 }; 271 272 private: 273 274 /** 275 * This inline function checks whether the specified mode is valid or not. 276 * @param "aMode" "input the current mode to be used in encoding" 277 * @return true for the valid mode, and false for the wrong mode 278 */ IsModeValid(int32 aMode)279 inline bool IsModeValid(int32 aMode) 280 { 281 return((aMode < GSM_AMR_N_MODES) && (aMode >= 0)); 282 } 283 284 private: 285 286 // GSM AMR encoder state variables 287 void* iEncState; 288 void* iSidState; 289 290 // contains the current mode of GSM AMR 291 GSM_AMR_MODES iGsmAmrMode; 292 293 // last mode used 294 int32 iLastModeUsed; 295 296 // number of samples per frame (granulity) 297 int32 iNumSamplesPerFrame; 298 // number of bytes per sample 299 int32 iBytesPerSample; 300 301 // maximum size allowed for output buffer 302 int32 iMaxOutputBufferSize; 303 304 // bit stream format 305 int32 iBitStreamFormat; 306 307 }; 308 309 typedef enum 310 { 311 GSMAMR_ENC_NO_ERROR = 0, 312 GSMAMR_ENC_NO_MEMORY_ERROR = -1, 313 GSMAMR_ENC_CODEC_INIT_FAILURE = -2, 314 GSMAMR_ENC_CODEC_NOT_INITIALIZED = -3, 315 GSMAMR_ENC_INVALID_PARAM = -4, 316 GSMAMR_ENC_INVALID_MODE = -5, 317 GSMAMR_ENC_CODEC_ENCODE_FAILURE = -6, 318 GSMAMR_ENC_MEMORY_OVERFLOW = -7 319 } GSMAMR_ENC_STATUS; 320 321 #endif // __GSMAMR_ENCODER_WRAPPER_H__ 322 323 324