1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright 2019 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 PIPELINE_WATCHER_H_ 18*ec779b8eSAndroid Build Coastguard Worker #define PIPELINE_WATCHER_H_ 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <chrono> 21*ec779b8eSAndroid Build Coastguard Worker #include <map> 22*ec779b8eSAndroid Build Coastguard Worker #include <memory> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #include <C2Work.h> 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker namespace android { 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker /** 29*ec779b8eSAndroid Build Coastguard Worker * PipelineWatcher watches the pipeline and infers the status of work items from 30*ec779b8eSAndroid Build Coastguard Worker * events. 31*ec779b8eSAndroid Build Coastguard Worker */ 32*ec779b8eSAndroid Build Coastguard Worker class PipelineWatcher { 33*ec779b8eSAndroid Build Coastguard Worker public: 34*ec779b8eSAndroid Build Coastguard Worker typedef std::chrono::steady_clock Clock; 35*ec779b8eSAndroid Build Coastguard Worker PipelineWatcher()36*ec779b8eSAndroid Build Coastguard Worker PipelineWatcher() 37*ec779b8eSAndroid Build Coastguard Worker : mInputDelay(0), 38*ec779b8eSAndroid Build Coastguard Worker mPipelineDelay(0), 39*ec779b8eSAndroid Build Coastguard Worker mOutputDelay(0), 40*ec779b8eSAndroid Build Coastguard Worker mSmoothnessFactor(0), 41*ec779b8eSAndroid Build Coastguard Worker mTunneled(false) {} 42*ec779b8eSAndroid Build Coastguard Worker ~PipelineWatcher() = default; 43*ec779b8eSAndroid Build Coastguard Worker 44*ec779b8eSAndroid Build Coastguard Worker /** 45*ec779b8eSAndroid Build Coastguard Worker * \param value the new input delay value 46*ec779b8eSAndroid Build Coastguard Worker * \return this object 47*ec779b8eSAndroid Build Coastguard Worker */ 48*ec779b8eSAndroid Build Coastguard Worker PipelineWatcher &inputDelay(uint32_t value); 49*ec779b8eSAndroid Build Coastguard Worker 50*ec779b8eSAndroid Build Coastguard Worker /** 51*ec779b8eSAndroid Build Coastguard Worker * \param value the new pipeline delay value 52*ec779b8eSAndroid Build Coastguard Worker * \return this object 53*ec779b8eSAndroid Build Coastguard Worker */ 54*ec779b8eSAndroid Build Coastguard Worker PipelineWatcher &pipelineDelay(uint32_t value); 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker /** 57*ec779b8eSAndroid Build Coastguard Worker * \param value the new output delay value 58*ec779b8eSAndroid Build Coastguard Worker * \return this object 59*ec779b8eSAndroid Build Coastguard Worker */ 60*ec779b8eSAndroid Build Coastguard Worker PipelineWatcher &outputDelay(uint32_t value); 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker /** 63*ec779b8eSAndroid Build Coastguard Worker * \param value the new smoothness factor value 64*ec779b8eSAndroid Build Coastguard Worker * \return this object 65*ec779b8eSAndroid Build Coastguard Worker */ 66*ec779b8eSAndroid Build Coastguard Worker PipelineWatcher &smoothnessFactor(uint32_t value); 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker /** 69*ec779b8eSAndroid Build Coastguard Worker * \param value the new tunneled value 70*ec779b8eSAndroid Build Coastguard Worker * \return this object 71*ec779b8eSAndroid Build Coastguard Worker */ 72*ec779b8eSAndroid Build Coastguard Worker PipelineWatcher &tunneled(bool value); 73*ec779b8eSAndroid Build Coastguard Worker 74*ec779b8eSAndroid Build Coastguard Worker /** 75*ec779b8eSAndroid Build Coastguard Worker * Client queued a work item to the component. 76*ec779b8eSAndroid Build Coastguard Worker * 77*ec779b8eSAndroid Build Coastguard Worker * \param frameIndex input frame index of this work 78*ec779b8eSAndroid Build Coastguard Worker * \param buffers input buffers of the queued work item 79*ec779b8eSAndroid Build Coastguard Worker * \param queuedAt time when the client queued the buffer 80*ec779b8eSAndroid Build Coastguard Worker */ 81*ec779b8eSAndroid Build Coastguard Worker void onWorkQueued( 82*ec779b8eSAndroid Build Coastguard Worker uint64_t frameIndex, 83*ec779b8eSAndroid Build Coastguard Worker std::vector<std::shared_ptr<C2Buffer>> &&buffers, 84*ec779b8eSAndroid Build Coastguard Worker const Clock::time_point &queuedAt); 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker /** 87*ec779b8eSAndroid Build Coastguard Worker * The component released input buffers from a work item. 88*ec779b8eSAndroid Build Coastguard Worker * 89*ec779b8eSAndroid Build Coastguard Worker * \param frameIndex input frame index 90*ec779b8eSAndroid Build Coastguard Worker * \param arrayIndex index of the buffer at the original |buffers| in 91*ec779b8eSAndroid Build Coastguard Worker * onWorkQueued(). 92*ec779b8eSAndroid Build Coastguard Worker * \return buffers[arrayIndex] 93*ec779b8eSAndroid Build Coastguard Worker */ 94*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> onInputBufferReleased( 95*ec779b8eSAndroid Build Coastguard Worker uint64_t frameIndex, size_t arrayIndex); 96*ec779b8eSAndroid Build Coastguard Worker 97*ec779b8eSAndroid Build Coastguard Worker /** 98*ec779b8eSAndroid Build Coastguard Worker * The component finished processing a work item. 99*ec779b8eSAndroid Build Coastguard Worker * 100*ec779b8eSAndroid Build Coastguard Worker * \param frameIndex input frame index 101*ec779b8eSAndroid Build Coastguard Worker */ 102*ec779b8eSAndroid Build Coastguard Worker void onWorkDone(uint64_t frameIndex); 103*ec779b8eSAndroid Build Coastguard Worker 104*ec779b8eSAndroid Build Coastguard Worker /** 105*ec779b8eSAndroid Build Coastguard Worker * Flush the pipeline. 106*ec779b8eSAndroid Build Coastguard Worker */ 107*ec779b8eSAndroid Build Coastguard Worker void flush(); 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker /** 110*ec779b8eSAndroid Build Coastguard Worker * \return true if pipeline does not need more work items to proceed 111*ec779b8eSAndroid Build Coastguard Worker * smoothly, considering delays and smoothness factor; 112*ec779b8eSAndroid Build Coastguard Worker * false otherwise. 113*ec779b8eSAndroid Build Coastguard Worker */ 114*ec779b8eSAndroid Build Coastguard Worker bool pipelineFull() const; 115*ec779b8eSAndroid Build Coastguard Worker 116*ec779b8eSAndroid Build Coastguard Worker /** 117*ec779b8eSAndroid Build Coastguard Worker * Return elapsed processing time of a work item, nth from the longest 118*ec779b8eSAndroid Build Coastguard Worker * processing time to the shortest. 119*ec779b8eSAndroid Build Coastguard Worker * 120*ec779b8eSAndroid Build Coastguard Worker * \param now current timestamp 121*ec779b8eSAndroid Build Coastguard Worker * \param n nth work item, from the longest processing time to the 122*ec779b8eSAndroid Build Coastguard Worker * shortest. It's a 0-based index. 123*ec779b8eSAndroid Build Coastguard Worker * \return elapsed processing time of nth work item. 124*ec779b8eSAndroid Build Coastguard Worker */ 125*ec779b8eSAndroid Build Coastguard Worker Clock::duration elapsed(const Clock::time_point &now, size_t n) const; 126*ec779b8eSAndroid Build Coastguard Worker 127*ec779b8eSAndroid Build Coastguard Worker private: 128*ec779b8eSAndroid Build Coastguard Worker uint32_t mInputDelay; 129*ec779b8eSAndroid Build Coastguard Worker uint32_t mPipelineDelay; 130*ec779b8eSAndroid Build Coastguard Worker uint32_t mOutputDelay; 131*ec779b8eSAndroid Build Coastguard Worker uint32_t mSmoothnessFactor; 132*ec779b8eSAndroid Build Coastguard Worker bool mTunneled; 133*ec779b8eSAndroid Build Coastguard Worker 134*ec779b8eSAndroid Build Coastguard Worker struct Frame { FrameFrame135*ec779b8eSAndroid Build Coastguard Worker Frame(std::vector<std::shared_ptr<C2Buffer>> &&b, 136*ec779b8eSAndroid Build Coastguard Worker const Clock::time_point &q) 137*ec779b8eSAndroid Build Coastguard Worker : buffers(b), 138*ec779b8eSAndroid Build Coastguard Worker queuedAt(q) {} 139*ec779b8eSAndroid Build Coastguard Worker std::vector<std::shared_ptr<C2Buffer>> buffers; 140*ec779b8eSAndroid Build Coastguard Worker const Clock::time_point queuedAt; 141*ec779b8eSAndroid Build Coastguard Worker }; 142*ec779b8eSAndroid Build Coastguard Worker std::map<uint64_t, Frame> mFramesInPipeline; 143*ec779b8eSAndroid Build Coastguard Worker }; 144*ec779b8eSAndroid Build Coastguard Worker 145*ec779b8eSAndroid Build Coastguard Worker } // namespace android 146*ec779b8eSAndroid Build Coastguard Worker 147*ec779b8eSAndroid Build Coastguard Worker #endif // PIPELINE_WATCHER_H_ 148