13399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/* 23399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Copyright (C) 2011 The Android Open Source Project 33399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * 43399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Licensed under the Apache License, Version 2.0 (the "License"); 53399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * you may not use this file except in compliance with the License. 63399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * You may obtain a copy of the License at 73399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * 83399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * http://www.apache.org/licenses/LICENSE-2.0 93399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * 103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Unless required by applicable law or agreed to in writing, software 113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * distributed under the License is distributed on an "AS IS" BASIS, 123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * See the License for the specific language governing permissions and 143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * limitations under the License. 153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi */ 167dc9b309f1ce01308bcfde9948ebfece32dc2870Pannag Sanketi//#define LOG_NDEBUG 0 171a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi#define LOG_TAG "SurfaceMediaSource" 183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 19a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn#include <inttypes.h> 20a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn 21f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 221a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketi#include <media/stagefright/SurfaceMediaSource.h> 233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <media/stagefright/MediaDefs.h> 24b62f95145293bf1a39959166a4964088bb413224Andreas Huber#include <media/stagefright/MetaData.h> 256c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong#include <OMX_IVCommon.h> 263e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar#include <media/hardware/HardwareAPI.h> 275e1f08b3917ac7900f8a11118afb7e8bf3e61c64Mathias Agopian#include <media/hardware/MetadataBufferType.h> 283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 29f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <ui/GraphicBuffer.h> 308ed8ceda7cfe29e8417142ef460cd70060204459Dan Stoza#include <gui/BufferItem.h> 31df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/ISurfaceComposer.h> 32df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/IGraphicBufferAlloc.h> 333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <OMX_Component.h> 343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 353399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <utils/Log.h> 363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <utils/String8.h> 373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 38404a123bed7f180724ead17f10e037b3eb347701Mathias Agopian#include <private/gui/ComposerService.h> 39404a123bed7f180724ead17f10e037b3eb347701Mathias Agopian 403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketinamespace android { 413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 42bdddc659a941afdb7f4958f582c6901c07246097Daniel LamSurfaceMediaSource::SurfaceMediaSource(uint32_t bufferWidth, uint32_t bufferHeight) : 43bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mWidth(bufferWidth), 44bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mHeight(bufferHeight), 45bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mCurrentSlot(BufferQueue::INVALID_BUFFER_SLOT), 46b62f95145293bf1a39959166a4964088bb413224Andreas Huber mNumPendingBuffers(0), 47bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mCurrentTimestamp(0), 48bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mFrameRate(30), 49a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber mStarted(false), 50bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mNumFramesReceived(0), 51bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mNumFramesEncoded(0), 52b62f95145293bf1a39959166a4964088bb413224Andreas Huber mFirstFrameTimestamp(0), 5390689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber mMaxAcquiredBufferCount(4), // XXX double-check the default 5490689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber mUseAbsoluteTimestamps(false) { 55a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennis ALOGV("SurfaceMediaSource"); 563399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 57bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam if (bufferWidth == 0 || bufferHeight == 0) { 58bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam ALOGE("Invalid dimensions %dx%d", bufferWidth, bufferHeight); 593399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 603399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 615205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza BufferQueue::createBufferQueue(&mProducer, &mConsumer); 625205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza mConsumer->setDefaultBufferSize(bufferWidth, bufferHeight); 635205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_VIDEO_ENCODER | 648add6cf4976de9b7bca7b73b1473a1e5f7201087Eino-Ville Talvala GRALLOC_USAGE_HW_TEXTURE); 653399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 66bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam sp<ISurfaceComposer> composer(ComposerService::getComposerService()); 673399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 68bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // Note that we can't create an sp<...>(this) in a ctor that will not keep a 69bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // reference once the ctor ends, as that would cause the refcount of 'this' 70bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // dropping to 0 at the end of the ctor. Since all we need is a wp<...> 71bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // that's what we create. 72deeef54487a34034dc0cfaab20b20d557224c07cMathias Agopian wp<ConsumerListener> listener = static_cast<ConsumerListener*>(this); 73910813bd66eaf0f6a72769c9b3fa9830dd100a19Mathias Agopian sp<BufferQueue::ProxyConsumerListener> proxy = new BufferQueue::ProxyConsumerListener(listener); 743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 755205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza status_t err = mConsumer->consumerConnect(proxy, false); 76bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam if (err != NO_ERROR) { 77bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam ALOGE("SurfaceMediaSource: error connecting to BufferQueue: %s (%d)", 78bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam strerror(-err), err); 793399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 803399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 813399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 82bdddc659a941afdb7f4958f582c6901c07246097Daniel LamSurfaceMediaSource::~SurfaceMediaSource() { 83a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennis ALOGV("~SurfaceMediaSource"); 84a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber CHECK(!mStarted); 853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 871a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketinsecs_t SurfaceMediaSource::getTimestamp() { 88a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennis ALOGV("getTimestamp"); 893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi Mutex::Autolock lock(mMutex); 903399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return mCurrentTimestamp; 913399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 923399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 931a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSource::setFrameAvailableListener( 943399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi const sp<FrameAvailableListener>& listener) { 95a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennis ALOGV("setFrameAvailableListener"); 963399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi Mutex::Autolock lock(mMutex); 973399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mFrameAvailableListener = listener; 983399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 993399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1001a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSource::dump(String8& result) const 1013399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi{ 1023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi char buffer[1024]; 1033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi dump(result, "", buffer, 1024); 1043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1053399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 10684333e0475bc911adc16417f4ca327c975cf6c36Andreas Hubervoid SurfaceMediaSource::dump( 10784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber String8& result, 10884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const char* /* prefix */, 10984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber char* buffer, 11084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber size_t /* SIZE */) const 1113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi{ 112bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam Mutex::Autolock lock(mMutex); 1133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi result.append(buffer); 1155205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza mConsumer->dump(result, ""); 1163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 118b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketistatus_t SurfaceMediaSource::setFrameRate(int32_t fps) 1193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi{ 120a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennis ALOGV("setFrameRate"); 1213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi Mutex::Autolock lock(mMutex); 122b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi const int MAX_FRAME_RATE = 60; 123b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi if (fps < 0 || fps > MAX_FRAME_RATE) { 124b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi return BAD_VALUE; 125b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi } 1263399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi mFrameRate = fps; 127b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi return OK; 1283399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1303e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos MolnarMetadataBufferType SurfaceMediaSource::metaDataStoredInVideoBuffers() const { 1313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("isMetaDataStoredInVideoBuffers"); 1323e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar return kMetadataBufferTypeANWBuffer; 133b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi} 134b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 135b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketiint32_t SurfaceMediaSource::getFrameRate( ) const { 136a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennis ALOGV("getFrameRate"); 1373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi Mutex::Autolock lock(mMutex); 1383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return mFrameRate; 1393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1411a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketistatus_t SurfaceMediaSource::start(MetaData *params) 1423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi{ 143a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennis ALOGV("start"); 144df4a59c61103e7e0e9332e167a0be67da5d82ff3Eino-Ville Talvala 14556fc8fb5437e08131a84063041183d5ce8a678ccJames Dong Mutex::Autolock lock(mMutex); 14656fc8fb5437e08131a84063041183d5ce8a678ccJames Dong 147a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber CHECK(!mStarted); 148a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber 149df4a59c61103e7e0e9332e167a0be67da5d82ff3Eino-Ville Talvala mStartTimeNs = 0; 150df4a59c61103e7e0e9332e167a0be67da5d82ff3Eino-Ville Talvala int64_t startTimeUs; 15156fc8fb5437e08131a84063041183d5ce8a678ccJames Dong int32_t bufferCount = 0; 15256fc8fb5437e08131a84063041183d5ce8a678ccJames Dong if (params) { 15356fc8fb5437e08131a84063041183d5ce8a678ccJames Dong if (params->findInt64(kKeyTime, &startTimeUs)) { 15456fc8fb5437e08131a84063041183d5ce8a678ccJames Dong mStartTimeNs = startTimeUs * 1000; 15556fc8fb5437e08131a84063041183d5ce8a678ccJames Dong } 15656fc8fb5437e08131a84063041183d5ce8a678ccJames Dong 15756fc8fb5437e08131a84063041183d5ce8a678ccJames Dong if (!params->findInt32(kKeyNumBuffers, &bufferCount)) { 15856fc8fb5437e08131a84063041183d5ce8a678ccJames Dong ALOGE("Failed to find the advertised buffer count"); 15956fc8fb5437e08131a84063041183d5ce8a678ccJames Dong return UNKNOWN_ERROR; 16056fc8fb5437e08131a84063041183d5ce8a678ccJames Dong } 16156fc8fb5437e08131a84063041183d5ce8a678ccJames Dong 16256fc8fb5437e08131a84063041183d5ce8a678ccJames Dong if (bufferCount <= 1) { 16356fc8fb5437e08131a84063041183d5ce8a678ccJames Dong ALOGE("bufferCount %d is too small", bufferCount); 16456fc8fb5437e08131a84063041183d5ce8a678ccJames Dong return BAD_VALUE; 16556fc8fb5437e08131a84063041183d5ce8a678ccJames Dong } 166b62f95145293bf1a39959166a4964088bb413224Andreas Huber 167b62f95145293bf1a39959166a4964088bb413224Andreas Huber mMaxAcquiredBufferCount = bufferCount; 16856fc8fb5437e08131a84063041183d5ce8a678ccJames Dong } 16956fc8fb5437e08131a84063041183d5ce8a678ccJames Dong 170b62f95145293bf1a39959166a4964088bb413224Andreas Huber CHECK_GT(mMaxAcquiredBufferCount, 1); 171b62f95145293bf1a39959166a4964088bb413224Andreas Huber 172b62f95145293bf1a39959166a4964088bb413224Andreas Huber status_t err = 1735205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza mConsumer->setMaxAcquiredBufferCount(mMaxAcquiredBufferCount); 174b62f95145293bf1a39959166a4964088bb413224Andreas Huber 175b62f95145293bf1a39959166a4964088bb413224Andreas Huber if (err != OK) { 176b62f95145293bf1a39959166a4964088bb413224Andreas Huber return err; 177df4a59c61103e7e0e9332e167a0be67da5d82ff3Eino-Ville Talvala } 178df4a59c61103e7e0e9332e167a0be67da5d82ff3Eino-Ville Talvala 179b62f95145293bf1a39959166a4964088bb413224Andreas Huber mNumPendingBuffers = 0; 180a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber mStarted = true; 181b62f95145293bf1a39959166a4964088bb413224Andreas Huber 1823399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return OK; 1833399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 1843399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 1857f06639d375c44f260e00aa5e18cd883624b38bfAndreas Huberstatus_t SurfaceMediaSource::setMaxAcquiredBufferCount(size_t count) { 186a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("setMaxAcquiredBufferCount(%zu)", count); 187b62f95145293bf1a39959166a4964088bb413224Andreas Huber Mutex::Autolock lock(mMutex); 188b62f95145293bf1a39959166a4964088bb413224Andreas Huber 189b62f95145293bf1a39959166a4964088bb413224Andreas Huber CHECK_GT(count, 1); 190b62f95145293bf1a39959166a4964088bb413224Andreas Huber mMaxAcquiredBufferCount = count; 191b62f95145293bf1a39959166a4964088bb413224Andreas Huber 192b62f95145293bf1a39959166a4964088bb413224Andreas Huber return OK; 1937f06639d375c44f260e00aa5e18cd883624b38bfAndreas Huber} 1947f06639d375c44f260e00aa5e18cd883624b38bfAndreas Huber 19590689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huberstatus_t SurfaceMediaSource::setUseAbsoluteTimestamps() { 19690689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber ALOGV("setUseAbsoluteTimestamps"); 19790689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber Mutex::Autolock lock(mMutex); 19890689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber mUseAbsoluteTimestamps = true; 19990689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber 20090689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber return OK; 20190689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber} 2023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 203a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennisstatus_t SurfaceMediaSource::stop() 2043399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi{ 205a0ead0a2d2ce1d114ad3a17d755dddce831abb40Jamie Gennis ALOGV("stop"); 2063399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi Mutex::Autolock lock(mMutex); 207bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 208a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber if (!mStarted) { 209a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber return OK; 210a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber } 211a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber 212456fa912e46edf0b01ea3b7760ea922c01ca1866Chong Zhang mStarted = false; 213456fa912e46edf0b01ea3b7760ea922c01ca1866Chong Zhang mFrameAvailableCondition.signal(); 214456fa912e46edf0b01ea3b7760ea922c01ca1866Chong Zhang 215a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber while (mNumPendingBuffers > 0) { 216a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGI("Still waiting for %zu buffers to be returned.", 217a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber mNumPendingBuffers); 218a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber 219a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber#if DEBUG_PENDING_BUFFERS 220a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber for (size_t i = 0; i < mPendingBuffers.size(); ++i) { 221a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber ALOGI("%d: %p", i, mPendingBuffers.itemAt(i)); 222a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber } 223a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber#endif 224a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber 225a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber mMediaBuffersAvailableCondition.wait(mMutex); 226a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber } 227a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber 228be996645b3118b84edf26fc05cc5e4ff56c163b5Andreas Huber mMediaBuffersAvailableCondition.signal(); 2293399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2305205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza return mConsumer->consumerDisconnect(); 2313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2331a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketisp<MetaData> SurfaceMediaSource::getFormat() 2343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi{ 2353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getFormat"); 236bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 237bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam Mutex::Autolock lock(mMutex); 2383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi sp<MetaData> meta = new MetaData; 239b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 240bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam meta->setInt32(kKeyWidth, mWidth); 241bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam meta->setInt32(kKeyHeight, mHeight); 2423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // The encoder format is set as an opaque colorformat 2433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // The encoder will later find out the actual colorformat 2443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // from the GL Frames itself. 2453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatAndroidOpaque); 246bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam meta->setInt32(kKeyStride, mWidth); 247bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam meta->setInt32(kKeySliceHeight, mHeight); 2483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi meta->setInt32(kKeyFrameRate, mFrameRate); 2493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); 2503399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return meta; 2513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 2523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 2532cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis// Pass the data to the MediaBuffer. Pass in only the metadata 2542cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis// Note: Call only when you have the lock 2553e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnarvoid SurfaceMediaSource::passMetadataBuffer_l(MediaBuffer **buffer, 2563e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar ANativeWindowBuffer *bufferHandle) const { 2573e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar *buffer = new MediaBuffer(sizeof(VideoNativeMetadata)); 2583e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar VideoNativeMetadata *data = (VideoNativeMetadata *)(*buffer)->data(); 2592cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis if (data == NULL) { 2602cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis ALOGE("Cannot allocate memory for metadata buffer!"); 2612cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis return; 2622cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis } 2633e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar data->eType = metaDataStoredInVideoBuffers(); 2643e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar data->pBuffer = bufferHandle; 2653e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar data->nFenceFd = -1; 2663e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar ALOGV("handle = %p, offset = %zu, length = %zu", 2672cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis bufferHandle, (*buffer)->range_length(), (*buffer)->range_offset()); 2682cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis} 2692cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis 27084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t SurfaceMediaSource::read( 27184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber MediaBuffer **buffer, const ReadOptions * /* options */) { 272bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam ALOGV("read"); 273bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam Mutex::Autolock lock(mMutex); 2740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi 2753399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *buffer = NULL; 2763399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 277a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber while (mStarted && mNumPendingBuffers == mMaxAcquiredBufferCount) { 278b62f95145293bf1a39959166a4964088bb413224Andreas Huber mMediaBuffersAvailableCondition.wait(mMutex); 279b62f95145293bf1a39959166a4964088bb413224Andreas Huber } 280b62f95145293bf1a39959166a4964088bb413224Andreas Huber 281bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // Update the current buffer info 282bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // TODO: mCurrentSlot can be made a bufferstate since there 283bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // can be more than one "current" slots. 284bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 2858ed8ceda7cfe29e8417142ef460cd70060204459Dan Stoza BufferItem item; 2863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // If the recording has started and the queue is empty, then just 2873399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // wait here till the frames come in from the client side 288a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber while (mStarted) { 289bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 2905205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza status_t err = mConsumer->acquireBuffer(&item, 0); 291bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam if (err == BufferQueue::NO_BUFFER_AVAILABLE) { 292bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // wait for a buffer to be queued 293bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mFrameAvailableCondition.wait(mMutex); 294bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } else if (err == OK) { 295d76442421eadfa73f2f3a9e50f6caf65b0dd1ce9Mathias Agopian err = item.mFence->waitForever("SurfaceMediaSource::read"); 29610174bfdac537730be6729b9d47ad7d5bafed072Greg Hackmann if (err) { 29710174bfdac537730be6729b9d47ad7d5bafed072Greg Hackmann ALOGW("read: failed to wait for buffer fence: %d", err); 29810174bfdac537730be6729b9d47ad7d5bafed072Greg Hackmann } 299bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 300bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // First time seeing the buffer? Added it to the SMS slot 301bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam if (item.mGraphicBuffer != NULL) { 302a8f5e0c24143299e3b3d722487de7322f7761559Pablo Ceballos mSlots[item.mSlot].mGraphicBuffer = item.mGraphicBuffer; 303bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 304a8f5e0c24143299e3b3d722487de7322f7761559Pablo Ceballos mSlots[item.mSlot].mFrameNumber = item.mFrameNumber; 305bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 306bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // check for the timing of this buffer 30790689fda75c343ab9328ced63e58f45eabaa33ccAndreas Huber if (mNumFramesReceived == 0 && !mUseAbsoluteTimestamps) { 308bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mFirstFrameTimestamp = item.mTimestamp; 309bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // Initial delay 310bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam if (mStartTimeNs > 0) { 311bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam if (item.mTimestamp < mStartTimeNs) { 312bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // This frame predates start of record, discard 3135205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza mConsumer->releaseBuffer( 314a8f5e0c24143299e3b3d722487de7322f7761559Pablo Ceballos item.mSlot, item.mFrameNumber, EGL_NO_DISPLAY, 315f15f6e2e7fc51d48ba95890e1f562908e6e957c0Jesse Hall EGL_NO_SYNC_KHR, Fence::NO_FENCE); 316bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam continue; 317bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 318bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mStartTimeNs = item.mTimestamp - mStartTimeNs; 319bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 320bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 321bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam item.mTimestamp = mStartTimeNs + (item.mTimestamp - mFirstFrameTimestamp); 322bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 323bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mNumFramesReceived++; 324bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 325bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam break; 326bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } else { 327bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam ALOGE("read: acquire failed with error code %d", err); 328bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam return ERROR_END_OF_STREAM; 329bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 330bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 3313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3323399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3333399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // If the loop was exited as a result of stopping the recording, 3343399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi // it is OK 335a54dee4002624e0885b39451cb29028406f5bf8eAndreas Huber if (!mStarted) { 3363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Read: SurfaceMediaSource is stopped. Returning ERROR_END_OF_STREAM."); 3373e9bf4061475ae0d01c57e32c13e63808aa3e31fPannag Sanketi return ERROR_END_OF_STREAM; 3383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 3393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 340a8f5e0c24143299e3b3d722487de7322f7761559Pablo Ceballos mCurrentSlot = item.mSlot; 341bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 342bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam // First time seeing the buffer? Added it to the SMS slot 343bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam if (item.mGraphicBuffer != NULL) { 344a8f5e0c24143299e3b3d722487de7322f7761559Pablo Ceballos mSlots[item.mSlot].mGraphicBuffer = item.mGraphicBuffer; 345bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 346a8f5e0c24143299e3b3d722487de7322f7761559Pablo Ceballos mSlots[item.mSlot].mFrameNumber = item.mFrameNumber; 3472cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis 348d030447b617105b31bf3013e5e4b39d422b53b77Lajos Molnar mCurrentBuffers.push_back(mSlots[mCurrentSlot].mGraphicBuffer); 3490c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi int64_t prevTimeStamp = mCurrentTimestamp; 350bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mCurrentTimestamp = item.mTimestamp; 351df4a59c61103e7e0e9332e167a0be67da5d82ff3Eino-Ville Talvala 3520c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mNumFramesEncoded++; 353a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi // Pass the data to the MediaBuffer. Pass in only the metadata 354b62f95145293bf1a39959166a4964088bb413224Andreas Huber 3553e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar passMetadataBuffer_l(buffer, mSlots[mCurrentSlot].mGraphicBuffer->getNativeBuffer()); 356a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 3573399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi (*buffer)->setObserver(this); 3583399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi (*buffer)->add_ref(); 3590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi (*buffer)->meta_data()->setInt64(kKeyTime, mCurrentTimestamp / 1000); 360a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("Frames encoded = %d, timestamp = %" PRId64 ", time diff = %" PRId64, 3610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mNumFramesEncoded, mCurrentTimestamp / 1000, 3620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi mCurrentTimestamp / 1000 - prevTimeStamp / 1000); 3633399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 364b62f95145293bf1a39959166a4964088bb413224Andreas Huber ++mNumPendingBuffers; 365bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 366a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber#if DEBUG_PENDING_BUFFERS 367a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber mPendingBuffers.push_back(*buffer); 368a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber#endif 369a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber 370a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber ALOGV("returning mbuf %p", *buffer); 371a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber 3723399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi return OK; 3733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 3743399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3752cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennisstatic buffer_handle_t getMediaBufferHandle(MediaBuffer *buffer) { 3762cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis // need to convert to char* for pointer arithmetic and then 3772cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis // copy the byte stream into our handle 3782cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis buffer_handle_t bufferHandle; 3792cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis memcpy(&bufferHandle, (char*)(buffer->data()) + 4, sizeof(buffer_handle_t)); 3802cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis return bufferHandle; 3810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi} 382a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi 3831a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketivoid SurfaceMediaSource::signalBufferReturned(MediaBuffer *buffer) { 3843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("signalBufferReturned"); 3853399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3863399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi bool foundBuffer = false; 387bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 388bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam Mutex::Autolock lock(mMutex); 3893399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 3902cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis buffer_handle_t bufferHandle = getMediaBufferHandle(buffer); 3912cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis 3922cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis for (size_t i = 0; i < mCurrentBuffers.size(); i++) { 3932cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis if (mCurrentBuffers[i]->handle == bufferHandle) { 3942cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis mCurrentBuffers.removeAt(i); 3952cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis foundBuffer = true; 3962cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis break; 3972cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis } 3982cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis } 3992cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis 4002cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis if (!foundBuffer) { 4012cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis ALOGW("returned buffer was not found in the current buffer list"); 4023399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 4033399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 404bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam for (int id = 0; id < BufferQueue::NUM_BUFFER_SLOTS; id++) { 405d030447b617105b31bf3013e5e4b39d422b53b77Lajos Molnar if (mSlots[id].mGraphicBuffer == NULL) { 4060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi continue; 4070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi } 4082cd25a9056cc150b9fd3ac9b0bca37a1334ffd47Jamie Gennis 409d030447b617105b31bf3013e5e4b39d422b53b77Lajos Molnar if (bufferHandle == mSlots[id].mGraphicBuffer->handle) { 4103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Slot %d returned, matches handle = %p", id, 411d030447b617105b31bf3013e5e4b39d422b53b77Lajos Molnar mSlots[id].mGraphicBuffer->handle); 412bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 4135205977929c8a63d3bba026c6bd7b4cc1e236627Dan Stoza mConsumer->releaseBuffer(id, mSlots[id].mFrameNumber, 414d030447b617105b31bf3013e5e4b39d422b53b77Lajos Molnar EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, 415f15f6e2e7fc51d48ba95890e1f562908e6e957c0Jesse Hall Fence::NO_FENCE); 416bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 4173399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buffer->setObserver(0); 4183399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi buffer->release(); 419bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 4203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi foundBuffer = true; 4213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi break; 4223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 4233399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 4243399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 4253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi if (!foundBuffer) { 426f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK(!"signalBufferReturned: bogus buffer"); 4273399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi } 428b62f95145293bf1a39959166a4964088bb413224Andreas Huber 429a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber#if DEBUG_PENDING_BUFFERS 430a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber for (size_t i = 0; i < mPendingBuffers.size(); ++i) { 431a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber if (mPendingBuffers.itemAt(i) == buffer) { 432a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber mPendingBuffers.removeAt(i); 433a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber break; 434a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber } 435a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber } 436a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber#endif 437a7f7e0ac9436a8417bb9f31aecedfec1909d4630Andreas Huber 438b62f95145293bf1a39959166a4964088bb413224Andreas Huber --mNumPendingBuffers; 439b62f95145293bf1a39959166a4964088bb413224Andreas Huber mMediaBuffersAvailableCondition.broadcast(); 4403399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} 4413399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 442bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam// Part of the BufferQueue::ConsumerListener 44304f101c35eaa90b1f95939afac30674ec1611e6fDan Stozavoid SurfaceMediaSource::onFrameAvailable(const BufferItem& /* item */) { 444bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam ALOGV("onFrameAvailable"); 445bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 446bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam sp<FrameAvailableListener> listener; 447bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam { // scope for the lock 448bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam Mutex::Autolock lock(mMutex); 449bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mFrameAvailableCondition.broadcast(); 450bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam listener = mFrameAvailableListener; 451bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 452bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 453bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam if (listener != NULL) { 454bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam ALOGV("actually calling onFrameAvailable"); 455bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam listener->onFrameAvailable(); 456bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 457bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam} 458bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 459bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam// SurfaceMediaSource hijacks this event to assume 460bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam// the prodcuer is disconnecting from the BufferQueue 461bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam// and that it should stop the recording 462bdddc659a941afdb7f4958f582c6901c07246097Daniel Lamvoid SurfaceMediaSource::onBuffersReleased() { 463bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam ALOGV("onBuffersReleased"); 464bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 465bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam Mutex::Autolock lock(mMutex); 466bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 467bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam mFrameAvailableCondition.signal(); 468bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam 469bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { 470d030447b617105b31bf3013e5e4b39d422b53b77Lajos Molnar mSlots[i].mGraphicBuffer = 0; 471bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam } 472a361483bb5dbd3bbf132c5b99b2df7d197c3fc50Pannag Sanketi} 4733399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi 4748dcc81a2fdb35905347cf7ef46d198afa7ae79cdJesse Hallvoid SurfaceMediaSource::onSidebandStreamChanged() { 4758dcc81a2fdb35905347cf7ef46d198afa7ae79cdJesse Hall ALOG_ASSERT(false, "SurfaceMediaSource can't consume sideband streams"); 4768dcc81a2fdb35905347cf7ef46d198afa7ae79cdJesse Hall} 4778dcc81a2fdb35905347cf7ef46d198afa7ae79cdJesse Hall 4783399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi} // end of namespace android 479