RepeaterSource.cpp revision d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480c
1d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber//#define LOG_NDEBUG 0 2d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#define LOG_TAG "RepeaterSource" 3d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <utils/Log.h> 4d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 5d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include "RepeaterSource.h" 6d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 7d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/foundation/ADebug.h> 8d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/foundation/ALooper.h> 9d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/foundation/AMessage.h> 10d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/MediaBuffer.h> 11d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/MetaData.h> 12d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 13d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubernamespace android { 14d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 15d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas HuberRepeaterSource::RepeaterSource(const sp<MediaSource> &source, double rateHz) 16d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber : mSource(source), 17d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mRateHz(rateHz), 18d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer(NULL), 19d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mResult(OK), 20d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mStartTimeUs(-1ll), 21d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mFrameCount(0) { 22d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 23d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas HuberRepeaterSource::~RepeaterSource() { 25d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stop(); 26d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 27d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 28d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::start(MetaData *params) { 29d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t err = mSource->start(params); 30d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 31d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 32d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return err; 33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer = NULL; 36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mResult = OK; 37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mStartTimeUs = -1ll; 38d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mFrameCount = 0; 39d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 40d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper = new ALooper; 41d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper->start(); 42d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 43d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mReflector = new AHandlerReflector<RepeaterSource>(this); 44d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper->registerHandler(mReflector); 45d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber postRead(); 47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return OK; 49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 50d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 51d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::stop() { 52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (mLooper != NULL) { 53d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper->stop(); 54d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper.clear(); 55d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 56d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mReflector.clear(); 57d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 58d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 59d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return mSource->stop(); 60d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 61d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 62d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubersp<MetaData> RepeaterSource::getFormat() { 63d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return mSource->getFormat(); 64d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 65d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 66d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::read( 67d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber MediaBuffer **buffer, const ReadOptions *options) { 68d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int64_t seekTimeUs; 69d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ReadOptions::SeekMode seekMode; 70d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber CHECK(options == NULL || !options->getSeekTo(&seekTimeUs, &seekMode)); 71d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 72d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int64_t bufferTimeUs = -1ll; 73d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 74d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (mStartTimeUs < 0ll) { 75d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber Mutex::Autolock autoLock(mLock); 76d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber while (mBuffer == NULL && mResult == OK) { 77d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCondition.wait(mLock); 78d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 79d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 80d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mStartTimeUs = ALooper::GetNowUs(); 81d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferTimeUs = mStartTimeUs; 82d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } else { 83d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferTimeUs = mStartTimeUs + (mFrameCount * 1000000ll) / mRateHz; 84d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 85d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int64_t nowUs = ALooper::GetNowUs(); 86d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int64_t delayUs = bufferTimeUs - nowUs; 87d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 88d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (delayUs > 0ll) { 89d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber usleep(delayUs); 90d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 91d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 92d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 93d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber Mutex::Autolock autoLock(mLock); 94d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (mResult != OK) { 95d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber CHECK(mBuffer == NULL); 96d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return mResult; 97d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 98d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 99d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer->add_ref(); 100d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *buffer = mBuffer; 101d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber (*buffer)->meta_data()->setInt64(kKeyTime, bufferTimeUs); 102d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 103d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ++mFrameCount; 104d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 105d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return OK; 106d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 107d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 108d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubervoid RepeaterSource::postRead() { 109d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber (new AMessage(kWhatRead, mReflector->id()))->post(); 110d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 111d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 112d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubervoid RepeaterSource::onMessageReceived(const sp<AMessage> &msg) { 113d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber switch (msg->what()) { 114d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber case kWhatRead: 115d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber { 116d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber MediaBuffer *buffer; 117d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t err = mSource->read(&buffer); 118d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 119d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber Mutex::Autolock autoLock(mLock); 120d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (mBuffer != NULL) { 121d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer->release(); 122d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer = NULL; 123d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 124d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer = buffer; 125d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mResult = err; 126d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 127d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCondition.broadcast(); 128d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 129d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err == OK) { 130d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber postRead(); 131d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 132d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber break; 133d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 134d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 135d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber default: 136d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber TRESPASS(); 137d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 138d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 139d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 140d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} // namespace android 141