xref: /aosp_15_r20/frameworks/av/media/codec2/sfplugin/CCodecBufferChannel.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright 2017, 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 CCODEC_BUFFER_CHANNEL_H_
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #define CCODEC_BUFFER_CHANNEL_H_
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <deque>
22*ec779b8eSAndroid Build Coastguard Worker #include <map>
23*ec779b8eSAndroid Build Coastguard Worker #include <memory>
24*ec779b8eSAndroid Build Coastguard Worker #include <vector>
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker #include <C2Buffer.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <C2Component.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <Codec2Mapper.h>
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker #include <codec2/hidl/client.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/Mutexed.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/CodecBase.h>
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker #include "CCodecBuffers.h"
35*ec779b8eSAndroid Build Coastguard Worker #include "FrameReassembler.h"
36*ec779b8eSAndroid Build Coastguard Worker #include "InputSurfaceWrapper.h"
37*ec779b8eSAndroid Build Coastguard Worker #include "PipelineWatcher.h"
38*ec779b8eSAndroid Build Coastguard Worker 
39*ec779b8eSAndroid Build Coastguard Worker namespace android {
40*ec779b8eSAndroid Build Coastguard Worker 
41*ec779b8eSAndroid Build Coastguard Worker class MemoryDealer;
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker class CCodecCallback {
44*ec779b8eSAndroid Build Coastguard Worker public:
45*ec779b8eSAndroid Build Coastguard Worker     virtual ~CCodecCallback() = default;
46*ec779b8eSAndroid Build Coastguard Worker     virtual void onError(status_t err, enum ActionCode actionCode) = 0;
47*ec779b8eSAndroid Build Coastguard Worker     virtual void onOutputFramesRendered(int64_t mediaTimeUs, nsecs_t renderTimeNs) = 0;
48*ec779b8eSAndroid Build Coastguard Worker     virtual void onOutputBuffersChanged() = 0;
49*ec779b8eSAndroid Build Coastguard Worker     virtual void onFirstTunnelFrameReady() = 0;
50*ec779b8eSAndroid Build Coastguard Worker };
51*ec779b8eSAndroid Build Coastguard Worker 
52*ec779b8eSAndroid Build Coastguard Worker /**
53*ec779b8eSAndroid Build Coastguard Worker  * BufferChannelBase implementation for CCodec.
54*ec779b8eSAndroid Build Coastguard Worker  */
55*ec779b8eSAndroid Build Coastguard Worker class CCodecBufferChannel
56*ec779b8eSAndroid Build Coastguard Worker     : public BufferChannelBase, public std::enable_shared_from_this<CCodecBufferChannel> {
57*ec779b8eSAndroid Build Coastguard Worker public:
58*ec779b8eSAndroid Build Coastguard Worker     explicit CCodecBufferChannel(const std::shared_ptr<CCodecCallback> &callback);
59*ec779b8eSAndroid Build Coastguard Worker     virtual ~CCodecBufferChannel();
60*ec779b8eSAndroid Build Coastguard Worker 
61*ec779b8eSAndroid Build Coastguard Worker     // BufferChannelBase interface
62*ec779b8eSAndroid Build Coastguard Worker     void setCrypto(const sp<ICrypto> &crypto) override;
63*ec779b8eSAndroid Build Coastguard Worker     void setDescrambler(const sp<IDescrambler> &descrambler) override;
64*ec779b8eSAndroid Build Coastguard Worker 
65*ec779b8eSAndroid Build Coastguard Worker     status_t queueInputBuffer(const sp<MediaCodecBuffer> &buffer) override;
66*ec779b8eSAndroid Build Coastguard Worker     status_t queueSecureInputBuffer(
67*ec779b8eSAndroid Build Coastguard Worker             const sp<MediaCodecBuffer> &buffer,
68*ec779b8eSAndroid Build Coastguard Worker             bool secure,
69*ec779b8eSAndroid Build Coastguard Worker             const uint8_t *key,
70*ec779b8eSAndroid Build Coastguard Worker             const uint8_t *iv,
71*ec779b8eSAndroid Build Coastguard Worker             CryptoPlugin::Mode mode,
72*ec779b8eSAndroid Build Coastguard Worker             CryptoPlugin::Pattern pattern,
73*ec779b8eSAndroid Build Coastguard Worker             const CryptoPlugin::SubSample *subSamples,
74*ec779b8eSAndroid Build Coastguard Worker             size_t numSubSamples,
75*ec779b8eSAndroid Build Coastguard Worker             AString *errorDetailMsg) override;
76*ec779b8eSAndroid Build Coastguard Worker     status_t queueSecureInputBuffers(
77*ec779b8eSAndroid Build Coastguard Worker             const sp<MediaCodecBuffer> &buffer,
78*ec779b8eSAndroid Build Coastguard Worker             bool secure,
79*ec779b8eSAndroid Build Coastguard Worker             AString *errorDetailMsg) override;
80*ec779b8eSAndroid Build Coastguard Worker     status_t attachBuffer(
81*ec779b8eSAndroid Build Coastguard Worker             const std::shared_ptr<C2Buffer> &c2Buffer,
82*ec779b8eSAndroid Build Coastguard Worker             const sp<MediaCodecBuffer> &buffer) override;
83*ec779b8eSAndroid Build Coastguard Worker     status_t attachEncryptedBuffer(
84*ec779b8eSAndroid Build Coastguard Worker             const sp<hardware::HidlMemory> &memory,
85*ec779b8eSAndroid Build Coastguard Worker             bool secure,
86*ec779b8eSAndroid Build Coastguard Worker             const uint8_t *key,
87*ec779b8eSAndroid Build Coastguard Worker             const uint8_t *iv,
88*ec779b8eSAndroid Build Coastguard Worker             CryptoPlugin::Mode mode,
89*ec779b8eSAndroid Build Coastguard Worker             CryptoPlugin::Pattern pattern,
90*ec779b8eSAndroid Build Coastguard Worker             size_t offset,
91*ec779b8eSAndroid Build Coastguard Worker             const CryptoPlugin::SubSample *subSamples,
92*ec779b8eSAndroid Build Coastguard Worker             size_t numSubSamples,
93*ec779b8eSAndroid Build Coastguard Worker             const sp<MediaCodecBuffer> &buffer,
94*ec779b8eSAndroid Build Coastguard Worker             AString* errorDetailMsg) override;
95*ec779b8eSAndroid Build Coastguard Worker     status_t attachEncryptedBuffers(
96*ec779b8eSAndroid Build Coastguard Worker             const sp<hardware::HidlMemory> &memory,
97*ec779b8eSAndroid Build Coastguard Worker             size_t offset,
98*ec779b8eSAndroid Build Coastguard Worker             const sp<MediaCodecBuffer> &buffer,
99*ec779b8eSAndroid Build Coastguard Worker             bool secure,
100*ec779b8eSAndroid Build Coastguard Worker             AString* errorDetailMsg) override;
101*ec779b8eSAndroid Build Coastguard Worker     status_t renderOutputBuffer(
102*ec779b8eSAndroid Build Coastguard Worker             const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) override;
103*ec779b8eSAndroid Build Coastguard Worker     void pollForRenderedBuffers() override;
104*ec779b8eSAndroid Build Coastguard Worker     void onBufferReleasedFromOutputSurface(uint32_t generation) override;
105*ec779b8eSAndroid Build Coastguard Worker     void onBufferAttachedToOutputSurface(uint32_t generation) override;
106*ec779b8eSAndroid Build Coastguard Worker     status_t discardBuffer(const sp<MediaCodecBuffer> &buffer) override;
107*ec779b8eSAndroid Build Coastguard Worker     void getInputBufferArray(Vector<sp<MediaCodecBuffer>> *array) override;
108*ec779b8eSAndroid Build Coastguard Worker     void getOutputBufferArray(Vector<sp<MediaCodecBuffer>> *array) override;
109*ec779b8eSAndroid Build Coastguard Worker 
110*ec779b8eSAndroid Build Coastguard Worker     // Methods below are interface for CCodec to use.
111*ec779b8eSAndroid Build Coastguard Worker 
112*ec779b8eSAndroid Build Coastguard Worker     /**
113*ec779b8eSAndroid Build Coastguard Worker      * Set the component object for buffer processing.
114*ec779b8eSAndroid Build Coastguard Worker      */
115*ec779b8eSAndroid Build Coastguard Worker     void setComponent(const std::shared_ptr<Codec2Client::Component> &component);
116*ec779b8eSAndroid Build Coastguard Worker 
117*ec779b8eSAndroid Build Coastguard Worker     /**
118*ec779b8eSAndroid Build Coastguard Worker      * Set output graphic surface for rendering.
119*ec779b8eSAndroid Build Coastguard Worker      */
120*ec779b8eSAndroid Build Coastguard Worker     status_t setSurface(const sp<Surface> &surface, uint32_t generation, bool pushBlankBuffer);
121*ec779b8eSAndroid Build Coastguard Worker 
122*ec779b8eSAndroid Build Coastguard Worker     /**
123*ec779b8eSAndroid Build Coastguard Worker      * Set GraphicBufferSource object from which the component extracts input
124*ec779b8eSAndroid Build Coastguard Worker      * buffers.
125*ec779b8eSAndroid Build Coastguard Worker      */
126*ec779b8eSAndroid Build Coastguard Worker     status_t setInputSurface(const std::shared_ptr<InputSurfaceWrapper> &surface);
127*ec779b8eSAndroid Build Coastguard Worker 
128*ec779b8eSAndroid Build Coastguard Worker     /**
129*ec779b8eSAndroid Build Coastguard Worker      * Signal EOS to input surface.
130*ec779b8eSAndroid Build Coastguard Worker      */
131*ec779b8eSAndroid Build Coastguard Worker     status_t signalEndOfInputStream();
132*ec779b8eSAndroid Build Coastguard Worker 
133*ec779b8eSAndroid Build Coastguard Worker     /**
134*ec779b8eSAndroid Build Coastguard Worker      * Set parameters.
135*ec779b8eSAndroid Build Coastguard Worker      */
136*ec779b8eSAndroid Build Coastguard Worker     status_t setParameters(std::vector<std::unique_ptr<C2Param>> &params);
137*ec779b8eSAndroid Build Coastguard Worker 
138*ec779b8eSAndroid Build Coastguard Worker     /**
139*ec779b8eSAndroid Build Coastguard Worker      * Start queueing buffers to the component. This object should never queue
140*ec779b8eSAndroid Build Coastguard Worker      * buffers before this call has completed.
141*ec779b8eSAndroid Build Coastguard Worker      */
142*ec779b8eSAndroid Build Coastguard Worker     status_t start(
143*ec779b8eSAndroid Build Coastguard Worker             const sp<AMessage> &inputFormat,
144*ec779b8eSAndroid Build Coastguard Worker             const sp<AMessage> &outputFormat,
145*ec779b8eSAndroid Build Coastguard Worker             bool buffersBoundToCodec);
146*ec779b8eSAndroid Build Coastguard Worker 
147*ec779b8eSAndroid Build Coastguard Worker     /**
148*ec779b8eSAndroid Build Coastguard Worker      * Prepare initial input buffers to be filled by client.
149*ec779b8eSAndroid Build Coastguard Worker      *
150*ec779b8eSAndroid Build Coastguard Worker      * \param clientInputBuffers[out]   pointer to slot index -> buffer map.
151*ec779b8eSAndroid Build Coastguard Worker      *                                  On success, it contains prepared
152*ec779b8eSAndroid Build Coastguard Worker      *                                  initial input buffers.
153*ec779b8eSAndroid Build Coastguard Worker      */
154*ec779b8eSAndroid Build Coastguard Worker     status_t prepareInitialInputBuffers(
155*ec779b8eSAndroid Build Coastguard Worker             std::map<size_t, sp<MediaCodecBuffer>> *clientInputBuffers,
156*ec779b8eSAndroid Build Coastguard Worker             bool retry = false);
157*ec779b8eSAndroid Build Coastguard Worker 
158*ec779b8eSAndroid Build Coastguard Worker     /**
159*ec779b8eSAndroid Build Coastguard Worker      * Request initial input buffers as prepared in clientInputBuffers.
160*ec779b8eSAndroid Build Coastguard Worker      *
161*ec779b8eSAndroid Build Coastguard Worker      * \param clientInputBuffers[in]    slot index -> buffer map with prepared
162*ec779b8eSAndroid Build Coastguard Worker      *                                  initial input buffers.
163*ec779b8eSAndroid Build Coastguard Worker      */
164*ec779b8eSAndroid Build Coastguard Worker     status_t requestInitialInputBuffers(
165*ec779b8eSAndroid Build Coastguard Worker             std::map<size_t, sp<MediaCodecBuffer>> &&clientInputBuffers);
166*ec779b8eSAndroid Build Coastguard Worker 
167*ec779b8eSAndroid Build Coastguard Worker     /**
168*ec779b8eSAndroid Build Coastguard Worker      * Stop using buffers of the current output surface for other Codec
169*ec779b8eSAndroid Build Coastguard Worker      * instances to use the surface safely.
170*ec779b8eSAndroid Build Coastguard Worker      *
171*ec779b8eSAndroid Build Coastguard Worker      * \param pushBlankBuffer[in]       push a blank buffer at the end if true
172*ec779b8eSAndroid Build Coastguard Worker      */
173*ec779b8eSAndroid Build Coastguard Worker     void stopUseOutputSurface(bool pushBlankBuffer);
174*ec779b8eSAndroid Build Coastguard Worker 
175*ec779b8eSAndroid Build Coastguard Worker     /**
176*ec779b8eSAndroid Build Coastguard Worker      * Stop queueing buffers to the component. This object should never queue
177*ec779b8eSAndroid Build Coastguard Worker      * buffers after this call, until start() is called.
178*ec779b8eSAndroid Build Coastguard Worker      */
179*ec779b8eSAndroid Build Coastguard Worker     void stop();
180*ec779b8eSAndroid Build Coastguard Worker 
181*ec779b8eSAndroid Build Coastguard Worker     /**
182*ec779b8eSAndroid Build Coastguard Worker      * Stop queueing buffers to the component and release all buffers.
183*ec779b8eSAndroid Build Coastguard Worker      */
184*ec779b8eSAndroid Build Coastguard Worker     void reset();
185*ec779b8eSAndroid Build Coastguard Worker 
186*ec779b8eSAndroid Build Coastguard Worker     /**
187*ec779b8eSAndroid Build Coastguard Worker      * Release all resources.
188*ec779b8eSAndroid Build Coastguard Worker      */
189*ec779b8eSAndroid Build Coastguard Worker     void release();
190*ec779b8eSAndroid Build Coastguard Worker 
191*ec779b8eSAndroid Build Coastguard Worker     void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork);
192*ec779b8eSAndroid Build Coastguard Worker 
193*ec779b8eSAndroid Build Coastguard Worker     /**
194*ec779b8eSAndroid Build Coastguard Worker      * Notify input client about work done.
195*ec779b8eSAndroid Build Coastguard Worker      *
196*ec779b8eSAndroid Build Coastguard Worker      * @param workItems    finished work item.
197*ec779b8eSAndroid Build Coastguard Worker      * @param inputFormat  input format
198*ec779b8eSAndroid Build Coastguard Worker      * @param outputFormat new output format if it has changed, otherwise nullptr
199*ec779b8eSAndroid Build Coastguard Worker      * @param initData     new init data (CSD) if it has changed, otherwise nullptr
200*ec779b8eSAndroid Build Coastguard Worker      */
201*ec779b8eSAndroid Build Coastguard Worker     void onWorkDone(
202*ec779b8eSAndroid Build Coastguard Worker             std::unique_ptr<C2Work> work,
203*ec779b8eSAndroid Build Coastguard Worker             const sp<AMessage> &inputFormat,
204*ec779b8eSAndroid Build Coastguard Worker             const sp<AMessage> &outputFormat,
205*ec779b8eSAndroid Build Coastguard Worker             const C2StreamInitDataInfo::output *initData);
206*ec779b8eSAndroid Build Coastguard Worker 
207*ec779b8eSAndroid Build Coastguard Worker     /**
208*ec779b8eSAndroid Build Coastguard Worker      * Make an input buffer available for the client as it is no longer needed
209*ec779b8eSAndroid Build Coastguard Worker      * by the codec.
210*ec779b8eSAndroid Build Coastguard Worker      *
211*ec779b8eSAndroid Build Coastguard Worker      * @param frameIndex The index of input work
212*ec779b8eSAndroid Build Coastguard Worker      * @param arrayIndex The index of buffer in the input work buffers.
213*ec779b8eSAndroid Build Coastguard Worker      */
214*ec779b8eSAndroid Build Coastguard Worker     void onInputBufferDone(uint64_t frameIndex, size_t arrayIndex);
215*ec779b8eSAndroid Build Coastguard Worker 
216*ec779b8eSAndroid Build Coastguard Worker     PipelineWatcher::Clock::duration elapsed();
217*ec779b8eSAndroid Build Coastguard Worker 
218*ec779b8eSAndroid Build Coastguard Worker     enum MetaMode {
219*ec779b8eSAndroid Build Coastguard Worker         MODE_NONE,
220*ec779b8eSAndroid Build Coastguard Worker         MODE_ANW,
221*ec779b8eSAndroid Build Coastguard Worker     };
222*ec779b8eSAndroid Build Coastguard Worker 
223*ec779b8eSAndroid Build Coastguard Worker     void setMetaMode(MetaMode mode);
224*ec779b8eSAndroid Build Coastguard Worker 
225*ec779b8eSAndroid Build Coastguard Worker     /**
226*ec779b8eSAndroid Build Coastguard Worker      * get pixel format from output buffers.
227*ec779b8eSAndroid Build Coastguard Worker      *
228*ec779b8eSAndroid Build Coastguard Worker      * @return 0 if no valid pixel format found.
229*ec779b8eSAndroid Build Coastguard Worker      */
230*ec779b8eSAndroid Build Coastguard Worker     uint32_t getBuffersPixelFormat(bool isEncoder);
231*ec779b8eSAndroid Build Coastguard Worker 
232*ec779b8eSAndroid Build Coastguard Worker     void resetBuffersPixelFormat(bool isEncoder);
233*ec779b8eSAndroid Build Coastguard Worker 
234*ec779b8eSAndroid Build Coastguard Worker     /**
235*ec779b8eSAndroid Build Coastguard Worker      * Queue a C2 info buffer that will be sent to codec in the subsequent
236*ec779b8eSAndroid Build Coastguard Worker      * queueInputBuffer
237*ec779b8eSAndroid Build Coastguard Worker      *
238*ec779b8eSAndroid Build Coastguard Worker      * @param buffer C2 info buffer
239*ec779b8eSAndroid Build Coastguard Worker      */
240*ec779b8eSAndroid Build Coastguard Worker     void setInfoBuffer(const std::shared_ptr<C2InfoBuffer> &buffer);
241*ec779b8eSAndroid Build Coastguard Worker 
242*ec779b8eSAndroid Build Coastguard Worker private:
243*ec779b8eSAndroid Build Coastguard Worker     uint32_t getInputBuffersPixelFormat();
244*ec779b8eSAndroid Build Coastguard Worker 
245*ec779b8eSAndroid Build Coastguard Worker     uint32_t getOutputBuffersPixelFormat();
246*ec779b8eSAndroid Build Coastguard Worker 
247*ec779b8eSAndroid Build Coastguard Worker     class QueueGuard;
248*ec779b8eSAndroid Build Coastguard Worker 
249*ec779b8eSAndroid Build Coastguard Worker     /**
250*ec779b8eSAndroid Build Coastguard Worker      * Special mutex-like object with the following properties:
251*ec779b8eSAndroid Build Coastguard Worker      *
252*ec779b8eSAndroid Build Coastguard Worker      * - At STOPPED state (initial, or after stop())
253*ec779b8eSAndroid Build Coastguard Worker      *   - QueueGuard object gets created at STOPPED state, and the client is
254*ec779b8eSAndroid Build Coastguard Worker      *     supposed to return immediately.
255*ec779b8eSAndroid Build Coastguard Worker      * - At RUNNING state (after start())
256*ec779b8eSAndroid Build Coastguard Worker      *   - Each QueueGuard object
257*ec779b8eSAndroid Build Coastguard Worker      */
258*ec779b8eSAndroid Build Coastguard Worker     class QueueSync {
259*ec779b8eSAndroid Build Coastguard Worker     public:
260*ec779b8eSAndroid Build Coastguard Worker         /**
261*ec779b8eSAndroid Build Coastguard Worker          * At construction the sync object is in STOPPED state.
262*ec779b8eSAndroid Build Coastguard Worker          */
QueueSync()263*ec779b8eSAndroid Build Coastguard Worker         inline QueueSync() {}
264*ec779b8eSAndroid Build Coastguard Worker         ~QueueSync() = default;
265*ec779b8eSAndroid Build Coastguard Worker 
266*ec779b8eSAndroid Build Coastguard Worker         /**
267*ec779b8eSAndroid Build Coastguard Worker          * Transition to RUNNING state when stopped. No-op if already in RUNNING
268*ec779b8eSAndroid Build Coastguard Worker          * state.
269*ec779b8eSAndroid Build Coastguard Worker          */
270*ec779b8eSAndroid Build Coastguard Worker         void start();
271*ec779b8eSAndroid Build Coastguard Worker 
272*ec779b8eSAndroid Build Coastguard Worker         /**
273*ec779b8eSAndroid Build Coastguard Worker          * At RUNNING state, wait until all QueueGuard object created during
274*ec779b8eSAndroid Build Coastguard Worker          * RUNNING state are destroyed, and then transition to STOPPED state.
275*ec779b8eSAndroid Build Coastguard Worker          * No-op if already in STOPPED state.
276*ec779b8eSAndroid Build Coastguard Worker          */
277*ec779b8eSAndroid Build Coastguard Worker         void stop();
278*ec779b8eSAndroid Build Coastguard Worker 
279*ec779b8eSAndroid Build Coastguard Worker     private:
280*ec779b8eSAndroid Build Coastguard Worker         Mutex mGuardLock;
281*ec779b8eSAndroid Build Coastguard Worker 
282*ec779b8eSAndroid Build Coastguard Worker         struct Counter {
CounterCounter283*ec779b8eSAndroid Build Coastguard Worker             inline Counter() : value(-1) {}
284*ec779b8eSAndroid Build Coastguard Worker             int32_t value;
285*ec779b8eSAndroid Build Coastguard Worker             Condition cond;
286*ec779b8eSAndroid Build Coastguard Worker         };
287*ec779b8eSAndroid Build Coastguard Worker         Mutexed<Counter> mCount;
288*ec779b8eSAndroid Build Coastguard Worker 
289*ec779b8eSAndroid Build Coastguard Worker         friend class CCodecBufferChannel::QueueGuard;
290*ec779b8eSAndroid Build Coastguard Worker     };
291*ec779b8eSAndroid Build Coastguard Worker 
292*ec779b8eSAndroid Build Coastguard Worker     class QueueGuard {
293*ec779b8eSAndroid Build Coastguard Worker     public:
294*ec779b8eSAndroid Build Coastguard Worker         QueueGuard(QueueSync &sync);
295*ec779b8eSAndroid Build Coastguard Worker         ~QueueGuard();
isRunning()296*ec779b8eSAndroid Build Coastguard Worker         inline bool isRunning() { return mRunning; }
297*ec779b8eSAndroid Build Coastguard Worker 
298*ec779b8eSAndroid Build Coastguard Worker     private:
299*ec779b8eSAndroid Build Coastguard Worker         QueueSync &mSync;
300*ec779b8eSAndroid Build Coastguard Worker         bool mRunning;
301*ec779b8eSAndroid Build Coastguard Worker     };
302*ec779b8eSAndroid Build Coastguard Worker 
303*ec779b8eSAndroid Build Coastguard Worker     struct TrackedFrame {
304*ec779b8eSAndroid Build Coastguard Worker         uint64_t number;
305*ec779b8eSAndroid Build Coastguard Worker         int64_t mediaTimeUs;
306*ec779b8eSAndroid Build Coastguard Worker         int64_t desiredRenderTimeNs;
307*ec779b8eSAndroid Build Coastguard Worker         nsecs_t latchTime;
308*ec779b8eSAndroid Build Coastguard Worker         sp<Fence> presentFence;
309*ec779b8eSAndroid Build Coastguard Worker     };
310*ec779b8eSAndroid Build Coastguard Worker 
311*ec779b8eSAndroid Build Coastguard Worker     void feedInputBufferIfAvailable();
312*ec779b8eSAndroid Build Coastguard Worker     void feedInputBufferIfAvailableInternal();
313*ec779b8eSAndroid Build Coastguard Worker     status_t queueInputBufferInternal(sp<MediaCodecBuffer> buffer,
314*ec779b8eSAndroid Build Coastguard Worker                                       std::shared_ptr<C2LinearBlock> encryptedBlock = nullptr,
315*ec779b8eSAndroid Build Coastguard Worker                                       size_t blockSize = 0);
316*ec779b8eSAndroid Build Coastguard Worker     bool handleWork(
317*ec779b8eSAndroid Build Coastguard Worker             std::unique_ptr<C2Work> work,
318*ec779b8eSAndroid Build Coastguard Worker             const sp<AMessage> &inputFormat,
319*ec779b8eSAndroid Build Coastguard Worker             const sp<AMessage> &outputFormat,
320*ec779b8eSAndroid Build Coastguard Worker             const C2StreamInitDataInfo::output *initData);
321*ec779b8eSAndroid Build Coastguard Worker     void sendOutputBuffers();
322*ec779b8eSAndroid Build Coastguard Worker     void ensureDecryptDestination(size_t size);
323*ec779b8eSAndroid Build Coastguard Worker     int32_t getHeapSeqNum(const sp<hardware::HidlMemory> &memory);
324*ec779b8eSAndroid Build Coastguard Worker 
325*ec779b8eSAndroid Build Coastguard Worker     void initializeFrameTrackingFor(ANativeWindow * window);
326*ec779b8eSAndroid Build Coastguard Worker     void trackReleasedFrame(const IGraphicBufferProducer::QueueBufferOutput& qbo,
327*ec779b8eSAndroid Build Coastguard Worker                             int64_t mediaTimeUs, int64_t desiredRenderTimeNs);
328*ec779b8eSAndroid Build Coastguard Worker     void processRenderedFrames(const FrameEventHistoryDelta& delta);
329*ec779b8eSAndroid Build Coastguard Worker     int64_t getRenderTimeNs(const TrackedFrame& frame);
330*ec779b8eSAndroid Build Coastguard Worker 
331*ec779b8eSAndroid Build Coastguard Worker     QueueSync mSync;
332*ec779b8eSAndroid Build Coastguard Worker     sp<MemoryDealer> mDealer;
333*ec779b8eSAndroid Build Coastguard Worker     sp<IMemory> mDecryptDestination;
334*ec779b8eSAndroid Build Coastguard Worker     int32_t mHeapSeqNum;
335*ec779b8eSAndroid Build Coastguard Worker     std::map<wp<hardware::HidlMemory>, int32_t> mHeapSeqNumMap;
336*ec779b8eSAndroid Build Coastguard Worker 
337*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<Codec2Client::Component> mComponent;
338*ec779b8eSAndroid Build Coastguard Worker     std::string mComponentName; ///< component name for debugging
339*ec779b8eSAndroid Build Coastguard Worker     const char *mName; ///< C-string version of component name
340*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<CCodecCallback> mCCodecCallback;
341*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<C2BlockPool> mInputAllocator;
342*ec779b8eSAndroid Build Coastguard Worker     QueueSync mQueueSync;
343*ec779b8eSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<C2Param>> mParamsToBeSet;
344*ec779b8eSAndroid Build Coastguard Worker     sp<AMessage> mOutputFormat;
345*ec779b8eSAndroid Build Coastguard Worker 
346*ec779b8eSAndroid Build Coastguard Worker     struct Input {
347*ec779b8eSAndroid Build Coastguard Worker         Input();
348*ec779b8eSAndroid Build Coastguard Worker 
349*ec779b8eSAndroid Build Coastguard Worker         std::unique_ptr<InputBuffers> buffers;
350*ec779b8eSAndroid Build Coastguard Worker         size_t numSlots;
351*ec779b8eSAndroid Build Coastguard Worker         FlexBuffersImpl extraBuffers;
352*ec779b8eSAndroid Build Coastguard Worker         size_t numExtraSlots;
353*ec779b8eSAndroid Build Coastguard Worker         uint32_t inputDelay;
354*ec779b8eSAndroid Build Coastguard Worker         uint32_t pipelineDelay;
355*ec779b8eSAndroid Build Coastguard Worker         c2_cntr64_t lastFlushIndex;
356*ec779b8eSAndroid Build Coastguard Worker 
357*ec779b8eSAndroid Build Coastguard Worker         FrameReassembler frameReassembler;
358*ec779b8eSAndroid Build Coastguard Worker     };
359*ec779b8eSAndroid Build Coastguard Worker     Mutexed<Input> mInput;
360*ec779b8eSAndroid Build Coastguard Worker     struct Output {
361*ec779b8eSAndroid Build Coastguard Worker         std::unique_ptr<OutputBuffers> buffers;
362*ec779b8eSAndroid Build Coastguard Worker         size_t numSlots;
363*ec779b8eSAndroid Build Coastguard Worker         uint32_t outputDelay;
364*ec779b8eSAndroid Build Coastguard Worker         // true iff the underlying block pool is bounded --- for example,
365*ec779b8eSAndroid Build Coastguard Worker         // a BufferQueue-based block pool would be bounded by the BufferQueue.
366*ec779b8eSAndroid Build Coastguard Worker         bool bounded;
367*ec779b8eSAndroid Build Coastguard Worker     };
368*ec779b8eSAndroid Build Coastguard Worker     Mutexed<Output> mOutput;
369*ec779b8eSAndroid Build Coastguard Worker     Mutexed<std::list<std::unique_ptr<C2Work>>> mFlushedConfigs;
370*ec779b8eSAndroid Build Coastguard Worker 
371*ec779b8eSAndroid Build Coastguard Worker     std::atomic_uint64_t mFrameIndex;
372*ec779b8eSAndroid Build Coastguard Worker     std::atomic_uint64_t mFirstValidFrameIndex;
373*ec779b8eSAndroid Build Coastguard Worker 
374*ec779b8eSAndroid Build Coastguard Worker     sp<MemoryDealer> makeMemoryDealer(size_t heapSize);
375*ec779b8eSAndroid Build Coastguard Worker 
376*ec779b8eSAndroid Build Coastguard Worker     std::deque<TrackedFrame> mTrackedFrames;
377*ec779b8eSAndroid Build Coastguard Worker     bool mAreRenderMetricsEnabled;
378*ec779b8eSAndroid Build Coastguard Worker     bool mIsSurfaceToDisplay;
379*ec779b8eSAndroid Build Coastguard Worker     bool mHasPresentFenceTimes;
380*ec779b8eSAndroid Build Coastguard Worker 
381*ec779b8eSAndroid Build Coastguard Worker     struct OutputSurface {
382*ec779b8eSAndroid Build Coastguard Worker         sp<Surface> surface;
383*ec779b8eSAndroid Build Coastguard Worker         uint32_t generation;
384*ec779b8eSAndroid Build Coastguard Worker         int maxDequeueBuffers;
385*ec779b8eSAndroid Build Coastguard Worker         std::map<uint64_t, int> rotation;
386*ec779b8eSAndroid Build Coastguard Worker     };
387*ec779b8eSAndroid Build Coastguard Worker     Mutexed<OutputSurface> mOutputSurface;
388*ec779b8eSAndroid Build Coastguard Worker     int mRenderingDepth;
389*ec779b8eSAndroid Build Coastguard Worker 
390*ec779b8eSAndroid Build Coastguard Worker     struct BlockPools {
391*ec779b8eSAndroid Build Coastguard Worker         C2Allocator::id_t inputAllocatorId;
392*ec779b8eSAndroid Build Coastguard Worker         std::shared_ptr<C2BlockPool> inputPool;
393*ec779b8eSAndroid Build Coastguard Worker         C2Allocator::id_t outputAllocatorId;
394*ec779b8eSAndroid Build Coastguard Worker         C2BlockPool::local_id_t outputPoolId;
395*ec779b8eSAndroid Build Coastguard Worker         std::shared_ptr<Codec2Client::Configurable> outputPoolIntf;
396*ec779b8eSAndroid Build Coastguard Worker     };
397*ec779b8eSAndroid Build Coastguard Worker     Mutexed<BlockPools> mBlockPools;
398*ec779b8eSAndroid Build Coastguard Worker 
399*ec779b8eSAndroid Build Coastguard Worker     std::atomic_bool mHasInputSurface;
400*ec779b8eSAndroid Build Coastguard Worker     struct InputSurface {
401*ec779b8eSAndroid Build Coastguard Worker         std::shared_ptr<InputSurfaceWrapper> surface;
402*ec779b8eSAndroid Build Coastguard Worker         // This variable tracks the number of buffers processing
403*ec779b8eSAndroid Build Coastguard Worker         // in the input surface and codec by counting the # of buffers to
404*ec779b8eSAndroid Build Coastguard Worker         // be filled in and queued from the input surface and the # of
405*ec779b8eSAndroid Build Coastguard Worker         // buffers generated from the codec.
406*ec779b8eSAndroid Build Coastguard Worker         //
407*ec779b8eSAndroid Build Coastguard Worker         // Note that this variable can go below 0, because it does not take
408*ec779b8eSAndroid Build Coastguard Worker         // account the number of buffers initially in the buffer queue at
409*ec779b8eSAndroid Build Coastguard Worker         // start. This is okay, as we only track how many more we allow
410*ec779b8eSAndroid Build Coastguard Worker         // from the initial state.
411*ec779b8eSAndroid Build Coastguard Worker         int64_t numProcessingBuffersBalance;
412*ec779b8eSAndroid Build Coastguard Worker     };
413*ec779b8eSAndroid Build Coastguard Worker     Mutexed<InputSurface> mInputSurface;
414*ec779b8eSAndroid Build Coastguard Worker 
415*ec779b8eSAndroid Build Coastguard Worker     MetaMode mMetaMode;
416*ec779b8eSAndroid Build Coastguard Worker 
417*ec779b8eSAndroid Build Coastguard Worker     Mutexed<PipelineWatcher> mPipelineWatcher;
418*ec779b8eSAndroid Build Coastguard Worker 
419*ec779b8eSAndroid Build Coastguard Worker     std::atomic_bool mInputMetEos;
420*ec779b8eSAndroid Build Coastguard Worker     std::once_flag mRenderWarningFlag;
421*ec779b8eSAndroid Build Coastguard Worker 
422*ec779b8eSAndroid Build Coastguard Worker     sp<ICrypto> mCrypto;
423*ec779b8eSAndroid Build Coastguard Worker     sp<IDescrambler> mDescrambler;
424*ec779b8eSAndroid Build Coastguard Worker 
hasCryptoOrDescrambler()425*ec779b8eSAndroid Build Coastguard Worker     inline bool hasCryptoOrDescrambler() {
426*ec779b8eSAndroid Build Coastguard Worker         return mCrypto != nullptr || mDescrambler != nullptr;
427*ec779b8eSAndroid Build Coastguard Worker     }
428*ec779b8eSAndroid Build Coastguard Worker     std::atomic_bool mSendEncryptedInfoBuffer;
429*ec779b8eSAndroid Build Coastguard Worker 
430*ec779b8eSAndroid Build Coastguard Worker     std::atomic_bool mTunneled;
431*ec779b8eSAndroid Build Coastguard Worker 
432*ec779b8eSAndroid Build Coastguard Worker     std::vector<std::shared_ptr<C2InfoBuffer>> mInfoBuffers;
433*ec779b8eSAndroid Build Coastguard Worker };
434*ec779b8eSAndroid Build Coastguard Worker 
435*ec779b8eSAndroid Build Coastguard Worker // Conversion of a c2_status_t value to a status_t value may depend on the
436*ec779b8eSAndroid Build Coastguard Worker // operation that returns the c2_status_t value.
437*ec779b8eSAndroid Build Coastguard Worker enum c2_operation_t {
438*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_NONE,
439*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_connectToOmxInputSurface,
440*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_createBlockPool,
441*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_destroyBlockPool,
442*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_disconnectFromInputSurface,
443*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_drain,
444*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_flush,
445*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_queue,
446*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_release,
447*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_reset,
448*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_setOutputSurface,
449*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_start,
450*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Component_stop,
451*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_ComponentStore_copyBuffer,
452*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_ComponentStore_createComponent,
453*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_ComponentStore_createInputSurface,
454*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_ComponentStore_createInterface,
455*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Configurable_config,
456*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Configurable_query,
457*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Configurable_querySupportedParams,
458*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_Configurable_querySupportedValues,
459*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_InputSurface_connectToComponent,
460*ec779b8eSAndroid Build Coastguard Worker     C2_OPERATION_InputSurfaceConnection_disconnect,
461*ec779b8eSAndroid Build Coastguard Worker };
462*ec779b8eSAndroid Build Coastguard Worker 
463*ec779b8eSAndroid Build Coastguard Worker status_t toStatusT(c2_status_t c2s, c2_operation_t c2op = C2_OPERATION_NONE);
464*ec779b8eSAndroid Build Coastguard Worker 
465*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
466*ec779b8eSAndroid Build Coastguard Worker 
467*ec779b8eSAndroid Build Coastguard Worker #endif  // CCODEC_BUFFER_CHANNEL_H_
468