Make line-ending consistent (unix style).

Change-Id: Id837b042952ff5d97907591f337b2222cff2c8a9
diff --git a/libvideoeditor/lvpp/VideoEditorSRC.cpp b/libvideoeditor/lvpp/VideoEditorSRC.cpp
index 17eb55a..9c50299 100755
--- a/libvideoeditor/lvpp/VideoEditorSRC.cpp
+++ b/libvideoeditor/lvpp/VideoEditorSRC.cpp
@@ -1,369 +1,369 @@
-/*

- * Copyright (C) 2011 The Android Open Source Project

- *

- * Licensed under the Apache License, Version 2.0 (the "License");

- * you may not use this file except in compliance with the License.

- * You may obtain a copy of the License at

- *

- *      http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-#define LOG_NDEBUG 1

-#define LOG_TAG "VEAudioSource"

-#include <utils/Log.h>

-

-

-#include "VideoEditorSRC.h"

-#include <media/stagefright/MetaData.h>

-#include <media/stagefright/MediaDebug.h>

-#include <media/stagefright/MediaBuffer.h>

-#include <media/stagefright/MediaDefs.h>

-#include "AudioMixer.h"

-

-

-namespace android {

-

-VideoEditorSRC::VideoEditorSRC(

-        const sp<MediaSource> &source) {

-

-    LOGV("VideoEditorSRC::Create");

-    mSource = source;

-    mResampler = NULL;

-    mBitDepth = 16;

-    mChannelCnt = 0;

-    mSampleRate = 0;

-    mOutputSampleRate = DEFAULT_SAMPLING_FREQ;

-    mStarted = false;

-    mIsResamplingRequired = false;

-    mIsChannelConvertionRequired = false;

-    mInitialTimeStampUs = -1;

-    mAccuOutBufferSize  = 0;

-    mSeekTimeUs = -1;

-    mLeftover = 0;

-    mLastReadSize = 0;

-    mReSampledBuffer = NULL;

-    mSeekMode =  ReadOptions::SEEK_PREVIOUS_SYNC;

-

-    mOutputFormat = new MetaData;

-

-    // Input Source validation

-    sp<MetaData> format = mSource->getFormat();

-    const char *mime;

-    bool success = format->findCString(kKeyMIMEType, &mime);

-    CHECK(success);

-    CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW));

-

-    //set the meta data of the output after convertion.

-    if(mOutputFormat != NULL) {

-        mOutputFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);

-        mOutputFormat->setInt32(kKeySampleRate, DEFAULT_SAMPLING_FREQ);

-

-        //by default we convert all data to stereo

-        mOutputFormat->setInt32(kKeyChannelCount, 2);

-    } else {

-        LOGE("Meta data was not allocated.");

-    }

-

-    // Allocate a  1 sec buffer (test only, to be refined)

-    mInterframeBufferPosition = 0;

-    mInterframeBuffer = new uint8_t[DEFAULT_SAMPLING_FREQ * 2 * 2]; //stereo=2 * bytespersample=2

-

-

-}

-

-VideoEditorSRC::~VideoEditorSRC(){

-    if (mStarted == true)

-        stop();

-

-    if(mOutputFormat != NULL) {

-        mOutputFormat.clear();

-        mOutputFormat = NULL;

-    }

-

-    if (mInterframeBuffer != NULL){

-        delete mInterframeBuffer;

-        mInterframeBuffer = NULL;

-    }

-}

-

-void VideoEditorSRC::setResampling(int32_t sampleRate) {

-    Mutex::Autolock autoLock(mLock);

-    LOGV("VideoEditorSRC::setResampling called with samplreRate = %d", sampleRate);

-    if(sampleRate != DEFAULT_SAMPLING_FREQ) { //default case

-        LOGV("VideoEditor Audio resampler, freq set is other than default");

-        CHECK(mOutputFormat->setInt32(kKeySampleRate, DEFAULT_SAMPLING_FREQ));

-    }

-    mOutputSampleRate = sampleRate;

-    return;

-}

-

-status_t  VideoEditorSRC::start (MetaData *params) {

-    Mutex::Autolock autoLock(mLock);

-

-    CHECK(!mStarted);

-    LOGV(" VideoEditorSRC:start() called");

-

-    sp<MetaData> format = mSource->getFormat();

-    const char *mime;

-    bool success = format->findCString(kKeyMIMEType, &mime);

-    CHECK(success);

-    CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW));

-

-    success = format->findInt32(kKeySampleRate, &mSampleRate);

-    CHECK(success);

-

-    int32_t numChannels;

-    success = format->findInt32(kKeyChannelCount, &mChannelCnt);

-    CHECK(success);

-

-    if(mSampleRate != mOutputSampleRate) {

-        LOGV("Resampling required (%d != %d)", mSampleRate, mOutputSampleRate);

-        mIsResamplingRequired = true;

-        LOGV("Create resampler %d %d %d", mBitDepth, mChannelCnt, mOutputSampleRate);

-

-        mResampler = AudioResampler::create(

-                        mBitDepth, mChannelCnt, mOutputSampleRate, AudioResampler::DEFAULT);

-

-        if(mResampler == NULL) {

-            return NO_MEMORY;

-        }

-        LOGV("Set input rate %d", mSampleRate);

-        mResampler->setSampleRate(mSampleRate);

-        mResampler->setVolume(UNITY_GAIN, UNITY_GAIN);

-

-    } else {

-        if(mChannelCnt != 2) { //we always make sure to provide stereo

-            LOGV("Only Channel convertion required");

-            mIsChannelConvertionRequired = true;

-        }

-    }

-    mSeekTimeUs = -1;

-    mSeekMode =  ReadOptions::SEEK_PREVIOUS_SYNC;

-    mStarted = true;

-    mSource->start();

-

-    return OK;

-}

-

-status_t VideoEditorSRC::stop() {

-

-    Mutex::Autolock autoLock(mLock);

-    LOGV("VideoEditorSRC::stop()");

-    mSource->stop();

-    if(mResampler != NULL) {

-        delete mResampler;

-        mResampler = NULL;

-    }

-    mStarted = false;

-    mInitialTimeStampUs = -1;

-    mAccuOutBufferSize  = 0;

-    mLeftover = 0;

-    mLastReadSize = 0;

-    if (mReSampledBuffer != NULL) {

-        free(mReSampledBuffer);

-        mReSampledBuffer = NULL;

-    }

-

-    return OK;

-}

-

-sp<MetaData> VideoEditorSRC::getFormat() {

-    LOGV("AudioSRC getFormat");

-    //Mutex::Autolock autoLock(mLock);

-    return mOutputFormat;

-}

-

-status_t VideoEditorSRC::read (

-        MediaBuffer **buffer_out, const ReadOptions *options) {

-    Mutex::Autolock autoLock(mLock);

-    *buffer_out = NULL;

-    int32_t leftover = 0;

-

-    LOGV("VideoEditorSRC::read");

-

-    if (!mStarted) {

-        return ERROR_END_OF_STREAM;

-    }

-

-    if(mIsResamplingRequired == true) {

-

-        LOGV("mIsResamplingRequired = true");

-

-        // Store the seek parameters

-        int64_t seekTimeUs;

-        ReadOptions::SeekMode mode = ReadOptions::SEEK_PREVIOUS_SYNC;

-        if (options && options->getSeekTo(&seekTimeUs, &mode)) {

-            LOGV("read Seek %lld", seekTimeUs);

-            mInitialTimeStampUs = -1;

-            mSeekTimeUs = seekTimeUs;

-            mSeekMode = mode;

-        }

-

-        // We ask for 1024 frames in output

-        size_t outFrameCnt = 1024;

-        int32_t outBufferSize = (outFrameCnt) * 2 * sizeof(int16_t); //out is always 2 channels & 16 bits

-        int64_t outDurationUs = (outBufferSize * 1000000) /(mOutputSampleRate * 2 * sizeof(int16_t)); //2 channels out * 2 bytes per sample

-        LOGV("outBufferSize            %d", outBufferSize);

-        LOGV("outFrameCnt              %d", outFrameCnt);

-

-        int32_t *pTmpBuffer = (int32_t*)malloc(outFrameCnt * 2 * sizeof(int32_t)); //out is always 2 channels and resampler out is 32 bits

-        memset(pTmpBuffer, 0x00, outFrameCnt * 2 * sizeof(int32_t));

-        // Resample to target quality

-        mResampler->resample(pTmpBuffer, outFrameCnt, this);

-

-        // Free previous allocation

-        if (mReSampledBuffer != NULL) {

-            free(mReSampledBuffer);

-            mReSampledBuffer = NULL;

-        }

-        mReSampledBuffer = (int16_t*)malloc(outBufferSize);

-        memset(mReSampledBuffer, 0x00, outBufferSize);

-

-        // Convert back to 16 bits

-        AudioMixer::ditherAndClamp((int32_t*)mReSampledBuffer, pTmpBuffer, outFrameCnt);

-        LOGV("Resampled buffer size %d", outFrameCnt* 2 * sizeof(int16_t));

-

-        // Create new MediaBuffer

-        mCopyBuffer = new MediaBuffer((void*)mReSampledBuffer, outBufferSize);

-

-        // Compute and set the new timestamp

-        sp<MetaData> to = mCopyBuffer->meta_data();

-        int64_t totalOutDurationUs = (mAccuOutBufferSize * 1000000) /(mOutputSampleRate * 2 * 2); //2 channels out * 2 bytes per sample

-        int64_t timeUs = mInitialTimeStampUs + totalOutDurationUs;

-        to->setInt64(kKeyTime, timeUs);

-        LOGV("buffer duration %lld   timestamp %lld   init %lld", outDurationUs, timeUs, mInitialTimeStampUs);

-

-        // update the accumulate size

-        mAccuOutBufferSize += outBufferSize;

-

-        mCopyBuffer->set_range(0, outBufferSize);

-        *buffer_out = mCopyBuffer;

-

-        free(pTmpBuffer);

-

-    } else if(mIsChannelConvertionRequired == true) {

-        //TODO convert to stereo here.

-    } else {

-        //LOGI("Resampling not required");

-        MediaBuffer *aBuffer;

-        status_t err = mSource->read(&aBuffer, options);

-        LOGV("mSource->read returned %d", err);

-        if(err != OK) {

-            *buffer_out = NULL;

-            mStarted = false;

-            return err;

-        }

-        *buffer_out = aBuffer;

-    }

-

-    return OK;

-}

-

-status_t VideoEditorSRC::getNextBuffer(AudioBufferProvider::Buffer *pBuffer) {

-    LOGV("Requesting        %d", pBuffer->frameCount);

-    uint32_t availableFrames;

-    bool lastBuffer = false;

-    MediaBuffer *aBuffer;

-

-

-    //update the internal buffer

-    // Store the leftover at the beginning of the local buffer

-    if (mLeftover > 0) {

-        LOGV("Moving mLeftover =%d  from  %d", mLeftover, mLastReadSize);

-        if (mLastReadSize > 0) {

-            memcpy(mInterframeBuffer, (uint8_t*) (mInterframeBuffer + mLastReadSize), mLeftover);

-        }

-        mInterframeBufferPosition = mLeftover;

-    }

-    else {

-        mInterframeBufferPosition = 0;

-    }

-

-    availableFrames = mInterframeBufferPosition / (mChannelCnt*2);

-

-    while ((availableFrames < pBuffer->frameCount)&&(mStarted)) {

-        // if we seek, reset the initial time stamp and accumulated time

-        ReadOptions options;

-        if (mSeekTimeUs >= 0) {

-            LOGV("%p cacheMore_l Seek requested = %lld", this, mSeekTimeUs);

-            ReadOptions::SeekMode mode = mSeekMode;

-            options.setSeekTo(mSeekTimeUs, mode);

-            mSeekTimeUs = -1;

-        }

-        /* The first call to read() will require to buffer twice as much data */

