RepeaterSource.cpp revision 1d15ab58bf8239069ef343de6cb21aabf3ef7d78
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) 1677245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber : mStarted(false), 1777245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber mSource(source), 18d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mRateHz(rateHz), 19d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer(NULL), 20d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mResult(OK), 214a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mLastBufferUpdateUs(-1ll), 22d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mStartTimeUs(-1ll), 23d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mFrameCount(0) { 24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 25d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 26d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas HuberRepeaterSource::~RepeaterSource() { 2777245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber CHECK(!mStarted); 28d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 29d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 30eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huberdouble RepeaterSource::getFrameRate() const { 31eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber return mRateHz; 32eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber} 33eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber 34eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Hubervoid RepeaterSource::setFrameRate(double rateHz) { 35eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber Mutex::Autolock autoLock(mLock); 36eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber 37eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber if (rateHz == mRateHz) { 38eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber return; 39eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber } 40eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber 41eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber if (mStartTimeUs >= 0ll) { 42eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber int64_t nextTimeUs = mStartTimeUs + (mFrameCount * 1000000ll) / mRateHz; 43eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber mStartTimeUs = nextTimeUs; 44eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber mFrameCount = 0; 45eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber } 46eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber mRateHz = rateHz; 47eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber} 48eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber 49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::start(MetaData *params) { 5077245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber CHECK(!mStarted); 5177245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber 52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t err = mSource->start(params); 53d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 54d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 55d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return err; 56d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 57d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 58d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer = NULL; 59d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mResult = OK; 60d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mStartTimeUs = -1ll; 61d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mFrameCount = 0; 62d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 63d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper = new ALooper; 64e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber mLooper->setName("repeater_looper"); 65d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper->start(); 66d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 67d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mReflector = new AHandlerReflector<RepeaterSource>(this); 68d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper->registerHandler(mReflector); 69d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 70d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber postRead(); 71d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 7277245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber mStarted = true; 7377245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber 74d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return OK; 75d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 76d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 77d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::stop() { 7877245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber CHECK(mStarted); 7977245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber 8096fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber ALOGV("stopping"); 8196fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 82456fa912e46edf0b01ea3b7760ea922c01ca1866Chong Zhang status_t err = mSource->stop(); 83456fa912e46edf0b01ea3b7760ea922c01ca1866Chong Zhang 84d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (mLooper != NULL) { 85d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper->stop(); 86d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mLooper.clear(); 87d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 88d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mReflector.clear(); 89d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 90d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 9196fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber if (mBuffer != NULL) { 9296fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber ALOGV("releasing mbuf %p", mBuffer); 9396fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber mBuffer->release(); 9496fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber mBuffer = NULL; 9596fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber } 9696fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 9796fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 9896fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber ALOGV("stopped"); 9996fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 10077245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber mStarted = false; 10177245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber 10296fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber return err; 103d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 104d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 105d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubersp<MetaData> RepeaterSource::getFormat() { 106d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return mSource->getFormat(); 107d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 108d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 109d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::read( 110d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber MediaBuffer **buffer, const ReadOptions *options) { 111d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int64_t seekTimeUs; 112d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ReadOptions::SeekMode seekMode; 113d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber CHECK(options == NULL || !options->getSeekTo(&seekTimeUs, &seekMode)); 114d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1154a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber for (;;) { 1164a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber int64_t bufferTimeUs = -1ll; 117d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1184a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber if (mStartTimeUs < 0ll) { 1194a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber Mutex::Autolock autoLock(mLock); 1204a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber while ((mLastBufferUpdateUs < 0ll || mBuffer == NULL) 1214a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber && mResult == OK) { 1224a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mCondition.wait(mLock); 1234a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } 124d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1254a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber ALOGV("now resuming."); 1264a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mStartTimeUs = ALooper::GetNowUs(); 1274a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber bufferTimeUs = mStartTimeUs; 1284a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } else { 1294a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber bufferTimeUs = mStartTimeUs + (mFrameCount * 1000000ll) / mRateHz; 130d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1314a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber int64_t nowUs = ALooper::GetNowUs(); 1324a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber int64_t delayUs = bufferTimeUs - nowUs; 133d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1344a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber if (delayUs > 0ll) { 1354a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber usleep(delayUs); 1364a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } 137d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 138d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1394a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber bool stale = false; 140d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1414a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber { 1424a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber Mutex::Autolock autoLock(mLock); 1434a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber if (mResult != OK) { 1444a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber CHECK(mBuffer == NULL); 1454a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber return mResult; 1464a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } 147d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1480224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber#if SUSPEND_VIDEO_IF_IDLE 1494a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber int64_t nowUs = ALooper::GetNowUs(); 1504a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber if (nowUs - mLastBufferUpdateUs > 1000000ll) { 1514a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mLastBufferUpdateUs = -1ll; 1524a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber stale = true; 1530224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber } else 1540224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber#endif 1550224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber { 1564a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mBuffer->add_ref(); 1574a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber *buffer = mBuffer; 1584a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber (*buffer)->meta_data()->setInt64(kKeyTime, bufferTimeUs); 1594a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber ++mFrameCount; 1604a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } 1614a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } 1624a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber 1634a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber if (!stale) { 1644a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber break; 1654a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } 1664a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber 1674a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mStartTimeUs = -1ll; 1684a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mFrameCount = 0; 1694a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber ALOGV("now dormant"); 1704a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } 171d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 172d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber return OK; 173d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 174d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 175d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubervoid RepeaterSource::postRead() { 1761d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatRead, mReflector))->post(); 177d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 178d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 179d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubervoid RepeaterSource::onMessageReceived(const sp<AMessage> &msg) { 180d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber switch (msg->what()) { 181d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber case kWhatRead: 182d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber { 183d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber MediaBuffer *buffer; 184d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber status_t err = mSource->read(&buffer); 185d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 18696fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber ALOGV("read mbuf %p", buffer); 18796fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber 188d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber Mutex::Autolock autoLock(mLock); 189d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (mBuffer != NULL) { 190d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer->release(); 191d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer = NULL; 192d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 193d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mBuffer = buffer; 194d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mResult = err; 1954a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mLastBufferUpdateUs = ALooper::GetNowUs(); 196d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 197d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCondition.broadcast(); 198d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 199d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err == OK) { 200d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber postRead(); 201d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 202d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber break; 203d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 204d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 205d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber default: 206d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber TRESPASS(); 207d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 208d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} 209d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 2104a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Hubervoid RepeaterSource::wakeUp() { 2114a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber ALOGV("wakeUp"); 2124a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber Mutex::Autolock autoLock(mLock); 2134a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber if (mLastBufferUpdateUs < 0ll && mBuffer != NULL) { 2144a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mLastBufferUpdateUs = ALooper::GetNowUs(); 2154a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber mCondition.broadcast(); 2164a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber } 2174a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber} 2184a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber 219d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber} // namespace android 220