1587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden/*
2587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * Copyright 2014 The Android Open Source Project
3587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden *
4587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
5587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * you may not use this file except in compliance with the License.
6587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * You may obtain a copy of the License at
7587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden *
8587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
9587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden *
10587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * Unless required by applicable law or agreed to in writing, software
11587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
12587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * See the License for the specific language governing permissions and
14587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * limitations under the License.
15587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden */
16587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
17587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden#ifndef SCREENRECORD_FRAMEOUTPUT_H
18587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden#define SCREENRECORD_FRAMEOUTPUT_H
19587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
20587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden#include "Program.h"
21587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden#include "EglWindow.h"
22587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
23587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden#include <gui/BufferQueue.h>
24587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden#include <gui/GLConsumer.h>
25587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
26587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFaddennamespace android {
27587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
28587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden/*
29587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden * Support for "frames" output format.
30587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden */
31587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFaddenclass FrameOutput : public GLConsumer::FrameAvailableListener {
32587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFaddenpublic:
33587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    FrameOutput() : mFrameAvailable(false),
34587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden        mExtTextureName(0),
35587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden        mPixelBuf(NULL)
36587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden        {}
37587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
38587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Create an "input surface", similar in purpose to a MediaCodec input
39587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // surface, that the virtual display can send buffers to.  Also configures
40587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // EGL with a pbuffer surface on the current thread.
41587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    status_t createInputSurface(int width, int height,
42587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden            sp<IGraphicBufferProducer>* pBufferProducer);
43587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
44587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Copy one from input to output.  If no frame is available, this will wait up to the
45587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // specified number of microseconds.
46587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    //
47587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Returns ETIMEDOUT if the timeout expired before we found a frame.
48e32106fd5175afdf939ae397aece9caf378a4912Benoit Goby    status_t copyFrame(FILE* fp, long timeoutUsec, bool rawFrames);
49587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
50587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Prepare to copy frames.  Makes the EGL context used by this object current.
51587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    void prepareToCopy() {
52587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden        mEglWindow.makeCurrent();
53587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    }
54587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
55587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFaddenprivate:
56587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    FrameOutput(const FrameOutput&);
57587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    FrameOutput& operator=(const FrameOutput&);
58587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
59778dccf9a7aa05e0c8df1481ea1d6048bb659667Andy McFadden    // Destruction via RefBase.
60778dccf9a7aa05e0c8df1481ea1d6048bb659667Andy McFadden    virtual ~FrameOutput() {
61778dccf9a7aa05e0c8df1481ea1d6048bb659667Andy McFadden        delete[] mPixelBuf;
62778dccf9a7aa05e0c8df1481ea1d6048bb659667Andy McFadden    }
63778dccf9a7aa05e0c8df1481ea1d6048bb659667Andy McFadden
64587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // (overrides GLConsumer::FrameAvailableListener method)
6504f101c35eaa90b1f95939afac30674ec1611e6fDan Stoza    virtual void onFrameAvailable(const BufferItem& item);
66587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
67587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Reduces RGBA to RGB, in place.
68587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    static void reduceRgbaToRgb(uint8_t* buf, unsigned int pixelCount);
69587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
70587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Put a 32-bit value into a buffer, in little-endian byte order.
71587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    static void setValueLE(uint8_t* buf, uint32_t value);
72587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
73587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Used to wait for the FrameAvailableListener callback.
74587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    Mutex mMutex;
75587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    Condition mEventCond;
76587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
77587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Set by the FrameAvailableListener callback.
78587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    bool mFrameAvailable;
79587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
80587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // This receives frames from the virtual display and makes them available
81587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // as an external texture.
82587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    sp<GLConsumer> mGlConsumer;
83587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
84587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // EGL display / context / surface.
85587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    EglWindow mEglWindow;
86587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
87587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // GL rendering support.
88587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    Program mExtTexProgram;
89587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
90587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // External texture, updated by GLConsumer.
91587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    GLuint mExtTextureName;
92587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
93587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    // Pixel data buffer.
94587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden    uint8_t* mPixelBuf;
95587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden};
96587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
97587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden}; // namespace android
98587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden
99587c6fefcd3c1d05c608ff511cf3534bc765256eAndy McFadden#endif /*SCREENRECORD_FRAMEOUTPUT_H*/
100