1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd.
3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License.
5da853ecaSopenharmony_ci * You may obtain a copy of the License at
6da853ecaSopenharmony_ci *
7da853ecaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8da853ecaSopenharmony_ci *
9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and
13da853ecaSopenharmony_ci * limitations under the License.
14da853ecaSopenharmony_ci */
15da853ecaSopenharmony_ci
16da853ecaSopenharmony_ci#ifndef CODEC_SERVER_H
17da853ecaSopenharmony_ci#define CODEC_SERVER_H
18da853ecaSopenharmony_ci
19da853ecaSopenharmony_ci#include <atomic>
20da853ecaSopenharmony_ci#include <shared_mutex>
21da853ecaSopenharmony_ci#include <unordered_map>
22da853ecaSopenharmony_ci#include "avcodec_sysevent.h"
23da853ecaSopenharmony_ci#include "codecbase.h"
24da853ecaSopenharmony_ci#include "i_codec_service.h"
25da853ecaSopenharmony_ci#include "nocopyable.h"
26da853ecaSopenharmony_ci#include "codec_drm_decrypt.h"
27da853ecaSopenharmony_ci#include "temporal_scalability.h"
28da853ecaSopenharmony_ci#include "task_thread.h"
29da853ecaSopenharmony_ci#include "codec_param_checker.h"
30da853ecaSopenharmony_ci#include "lock_free_queue.h"
31da853ecaSopenharmony_ci#include "post_processing.h"
32da853ecaSopenharmony_ci
33da853ecaSopenharmony_cinamespace OHOS {
34da853ecaSopenharmony_cinamespace MediaAVCodec {
35da853ecaSopenharmony_ciclass CodecServer : public std::enable_shared_from_this<CodecServer>, public ICodecService, public NoCopyable {
36da853ecaSopenharmony_cipublic:
37da853ecaSopenharmony_ci    static std::shared_ptr<ICodecService> Create();
38da853ecaSopenharmony_ci    CodecServer();
39da853ecaSopenharmony_ci    virtual ~CodecServer();
40da853ecaSopenharmony_ci
41da853ecaSopenharmony_ci    enum CodecStatus {
42da853ecaSopenharmony_ci        UNINITIALIZED = 0,
43da853ecaSopenharmony_ci        INITIALIZED,
44da853ecaSopenharmony_ci        CONFIGURED,
45da853ecaSopenharmony_ci        RUNNING,
46da853ecaSopenharmony_ci        FLUSHED,
47da853ecaSopenharmony_ci        END_OF_STREAM,
48da853ecaSopenharmony_ci        ERROR,
49da853ecaSopenharmony_ci    };
50da853ecaSopenharmony_ci
51da853ecaSopenharmony_ci    typedef struct {
52da853ecaSopenharmony_ci        std::shared_ptr<AVBuffer> inBuf;
53da853ecaSopenharmony_ci        std::shared_ptr<AVBuffer> outBuf;
54da853ecaSopenharmony_ci    } DrmDecryptVideoBuf;
55da853ecaSopenharmony_ci
56da853ecaSopenharmony_ci    int32_t Init(AVCodecType type, bool isMimeType, const std::string &name,
57da853ecaSopenharmony_ci                 Meta &callerInfo, API_VERSION apiVersion = API_VERSION::API_VERSION_10) override;
58da853ecaSopenharmony_ci    int32_t Configure(const Format &format) override;
59da853ecaSopenharmony_ci    int32_t Start() override;
60da853ecaSopenharmony_ci    int32_t Stop() override;
61da853ecaSopenharmony_ci    int32_t Flush() override;
62da853ecaSopenharmony_ci    int32_t Reset() override;
63da853ecaSopenharmony_ci    int32_t Release() override;
64da853ecaSopenharmony_ci    int32_t NotifyEos() override;
65da853ecaSopenharmony_ci    sptr<Surface> CreateInputSurface() override;
66da853ecaSopenharmony_ci    int32_t SetInputSurface(sptr<Surface> surface);
67da853ecaSopenharmony_ci    int32_t SetOutputSurface(sptr<Surface> surface) override;
68da853ecaSopenharmony_ci    int32_t QueueInputBuffer(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag) override;
69da853ecaSopenharmony_ci    int32_t QueueInputBuffer(uint32_t index) override;
70da853ecaSopenharmony_ci    int32_t QueueInputParameter(uint32_t index) override;
71da853ecaSopenharmony_ci    int32_t GetOutputFormat(Format &format) override;
72da853ecaSopenharmony_ci    int32_t ReleaseOutputBuffer(uint32_t index, bool render) override;
73da853ecaSopenharmony_ci    int32_t RenderOutputBufferAtTime(uint32_t index, int64_t renderTimestampNs) override;
74da853ecaSopenharmony_ci    int32_t SetParameter(const Format &format) override;
75da853ecaSopenharmony_ci    int32_t SetCallback(const std::shared_ptr<AVCodecCallback> &callback) override;
76da853ecaSopenharmony_ci    int32_t SetCallback(const std::shared_ptr<MediaCodecCallback> &callback) override;
77da853ecaSopenharmony_ci    int32_t SetCallback(const std::shared_ptr<MediaCodecParameterCallback> &callback) override;
78da853ecaSopenharmony_ci    int32_t SetCallback(const std::shared_ptr<MediaCodecParameterWithAttrCallback> &callback) override;
79da853ecaSopenharmony_ci    int32_t GetInputFormat(Format &format) override;
80da853ecaSopenharmony_ci#ifdef SUPPORT_DRM
81da853ecaSopenharmony_ci    int32_t SetDecryptConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession,
82da853ecaSopenharmony_ci        const bool svpFlag) override;
83da853ecaSopenharmony_ci#endif
84da853ecaSopenharmony_ci    int32_t SetCustomBuffer(std::shared_ptr<AVBuffer> buffer) override;
85da853ecaSopenharmony_ci    int32_t DumpInfo(int32_t fd);
86da853ecaSopenharmony_ci    void SetCallerInfo(const Meta &callerInfo);
87da853ecaSopenharmony_ci
88da853ecaSopenharmony_ci    void OnError(int32_t errorType, int32_t errorCode);
89da853ecaSopenharmony_ci    void OnOutputFormatChanged(const Format &format);
90da853ecaSopenharmony_ci    void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVSharedMemory> buffer);
91da853ecaSopenharmony_ci    void OnOutputBufferAvailable(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag,
92da853ecaSopenharmony_ci                                 std::shared_ptr<AVSharedMemory> buffer);
93da853ecaSopenharmony_ci
94da853ecaSopenharmony_ci    void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer);
95da853ecaSopenharmony_ci    void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer);
96da853ecaSopenharmony_ci
97da853ecaSopenharmony_ci    int32_t Configure(const std::shared_ptr<Media::Meta> &meta) override;
98da853ecaSopenharmony_ci    int32_t SetParameter(const std::shared_ptr<Media::Meta> &parameter) override;
99da853ecaSopenharmony_ci    int32_t GetOutputFormat(std::shared_ptr<Media::Meta> &parameter) override;
100da853ecaSopenharmony_ci
101da853ecaSopenharmony_ci    int32_t SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer) override;
102da853ecaSopenharmony_ci    int32_t Prepare() override;
103da853ecaSopenharmony_ci    sptr<Media::AVBufferQueueProducer> GetInputBufferQueue() override;
104da853ecaSopenharmony_ci    void ProcessInputBuffer() override;
105da853ecaSopenharmony_ci    bool CheckRunning() override;
106da853ecaSopenharmony_ci
107da853ecaSopenharmony_ci    // post processing callback
108da853ecaSopenharmony_ci    void PostProcessingOnError(int32_t errorCode);
109da853ecaSopenharmony_ci    void PostProcessingOnOutputBufferAvailable(uint32_t index, [[maybe_unused]] int32_t flag);
110da853ecaSopenharmony_ci    void PostProcessingOnOutputFormatChanged(const Format &format);
111da853ecaSopenharmony_ci
112da853ecaSopenharmony_ci#ifdef SUPPORT_DRM
113da853ecaSopenharmony_ci    int32_t SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession,
114da853ecaSopenharmony_ci        const bool svpFlag) override;
115da853ecaSopenharmony_ci#endif
116da853ecaSopenharmony_ci
117da853ecaSopenharmony_ciprivate:
118da853ecaSopenharmony_ci    int32_t InitByName(Meta &callerInfo, API_VERSION apiVersion);
119da853ecaSopenharmony_ci    int32_t InitByMime(Meta &callerInfo, API_VERSION apiVersion);
120da853ecaSopenharmony_ci    int32_t InitServer();
121da853ecaSopenharmony_ci    int32_t CodecScenarioInit(Format &config);
122da853ecaSopenharmony_ci    void StartInputParamTask();
123da853ecaSopenharmony_ci    void ExitProcessor();
124da853ecaSopenharmony_ci    const std::string &GetStatusDescription(OHOS::MediaAVCodec::CodecServer::CodecStatus status);
125da853ecaSopenharmony_ci    void StatusChanged(CodecStatus newStatus);
126da853ecaSopenharmony_ci    int32_t GetCodecDfxInfo(CodecDfxInfo &codecDfxInfo);
127da853ecaSopenharmony_ci    int32_t DrmVideoCencDecrypt(uint32_t index);
128da853ecaSopenharmony_ci    int32_t CheckDrmSvpConsistency(const sptr<DrmStandard::IMediaKeySessionService> &keySession, bool svpFlag);
129da853ecaSopenharmony_ci    void SetFreeStatus(bool isFree);
130da853ecaSopenharmony_ci    int32_t QueueInputBufferIn(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag);
131da853ecaSopenharmony_ci    int32_t ReleaseOutputBufferOfCodec(uint32_t index, bool render);
132da853ecaSopenharmony_ci    int32_t ParamCheck(Format &config);
133da853ecaSopenharmony_ci
134da853ecaSopenharmony_ci    CodecStatus status_ = UNINITIALIZED;
135da853ecaSopenharmony_ci
136da853ecaSopenharmony_ci    std::shared_ptr<CodecBase> codecBase_;
137da853ecaSopenharmony_ci    std::shared_ptr<AVCodecCallback> codecCb_;
138da853ecaSopenharmony_ci    std::shared_ptr<MediaCodecCallback> videoCb_;
139da853ecaSopenharmony_ci    std::shared_mutex mutex_;
140da853ecaSopenharmony_ci    std::shared_mutex cbMutex_;
141da853ecaSopenharmony_ci    std::string lastErrMsg_;
142da853ecaSopenharmony_ci    std::string codecName_;
143da853ecaSopenharmony_ci    AVCodecType codecType_ = AVCODEC_TYPE_NONE;
144da853ecaSopenharmony_ci    struct CallerInfo {
145da853ecaSopenharmony_ci        pid_t pid = -1;
146da853ecaSopenharmony_ci        uid_t uid = 0;
147da853ecaSopenharmony_ci        std::string processName;
148da853ecaSopenharmony_ci    } caller_, forwardCaller_;
149da853ecaSopenharmony_ci    bool isSurfaceMode_ = false;
150da853ecaSopenharmony_ci    bool isModeConfirmed_ = false;
151da853ecaSopenharmony_ci    bool isCreateSurface_ = false;
152da853ecaSopenharmony_ci    bool isSetParameterCb_ = false;
153da853ecaSopenharmony_ci    std::shared_ptr<TemporalScalability> temporalScalability_ = nullptr;
154da853ecaSopenharmony_ci    std::shared_ptr<CodecDrmDecrypt> drmDecryptor_ = nullptr;
155da853ecaSopenharmony_ci    std::unordered_map<uint32_t, DrmDecryptVideoBuf> decryptVideoBufs_;
156da853ecaSopenharmony_ci    std::shared_mutex freeMutex_;
157da853ecaSopenharmony_ci    bool isFree_ = false;
158da853ecaSopenharmony_ci    std::shared_ptr<TaskThread> inputParamTask_ = nullptr;
159da853ecaSopenharmony_ci    CodecScenario scenario_ = CodecScenario::CODEC_SCENARIO_ENC_NORMAL;
160da853ecaSopenharmony_ci
161da853ecaSopenharmony_ci    // post processing, video decoder and surface mode only
162da853ecaSopenharmony_ci    int32_t SetCallbackForPostProcessing();
163da853ecaSopenharmony_ci    void ClearCallbackForPostProcessing();
164da853ecaSopenharmony_ci    int32_t CreatePostProcessing(const Format& format);
165da853ecaSopenharmony_ci    int32_t SetOutputSurfaceForPostProcessing(sptr<Surface> surface);
166da853ecaSopenharmony_ci    int32_t PreparePostProcessing();
167da853ecaSopenharmony_ci    int32_t StartPostProcessing();
168da853ecaSopenharmony_ci    int32_t StopPostProcessing();
169da853ecaSopenharmony_ci    int32_t FlushPostProcessing();
170da853ecaSopenharmony_ci    int32_t ResetPostProcessing();
171da853ecaSopenharmony_ci    int32_t ReleasePostProcessing();
172da853ecaSopenharmony_ci    int32_t GetPostProcessingOutputFormat(Format& format);
173da853ecaSopenharmony_ci    int32_t ReleaseOutputBufferOfPostProcessing(uint32_t index, bool render);
174da853ecaSopenharmony_ci    int32_t PushDecodedBufferInfo(uint32_t index, std::shared_ptr<AVBuffer> buffer);
175da853ecaSopenharmony_ci    int32_t StartPostProcessingTask();
176da853ecaSopenharmony_ci    void PostProcessingTask();
177da853ecaSopenharmony_ci    void DeactivatePostProcessingQueue();
178da853ecaSopenharmony_ci    void CleanPostProcessingResource();
179da853ecaSopenharmony_ci    using PostProcessingType = PostProcessing::DynamicPostProcessing;
180da853ecaSopenharmony_ci    std::unique_ptr<PostProcessingType> postProcessing_{nullptr};
181da853ecaSopenharmony_ci    void* postProcessingUserData_{nullptr};
182da853ecaSopenharmony_ci    PostProcessing::Callback postProcessingCallback_;
183da853ecaSopenharmony_ci    static constexpr size_t decodedBufferInfoQueueSize_{8};
184da853ecaSopenharmony_ci    struct DecodedBufferInfo {
185da853ecaSopenharmony_ci        uint32_t index;
186da853ecaSopenharmony_ci        std::shared_ptr<AVBuffer> buffer;
187da853ecaSopenharmony_ci    };
188da853ecaSopenharmony_ci    using DecodedBufferInfoQueue = LockFreeQueue<std::shared_ptr<DecodedBufferInfo>, decodedBufferInfoQueueSize_>;
189da853ecaSopenharmony_ci    std::shared_ptr<DecodedBufferInfoQueue> decodedBufferInfoQueue_{nullptr};
190da853ecaSopenharmony_ci    std::shared_ptr<DecodedBufferInfoQueue> postProcessingInputBufferInfoQueue_{nullptr};
191da853ecaSopenharmony_ci    std::shared_ptr<DecodedBufferInfoQueue> postProcessingOutputBufferInfoQueue_{nullptr};
192da853ecaSopenharmony_ci    std::unique_ptr<TaskThread> postProcessingTask_{nullptr};
193da853ecaSopenharmony_ci    Format outputFormatChanged_;
194da853ecaSopenharmony_ci    std::atomic<uint64_t> decodedFrameCount_{0};
195da853ecaSopenharmony_ci    std::atomic<uint64_t> processedFrameCount_{0};
196da853ecaSopenharmony_ci    std::atomic<bool> decoderIsEOS_{false};
197da853ecaSopenharmony_ci};
198da853ecaSopenharmony_ci
199da853ecaSopenharmony_ciclass CodecBaseCallback : public AVCodecCallback, public NoCopyable {
200da853ecaSopenharmony_cipublic:
201da853ecaSopenharmony_ci    explicit CodecBaseCallback(const std::shared_ptr<CodecServer> &codec);
202da853ecaSopenharmony_ci    virtual ~CodecBaseCallback();
203da853ecaSopenharmony_ci
204da853ecaSopenharmony_ci    void OnError(AVCodecErrorType errorType, int32_t errorCode) override;
205da853ecaSopenharmony_ci    void OnOutputFormatChanged(const Format &format) override;
206da853ecaSopenharmony_ci    void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVSharedMemory> buffer) override;
207da853ecaSopenharmony_ci    void OnOutputBufferAvailable(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag,
208da853ecaSopenharmony_ci                                 std::shared_ptr<AVSharedMemory> buffer) override;
209da853ecaSopenharmony_ci
210da853ecaSopenharmony_ciprivate:
211da853ecaSopenharmony_ci    std::shared_ptr<CodecServer> codec_ = nullptr;
212da853ecaSopenharmony_ci};
213da853ecaSopenharmony_ci
214da853ecaSopenharmony_ciclass VCodecBaseCallback : public MediaCodecCallback, public NoCopyable {
215da853ecaSopenharmony_cipublic:
216da853ecaSopenharmony_ci    explicit VCodecBaseCallback(const std::shared_ptr<CodecServer> &codec);
217da853ecaSopenharmony_ci    virtual ~VCodecBaseCallback();
218da853ecaSopenharmony_ci
219da853ecaSopenharmony_ci    void OnError(AVCodecErrorType errorType, int32_t errorCode) override;
220da853ecaSopenharmony_ci    void OnOutputFormatChanged(const Format &format) override;
221da853ecaSopenharmony_ci    void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override;
222da853ecaSopenharmony_ci    void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override;
223da853ecaSopenharmony_ci
224da853ecaSopenharmony_ciprivate:
225da853ecaSopenharmony_ci    std::shared_ptr<CodecServer> codec_ = nullptr;
226da853ecaSopenharmony_ci};
227da853ecaSopenharmony_ci} // namespace MediaAVCodec
228da853ecaSopenharmony_ci} // namespace OHOS
229da853ecaSopenharmony_ci#endif // CODEC_SERVER_H