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