• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-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 
16 #ifndef MODULES_MEDIA_CODEC_H
17 #define MODULES_MEDIA_CODEC_H
18 
19 #include <cstring>
20 #include "surface.h"
21 #include "meta/meta.h"
22 #include "buffer/avbuffer.h"
23 #include "buffer/avallocator.h"
24 #include "buffer/avbuffer_queue.h"
25 #include "buffer/avbuffer_queue_producer.h"
26 #include "buffer/avbuffer_queue_consumer.h"
27 #include "common/status.h"
28 #include "plugin/plugin_event.h"
29 #include "plugin/codec_plugin.h"
30 #include "osal/task/mutex.h"
31 #include "foundation/multimedia/drm_framework/services/drm_service/ipc/i_keysession_service.h"
32 #include "foundation/multimedia/av_codec/services/drm_decryptor/codec_drm_decrypt.h"
33 
34 namespace OHOS {
35 namespace Media {
36 enum class CodecState : int32_t {
37     UNINITIALIZED,
38     INITIALIZED,
39     CONFIGURED,
40     PREPARED,
41     RUNNING,
42     FLUSHED,
43     END_OF_STREAM,
44 
45     INITIALIZING, // RELEASED -> INITIALIZED
46     STARTING,     // INITIALIZED -> RUNNING
47     STOPPING,     // RUNNING -> INITIALIZED
48     FLUSHING,     // RUNNING -> FLUSHED
49     RESUMING,     // FLUSHED -> RUNNING
50     RELEASING,    // {ANY EXCEPT RELEASED} -> RELEASED
51 
52     ERROR,
53 };
54 
55 enum class CodecErrorType : int32_t {
56     CODEC_ERROR_INTERNAL,
57     CODEC_DRM_DECRYTION_FAILED,
58     CODEC_ERROR_EXTEND_START = 0X10000,
59 };
60 
61 class CodecCallback {
62 public:
63     virtual ~CodecCallback() = default;
64 
65     virtual void OnError(CodecErrorType errorType, int32_t errorCode) = 0;
66 
67     virtual void OnOutputFormatChanged(const std::shared_ptr<Meta> &format) = 0;
68 };
69 
70 class AudioBaseCodecCallback {
71 public:
72     virtual ~AudioBaseCodecCallback() = default;
73 
74     virtual void OnError(CodecErrorType errorType, int32_t errorCode) = 0;
75 
76     virtual void OnOutputBufferDone(const std::shared_ptr<AVBuffer> &outputBuffer) = 0;
77 
78     virtual void OnOutputFormatChanged(const std::shared_ptr<Meta> &format) = 0;
79 };
80 
81 class MediaCodec : public Plugins::DataCallback {
82 public:
83     MediaCodec();
84 
85     ~MediaCodec() override;
86 
87     int32_t Init(const std::string &mime, bool isEncoder);
88 
89     int32_t Init(const std::string &name);
90 
91     int32_t Configure(const std::shared_ptr<Meta> &meta);
92 
93     int32_t SetOutputBufferQueue(const sptr<AVBufferQueueProducer> &bufferQueueProducer);
94 
95     int32_t SetCodecCallback(const std::shared_ptr<CodecCallback> &codecCallback);
96 
97     int32_t SetCodecCallback(const std::shared_ptr<AudioBaseCodecCallback> &codecCallback);
98 
99     int32_t SetOutputSurface(sptr<Surface> surface);
100 
101     int32_t Prepare();
102 
103     sptr<AVBufferQueueProducer> GetInputBufferQueue();
104 
105     sptr<Surface> GetInputSurface();
106 
107     int32_t Start();
108 
109     int32_t Stop();
110 
111     int32_t Flush();
112 
113     int32_t Reset();
114 
115     int32_t Release();
116 
117     int32_t NotifyEos();
118 
119     int32_t SetParameter(const std::shared_ptr<Meta> &parameter);
120 
121     int32_t GetOutputFormat(std::shared_ptr<Meta> &parameter);
122 
123     void ProcessInputBuffer();
124 
125     void SetDumpInfo(bool isDump, uint64_t instanceId);
126 
127     int32_t SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession,
128         const bool svpFlag);
129 
130     Status ChangePlugin(const std::string &mime, bool isEncoder, const std::shared_ptr<Meta> &meta);
131 
132     void OnDumpInfo(int32_t fd);
133 
134 private:
135     std::shared_ptr<Plugins::CodecPlugin> CreatePlugin(Plugins::PluginType pluginType);
136     std::shared_ptr<Plugins::CodecPlugin> CreatePlugin(const std::string &mime, Plugins::PluginType pluginType);
137     Status AttachBufffer();
138     Status AttachDrmBufffer(std::shared_ptr<AVBuffer> &drmInbuf, std::shared_ptr<AVBuffer> &drmOutbuf,
139         uint32_t size);
140     Status DrmAudioCencDecrypt(std::shared_ptr<AVBuffer> &filledInputBuffer);
141     Status HandleOutputBuffer(uint32_t eosStatus);
142 
143     int32_t PrepareInputBufferQueue();
144 
145     int32_t PrepareOutputBufferQueue();
146 
147     void OnInputBufferDone(const std::shared_ptr<AVBuffer> &inputBuffer) override;
148 
149     void OnOutputBufferDone(const std::shared_ptr<AVBuffer> &outputBuffer) override;
150 
151     void OnEvent(const std::shared_ptr<Plugins::PluginEvent> event) override;
152 
153     std::string StateToString(CodecState state);
154 
155     void ClearBufferQueue();
156 
157     void ClearInputBuffer();
158 
159     void HandleAudioCencDecryptError();
160 
161     uint32_t GetApiVersion();
162 
163 private:
164     std::shared_ptr<Plugins::CodecPlugin> codecPlugin_;
165     std::shared_ptr<AVBufferQueue> inputBufferQueue_;
166     sptr<AVBufferQueueProducer> inputBufferQueueProducer_;
167     sptr<AVBufferQueueConsumer> inputBufferQueueConsumer_;
168     sptr<AVBufferQueueProducer> outputBufferQueueProducer_;
169     std::weak_ptr<CodecCallback> codecCallback_;
170     // callback from north interface(AudioCodec..)
171     std::weak_ptr<AudioBaseCodecCallback> mediaCodecCallback_;
172     AVBufferConfig outputBufferConfig_;
173     bool isEncoder_;
174     bool isSurfaceMode_;
175     bool isBufferMode_;
176     bool isDump_ = false;
177     bool isSupportAudioFormatChanged_ = true;
178     std::string dumpPrefix_ = "";
179     int32_t outputBufferCapacity_;
180     std::string codecPluginName_;
181 
182     std::atomic<CodecState> state_;
183     std::shared_ptr<MediaAVCodec::CodecDrmDecrypt> drmDecryptor_ = nullptr;
184     std::vector<std::shared_ptr<AVBuffer>> inputBufferVector_;
185     std::vector<std::shared_ptr<AVBuffer>> outputBufferVector_;
186     Mutex stateMutex_;
187 };
188 } // namespace Media
189 } // namespace OHOS
190 #endif // MODULES_MEDIA_CODEC_H
191