1 /* 2 * Copyright (c) 2024 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 FILTERS_SURFACE_DECODER_ADAPTER_H 17 #define FILTERS_SURFACE_DECODER_ADAPTER_H 18 19 #include <cstring> 20 #include <shared_mutex> 21 #include "surface.h" 22 #include "meta/meta.h" 23 #include "buffer/avbuffer.h" 24 #include "buffer/avallocator.h" 25 #include "buffer/avbuffer_queue.h" 26 #include "buffer/avbuffer_queue_producer.h" 27 #include "buffer/avbuffer_queue_consumer.h" 28 #include "common/status.h" 29 #include "common/log.h" 30 #include "osal/task/task.h" 31 #include "avcodec_common.h" 32 #include "osal/task/condition_variable.h" 33 #include "avcodec_video_decoder.h" 34 35 namespace OHOS { 36 namespace MediaAVCodec { 37 class ICodecService; 38 } 39 40 namespace Media { 41 class DecoderAdapterCallback { 42 public: 43 virtual ~DecoderAdapterCallback() = default; 44 virtual void OnError(MediaAVCodec::AVCodecErrorType type, int32_t errorCode) = 0; 45 virtual void OnOutputFormatChanged(const std::shared_ptr<Meta> &format) = 0; 46 virtual void OnBufferEos(int64_t pts, int64_t frameNum) = 0; 47 }; 48 49 class SurfaceDecoderAdapter : public std::enable_shared_from_this<SurfaceDecoderAdapter> { 50 public: 51 explicit SurfaceDecoderAdapter(); 52 ~SurfaceDecoderAdapter(); 53 public: 54 Status Init(const std::string &mime); 55 Status Configure(const Format &format); 56 sptr<OHOS::Media::AVBufferQueueProducer> GetInputBufferQueue(); 57 Status SetDecoderAdapterCallback(const std::shared_ptr<DecoderAdapterCallback> &decoderAdapterCallback); 58 Status SetOutputSurface(sptr<Surface> surface); 59 sptr<Surface> GetInputSurface(); 60 Status Start(); 61 Status Stop(); 62 Status Pause(); 63 Status Resume(); 64 Status Flush(); 65 Status Release(); 66 Status SetParameter(const Format &format); 67 void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer); 68 void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer); 69 void AcquireAvailableInputBuffer(); 70 int64_t GetFrameNum(); 71 int64_t GetLastBufferPts(); 72 73 std::shared_ptr<DecoderAdapterCallback> decoderAdapterCallback_; 74 75 private: 76 void ReleaseBuffer(); 77 78 std::shared_ptr<MediaAVCodec::AVCodecVideoDecoder> codecServer_; 79 std::shared_ptr<Media::AVBufferQueue> inputBufferQueue_; 80 sptr<Media::AVBufferQueueProducer> inputBufferQueueProducer_; 81 sptr<Media::AVBufferQueueConsumer> inputBufferQueueConsumer_; 82 83 std::shared_ptr<Task> releaseBufferTask_{nullptr}; 84 std::mutex releaseBufferMutex_; 85 std::condition_variable releaseBufferCondition_; 86 std::vector<uint32_t> indexs_; 87 std::vector<uint32_t> dropIndexs_; 88 std::atomic<int64_t> frameNum_ = 0; 89 std::atomic<int64_t> lastBufferPts_ = INT64_MIN; 90 std::atomic<bool> isThreadExit_ = true; 91 }; 92 } // namespace MediaAVCodec 93 } // namespace OHOS 94 #endif // FILTERS_SURFACE_ENCODER_ADAPTER_H 95