-        /* This will be needed by the resampler */

-        status_t err = mSource->read(&aBuffer, &options);

-        LOGV("mSource->read returned %d", err);

-        if(err != OK) {

-            if (mInterframeBufferPosition == 0) {

-                mStarted = false;

-            }

-            //Empty the internal buffer if there is no more data left in the source

-            else {

-                lastBuffer = true;

-                //clear the end of the buffer, just in case

-                memset(mInterframeBuffer+mInterframeBufferPosition, 0x00, DEFAULT_SAMPLING_FREQ * 2 * 2 - mInterframeBufferPosition);

-                mStarted = false;

-            }

-        }

-        else {

-            //copy the buffer

-            memcpy(((uint8_t*) mInterframeBuffer) + mInterframeBufferPosition,

-                    ((uint8_t*) aBuffer->data()) + aBuffer->range_offset(),

-                    aBuffer->range_length());

-            LOGV("Read from buffer  %d", aBuffer->range_length());

-

-            mInterframeBufferPosition += aBuffer->range_length();

-            LOGV("Stored            %d", mInterframeBufferPosition);

-

-            // Get the time stamp of the first buffer

-            if (mInitialTimeStampUs == -1) {

-                int64_t curTS;

-                sp<MetaData> from = aBuffer->meta_data();

-                from->findInt64(kKeyTime, &curTS);

-                LOGV("setting mInitialTimeStampUs to %lld", mInitialTimeStampUs);

-                mInitialTimeStampUs = curTS;

-            }

-

-            // release the buffer

-            aBuffer->release();

-        }

