1441e847feb0e055ecb004802802cea07782ab228Andy McFadden/*
2441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Copyright 2013 The Android Open Source Project
3441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
4441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
5441e847feb0e055ecb004802802cea07782ab228Andy McFadden * you may not use this file except in compliance with the License.
6441e847feb0e055ecb004802802cea07782ab228Andy McFadden * You may obtain a copy of the License at
7441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
8441e847feb0e055ecb004802802cea07782ab228Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
9441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
10441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Unless required by applicable law or agreed to in writing, software
11441e847feb0e055ecb004802802cea07782ab228Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
12441e847feb0e055ecb004802802cea07782ab228Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13441e847feb0e055ecb004802802cea07782ab228Andy McFadden * See the License for the specific language governing permissions and
14441e847feb0e055ecb004802802cea07782ab228Andy McFadden * limitations under the License.
15441e847feb0e055ecb004802802cea07782ab228Andy McFadden */
16441e847feb0e055ecb004802802cea07782ab228Andy McFadden
17441e847feb0e055ecb004802802cea07782ab228Andy McFadden#ifndef SCREENRECORD_OVERLAY_H
18441e847feb0e055ecb004802802cea07782ab228Andy McFadden#define SCREENRECORD_OVERLAY_H
19441e847feb0e055ecb004802802cea07782ab228Andy McFadden
20441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include "Program.h"
21441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include "TextRenderer.h"
22441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include "EglWindow.h"
23441e847feb0e055ecb004802802cea07782ab228Andy McFadden
24441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <gui/BufferQueue.h>
25441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <gui/GLConsumer.h>
26441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <utils/Thread.h>
27441e847feb0e055ecb004802802cea07782ab228Andy McFadden
28441e847feb0e055ecb004802802cea07782ab228Andy McFadden#include <EGL/egl.h>
29441e847feb0e055ecb004802802cea07782ab228Andy McFadden
30441e847feb0e055ecb004802802cea07782ab228Andy McFaddennamespace android {
31441e847feb0e055ecb004802802cea07782ab228Andy McFadden
32441e847feb0e055ecb004802802cea07782ab228Andy McFadden/*
33441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Overlay "filter".  This sits between the virtual display and the video
34441e847feb0e055ecb004802802cea07782ab228Andy McFadden * encoder.
35441e847feb0e055ecb004802802cea07782ab228Andy McFadden *
36441e847feb0e055ecb004802802cea07782ab228Andy McFadden * Most functions run on a thread created by start().
37441e847feb0e055ecb004802802cea07782ab228Andy McFadden */
38441e847feb0e055ecb004802802cea07782ab228Andy McFaddenclass Overlay : public GLConsumer::FrameAvailableListener, Thread {
39441e847feb0e055ecb004802802cea07782ab228Andy McFaddenpublic:
40441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Overlay() : Thread(false),
41441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mThreadResult(UNKNOWN_ERROR),
42441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mState(UNINITIALIZED),
43441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mFrameAvailable(false),
44441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mExtTextureName(0),
45441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mStartMonotonicNsecs(0),
46441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mStartRealtimeNsecs(0),
47441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mLastFrameNumber(-1),
48441e847feb0e055ecb004802802cea07782ab228Andy McFadden        mTotalDroppedFrames(0)
49441e847feb0e055ecb004802802cea07782ab228Andy McFadden        {}
50441e847feb0e055ecb004802802cea07782ab228Andy McFadden
51441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Creates a thread that performs the overlay.  Pass in the surface that
52441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // output will be sent to.
53441e847feb0e055ecb004802802cea07782ab228Andy McFadden    //
54441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // This creates a dedicated thread for processing frames.
55441e847feb0e055ecb004802802cea07782ab228Andy McFadden    //
56441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Returns a reference to the producer side of a new BufferQueue that will
57441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // be used by the virtual display.
58441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t start(const sp<IGraphicBufferProducer>& outputSurface,
59441e847feb0e055ecb004802802cea07782ab228Andy McFadden            sp<IGraphicBufferProducer>* pBufferProducer);
60441e847feb0e055ecb004802802cea07782ab228Andy McFadden
61441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Stops the thread and releases resources.  It's okay to call this even
62441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // if start() was never called.
63441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t stop();
64441e847feb0e055ecb004802802cea07782ab228Andy McFadden
65441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // This creates an EGL context and window surface, draws some informative
66441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // text on it, swaps the buffer, and then tears the whole thing down.
67441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static status_t drawInfoPage(const sp<IGraphicBufferProducer>& outputSurface);
68441e847feb0e055ecb004802802cea07782ab228Andy McFadden
69441e847feb0e055ecb004802802cea07782ab228Andy McFaddenprivate:
70441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Overlay(const Overlay&);
71441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Overlay& operator=(const Overlay&);
72441e847feb0e055ecb004802802cea07782ab228Andy McFadden
73778dccf9a7aa05e0c8df1481ea1d6048bb659667Andy McFadden    // Destruction via RefBase.
74778dccf9a7aa05e0c8df1481ea1d6048bb659667Andy McFadden    virtual ~Overlay() { assert(mState == UNINITIALIZED || mState == STOPPED); }
75778dccf9a7aa05e0c8df1481ea1d6048bb659667Andy McFadden
76441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Draw the initial info screen.
77441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static void doDrawInfoPage(const EglWindow& window,
78441e847feb0e055ecb004802802cea07782ab228Andy McFadden            const Program& texRender, TextRenderer& textRenderer);
79441e847feb0e055ecb004802802cea07782ab228Andy McFadden
80441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // (overrides GLConsumer::FrameAvailableListener method)
8104f101c35eaa90b1f95939afac30674ec1611e6fDan Stoza    virtual void onFrameAvailable(const BufferItem& item);
82441e847feb0e055ecb004802802cea07782ab228Andy McFadden
83441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // (overrides Thread method)
84441e847feb0e055ecb004802802cea07782ab228Andy McFadden    virtual bool threadLoop();
85441e847feb0e055ecb004802802cea07782ab228Andy McFadden
86441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // One-time setup (essentially object construction on the overlay thread).
87441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t setup_l();
88441e847feb0e055ecb004802802cea07782ab228Andy McFadden
89441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Release all resources held.
90441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void release_l();
91441e847feb0e055ecb004802802cea07782ab228Andy McFadden
92441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Release EGL display, context, surface.
93441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void eglRelease_l();
94441e847feb0e055ecb004802802cea07782ab228Andy McFadden
95441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Process a frame received from the virtual display.
96441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void processFrame_l();
97441e847feb0e055ecb004802802cea07782ab228Andy McFadden
98441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Convert a monotonic time stamp into a string with the current time.
99441e847feb0e055ecb004802802cea07782ab228Andy McFadden    void getTimeString_l(nsecs_t monotonicNsec, char* buf, size_t bufLen);
100441e847feb0e055ecb004802802cea07782ab228Andy McFadden
101441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Guards all fields below.
102441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Mutex mMutex;
103441e847feb0e055ecb004802802cea07782ab228Andy McFadden
104441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Initialization gate.
105441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Condition mStartCond;
106441e847feb0e055ecb004802802cea07782ab228Andy McFadden
107441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Thread status, mostly useful during startup.
108441e847feb0e055ecb004802802cea07782ab228Andy McFadden    status_t mThreadResult;
109441e847feb0e055ecb004802802cea07782ab228Andy McFadden
110441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Overlay thread state.  States advance from left to right; object may
111441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // not be restarted.
112441e847feb0e055ecb004802802cea07782ab228Andy McFadden    enum { UNINITIALIZED, INIT, RUNNING, STOPPING, STOPPED } mState;
113441e847feb0e055ecb004802802cea07782ab228Andy McFadden
114441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Event notification.  Overlay thread sleeps on this until a frame
115441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // arrives or it's time to shut down.
116441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Condition mEventCond;
117441e847feb0e055ecb004802802cea07782ab228Andy McFadden
118441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Set by the FrameAvailableListener callback.
119441e847feb0e055ecb004802802cea07782ab228Andy McFadden    bool mFrameAvailable;
120441e847feb0e055ecb004802802cea07782ab228Andy McFadden
121441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // The surface we send our output to, i.e. the video encoder's input
122441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // surface.
123441e847feb0e055ecb004802802cea07782ab228Andy McFadden    sp<IGraphicBufferProducer> mOutputSurface;
124441e847feb0e055ecb004802802cea07782ab228Andy McFadden
125b278f5e70c001391779525fb4d3b024503ba9466Dan Stoza    // Producer side of queue, passed into the virtual display.
126b278f5e70c001391779525fb4d3b024503ba9466Dan Stoza    // The consumer end feeds into our GLConsumer.
127b278f5e70c001391779525fb4d3b024503ba9466Dan Stoza    sp<IGraphicBufferProducer> mProducer;
128441e847feb0e055ecb004802802cea07782ab228Andy McFadden
129441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // This receives frames from the virtual display and makes them available
130441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // as an external texture.
131441e847feb0e055ecb004802802cea07782ab228Andy McFadden    sp<GLConsumer> mGlConsumer;
132441e847feb0e055ecb004802802cea07782ab228Andy McFadden
133441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // EGL display / context / surface.
134441e847feb0e055ecb004802802cea07782ab228Andy McFadden    EglWindow mEglWindow;
135441e847feb0e055ecb004802802cea07782ab228Andy McFadden
136441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // GL rendering support.
137441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Program mExtTexProgram;
138441e847feb0e055ecb004802802cea07782ab228Andy McFadden    Program mTexProgram;
139441e847feb0e055ecb004802802cea07782ab228Andy McFadden
140441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Text rendering.
141441e847feb0e055ecb004802802cea07782ab228Andy McFadden    TextRenderer mTextRenderer;
142441e847feb0e055ecb004802802cea07782ab228Andy McFadden
143441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // External texture, updated by GLConsumer.
144441e847feb0e055ecb004802802cea07782ab228Andy McFadden    GLuint mExtTextureName;
145441e847feb0e055ecb004802802cea07782ab228Andy McFadden
146441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Start time, used to map monotonic to wall-clock time.
147441e847feb0e055ecb004802802cea07782ab228Andy McFadden    nsecs_t mStartMonotonicNsecs;
148441e847feb0e055ecb004802802cea07782ab228Andy McFadden    nsecs_t mStartRealtimeNsecs;
149441e847feb0e055ecb004802802cea07782ab228Andy McFadden
150441e847feb0e055ecb004802802cea07782ab228Andy McFadden    // Used for tracking dropped frames.
151441e847feb0e055ecb004802802cea07782ab228Andy McFadden    nsecs_t mLastFrameNumber;
152441e847feb0e055ecb004802802cea07782ab228Andy McFadden    size_t mTotalDroppedFrames;
153441e847feb0e055ecb004802802cea07782ab228Andy McFadden
154441e847feb0e055ecb004802802cea07782ab228Andy McFadden    static const char* kPropertyNames[];
155441e847feb0e055ecb004802802cea07782ab228Andy McFadden};
156441e847feb0e055ecb004802802cea07782ab228Andy McFadden
157441e847feb0e055ecb004802802cea07782ab228Andy McFadden}; // namespace android
158441e847feb0e055ecb004802802cea07782ab228Andy McFadden
159441e847feb0e055ecb004802802cea07782ab228Andy McFadden#endif /*SCREENRECORD_OVERLAY_H*/
160