/* * Copyright (c) 2023-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MODULES_MEDIA_CODEC_H #define MODULES_MEDIA_CODEC_H #include #include "surface.h" #include "meta/meta.h" #include "buffer/avbuffer.h" #include "buffer/avallocator.h" #include "buffer/avbuffer_queue.h" #include "buffer/avbuffer_queue_producer.h" #include "buffer/avbuffer_queue_consumer.h" #include "common/status.h" #include "plugin/plugin_event.h" #include "plugin/codec_plugin.h" #include "osal/task/mutex.h" #include "foundation/multimedia/drm_framework/services/drm_service/ipc/i_keysession_service.h" #include "foundation/multimedia/av_codec/services/drm_decryptor/codec_drm_decrypt.h" namespace OHOS { namespace Media { enum class CodecState : int32_t { UNINITIALIZED, INITIALIZED, CONFIGURED, PREPARED, RUNNING, FLUSHED, END_OF_STREAM, INITIALIZING, // RELEASED -> INITIALIZED STARTING, // INITIALIZED -> RUNNING STOPPING, // RUNNING -> INITIALIZED FLUSHING, // RUNNING -> FLUSHED RESUMING, // FLUSHED -> RUNNING RELEASING, // {ANY EXCEPT RELEASED} -> RELEASED ERROR, }; enum class CodecErrorType : int32_t { CODEC_ERROR_INTERNAL, CODEC_DRM_DECRYTION_FAILED, CODEC_ERROR_EXTEND_START = 0X10000, }; class CodecCallback { public: virtual ~CodecCallback() = default; virtual void OnError(CodecErrorType errorType, int32_t errorCode) = 0; virtual void OnOutputFormatChanged(const std::shared_ptr &format) = 0; }; class AudioBaseCodecCallback { public: virtual ~AudioBaseCodecCallback() = default; virtual void OnError(CodecErrorType errorType, int32_t errorCode) = 0; virtual void OnOutputBufferDone(const std::shared_ptr &outputBuffer) = 0; virtual void OnOutputFormatChanged(const std::shared_ptr &format) = 0; }; class MediaCodec : public Plugins::DataCallback { public: MediaCodec(); ~MediaCodec() override; int32_t Init(const std::string &mime, bool isEncoder); int32_t Init(const std::string &name); int32_t Configure(const std::shared_ptr &meta); int32_t SetOutputBufferQueue(const sptr &bufferQueueProducer); int32_t SetCodecCallback(const std::shared_ptr &codecCallback); int32_t SetCodecCallback(const std::shared_ptr &codecCallback); int32_t SetOutputSurface(sptr surface); int32_t Prepare(); sptr GetInputBufferQueue(); sptr GetInputSurface(); int32_t Start(); int32_t Stop(); int32_t Flush(); int32_t Reset(); int32_t Release(); int32_t NotifyEos(); int32_t SetParameter(const std::shared_ptr ¶meter); int32_t GetOutputFormat(std::shared_ptr ¶meter); void ProcessInputBuffer(); void SetDumpInfo(bool isDump, uint64_t instanceId); int32_t SetAudioDecryptionConfig(const sptr &keySession, const bool svpFlag); Status ChangePlugin(const std::string &mime, bool isEncoder, const std::shared_ptr &meta); void OnDumpInfo(int32_t fd); private: std::shared_ptr CreatePlugin(Plugins::PluginType pluginType); std::shared_ptr CreatePlugin(const std::string &mime, Plugins::PluginType pluginType); Status AttachBufffer(); Status AttachDrmBufffer(std::shared_ptr &drmInbuf, std::shared_ptr &drmOutbuf, uint32_t size); Status DrmAudioCencDecrypt(std::shared_ptr &filledInputBuffer); Status HandleOutputBuffer(uint32_t eosStatus); int32_t PrepareInputBufferQueue(); int32_t PrepareOutputBufferQueue(); void OnInputBufferDone(const std::shared_ptr &inputBuffer) override; void OnOutputBufferDone(const std::shared_ptr &outputBuffer) override; void OnEvent(const std::shared_ptr event) override; std::string StateToString(CodecState state); void ClearBufferQueue(); void ClearInputBuffer(); void HandleAudioCencDecryptError(); uint32_t GetApiVersion(); private: std::shared_ptr codecPlugin_; std::shared_ptr inputBufferQueue_; sptr inputBufferQueueProducer_; sptr inputBufferQueueConsumer_; sptr outputBufferQueueProducer_; std::weak_ptr codecCallback_; // callback from north interface(AudioCodec..) std::weak_ptr mediaCodecCallback_; AVBufferConfig outputBufferConfig_; bool isEncoder_; bool isSurfaceMode_; bool isBufferMode_; bool isDump_ = false; bool isSupportAudioFormatChanged_ = true; std::string dumpPrefix_ = ""; int32_t outputBufferCapacity_; std::string codecPluginName_; std::atomic state_; std::shared_ptr drmDecryptor_ = nullptr; std::vector> inputBufferVector_; std::vector> outputBufferVector_; Mutex stateMutex_; }; } // namespace Media } // namespace OHOS #endif // MODULES_MEDIA_CODEC_H