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