FrameOutput.h revision 778dccf9a7aa05e0c8df1481ea1d6048bb659667
1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright 2014 The Android Open Source Project
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Licensed under the Apache License, Version 2.0 (the "License");
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * you may not use this file except in compliance with the License.
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * You may obtain a copy of the License at
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      http://www.apache.org/licenses/LICENSE-2.0
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Unless required by applicable law or agreed to in writing, software
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * distributed under the License is distributed on an "AS IS" BASIS,
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * See the License for the specific language governing permissions and
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * limitations under the License.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef SCREENRECORD_FRAMEOUTPUT_H
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define SCREENRECORD_FRAMEOUTPUT_H
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "Program.h"
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "EglWindow.h"
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <gui/BufferQueue.h>
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <gui/GLConsumer.h>
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace android {
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Support for "frames" output format.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass FrameOutput : public GLConsumer::FrameAvailableListener {
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic:
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FrameOutput() : mFrameAvailable(false),
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        mExtTextureName(0),
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        mPixelBuf(NULL)
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {}
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Create an "input surface", similar in purpose to a MediaCodec input
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // surface, that the virtual display can send buffers to.  Also configures
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // EGL with a pbuffer surface on the current thread.
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    status_t createInputSurface(int width, int height,
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sp<IGraphicBufferProducer>* pBufferProducer);
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Copy one from input to output.  If no frame is available, this will wait up to the
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // specified number of microseconds.
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Returns ETIMEDOUT if the timeout expired before we found a frame.
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    status_t copyFrame(FILE* fp, long timeoutUsec);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Prepare to copy frames.  Makes the EGL context used by this object current.
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void prepareToCopy() {
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        mEglWindow.makeCurrent();
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprivate:
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FrameOutput(const FrameOutput&);
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FrameOutput& operator=(const FrameOutput&);
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Destruction via RefBase.
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    virtual ~FrameOutput() {
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        delete[] mPixelBuf;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // (overrides GLConsumer::FrameAvailableListener method)
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    virtual void onFrameAvailable();
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Reduces RGBA to RGB, in place.
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    static void reduceRgbaToRgb(uint8_t* buf, unsigned int pixelCount);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Put a 32-bit value into a buffer, in little-endian byte order.
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    static void setValueLE(uint8_t* buf, uint32_t value);
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Used to wait for the FrameAvailableListener callback.
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Mutex mMutex;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Condition mEventCond;
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Set by the FrameAvailableListener callback.
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    bool mFrameAvailable;
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Our queue.  The producer side is passed to the virtual display, the
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // consumer side feeds into our GLConsumer.
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sp<BufferQueue> mBufferQueue;
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // This receives frames from the virtual display and makes them available
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // as an external texture.
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sp<GLConsumer> mGlConsumer;
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // EGL display / context / surface.
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EglWindow mEglWindow;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // GL rendering support.
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Program mExtTexProgram;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // External texture, updated by GLConsumer.
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    GLuint mExtTextureName;
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Pixel data buffer.
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    uint8_t* mPixelBuf;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver};
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; // namespace android
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif /*SCREENRECORD_FRAMEOUTPUT_H*/
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver