| /* |
| * 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*/ |