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 #ifndef AVCODEC_AUDIO_CODEC_IMPL_H 16 #define AVCODEC_AUDIO_CODEC_IMPL_H 17 18 #include <queue> 19 #include "avcodec_audio_codec.h" 20 #include "nocopyable.h" 21 #include "task_thread.h" 22 #include "i_avcodec_service.h" 23 #include "meta/meta.h" 24 #include "buffer/avbuffer.h" 25 #include "buffer/avbuffer_queue.h" 26 #include "buffer/avbuffer_queue_consumer.h" 27 #include "buffer/avbuffer_queue_define.h" 28 #include "buffer/avbuffer_queue_producer.h" 29 #include "foundation/multimedia/drm_framework/services/drm_service/ipc/i_keysession_service.h" 30 31 namespace OHOS { 32 namespace MediaAVCodec { 33 class AVCodecAudioCodecImpl { 34 public: 35 AVCodecAudioCodecImpl(); 36 ~AVCodecAudioCodecImpl(); 37 38 int32_t Configure(const Format &format); 39 int32_t Prepare(); 40 int32_t Start(); 41 int32_t Stop(); 42 int32_t Flush(); 43 int32_t Reset(); 44 int32_t Release(); 45 int32_t QueueInputBuffer(uint32_t index); 46 int32_t SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession, 47 const bool svpFlag); 48 int32_t GetOutputFormat(Format &format); 49 int32_t ReleaseOutputBuffer(uint32_t index); 50 int32_t SetParameter(const Format &format); 51 int32_t SetCallback(const std::shared_ptr<MediaCodecCallback> &callback); 52 int32_t Init(AVCodecType type, bool isMimeType, const std::string &name); 53 void Notify(); 54 55 private: 56 void ProduceInputBuffer(); 57 void ConsumerOutputBuffer(); 58 int32_t GetInputBufferSize(); 59 void ClearCache(); 60 void StopTask(); 61 void PauseTask(); 62 void StopTaskAsync(); 63 void PauseTaskAsync(); 64 void ClearInputBuffer(); 65 void ReturnInputBuffer(); 66 67 private: 68 class AVCodecInnerCallback : public MediaCodecCallback { 69 public: 70 explicit AVCodecInnerCallback(AVCodecAudioCodecImpl *impl); 71 ~AVCodecInnerCallback() = default; 72 void OnError(AVCodecErrorType errorType, int32_t errorCode) override; 73 void OnOutputFormatChanged(const Format &format) override; 74 void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override; 75 void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override; 76 77 private: 78 AVCodecAudioCodecImpl *impl_; 79 }; 80 81 private: 82 std::atomic<bool> isRunning_; 83 std::shared_ptr<ICodecService> codecService_ = nullptr; 84 std::shared_ptr<Media::AVBufferQueue> implBufferQueue_; 85 std::unique_ptr<TaskThread> inputTask_; 86 std::unique_ptr<TaskThread> outputTask_; 87 std::shared_ptr<MediaCodecCallback> callback_; 88 std::condition_variable inputCondition_; 89 std::condition_variable outputCondition_; 90 std::mutex inputMutex_; 91 std::mutex inputMutex2_; 92 std::mutex outputMutex_; 93 std::mutex outputMutex_2; 94 std::atomic<int32_t> bufferConsumerAvailableCount_ = 0; 95 std::atomic<uint32_t> indexInput_ = 0; 96 std::atomic<uint32_t> indexOutput_ = 0; 97 int32_t inputBufferSize_ = 0; 98 std::queue<std::shared_ptr<AVBuffer>> inputIndexQueue; 99 std::map<uint32_t, std::shared_ptr<AVBuffer>> inputBufferObjMap_; 100 std::map<uint32_t, std::shared_ptr<AVBuffer>> outputBufferObjMap_; 101 sptr<Media::AVBufferQueueProducer> mediaCodecProducer_; 102 sptr<Media::AVBufferQueueProducer> implProducer_; 103 sptr<Media::AVBufferQueueConsumer> implConsumer_; 104 }; 105 106 class AudioCodecConsumerListener : public Media::IConsumerListener { 107 public: 108 explicit AudioCodecConsumerListener(AVCodecAudioCodecImpl *impl); 109 void OnBufferAvailable() override; 110 private: 111 AVCodecAudioCodecImpl *impl_; 112 }; 113 114 class AudioCodecProducerListener : public IRemoteStub<Media::IProducerListener> { 115 public: 116 explicit AudioCodecProducerListener(AVCodecAudioCodecImpl *impl); 117 void OnBufferAvailable() override; 118 private: 119 AVCodecAudioCodecImpl *impl_; 120 bool isCousumer_; 121 }; 122 123 } // namespace MediaAVCodec 124 } // namespace OHOS 125 #endif // AVCODEC_AUDIO_CODEC_IMPL_H