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