1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright 2018, The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef INPUT_SURFACE_WRAPPER_H_ 18*ec779b8eSAndroid Build Coastguard Worker #define INPUT_SURFACE_WRAPPER_H_ 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <codec2/hidl/client.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <system/graphics.h> 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker namespace android { 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker /** 26*ec779b8eSAndroid Build Coastguard Worker * Wrapper interface around InputSurface. 27*ec779b8eSAndroid Build Coastguard Worker */ 28*ec779b8eSAndroid Build Coastguard Worker class InputSurfaceWrapper { 29*ec779b8eSAndroid Build Coastguard Worker public: InputSurfaceWrapper()30*ec779b8eSAndroid Build Coastguard Worker InputSurfaceWrapper() 31*ec779b8eSAndroid Build Coastguard Worker : mDataSpace(HAL_DATASPACE_UNKNOWN), 32*ec779b8eSAndroid Build Coastguard Worker mPixelFormat(PIXEL_FORMAT_UNKNOWN) { 33*ec779b8eSAndroid Build Coastguard Worker } 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker virtual ~InputSurfaceWrapper() = default; 36*ec779b8eSAndroid Build Coastguard Worker 37*ec779b8eSAndroid Build Coastguard Worker /** 38*ec779b8eSAndroid Build Coastguard Worker * Connect the surface with |comp|. A surface can 39*ec779b8eSAndroid Build Coastguard Worker * connect to at most one component at a time. 40*ec779b8eSAndroid Build Coastguard Worker * 41*ec779b8eSAndroid Build Coastguard Worker * \return OK successfully connected to |comp| 42*ec779b8eSAndroid Build Coastguard Worker * \return ALREADY_EXISTS already connected to another component. 43*ec779b8eSAndroid Build Coastguard Worker */ 44*ec779b8eSAndroid Build Coastguard Worker virtual status_t connect( 45*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<Codec2Client::Component> &comp) = 0; 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker /** 48*ec779b8eSAndroid Build Coastguard Worker * Disconnect the surface from the component if any. 49*ec779b8eSAndroid Build Coastguard Worker */ 50*ec779b8eSAndroid Build Coastguard Worker virtual void disconnect() = 0; 51*ec779b8eSAndroid Build Coastguard Worker 52*ec779b8eSAndroid Build Coastguard Worker /** 53*ec779b8eSAndroid Build Coastguard Worker * Start pushing buffers to the surface. 54*ec779b8eSAndroid Build Coastguard Worker */ 55*ec779b8eSAndroid Build Coastguard Worker virtual status_t start() = 0; 56*ec779b8eSAndroid Build Coastguard Worker 57*ec779b8eSAndroid Build Coastguard Worker /** 58*ec779b8eSAndroid Build Coastguard Worker * Ref: GraphicBufferSource::signalEndOfInputStream. 59*ec779b8eSAndroid Build Coastguard Worker */ 60*ec779b8eSAndroid Build Coastguard Worker virtual status_t signalEndOfInputStream() = 0; 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker /// Input Surface configuration 63*ec779b8eSAndroid Build Coastguard Worker struct Config { 64*ec779b8eSAndroid Build Coastguard Worker // IN PARAMS (GBS) 65*ec779b8eSAndroid Build Coastguard Worker float mMinFps = 0.0; // minimum fps (repeat frame to achieve this) 66*ec779b8eSAndroid Build Coastguard Worker float mMaxFps = 0.0; // max fps (via frame drop) 67*ec779b8eSAndroid Build Coastguard Worker float mCaptureFps = 0.0; // capture fps 68*ec779b8eSAndroid Build Coastguard Worker float mCodedFps = 0.0; // coded fps 69*ec779b8eSAndroid Build Coastguard Worker bool mSuspended = false; // suspended 70*ec779b8eSAndroid Build Coastguard Worker int64_t mTimeOffsetUs = 0; // time offset (input => codec) 71*ec779b8eSAndroid Build Coastguard Worker int64_t mSuspendAtUs = 0; // suspend/resume time 72*ec779b8eSAndroid Build Coastguard Worker int64_t mStartAtUs = 0; // start time 73*ec779b8eSAndroid Build Coastguard Worker bool mStopped = false; // stopped 74*ec779b8eSAndroid Build Coastguard Worker int64_t mStopAtUs = 0; // stop time 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker // OUT PARAMS (GBS) 77*ec779b8eSAndroid Build Coastguard Worker int64_t mInputDelayUs = 0; // delay between encoder input and surface input 78*ec779b8eSAndroid Build Coastguard Worker 79*ec779b8eSAndroid Build Coastguard Worker // IN PARAMS (CODEC WRAPPER) 80*ec779b8eSAndroid Build Coastguard Worker float mFixedAdjustedFps = 0.0; // fixed fps via PTS manipulation 81*ec779b8eSAndroid Build Coastguard Worker float mMinAdjustedFps = 0.0; // minimum fps via PTS manipulation 82*ec779b8eSAndroid Build Coastguard Worker uint64_t mUsage = 0; // consumer usage 83*ec779b8eSAndroid Build Coastguard Worker int mPriority = INT_MAX; // priority of queue thread (if any); INT_MAX for no-op 84*ec779b8eSAndroid Build Coastguard Worker }; 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker /** 87*ec779b8eSAndroid Build Coastguard Worker * Configures input surface. 88*ec779b8eSAndroid Build Coastguard Worker * 89*ec779b8eSAndroid Build Coastguard Worker * \param config configuration. This can be updated during this call to provide output 90*ec779b8eSAndroid Build Coastguard Worker * parameters, but not to provide configured parameters (to avoid continually 91*ec779b8eSAndroid Build Coastguard Worker * reconfiguring) 92*ec779b8eSAndroid Build Coastguard Worker */ 93*ec779b8eSAndroid Build Coastguard Worker virtual status_t configure(Config &config) = 0; 94*ec779b8eSAndroid Build Coastguard Worker 95*ec779b8eSAndroid Build Coastguard Worker /** 96*ec779b8eSAndroid Build Coastguard Worker * Configures desired data space. 97*ec779b8eSAndroid Build Coastguard Worker * 98*ec779b8eSAndroid Build Coastguard Worker * \param dataSpace desired data space 99*ec779b8eSAndroid Build Coastguard Worker */ setDataSpace(android_dataspace dataSpace)100*ec779b8eSAndroid Build Coastguard Worker inline void setDataSpace(android_dataspace dataSpace) { 101*ec779b8eSAndroid Build Coastguard Worker mDataSpace = dataSpace; 102*ec779b8eSAndroid Build Coastguard Worker } 103*ec779b8eSAndroid Build Coastguard Worker 104*ec779b8eSAndroid Build Coastguard Worker /** 105*ec779b8eSAndroid Build Coastguard Worker * Notify that the input buffer reference is no longer needed. 106*ec779b8eSAndroid Build Coastguard Worker * Clean up C2Work related references if necessary. No-op by default. 107*ec779b8eSAndroid Build Coastguard Worker * 108*ec779b8eSAndroid Build Coastguard Worker * \param index index of input work. 109*ec779b8eSAndroid Build Coastguard Worker */ onInputBufferDone(c2_cntr64_t)110*ec779b8eSAndroid Build Coastguard Worker virtual void onInputBufferDone(c2_cntr64_t /* index */) {} 111*ec779b8eSAndroid Build Coastguard Worker 112*ec779b8eSAndroid Build Coastguard Worker /** 113*ec779b8eSAndroid Build Coastguard Worker * Signal one input buffer as emptied. 114*ec779b8eSAndroid Build Coastguard Worker * No-op by default. 115*ec779b8eSAndroid Build Coastguard Worker */ onInputBufferEmptied()116*ec779b8eSAndroid Build Coastguard Worker virtual void onInputBufferEmptied() {} 117*ec779b8eSAndroid Build Coastguard Worker 118*ec779b8eSAndroid Build Coastguard Worker /** 119*ec779b8eSAndroid Build Coastguard Worker * Returns dataspace information from GraphicBufferSource. 120*ec779b8eSAndroid Build Coastguard Worker */ getDataspace()121*ec779b8eSAndroid Build Coastguard Worker virtual android_dataspace getDataspace() { return mDataSpace; } 122*ec779b8eSAndroid Build Coastguard Worker 123*ec779b8eSAndroid Build Coastguard Worker /** 124*ec779b8eSAndroid Build Coastguard Worker * Returns pixel format information from GraphicBufferSource. 125*ec779b8eSAndroid Build Coastguard Worker */ getPixelFormat()126*ec779b8eSAndroid Build Coastguard Worker virtual uint32_t getPixelFormat() { return mPixelFormat; } 127*ec779b8eSAndroid Build Coastguard Worker 128*ec779b8eSAndroid Build Coastguard Worker protected: 129*ec779b8eSAndroid Build Coastguard Worker android_dataspace mDataSpace; 130*ec779b8eSAndroid Build Coastguard Worker uint32_t mPixelFormat; 131*ec779b8eSAndroid Build Coastguard Worker }; 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker } // namespace android 134*ec779b8eSAndroid Build Coastguard Worker 135*ec779b8eSAndroid Build Coastguard Worker #endif // INPUT_SURFACE_WRAPPER_H_ 136