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