1 /* 2 * Copyright (c) 2025-2025 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 SEI_PARSER_FILTER_H 17 #define SEI_PARSER_FILTER_H 18 19 #include <atomic> 20 21 #include "plugin/plugin_info.h" 22 #include "filter/filter.h" 23 #include "buffer/avbuffer_queue.h" 24 #include "buffer/avbuffer_queue_define.h" 25 #include "sink/media_synchronous_sink.h" 26 #include "meta/format.h" 27 #include "sei_parser_helper.h" 28 #include "media_sync_manager.h" 29 30 namespace OHOS { 31 namespace Media { 32 namespace Pipeline { 33 class SeiParserFilter : public Filter, public InterruptListener, public std::enable_shared_from_this<SeiParserFilter> { 34 public: 35 explicit SeiParserFilter(const std::string &name, FilterType filterType = FilterType::FILTERTYPE_SEI); 36 ~SeiParserFilter() override; 37 38 sptr<AVBufferQueueProducer> GetBufferQueueProducer(); 39 40 sptr<AVBufferQueueConsumer> GetBufferQueueConsumer(); 41 42 void Init(const std::shared_ptr<EventReceiver> &receiver, const std::shared_ptr<FilterCallback> &callback) override; 43 44 Status DoInitAfterLink() override; 45 46 Status DoPrepare() override; 47 48 void OnInterrupted(bool isInterruptNeeded) override; 49 50 Status PrepareState(); 51 52 Status DoProcessInputBuffer(int recvArg, bool dropFrame) override; 53 54 Status ParseSei(std::shared_ptr<AVBuffer> buffer); 55 56 Status SetSeiMessageCbStatus(bool status, const std::vector<int32_t> &payloadTypes); 57 58 void DrainOutputBuffer(bool flushed); 59 60 void SetParseSeiEnabled(bool needParseSeiInfo); 61 62 void SetSyncCenter(std::shared_ptr<IMediaSyncCenter> syncCenter); 63 64 protected: 65 Status OnLinked(StreamType inType, const std::shared_ptr<Meta> &meta, 66 const std::shared_ptr<FilterLinkCallback> &callback) override; 67 Status OnUpdated(StreamType inType, const std::shared_ptr<Meta> &meta, 68 const std::shared_ptr<FilterLinkCallback> &callback) override; 69 Status OnUnLinked(StreamType inType, const std::shared_ptr<FilterLinkCallback> &callback) override; 70 71 class AVBufferAvailableListener : public IConsumerListener { 72 public: 73 AVBufferAvailableListener(std::shared_ptr<SeiParserFilter> SeiParserFilter); 74 void OnBufferAvailable() override; 75 76 private: 77 std::weak_ptr<SeiParserFilter> seiParserFilter_; 78 }; 79 80 private: 81 Status PrepareInputBufferQueue(); 82 83 const std::string INPUT_BUFFER_QUEUE_NAME = "SeiParserFilterInputBufferQueue"; 84 std::string name_; 85 std::string codecMimeType_; 86 FilterType filterType_ = FilterType::FILTERTYPE_SEI; 87 FilterState state_ = FilterState::CREATED; 88 std::shared_ptr<Meta> trackMeta_; 89 std::shared_ptr<EventReceiver> eventReceiver_; 90 std::shared_ptr<FilterCallback> filterCallback_; 91 std::shared_ptr<FilterLinkCallback> onLinkedResultCallback_; 92 std::shared_ptr<AVBufferQueue> inputBufferQueue_; 93 sptr<AVBufferQueueProducer> inputBufferQueueProducer_; 94 sptr<AVBufferQueueConsumer> inputBufferQueueConsumer_; 95 std::shared_ptr<AVBuffer> filledOutputBuffer_; 96 bool seiMessageCbStatus_{ false }; 97 std::vector<int32_t> payloadTypes_{}; 98 sptr<SeiParserListener> producerListener_ {}; 99 std::shared_ptr<IMediaSyncCenter> syncCenter_; 100 }; 101 } // namespace Pipeline 102 } // namespace Media 103 } // namespace OHOS 104 #endif // SEI_PARSER_FILTER_H 105