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