xref: /aosp_15_r20/frameworks/av/media/codec2/sfplugin/PipelineWatcher.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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