| /* | |
| * Copyright 2014 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef SCREENRECORD_FRAMEOUTPUT_H | |
| #define SCREENRECORD_FRAMEOUTPUT_H | |
| #include "Program.h" | |
| #include "EglWindow.h" | |
| #include <gui/BufferQueue.h> | |
| #include <gui/GLConsumer.h> | |
| namespace android { | |
| /* | |
| * Support for "frames" output format. | |
| */ | |
| class FrameOutput : public GLConsumer::FrameAvailableListener { | |
| public: | |
| FrameOutput() : mFrameAvailable(false), | |
| mExtTextureName(0), | |
| mPixelBuf(NULL) | |
| {} | |
| // Create an "input surface", similar in purpose to a MediaCodec input | |
| // surface, that the virtual display can send buffers to. Also configures | |
| // EGL with a pbuffer surface on the current thread. | |
| status_t createInputSurface(int width, int height, | |
| sp<IGraphicBufferProducer>* pBufferProducer); | |
| // Copy one from input to output. If no frame is available, this will wait up to the | |
| // specified number of microseconds. | |
| // | |
| // Returns ETIMEDOUT if the timeout expired before we found a frame. | |
| status_t copyFrame(FILE* fp, long timeoutUsec, bool rawFrames); | |
| // Prepare to copy frames. Makes the EGL context used by this object current. | |
| void prepareToCopy() { | |
| mEglWindow.makeCurrent(); | |
| } | |
| private: | |
| FrameOutput(const FrameOutput&); | |
| FrameOutput& operator=(const FrameOutput&); | |
| // Destruction via RefBase. | |
| virtual ~FrameOutput() { | |
| delete[] mPixelBuf; | |
| } | |
| // (overrides GLConsumer::FrameAvailableListener method) | |
| virtual void onFrameAvailable(const BufferItem& item); | |
| // Reduces RGBA to RGB, in place. | |
| static void reduceRgbaToRgb(uint8_t* buf, unsigned int pixelCount); | |
| // Put a 32-bit value into a buffer, in little-endian byte order. | |
| static void setValueLE(uint8_t* buf, uint32_t value); | |
| // Used to wait for the FrameAvailableListener callback. | |
| Mutex mMutex; | |
| Condition mEventCond; | |
| // Set by the FrameAvailableListener callback. | |
| bool mFrameAvailable; | |
| // This receives frames from the virtual display and makes them available | |
| // as an external texture. | |
| sp<GLConsumer> mGlConsumer; | |
| // EGL display / context / surface. | |
| EglWindow mEglWindow; | |
| // GL rendering support. | |
| Program mExtTexProgram; | |
| // External texture, updated by GLConsumer. | |
| GLuint mExtTextureName; | |
| // Pixel data buffer. | |
| uint8_t* mPixelBuf; | |
| }; | |
| }; // namespace android | |
| #endif /*SCREENRECORD_FRAMEOUTPUT_H*/ |