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