Overlay.h revision 441e847feb0e055ecb004802802cea07782ab228
1ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/* 2ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * Copyright 2013 The Android Open Source Project 3ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * 4ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * Licensed under the Apache License, Version 2.0 (the "License"); 5ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * you may not use this file except in compliance with the License. 6ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * You may obtain a copy of the License at 7ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * 8ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * http://www.apache.org/licenses/LICENSE-2.0 9ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * 10ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * Unless required by applicable law or agreed to in writing, software 11ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * distributed under the License is distributed on an "AS IS" BASIS, 12ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * See the License for the specific language governing permissions and 14ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * limitations under the License. 15ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek */ 16ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 17ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#ifndef SCREENRECORD_OVERLAY_H 18ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#define SCREENRECORD_OVERLAY_H 19ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 20ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "Program.h" 21ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include "TextRenderer.h" 228bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek#include "EglWindow.h" 23ceac1d6e0521161adf7ac9834b1a7ad79d73fea4Anna Zaks 24ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include <gui/BufferQueue.h> 25ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include <gui/GLConsumer.h> 26ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include <utils/Thread.h> 27ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 28ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#include <EGL/egl.h> 29ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 30ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremeneknamespace android { 31ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 32ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek/* 33ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * Overlay "filter". This sits between the virtual display and the video 34ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * encoder. 35ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * 36ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek * Most functions run on a thread created by start(). 37ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek */ 38740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass Overlay : public GLConsumer::FrameAvailableListener, Thread { 39972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosepublic: 408bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek Overlay() : Thread(false), 41ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek mThreadResult(UNKNOWN_ERROR), 42ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek mState(UNINITIALIZED), 43ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek mFrameAvailable(false), 44ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek mExtTextureName(0), 45ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek mStartMonotonicNsecs(0), 46ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek mStartRealtimeNsecs(0), 47ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek mLastFrameNumber(-1), 48ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek mTotalDroppedFrames(0) 49ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek {} 50ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek virtual ~Overlay() { assert(mState == UNINITIALIZED || mState == STOPPED); } 51ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 52ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Creates a thread that performs the overlay. Pass in the surface that 53ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // output will be sent to. 54ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 55ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // This creates a dedicated thread for processing frames. 56ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // 57ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Returns a reference to the producer side of a new BufferQueue that will 58ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // be used by the virtual display. 592d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks status_t start(const sp<IGraphicBufferProducer>& outputSurface, 602d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks sp<IGraphicBufferProducer>* pBufferProducer); 612d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks 622d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks // Stops the thread and releases resources. It's okay to call this even 632d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks // if start() was never called. 6454918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks status_t stop(); 652d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks 662d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks // This creates an EGL context and window surface, draws some informative 672d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks // text on it, swaps the buffer, and then tears the whole thing down. 6854918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks static status_t drawInfoPage(const sp<IGraphicBufferProducer>& outputSurface); 6954918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks 7054918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaksprivate: 7154918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks Overlay(const Overlay&); 72148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks Overlay& operator=(const Overlay&); 73148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks 7454918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks // Draw the initial info screen. 75148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks static void doDrawInfoPage(const EglWindow& window, 76148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks const Program& texRender, TextRenderer& textRenderer); 7754918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks 78148fee988e32efcad45ecf7b3bf714880c657ddaAnna Zaks // (overrides GLConsumer::FrameAvailableListener method) 792d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks virtual void onFrameAvailable(); 802d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks 815f625712f622f6e57de17b6f7eec242956b993eeAnna Zaks // (overrides Thread method) 82ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek virtual bool threadLoop(); 83ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 84ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // One-time setup (essentially object construction on the overlay thread). 85ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek status_t setup_l(); 86ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 87ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Release all resources held. 88ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void release_l(); 89ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 90ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Release EGL display, context, surface. 91ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void eglRelease_l(); 92ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 93ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Process a frame received from the virtual display. 94ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void processFrame_l(); 95ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 96ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Convert a monotonic time stamp into a string with the current time. 97ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek void getTimeString_l(nsecs_t monotonicNsec, char* buf, size_t bufLen); 98ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 99ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Guards all fields below. 100ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Mutex mMutex; 101ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 102ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Initialization gate. 103ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Condition mStartCond; 104ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 105ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Thread status, mostly useful during startup. 106ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek status_t mThreadResult; 107ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 108ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Overlay thread state. States advance from left to right; object may 109ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // not be restarted. 110ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek enum { UNINITIALIZED, INIT, RUNNING, STOPPING, STOPPED } mState; 111ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 112ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Event notification. Overlay thread sleeps on this until a frame 1138bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek // arrives or it's time to shut down. 114ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Condition mEventCond; 115ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 116ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Set by the FrameAvailableListener callback. 117ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek bool mFrameAvailable; 118ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 119ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // The surface we send our output to, i.e. the video encoder's input 120ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // surface. 121ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek sp<IGraphicBufferProducer> mOutputSurface; 122ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 123ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Our queue. The producer side is passed to the virtual display, the 124ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // consumer side feeds into our GLConsumer. 125ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek sp<BufferQueue> mBufferQueue; 126ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 127ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // This receives frames from the virtual display and makes them available 128ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // as an external texture. 129ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek sp<GLConsumer> mGlConsumer; 130ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 131ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // EGL display / context / surface. 132ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek EglWindow mEglWindow; 133ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 134ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // GL rendering support. 135ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Program mExtTexProgram; 136ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek Program mTexProgram; 137ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 138ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Text rendering. 139ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek TextRenderer mTextRenderer; 140ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 141ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // External texture, updated by GLConsumer. 142ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek GLuint mExtTextureName; 143ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 144ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek // Start time, used to map monotonic to wall-clock time. 145ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek nsecs_t mStartMonotonicNsecs; 146ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek nsecs_t mStartRealtimeNsecs; 147ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 148a5888f61be9f8d76e9b48a453dbced50523bd2e0Argyrios Kyrtzidis // Used for tracking dropped frames. 149ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek nsecs_t mLastFrameNumber; 150ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek size_t mTotalDroppedFrames; 151ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 152ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek static const char* kPropertyNames[]; 153ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek}; 154ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 155ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek}; // namespace android 156ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek 157ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek#endif /*SCREENRECORD_OVERLAY_H*/ 158ae160f880d183ab938fd7ce3b891694ae2f569c0Ted Kremenek