• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_ENC_H_INCLUDED
30 #include "gsmamr_enc.h"
31 #endif
32 
33 #ifndef GSMAMR_ENCODER_WRAPPER_H_INCLUDED
34 #include "gsmamr_encoder_wrapper.h"
35 #endif
36 
37 #ifndef OSCL_DLL_H_INCLUDED
38 #include "oscl_dll.h"
39 #endif
40 
41 // Define entry point for this DLL
OSCL_DLL_ENTRY_POINT_DEFAULT()42 OSCL_DLL_ENTRY_POINT_DEFAULT()
43 
44 //----------------------------------------------------------------------------
45 // CONSTANTS
46 //----------------------------------------------------------------------------
47 
48 // Number of samples per frame
49 #define KGAMR_NUM_SAMPLES_PER_FRAME   160
50 
51 // Default mode
52 #define KDFLT_GAMR_MODE               MR475
53 
54 // Default bits per sample for input audio
55 #define KDFLT_GAMR_BITS_PER_SAMPLE    16
56 
57 // Default sampling rate for input audio (in Hz)
58 #define KDFLT_GAMR_SAMPLING_RATE      8000
59 
60 // Default input clock rate for input audio (in ticks/sec)
61 #define KDFLT_GAMR_CLOCK_RATE         8000
62 
63 // Default number of channels
64 #define KDFLT_GAMR_NUM_CHANNELS       1
65 
66 // length of uncompressed audio frame in bytes
67 // Formula: (num_samples_per_frame * bits_per_sample) / num_bits_per_byte
68 #define PV_GSM_AMR_20_MSEC_SIZE       \
69         ((KGAMR_NUM_SAMPLES_PER_FRAME * KDFLT_GAMR_BITS_PER_SAMPLE) / 8)
70 
71 
72 ///////////////////////////////////////////////////////////////////////////////
73 OSCL_EXPORT_REF
74 CPvGsmAmrEncoder::CPvGsmAmrEncoder()
75 {
76     // initialize member data to default values
77     iEncState = NULL;
78     iSidState = NULL;
79     iGsmAmrMode = (GSM_AMR_MODES)KDFLT_GAMR_MODE;
80     iLastModeUsed = 0;
81     iBitStreamFormat = AMR_TX_WMF;
82     iNumSamplesPerFrame = KGAMR_NUM_SAMPLES_PER_FRAME;
83 }
84 ///////////////////////////////////////////////////////////////////////////////
~CPvGsmAmrEncoder()85 OSCL_EXPORT_REF CPvGsmAmrEncoder::~CPvGsmAmrEncoder()
86 {
87 }
88 
89 ///////////////////////////////////////////////////////////////////////////////////////////////////////////
InitializeEncoder(int32 aMaxOutputBufferSize,TEncodeProperties * aProps)90 OSCL_EXPORT_REF int32 CPvGsmAmrEncoder::InitializeEncoder(int32 aMaxOutputBufferSize, TEncodeProperties* aProps)
91 {
92     if (aProps == NULL)
93     {
94         // use default parameters
95         TEncodeProperties dfltProps;
96         aProps = &dfltProps;
97         dfltProps.iInBitsPerSample = KDFLT_GAMR_BITS_PER_SAMPLE;
98         dfltProps.iInSamplingRate = KDFLT_GAMR_SAMPLING_RATE;
99         dfltProps.iInClockRate = dfltProps.iInSamplingRate;
100         dfltProps.iInNumChannels = KDFLT_GAMR_NUM_CHANNELS;
101         iGsmAmrMode = (GSM_AMR_MODES)KDFLT_GAMR_MODE;
102         iBitStreamFormat = AMR_TX_WMF;
103     }
104     else
105     {
106         // check first if input parameters are valid
107         if ((IsModeValid(aProps->iMode) == false) ||
108                 (aProps->iInBitsPerSample == 0) ||
109                 (aProps->iInClockRate == 0) ||
110                 (aProps->iInSamplingRate == 0) ||
111                 (aProps->iInNumChannels == 0))
112         {
113             return GSMAMR_ENC_INVALID_PARAM;
114         }
115         // set AMR mode (bits per second)
116         iGsmAmrMode = (GSM_AMR_MODES)aProps->iMode;
117         if (aProps->iBitStreamFormat == AMR_TX_WMF)
118         {
119             iBitStreamFormat = AMR_TX_WMF;
120         }
121         else if (aProps->iBitStreamFormat == AMR_TX_IF2)
122         {
123             iBitStreamFormat = AMR_TX_IF2;
124         }
125         else
126         {
127             iBitStreamFormat = AMR_TX_ETS;
128         }
129     }
130 
131     iBytesPerSample = aProps->iInBitsPerSample / 8;
132 
133     // set maximum buffer size for encoded data
134     iMaxOutputBufferSize = aMaxOutputBufferSize;
135     // return output parameters that will be used
136     aProps->iOutSamplingRate = KDFLT_GAMR_SAMPLING_RATE;
137     aProps->iOutNumChannels = KDFLT_GAMR_NUM_CHANNELS;
138     aProps->iOutClockRate = aProps->iOutSamplingRate;
139 
140     // initialize AMR encoder
141     int32 nResult = AMREncodeInit(&iEncState, &iSidState, false);
142     if (nResult < 0) return(GSMAMR_ENC_CODEC_INIT_FAILURE);
143 
144     return GSMAMR_ENC_NO_ERROR;
145 }
146 
147 
148 ////////////////////////////////////////////////////////////////////////////
Encode(TInputAudioStream & aInStream,TOutputAudioStream & aOutStream)149 OSCL_EXPORT_REF int32 CPvGsmAmrEncoder::Encode(TInputAudioStream& aInStream,
150         TOutputAudioStream& aOutStream)
151 {
152     // check first if mode specified is invalid
153     if (IsModeValid(aInStream.iMode) == false)
154         return GSMAMR_ENC_INVALID_MODE;
155 
156     // set AMR mode for this set of samples
157     iGsmAmrMode = (GSM_AMR_MODES)aInStream.iMode;
158 
159     // get the maximum number of frames // BX
160     int32 bytesPerFrame = iNumSamplesPerFrame * iBytesPerSample;
161     int32 maxNumFrames = aInStream.iSampleLength / bytesPerFrame;
162     uint8 *pFrameIn  = aInStream.iSampleBuffer;
163     uint8 *pFrameOut = aOutStream.iBitStreamBuffer;
164     int32 i;
165 
166     // encode samples
167     for (i = 0; i < maxNumFrames; i++)
168     {
169 
170         // //////////////////////////////////////////
171         // encode this frame
172         // //////////////////////////////////////////
173         int32 * temp = & iLastModeUsed;
174         Word16 nStatus = AMREncode(iEncState, iSidState,    // BX, Word16 instead of int32 to avoid wierd case(IF2 format): the function returns 31, but nStatus ends up with a big wierd number
175                                    (Mode)iGsmAmrMode,
176                                    (Word16 *)pFrameIn,
177                                    (unsigned char *)pFrameOut,
178                                    (Frame_Type_3GPP*) temp,
179                                    iBitStreamFormat);
180 
181         if (nStatus < 0)
182         {
183             // an error when encoding was received, so quit
184             return(GSMAMR_ENC_CODEC_ENCODE_FAILURE);
185         }
186 
187         // save nStatus as this indicates the encoded frame size
188         int32 encFrameSize = (int32)nStatus;
189         aOutStream.iSampleFrameSize[i] = encFrameSize;
190         pFrameOut += encFrameSize;
191         pFrameIn  += bytesPerFrame;
192     }
193 
194     // set other values to be returned
195     aOutStream.iNumSampleFrames = maxNumFrames;
196     return(GSMAMR_ENC_NO_ERROR);
197 }
198 
199 ////////////////////////////////////////////////////////////////////////////
CleanupEncoder()200 OSCL_EXPORT_REF int32 CPvGsmAmrEncoder::CleanupEncoder()
201 {
202     // call terminate function of GSM AMR encoder
203     AMREncodeExit(&iEncState, &iSidState);
204 
205     iEncState = NULL;
206     iSidState = NULL;
207 
208     return GSMAMR_ENC_NO_ERROR;
209 }
210 
211 ////////////////////////////////////////////////////////////////////////////
Reset()212 OSCL_EXPORT_REF int32 CPvGsmAmrEncoder::Reset()
213 {
214     // reset GSM AMR encoder (state memory and SID sync function.)
215     Word16 nStatus = AMREncodeReset(&iEncState, &iSidState);
216 
217     if (nStatus < 0)
218     {
219         return GSMAMR_ENC_CODEC_ENCODE_FAILURE;
220     }
221     return GSMAMR_ENC_NO_ERROR;
222 }
223 
224 
225