-        availableFrames = mInterframeBufferPosition / (mChannelCnt*2);

-        LOGV("availableFrames   %d", availableFrames);

-    }

-

-    if (lastBuffer) {

-        pBuffer->frameCount = availableFrames;

-    }

-

-    //update the input buffer

-    pBuffer->raw        = (void*)(mInterframeBuffer);

-

-    // Update how many bytes are left

-    // (actualReadSize is updated in getNextBuffer() called from resample())

-    int32_t actualReadSize = pBuffer->frameCount * mChannelCnt * 2;

-    mLeftover = mInterframeBufferPosition - actualReadSize;

-    LOGV("mLeftover         %d", mLeftover);

-

-    mLastReadSize = actualReadSize;

-

-    LOGV("inFrameCount     %d", pBuffer->frameCount);

-

-    return OK;

-}

-

-

-void VideoEditorSRC::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) {

-    if(pBuffer->raw != NULL) {

-        pBuffer->raw = NULL;

-    }

-    pBuffer->frameCount = 0;

-}

-

-} //namespce android

+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_NDEBUG 1
+#define LOG_TAG "VEAudioSource"
+#include <utils/Log.h>
+
+
+#include "VideoEditorSRC.h"
+#include <media/stagefright/MetaData.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaBuffer.h>
+#include <media/stagefright/MediaDefs.h>
+#include "AudioMixer.h"
+
+
+namespace android {
+
+VideoEditorSRC::VideoEditorSRC(
+        const sp<MediaSource> &source) {
+
+    LOGV("VideoEditorSRC::Create");
+    mSource = source;
+    mResampler = NULL;
+    mBitDepth = 16;
+    mChannelCnt = 0;
+    mSampleRate = 0;
+    mOutputSampleRate = DEFAULT_SAMPLING_FREQ;
+    mStarted = false;
+    mIsResamplingRequired = false;
+    mIsChannelConvertionRequired = false;
+    mInitialTimeStampUs = -1;
+    mAccuOutBufferSize  = 0;
+    mSeekTimeUs = -1;
+    mLeftover = 0;
+    mLastReadSize = 0;
+    mReSampledBuffer = NULL;
+    mSeekMode =  ReadOptions::SEEK_PREVIOUS_SYNC;
+
+    mOutputFormat = new MetaData;
+
+    // Input Source validation
+    sp<MetaData> format = mSource->getFormat();
+    const char *mime;
+    bool success = format->findCString(kKeyMIMEType, &mime);
+    CHECK(success);
+    CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW));
+
+    //set the meta data of the output after convertion.
+    if(mOutputFormat != NULL) {
+        mOutputFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
+        mOutputFormat->setInt32(kKeySampleRate, DEFAULT_SAMPLING_FREQ);
+
+        //by default we convert all data to stereo
+        mOutputFormat->setInt32(kKeyChannelCount, 2);
+    } else {
+        LOGE("Meta data was not allocated.");
+    }
+
+    // Allocate a  1 sec buffer (test only, to be refined)
+    mInterframeBufferPosition = 0;
+    mInterframeBuffer = new uint8_t[DEFAULT_SAMPLING_FREQ * 2 * 2]; //stereo=2 * bytespersample=2
+
+
+}
+
+VideoEditorSRC::~VideoEditorSRC(){
+    if (mStarted == true)
+        stop();
+
+    if(mOutputFormat != NULL) {
+        mOutputFormat.clear();
+        mOutputFormat = NULL;
+    }
+
+    if (mInterframeBuffer != NULL){
+        delete mInterframeBuffer;
+        mInterframeBuffer = NULL;
+    }
+}
+
+void VideoEditorSRC::setResampling(int32_t sampleRate) {
+    Mutex::Autolock autoLock(mLock);
+    LOGV("VideoEditorSRC::setResampling called with samplreRate = %d", sampleRate);
+    if(sampleRate != DEFAULT_SAMPLING_FREQ) { //default case
+        LOGV("VideoEditor Audio resampler, freq set is other than default");
+        CHECK(mOutputFormat->setInt32(kKeySampleRate, DEFAULT_SAMPLING_FREQ));
+    }
+    mOutputSampleRate = sampleRate;
+    return;
+}
+
+status_t  VideoEditorSRC::start (MetaData *params) {
+    Mutex::Autolock autoLock(mLock);
+
+    CHECK(!mStarted);
+    LOGV(" VideoEditorSRC:start() called");
+
+    sp<MetaData> format = mSource->getFormat();
+    const char *mime;
+    bool success = format->findCString(kKeyMIMEType, &mime);
+    CHECK(success);
+    CHECK(!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW));
+
+    success = format->findInt32(kKeySampleRate, &mSampleRate);
+    CHECK(success);
+
+    int32_t numChannels;
+    success = format->findInt32(kKeyChannelCount, &mChannelCnt);
+    CHECK(success);
+
+    if(mSampleRate != mOutputSampleRate) {
+        LOGV("Resampling required (%d != %d)", mSampleRate, mOutputSampleRate);
+        mIsResamplingRequired = true;
+        LOGV("Create resampler %d %d %d", mBitDepth, mChannelCnt, mOutputSampleRate);
+
+        mResampler = AudioResampler::create(
+                        mBitDepth, mChannelCnt, mOutputSampleRate, AudioResampler::DEFAULT);
+
+        if(mResampler == NULL) {
+            return NO_MEMORY;
+        }
+        LOGV("Set input rate %d", mSampleRate);
+        mResampler->setSampleRate(mSampleRate);
+        mResampler->setVolume(UNITY_GAIN, UNITY_GAIN);
+
+    } else {
+        if(mChannelCnt != 2) { //we always make sure to provide stereo
+            LOGV("Only Channel convertion required");
+            mIsChannelConvertionRequired = true;
+        }
+    }
+    mSeekTimeUs = -1;
+    mSeekMode =  ReadOptions::SEEK_PREVIOUS_SYNC;
+    mStarted = true;
+    mSource->start();
+
+    return OK;
+}
+
+status_t VideoEditorSRC::stop() {
+
+    Mutex::Autolock autoLock(mLock);
+    LOGV("VideoEditorSRC::stop()");
+    mSource->stop();
+    if(mResampler != NULL) {
+        delete mResampler;
+        mResampler = NULL;
+    }
+    mStarted = false;
+    mInitialTimeStampUs = -1;
+    mAccuOutBufferSize  = 0;
+    mLeftover = 0;
+    mLastReadSize = 0;
+    if (mReSampledBuffer != NULL) {
+        free(mReSampledBuffer);
+        mReSampledBuffer = NULL;
+    }
+
+    return OK;
+}
+
+sp<MetaData> VideoEditorSRC::getFormat() {
+    LOGV("AudioSRC getFormat");
+    //Mutex::Autolock autoLock(mLock);
+    return mOutputFormat;
+}
+
+status_t VideoEditorSRC::read (
+        MediaBuffer **buffer_out, const ReadOptions *options) {
+    Mutex::Autolock autoLock(mLock);
+    *buffer_out = NULL;
+    int32_t leftover = 0;
+
+    LOGV("VideoEditorSRC::read");
+
+    if (!mStarted) {
+        return ERROR_END_OF_STREAM;
+    }
+
+    if(mIsResamplingRequired == true) {
+
+        LOGV("mIsResamplingRequired = true");
+
+        // Store the seek parameters
+        int64_t seekTimeUs;
+        ReadOptions::SeekMode mode = ReadOptions::SEEK_PREVIOUS_SYNC;
+        if (options && options->getSeekTo(&seekTimeUs, &mode)) {
+            LOGV("read Seek %lld", seekTimeUs);
+            mInitialTimeStampUs = -1;
+            mSeekTimeUs = seekTimeUs;
+            mSeekMode = mode;
+        }
+
+        // We ask for 1024 frames in output
+        size_t outFrameCnt = 1024;
+        int32_t outBufferSize = (outFrameCnt) * 2 * sizeof(int16_t); //out is always 2 channels & 16 bits
+        int64_t outDurationUs = (outBufferSize * 1000000) /(mOutputSampleRate * 2 * sizeof(int16_t)); //2 channels out * 2 bytes per sample
+        LOGV("outBufferSize            %d", outBufferSize);
+        LOGV("outFrameCnt              %d", outFrameCnt);
+
+        int32_t *pTmpBuffer = (int32_t*)malloc(outFrameCnt * 2 * sizeof(int32_t)); //out is always 2 channels and resampler out is 32 bits
+        memset(pTmpBuffer, 0x00, outFrameCnt * 2 * sizeof(int32_t));
+        // Resample to target quality
+        mResampler->resample(pTmpBuffer, outFrameCnt, this);
+
+        // Free previous allocation
+        if (mReSampledBuffer != NULL) {
+            free(mReSampledBuffer);
+            mReSampledBuffer = NULL;
+        }
+        mReSampledBuffer = (int16_t*)malloc(outBufferSize);
+        memset(mReSampledBuffer, 0x00, outBufferSize);
+
+        // Convert back to 16 bits
+        AudioMixer::ditherAndClamp((int32_t*)mReSampledBuffer, pTmpBuffer, outFrameCnt);
+        LOGV("Resampled buffer size %d", outFrameCnt* 2 * sizeof(int16_t));
+
+        // Create new MediaBuffer
+        mCopyBuffer = new MediaBuffer((void*)mReSampledBuffer, outBufferSize);
+
+        // Compute and set the new timestamp
+        sp<MetaData> to = mCopyBuffer->meta_data();
+        int64_t totalOutDurationUs = (mAccuOutBufferSize * 1000000) /(mOutputSampleRate * 2 * 2); //2 channels out * 2 bytes per sample
+        int64_t timeUs = mInitialTimeStampUs + totalOutDurationUs;
+        to->setInt64(kKeyTime, timeUs);
+        LOGV("buffer duration %lld   timestamp %lld   init %lld", outDurationUs, timeUs, mInitialTimeStampUs);
+
+        // update the accumulate size
+        mAccuOutBufferSize += outBufferSize;
+
+        mCopyBuffer->set_range(0, outBufferSize);
+        *buffer_out = mCopyBuffer;
+
+        free(pTmpBuffer);
+
+    } else if(mIsChannelConvertionRequired == true) {
+        //TODO convert to stereo here.
+    } else {
+        //LOGI("Resampling not required");
+        MediaBuffer *aBuffer;
+        status_t err = mSource->read(&aBuffer, options);
+        LOGV("mSource->read returned %d", err);
+        if(err != OK) {
+            *buffer_out = NULL;
+            mStarted = false;
+            return err;
+        }
+        *buffer_out = aBuffer;
+    }
+
+    return OK;
+}
+
+status_t VideoEditorSRC::getNextBuffer(AudioBufferProvider::Buffer *pBuffer) {
+    LOGV("Requesting        %d", pBuffer->frameCount);
+    uint32_t availableFrames;
+    bool lastBuffer = false;
+    MediaBuffer *aBuffer;
+
+
+    //update the internal buffer
+    // Store the leftover at the beginning of the local buffer
+    if (mLeftover > 0) {
+        LOGV("Moving mLeftover =%d  from  %d", mLeftover, mLastReadSize);
+        if (mLastReadSize > 0) {
+            memcpy(mInterframeBuffer, (uint8_t*) (mInterframeBuffer + mLastReadSize), mLeftover);
+        }
+        mInterframeBufferPosition = mLeftover;
+    }
+    else {
+        mInterframeBufferPosition = 0;
+    }
+
+    availableFrames = mInterframeBufferPosition / (mChannelCnt*2);
+
+    while ((availableFrames < pBuffer->frameCount)&&(mStarted)) {
+        // if we seek, reset the initial time stamp and accumulated time
+        ReadOptions options;
+        if (mSeekTimeUs >= 0) {
+            LOGV("%p cacheMore_l Seek requested = %lld", this, mSeekTimeUs);
+            ReadOptions::SeekMode mode = mSeekMode;
+            options.setSeekTo(mSeekTimeUs, mode);
+            mSeekTimeUs = -1;
+        }
+        /* The first call to read() will require to buffer twice as much data */
+        /* This will be needed by the resampler */
+        status_t err = mSource->read(&aBuffer, &options);
+        LOGV("mSource->read returned %d", err);
+        if(err != OK) {
+            if (mInterframeBufferPosition == 0) {
+                mStarted = false;
+            }
+            //Empty the internal buffer if there is no more data left in the source
+            else {
+                lastBuffer = true;
+                //clear the end of the buffer, just in case
+                memset(mInterframeBuffer+mInterframeBufferPosition, 0x00, DEFAULT_SAMPLING_FREQ * 2 * 2 - mInterframeBufferPosition);
+                mStarted = false;
+            }
+        }
+        else {
+            //copy the buffer
+            memcpy(((uint8_t*) mInterframeBuffer) + mInterframeBufferPosition,
+                    ((uint8_t*) aBuffer->data()) + aBuffer->range_offset(),
+                    aBuffer->range_length());
+            LOGV("Read from buffer  %d", aBuffer->range_length());
+
+            mInterframeBufferPosition += aBuffer->range_length();
+            LOGV("Stored            %d", mInterframeBufferPosition);
+
+            // Get the time stamp of the first buffer
+            if (mInitialTimeStampUs == -1) {
+                int64_t curTS;
+                sp<MetaData> from = aBuffer->meta_data();
+                from->findInt64(kKeyTime, &curTS);
+                LOGV("setting mInitialTimeStampUs to %lld", mInitialTimeStampUs);
+                mInitialTimeStampUs = curTS;
+            }
+
+            // release the buffer
+            aBuffer->release();
+        }
+        availableFrames = mInterframeBufferPosition / (mChannelCnt*2);
+        LOGV("availableFrames   %d", availableFrames);
+    }
+
+    if (lastBuffer) {
+        pBuffer->frameCount = availableFrames;
+    }
+
+    //update the input buffer
+    pBuffer->raw        = (void*)(mInterframeBuffer);
+
+    // Update how many bytes are left
+    // (actualReadSize is updated in getNextBuffer() called from resample())
+    int32_t actualReadSize = pBuffer->frameCount * mChannelCnt * 2;
+    mLeftover = mInterframeBufferPosition - actualReadSize;
+    LOGV("mLeftover         %d", mLeftover);
+
+    mLastReadSize = actualReadSize;
+
+    LOGV("inFrameCount     %d", pBuffer->frameCount);
+
+    return OK;
+}
+
+
+void VideoEditorSRC::releaseBuffer(AudioBufferProvider::Buffer *pBuffer) {
+    if(pBuffer->raw != NULL) {
+        pBuffer->raw = NULL;
+    }
+    pBuffer->frameCount = 0;
+}
+
+} //namespce android