1 /*
2  * Copyright (C) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef NATIVE_AVBUFFER_QUEUE_DEFINE_H
17 #define NATIVE_AVBUFFER_QUEUE_DEFINE_H
18 
19 #include <refbase.h>
20 #include <list>
21 #include <vector>
22 #include <mutex>
23 #include "buffer/avbuffer_queue.h"
24 
25 #define AV_BUFFER_QUEUE_MAGIC(a, b, c, d) (((a) << 24) + ((b) << 16) + ((c) << 8) + ((d) << 0))
26 
27 using NativeAVBufferQueueObjectMagic = enum NativeAVBufferQueueObjectMagic: uint32_t {
28     NATIVE_ABQ_OBJECT_MAGIC_QUEUE = AV_BUFFER_QUEUE_MAGIC('Q', 'U', 'E', 'E'),
29     NATIVE_ABQ_OBJECT_MAGIC_PRODUCER = AV_BUFFER_QUEUE_MAGIC('Q', 'P', 'D', 'C'),
30     NATIVE_ABQ_OBJECT_MAGIC_CONSUMER = AV_BUFFER_QUEUE_MAGIC('Q', 'C', 'S', 'M'),
31     NATIVE_ABQ_OBJECT_MAGIC_INVALID = AV_BUFFER_QUEUE_MAGIC('0', '0', '0', '0'),
32 };
33 
34 std::list<NativeAVBufferQueueObjectMagic> NativeAVBufferQueueObjectMagicList = {
35     NATIVE_ABQ_OBJECT_MAGIC_QUEUE,
36     NATIVE_ABQ_OBJECT_MAGIC_PRODUCER,
37     NATIVE_ABQ_OBJECT_MAGIC_CONSUMER,
38 };
39 
40 struct NativeAVBufferQueueMagic : public OHOS::RefBase {
NativeAVBufferQueueMagicNativeAVBufferQueueMagic41     explicit NativeAVBufferQueueMagic(NativeAVBufferQueueObjectMagic m) : magic_(m) {}
~NativeAVBufferQueueMagicNativeAVBufferQueueMagic42     ~NativeAVBufferQueueMagic() override { magic_ = NATIVE_ABQ_OBJECT_MAGIC_INVALID; }
43     NativeAVBufferQueueObjectMagic magic_;
44 };
45 
46 struct OH_AVBufferQueue: public NativeAVBufferQueueMagic {
47     explicit OH_AVBufferQueue(
48             std::shared_ptr<OHOS::Media::AVBufferQueue>& bufferQueue, uint32_t maxBufferCount);
49     ~OH_AVBufferQueue() override = default;
50 
51     std::shared_ptr<OHOS::Media::AVBufferQueue> bufferQueue_;
52     std::vector<std::shared_ptr<OH_AVBuffer>> nativeBufferVector_;
53     std::vector<bool> nativeBufferFree_;
54 
55     std::mutex lock_;
56 
57     OH_AVBuffer* FindAndBindNativeBuffer(std::shared_ptr<OHOS::Media::AVBuffer>& buffer);
58     OH_AVErrCode UnbindNativeBuffer(const OH_AVBuffer *nativeBuffer);
59 };
60 
61 struct OH_AVBufferQueueConsumer : public NativeAVBufferQueueMagic {
OH_AVBufferQueueConsumerOH_AVBufferQueueConsumer62     explicit OH_AVBufferQueueConsumer(
63         OHOS::sptr<OH_AVBufferQueue>& nativeBufferQueue,
64         OHOS::sptr<OHOS::Media::AVBufferQueueConsumer>& consumer)
65         : NativeAVBufferQueueMagic(NATIVE_ABQ_OBJECT_MAGIC_CONSUMER),
66           nativeBufferQueue_(nativeBufferQueue),
67           consumer_(consumer) { }
68 
~OH_AVBufferQueueConsumerOH_AVBufferQueueConsumer69     ~OH_AVBufferQueueConsumer() override { nativeBufferQueue_ = nullptr; }
70 
71     OHOS::sptr<OH_AVBufferQueue> nativeBufferQueue_;
72     OHOS::sptr<OHOS::Media::AVBufferQueueConsumer> consumer_;
73 };
74 
75 struct OH_AVBufferQueueProducer : public NativeAVBufferQueueMagic {
OH_AVBufferQueueProducerOH_AVBufferQueueProducer76     explicit OH_AVBufferQueueProducer(
77         OHOS::sptr<OH_AVBufferQueue>& nativeBufferQueue,
78         OHOS::sptr<OHOS::Media::AVBufferQueueProducer>& producer)
79         : NativeAVBufferQueueMagic(NATIVE_ABQ_OBJECT_MAGIC_PRODUCER),
80           nativeBufferQueue_(nativeBufferQueue),
81           producer_(producer) { }
82 
~OH_AVBufferQueueProducerOH_AVBufferQueueProducer83     ~OH_AVBufferQueueProducer() override { nativeBufferQueue_ = nullptr; }
84 
85     OHOS::sptr<OH_AVBufferQueue> nativeBufferQueue_;
86     OHOS::sptr<OHOS::Media::AVBufferQueueProducer> producer_;
87 };
88 
89 #endif // NATIVE_AVBUFFER_QUEUE_DEFINE_H