• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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 #define LOG_NDEBUG 1
18 #include <utils/Log.h>
19 #include "AudioMixer.h"
20 #include "VideoEditorResampler.h"
21 
22 namespace android {
23 
24 struct VideoEditorResampler : public AudioBufferProvider {
25 
26     public:
27 
28         virtual status_t getNextBuffer(Buffer* buffer);
29         virtual void releaseBuffer(Buffer* buffer);
30 
31     enum { //Sampling freq
32      kFreq8000Hz = 8000,
33      kFreq11025Hz = 11025,
34      kFreq12000Hz = 12000,
35      kFreq16000Hz = 16000,
36      kFreq22050Hz = 22050,
37      kFreq240000Hz = 24000,
38      kFreq32000Hz = 32000,
39      kFreq44100 = 44100,
40      kFreq48000 = 48000,
41     };
42 
43     AudioResampler *mResampler;
44     int16_t* mInput;
45     int nbChannels;
46     int nbSamples;
47     M4OSA_Int32 outSamplingRate;
48     M4OSA_Int32 inSamplingRate;
49 
50     int16_t *mTmpInBuffer;
51 };
52 
53 #define MAX_SAMPLEDURATION_FOR_CONVERTION 40 //ms
54 
getNextBuffer(AudioBufferProvider::Buffer * pBuffer)55 status_t VideoEditorResampler::getNextBuffer(AudioBufferProvider::Buffer *pBuffer) {
56 
57     uint32_t dataSize = pBuffer->frameCount * this->nbChannels * sizeof(int16_t);
58     mTmpInBuffer = (int16_t*)malloc(dataSize);
59     memcpy(mTmpInBuffer, this->mInput, dataSize);
60     pBuffer->raw = (void*)mTmpInBuffer;
61 
62     return OK;
63 }
64 
releaseBuffer(AudioBufferProvider::Buffer * pBuffer)65 void VideoEditorResampler::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) {
66 
67     if(pBuffer->raw != NULL) {
68         free(pBuffer->raw);
69         pBuffer->raw = NULL;
70         mTmpInBuffer = NULL;
71     }
72     pBuffer->frameCount = 0;
73 }
74 
75 extern "C" {
76 
LVAudioResamplerCreate(M4OSA_Int32 bitDepth,M4OSA_Int32 inChannelCount,M4OSA_Int32 sampleRate,M4OSA_Int32 quality)77 M4OSA_Context  LVAudioResamplerCreate(M4OSA_Int32 bitDepth, M4OSA_Int32 inChannelCount,
78                                      M4OSA_Int32 sampleRate, M4OSA_Int32 quality) {
79 
80     VideoEditorResampler *context = new VideoEditorResampler();
81     context->mResampler = AudioResampler::create(
82         bitDepth, inChannelCount, sampleRate, AudioResampler::DEFAULT);
83     if (context->mResampler == NULL) {
84         return NULL;
85     }
86     context->mResampler->setSampleRate(android::VideoEditorResampler::kFreq32000Hz);
87     context->mResampler->setVolume(0x1000, 0x1000);
88     context->nbChannels = inChannelCount;
89     context->outSamplingRate = sampleRate;
90     context->mInput = NULL;
91     context->mTmpInBuffer = NULL;
92 
93     return ((M4OSA_Context )context);
94 }
95 
96 
LVAudiosetSampleRate(M4OSA_Context resamplerContext,M4OSA_Int32 inSampleRate)97 void LVAudiosetSampleRate(M4OSA_Context resamplerContext, M4OSA_Int32 inSampleRate) {
98 
99     VideoEditorResampler *context =
100       (VideoEditorResampler *)resamplerContext;
101     context->mResampler->setSampleRate(inSampleRate);
102     /*
103      * nbSamples is calculated for 40ms worth of data;hence sample rate
104      * is used to calculate the nbSamples
105      */
106     context->inSamplingRate = inSampleRate;
107     // Allocate buffer for maximum allowed number of samples.
108     context->mInput = (int16_t*)malloc( (inSampleRate * MAX_SAMPLEDURATION_FOR_CONVERTION *
109                                    context->nbChannels * sizeof(int16_t)) / 1000);
110 }
111 
LVAudiosetVolume(M4OSA_Context resamplerContext,M4OSA_Int16 left,M4OSA_Int16 right)112 void LVAudiosetVolume(M4OSA_Context resamplerContext, M4OSA_Int16 left, M4OSA_Int16 right) {
113 
114     VideoEditorResampler *context =
115        (VideoEditorResampler *)resamplerContext;
116     context->mResampler->setVolume(left,right);
117 }
118 
LVDestroy(M4OSA_Context resamplerContext)119 void LVDestroy(M4OSA_Context resamplerContext) {
120 
121     VideoEditorResampler *context =
122        (VideoEditorResampler *)resamplerContext;
123 
124     if (context->mTmpInBuffer != NULL) {
125         free(context->mTmpInBuffer);
126         context->mTmpInBuffer = NULL;
127     }
128 
129     if (context->mInput != NULL) {
130         free(context->mInput);
131         context->mInput = NULL;
132     }
133 
134     if (context->mResampler != NULL) {
135         delete context->mResampler;
136         context->mResampler = NULL;
137     }
138 
139     if (context != NULL) {
140         delete context;
141         context = NULL;
142     }
143 }
144 
LVAudioresample_LowQuality(M4OSA_Int16 * out,M4OSA_Int16 * input,M4OSA_Int32 outFrameCount,M4OSA_Context resamplerContext)145 void LVAudioresample_LowQuality(M4OSA_Int16* out, M4OSA_Int16* input,
146                                      M4OSA_Int32 outFrameCount, M4OSA_Context resamplerContext) {
147 
148     VideoEditorResampler *context =
149       (VideoEditorResampler *)resamplerContext;
150     int32_t *pTmpBuffer = NULL;
151 
152     context->nbSamples = (context->inSamplingRate * outFrameCount) / context->outSamplingRate;
153     memcpy(context->mInput,input,(context->nbSamples * context->nbChannels * sizeof(int16_t)));
154 
155     /*
156      SRC module always gives stereo output, hence 2 for stereo audio
157     */
158     pTmpBuffer = (int32_t*)malloc(outFrameCount * 2 * sizeof(int32_t));
159     memset(pTmpBuffer, 0x00, outFrameCount * 2 * sizeof(int32_t));
160 
161     context->mResampler->resample((int32_t *)pTmpBuffer,
162        (size_t)outFrameCount, (VideoEditorResampler *)resamplerContext);
163     // Convert back to 16 bits
164     AudioMixer::ditherAndClamp((int32_t*)out, pTmpBuffer, outFrameCount);
165     free(pTmpBuffer);
166     pTmpBuffer = NULL;
167 }
168 
169 }
170 
171 } //namespace android
172