11526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma/*
21526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * Copyright (C) 2011 The Android Open Source Project
31526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma *
41526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * Licensed under the Apache License, Version 2.0 (the "License");
51526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * you may not use this file except in compliance with the License.
61526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * You may obtain a copy of the License at
71526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma *
81526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma *      http://www.apache.org/licenses/LICENSE-2.0
91526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma *
101526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * Unless required by applicable law or agreed to in writing, software
111526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * distributed under the License is distributed on an "AS IS" BASIS,
121526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * See the License for the specific language governing permissions and
141526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma * limitations under the License.
151526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma */
161526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
171526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma#define LOG_NDEBUG 1
187bdbbc7e45fca8e50df91ef2e8b39d1608841c9dGlenn Kasten#include <audio_utils/primitives.h>
191526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma#include <utils/Log.h>
201526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma#include "AudioMixer.h"
211526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma#include "VideoEditorResampler.h"
221526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
231526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharmanamespace android {
241526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
251526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharmastruct VideoEditorResampler : public AudioBufferProvider {
261526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
271526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    public:
281526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
297719f633bd8747b2f56c7be0f102ff131c074c2eJohn Grossman        virtual status_t getNextBuffer(Buffer* buffer, int64_t pts);
301526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma        virtual void releaseBuffer(Buffer* buffer);
311526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
321526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    enum { //Sampling freq
331526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     kFreq8000Hz = 8000,
341526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     kFreq11025Hz = 11025,
351526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     kFreq12000Hz = 12000,
361526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     kFreq16000Hz = 16000,
371526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     kFreq22050Hz = 22050,
387a4097cc526fc25a36e0f451613340a9444ca043James Dong     kFreq24000Hz = 24000,
391526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     kFreq32000Hz = 32000,
401526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     kFreq44100 = 44100,
411526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     kFreq48000 = 48000,
421526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    };
431526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
441526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    AudioResampler *mResampler;
451526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    int16_t* mInput;
461526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    int nbChannels;
471526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    int nbSamples;
4852897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    M4OSA_Int32 outSamplingRate;
4952897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    M4OSA_Int32 inSamplingRate;
501526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
51b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava    int16_t *mTmpInBuffer;
521526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma};
531526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
5452897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi#define MAX_SAMPLEDURATION_FOR_CONVERTION 40 //ms
551526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
567719f633bd8747b2f56c7be0f102ff131c074c2eJohn Grossmanstatus_t VideoEditorResampler::getNextBuffer(AudioBufferProvider::Buffer *pBuffer, int64_t pts) {
571526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
5852897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    uint32_t dataSize = pBuffer->frameCount * this->nbChannels * sizeof(int16_t);
59b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava    mTmpInBuffer = (int16_t*)malloc(dataSize);
60b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava    memcpy(mTmpInBuffer, this->mInput, dataSize);
61b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava    pBuffer->raw = (void*)mTmpInBuffer;
6252897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
631526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    return OK;
641526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma}
651526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
661526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharmavoid VideoEditorResampler::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) {
671526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
681526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    if(pBuffer->raw != NULL) {
6952897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        free(pBuffer->raw);
701526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma        pBuffer->raw = NULL;
715d5aed9d4e28fc2166617e54a219506fe0892e8bSantosh Madhava        mTmpInBuffer = NULL;
721526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    }
731526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    pBuffer->frameCount = 0;
741526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma}
751526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
761526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharmaextern "C" {
771526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
78100d01836041713337dd9532e417fb010bfb381cBasavapatna DattaguruM4OSA_Context  LVAudioResamplerCreate(M4OSA_Int32 bitDepth, M4OSA_Int32 inChannelCount,
791526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma                                     M4OSA_Int32 sampleRate, M4OSA_Int32 quality) {
801526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
811526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    VideoEditorResampler *context = new VideoEditorResampler();
821526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    context->mResampler = AudioResampler::create(
83ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        bitDepth, inChannelCount, sampleRate);
841526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    if (context->mResampler == NULL) {
85100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru        return NULL;
861526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    }
8752897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    context->mResampler->setSampleRate(android::VideoEditorResampler::kFreq32000Hz);
881526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    context->mResampler->setVolume(0x1000, 0x1000);
891526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    context->nbChannels = inChannelCount;
9052897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    context->outSamplingRate = sampleRate;
9152897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    context->mInput = NULL;
925d5aed9d4e28fc2166617e54a219506fe0892e8bSantosh Madhava    context->mTmpInBuffer = NULL;
931526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
94100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru    return ((M4OSA_Context )context);
951526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma}
961526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
971526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
98100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguruvoid LVAudiosetSampleRate(M4OSA_Context resamplerContext, M4OSA_Int32 inSampleRate) {
991526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
1001526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    VideoEditorResampler *context =
1011526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma      (VideoEditorResampler *)resamplerContext;
1021526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    context->mResampler->setSampleRate(inSampleRate);
1031526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    /*
1041526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     * nbSamples is calculated for 40ms worth of data;hence sample rate
1051526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     * is used to calculate the nbSamples
1061526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     */
10752897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    context->inSamplingRate = inSampleRate;
10852897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    // Allocate buffer for maximum allowed number of samples.
10952897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    context->mInput = (int16_t*)malloc( (inSampleRate * MAX_SAMPLEDURATION_FOR_CONVERTION *
11052897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi                                   context->nbChannels * sizeof(int16_t)) / 1000);
1111526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma}
1121526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
113100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguruvoid LVAudiosetVolume(M4OSA_Context resamplerContext, M4OSA_Int16 left, M4OSA_Int16 right) {
1141526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
1151526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    VideoEditorResampler *context =
1161526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma       (VideoEditorResampler *)resamplerContext;
1171526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    context->mResampler->setVolume(left,right);
1181526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma}
1191526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
120100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguruvoid LVDestroy(M4OSA_Context resamplerContext) {
12152897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
12252897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    VideoEditorResampler *context =
12352897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi       (VideoEditorResampler *)resamplerContext;
12452897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
125b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava    if (context->mTmpInBuffer != NULL) {
126b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava        free(context->mTmpInBuffer);
127b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava        context->mTmpInBuffer = NULL;
128b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava    }
129b4ce81da6664b5029406a78be71c39af055a4d29Santosh Madhava
13052897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    if (context->mInput != NULL) {
13152897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        free(context->mInput);
13252897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        context->mInput = NULL;
13352897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    }
13452897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
13552897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    if (context->mResampler != NULL) {
13652897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        delete context->mResampler;
13752897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        context->mResampler = NULL;
13852897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    }
13952897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
14052897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    if (context != NULL) {
14152897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        delete context;
14252897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi        context = NULL;
14352897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    }
14452897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi}
1451526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
1461526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharmavoid LVAudioresample_LowQuality(M4OSA_Int16* out, M4OSA_Int16* input,
147100d01836041713337dd9532e417fb010bfb381cBasavapatna Dattaguru                                     M4OSA_Int32 outFrameCount, M4OSA_Context resamplerContext) {
1481526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
1491526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    VideoEditorResampler *context =
1501526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma      (VideoEditorResampler *)resamplerContext;
1511526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    int32_t *pTmpBuffer = NULL;
15252897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
15352897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi    context->nbSamples = (context->inSamplingRate * outFrameCount) / context->outSamplingRate;
1541526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    memcpy(context->mInput,input,(context->nbSamples * context->nbChannels * sizeof(int16_t)));
15552897c2fda8d1d97796af1477c2748e3a2f25436Dharmaray Kundargi
1561526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    /*
1571526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma     SRC module always gives stereo output, hence 2 for stereo audio
1581526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    */
1591526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    pTmpBuffer = (int32_t*)malloc(outFrameCount * 2 * sizeof(int32_t));
1601526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    memset(pTmpBuffer, 0x00, outFrameCount * 2 * sizeof(int32_t));
1611526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
1621526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    context->mResampler->resample((int32_t *)pTmpBuffer,
1631526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma       (size_t)outFrameCount, (VideoEditorResampler *)resamplerContext);
1641526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    // Convert back to 16 bits
1657bdbbc7e45fca8e50df91ef2e8b39d1608841c9dGlenn Kasten    ditherAndClamp((int32_t*)out, pTmpBuffer, outFrameCount);
1661526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    free(pTmpBuffer);
1671526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma    pTmpBuffer = NULL;
1681526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma}
1691526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
1701526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma}
1711526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma
1721526a3385d36d6e1953c932410548bf9631a0eb3Dheeraj Sharma} //namespace android
173