1b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza/* 2b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * Copyright 2014 The Android Open Source Project 3b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * 4b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * you may not use this file except in compliance with the License. 6b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * You may obtain a copy of the License at 7b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * 8b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * 10b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * Unless required by applicable law or agreed to in writing, software 11b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * See the License for the specific language governing permissions and 14b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza * limitations under the License. 15b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza */ 16b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 17b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MessageQueue.h" 18b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 19b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "SurfaceFlinger.h" 201db73f66624e7d151710483dd58e03eed672f064Robert Carr#include "Layer.h" 21b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 22b9b088375d33a87b201cdbe18be71802e2607717Dan Stozanamespace android { 23b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 24b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan StozaMonitoredProducer::MonitoredProducer(const sp<IGraphicBufferProducer>& producer, 251db73f66624e7d151710483dd58e03eed672f064Robert Carr const sp<SurfaceFlinger>& flinger, 261db73f66624e7d151710483dd58e03eed672f064Robert Carr const wp<Layer>& layer) : 27b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mProducer(producer), 281db73f66624e7d151710483dd58e03eed672f064Robert Carr mFlinger(flinger), 291db73f66624e7d151710483dd58e03eed672f064Robert Carr mLayer(layer) {} 30b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 31b9b088375d33a87b201cdbe18be71802e2607717Dan StozaMonitoredProducer::~MonitoredProducer() { 32b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza // Remove ourselves from SurfaceFlinger's list. We do this asynchronously 33b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza // because we don't know where this destructor is called from. It could be 34b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza // called with the mStateLock held, leading to a dead-lock (it actually 35b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza // happens). 36b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza class MessageCleanUpList : public MessageBase { 37b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza public: 38b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza MessageCleanUpList(const sp<SurfaceFlinger>& flinger, 39b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza const wp<IBinder>& producer) 40b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza : mFlinger(flinger), mProducer(producer) {} 41b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 42b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza virtual ~MessageCleanUpList() {} 43b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 44b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza virtual bool handler() { 45b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza Mutex::Autolock _l(mFlinger->mStateLock); 46b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mFlinger->mGraphicBufferProducerList.remove(mProducer); 47b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return true; 48b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza } 49b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 50b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza private: 51b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza sp<SurfaceFlinger> mFlinger; 52b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza wp<IBinder> mProducer; 53b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza }; 54b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 55643f0949daccb57e48f2d05b355ce3ea5696965aKalle Raita mFlinger->postMessageAsync(new MessageCleanUpList(mFlinger, asBinder(mProducer))); 56b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 57b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 58b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::requestBuffer(int slot, sp<GraphicBuffer>* buf) { 59b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->requestBuffer(slot, buf); 60b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 61b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 62fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballosstatus_t MonitoredProducer::setMaxDequeuedBufferCount( 63fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos int maxDequeuedBuffers) { 64fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return mProducer->setMaxDequeuedBufferCount(maxDequeuedBuffers); 65fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos} 66fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 67fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballosstatus_t MonitoredProducer::setAsyncMode(bool async) { 68fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos return mProducer->setAsyncMode(async); 69fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos} 70fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos 71b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::dequeueBuffer(int* slot, sp<Fence>* fence, 727c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson uint32_t w, uint32_t h, PixelFormat format, uint32_t usage, 737c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson FrameEventHistoryDelta* outTimestamps) { 747c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson return mProducer->dequeueBuffer( 757c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson slot, fence, w, h, format, usage, outTimestamps); 76b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 77b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 78b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::detachBuffer(int slot) { 79b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->detachBuffer(slot); 80b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 81b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 82d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stozastatus_t MonitoredProducer::detachNextBuffer(sp<GraphicBuffer>* outBuffer, 83d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza sp<Fence>* outFence) { 84d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza return mProducer->detachNextBuffer(outBuffer, outFence); 85d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza} 86d9822a3843017444364899afc3c23fb5be6b9cb9Dan Stoza 87b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::attachBuffer(int* outSlot, 88b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza const sp<GraphicBuffer>& buffer) { 89b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->attachBuffer(outSlot, buffer); 90b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 91b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 92b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::queueBuffer(int slot, const QueueBufferInput& input, 93b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza QueueBufferOutput* output) { 94b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->queueBuffer(slot, input, output); 95b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 96b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 97583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballosstatus_t MonitoredProducer::cancelBuffer(int slot, const sp<Fence>& fence) { 98583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos return mProducer->cancelBuffer(slot, fence); 99b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 100b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 101b9b088375d33a87b201cdbe18be71802e2607717Dan Stozaint MonitoredProducer::query(int what, int* value) { 102b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->query(what, value); 103b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 104b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 105f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stozastatus_t MonitoredProducer::connect(const sp<IProducerListener>& listener, 106f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza int api, bool producerControlledByApp, QueueBufferOutput* output) { 107f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza return mProducer->connect(listener, api, producerControlledByApp, output); 108b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 109b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 11097b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carrstatus_t MonitoredProducer::disconnect(int api, DisconnectMode mode) { 11197b9c86338e2d364d47ea7522c2d81a8014f0e07Robert Carr return mProducer->disconnect(api, mode); 112b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 113b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 114b9b088375d33a87b201cdbe18be71802e2607717Dan Stozastatus_t MonitoredProducer::setSidebandStream(const sp<NativeHandle>& stream) { 115b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer->setSidebandStream(stream); 116b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza} 117b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza 118567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballosvoid MonitoredProducer::allocateBuffers(uint32_t width, uint32_t height, 119567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos PixelFormat format, uint32_t usage) { 120567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos mProducer->allocateBuffers(width, height, format, usage); 12129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza} 12229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 1239de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stozastatus_t MonitoredProducer::allowAllocation(bool allow) { 1249de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza return mProducer->allowAllocation(allow); 1259de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza} 1269de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza 127812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stozastatus_t MonitoredProducer::setGenerationNumber(uint32_t generationNumber) { 128812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza return mProducer->setGenerationNumber(generationNumber); 129812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza} 130812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 131c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan StozaString8 MonitoredProducer::getConsumerName() const { 132c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza return mProducer->getConsumerName(); 133c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza} 134c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 1353559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballosstatus_t MonitoredProducer::setSharedBufferMode(bool sharedBufferMode) { 1363559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos return mProducer->setSharedBufferMode(sharedBufferMode); 137ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos} 138ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos 139ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballosstatus_t MonitoredProducer::setAutoRefresh(bool autoRefresh) { 140ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return mProducer->setAutoRefresh(autoRefresh); 141ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos} 142ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos 143127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stozastatus_t MonitoredProducer::setDequeueTimeout(nsecs_t timeout) { 144127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza return mProducer->setDequeueTimeout(timeout); 145127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza} 146127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza 14750101d02a8eae555887282a5f761fdec57bdaf30Dan Stozastatus_t MonitoredProducer::getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, 1481a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck sp<Fence>* outFence, float outTransformMatrix[16]) { 1491a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck return mProducer->getLastQueuedBuffer(outBuffer, outFence, 1501a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck outTransformMatrix); 15150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza} 15250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza 1533890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid MonitoredProducer::getFrameTimestamps(FrameEventHistoryDelta* outDelta) { 1543890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson mProducer->getFrameTimestamps(outDelta); 155d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson} 156d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson 1578e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballosstatus_t MonitoredProducer::getUniqueId(uint64_t* outId) const { 1588e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return mProducer->getUniqueId(outId); 1598e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos} 1608e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos 161b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan StozaIBinder* MonitoredProducer::onAsBinder() { 162643f0949daccb57e48f2d05b355ce3ea5696965aKalle Raita return this; 163b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza} 164b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza 1651db73f66624e7d151710483dd58e03eed672f064Robert Carrsp<Layer> MonitoredProducer::getLayer() const { 1661db73f66624e7d151710483dd58e03eed672f064Robert Carr return mLayer.promote(); 1671db73f66624e7d151710483dd58e03eed672f064Robert Carr} 1681db73f66624e7d151710483dd58e03eed672f064Robert Carr 169b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza// --------------------------------------------------------------------------- 170b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza}; // namespace android 171