• 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     int32_t QueryInputBuffer(uint32_t *index, int64_t timeoutUs);
55     std::shared_ptr<AVBuffer> GetInputBuffer(uint32_t index);
56     int32_t QueryOutputBuffer(uint32_t *index, int64_t timeoutUs);
57     std::shared_ptr<AVBuffer> GetOutputBuffer(uint32_t index);
58 
59 private:
60     void ProduceInputBuffer();
61     void ConsumerOutputBuffer();
62     int32_t GetInputBufferSize();
63     void ClearCache();
64     void StopTask();
65     void PauseTask();
66     void StopTaskAsync();
67     void PauseTaskAsync();
68     void ClearInputBuffer();
69     void ReturnInputBuffer();
70 
71 private:
72     class AVCodecInnerCallback : public MediaCodecCallback {
73     public:
74         explicit AVCodecInnerCallback(AVCodecAudioCodecImpl *impl);
75         ~AVCodecInnerCallback() = default;
76         void OnError(AVCodecErrorType errorType, int32_t errorCode) override;
77         void OnOutputFormatChanged(const Format &format) override;
78         void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override;
79         void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override;
80 
81     private:
82         AVCodecAudioCodecImpl *impl_;
83     };
84     typedef enum : uint8_t {
85         OUTPUT_NONE           = 0,
86         OUTPUT_STREAM_CHANGED = 1,
87         OUTPUT_BUFFER         = 2,
88     } OutputInfoType;
89 
90     class OutputInfo {
91     public:
OutputInfo(const Format & format)92         explicit OutputInfo(const Format &format)
93         {
94             type_ = OUTPUT_STREAM_CHANGED;
95             buffer_ = nullptr;
96         }
OutputInfo(std::shared_ptr<AVBuffer> buffer)97         explicit OutputInfo(std::shared_ptr<AVBuffer> buffer)
98         {
99             type_ = OUTPUT_BUFFER;
100             buffer_ = buffer;
101         }
~OutputInfo()102         ~OutputInfo()
103         {
104             buffer_ = nullptr;
105         }
106         OutputInfoType type_;
107         std::shared_ptr<AVBuffer> buffer_;
108     };
109 
110 private:
111     std::atomic<bool> isRunning_ = false;
112     std::atomic<bool> isSyncMode_ = false;
113     std::shared_ptr<ICodecService> codecService_ = nullptr;
114     std::shared_ptr<Media::AVBufferQueue> implBufferQueue_;
115     std::unique_ptr<TaskThread> inputTask_;
116     std::unique_ptr<TaskThread> outputTask_;
117     std::shared_ptr<MediaCodecCallback> callback_;
118     std::condition_variable inputCondition_;
119     std::condition_variable outputCondition_;
120     std::mutex inputMutex_;
121     std::mutex inputMutex2_;
122     std::mutex outputMutex_;
123     std::mutex outputMutex_2;
124     std::atomic<int32_t> bufferConsumerAvailableCount_ = 0;
125     std::atomic<uint32_t> indexInput_ = 0;
126     std::atomic<uint32_t> indexOutput_ = 0;
127     int32_t inputBufferSize_ = 0;
128     std::queue<std::shared_ptr<AVBuffer>> inputIndexQueue;
129     std::map<uint32_t, std::shared_ptr<AVBuffer>> inputBufferObjMap_;
130     std::map<uint32_t, std::shared_ptr<AVBuffer>> outputBufferObjMap_;
131     sptr<Media::AVBufferQueueProducer> mediaCodecProducer_;
132     sptr<Media::AVBufferQueueProducer> implProducer_;
133     sptr<Media::AVBufferQueueConsumer> implConsumer_;
134     std::queue<std::shared_ptr<OutputInfo>> syncOutputQueue_;
135     std::mutex syncOutputMutex_;
136     std::condition_variable syncOutCond_;
137 };
138 
139 class AudioCodecConsumerListener : public Media::IConsumerListener {
140 public:
141     explicit AudioCodecConsumerListener(AVCodecAudioCodecImpl *impl);
142     void OnBufferAvailable() override;
143 private:
144     AVCodecAudioCodecImpl *impl_;
145 };
146 
147 class AudioCodecProducerListener : public IRemoteStub<Media::IProducerListener> {
148 public:
149     explicit AudioCodecProducerListener(AVCodecAudioCodecImpl *impl);
150     void OnBufferAvailable() override;
151 private:
152     AVCodecAudioCodecImpl *impl_;
153     bool isCousumer_;
154 };
155 
156 } // namespace MediaAVCodec
157 } // namespace OHOS
158 #endif // AVCODEC_AUDIO_CODEC_IMPL_H