1cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza/* 2cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Copyright 2013 The Android Open Source Project 3cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 4cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * you may not use this file except in compliance with the License. 6cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * You may obtain a copy of the License at 7cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 8cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 10cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Unless required by applicable law or agreed to in writing, software 11cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * See the License for the specific language governing permissions and 14cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * limitations under the License. 15cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza */ 16cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 17cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#ifndef ANDROID_FRAME_WAITER_H 18cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#define ANDROID_FRAME_WAITER_H 19cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 20cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <gui/GLConsumer.h> 21cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 22cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozanamespace android { 23cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 24cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozaclass FrameWaiter : public GLConsumer::FrameAvailableListener { 25cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozapublic: 26cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza FrameWaiter(): 27cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mPendingFrames(0) { 28cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 29cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza void waitForFrame() { 31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Mutex::Autolock lock(mMutex); 32cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza while (mPendingFrames == 0) { 33cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mCondition.wait(mMutex); 34cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mPendingFrames--; 36cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 37cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 388dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza virtual void onFrameAvailable(const BufferItem& /* item */) { 39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Mutex::Autolock lock(mMutex); 40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mPendingFrames++; 41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mCondition.signal(); 42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozaprivate: 45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza int mPendingFrames; 46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Mutex mMutex; 47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza Condition mCondition; 48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}; 49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android 51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#endif 53