1 /*
2  * Copyright (C) 2024 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 IMAGE_EFFECT_IMAGE_EFFECT_H
17 #define IMAGE_EFFECT_IMAGE_EFFECT_H
18 
19 #include <vector>
20 #include <mutex>
21 
22 #include "any.h"
23 #include "effect.h"
24 #include "external_window.h"
25 #include "image_type.h"
26 #include "surface.h"
27 #include "pixel_map.h"
28 #include "render_thread.h"
29 #include "image_effect_marco_define.h"
30 #include "picture.h"
31 
32 namespace OHOS {
33 namespace Media {
34 namespace Effect {
35 struct SurfaceBufferInfo {
36     SurfaceBuffer *surfaceBuffer_ = nullptr;
37     int64_t timestamp_ = 0;
38 };
39 
40 struct DataInfo {
41     DataType dataType_ = DataType::UNKNOWN;
42     PixelMap *pixelMap_ = nullptr;
43     SurfaceBufferInfo surfaceBufferInfo_;
44     std::string uri_;
45     std::string path_;
46     Picture *picture_ = nullptr;
47 };
48 
49 class ImageEffect : public Effect {
50 public:
51     IMAGE_EFFECT_EXPORT ImageEffect(const char *name = nullptr);
52     IMAGE_EFFECT_EXPORT ~ImageEffect();
53 
54     IMAGE_EFFECT_EXPORT void AddEFilter(const std::shared_ptr<EFilter> &effect) override;
55 
56     IMAGE_EFFECT_EXPORT ErrorCode InsertEFilter(const std::shared_ptr<EFilter> &efilter, uint32_t index) override;
57 
58     IMAGE_EFFECT_EXPORT void RemoveEFilter(const std::shared_ptr<EFilter> &efilter) override;
59     IMAGE_EFFECT_EXPORT ErrorCode RemoveEFilter(uint32_t index) override;
60 
61     IMAGE_EFFECT_EXPORT ErrorCode ReplaceEFilter(const std::shared_ptr<EFilter> &efilter, uint32_t index) override;
62 
63     IMAGE_EFFECT_EXPORT virtual ErrorCode SetInputPixelMap(PixelMap *pixelMap);
64 
65     IMAGE_EFFECT_EXPORT ErrorCode Start() override;
66 
67     IMAGE_EFFECT_EXPORT ErrorCode Save(EffectJsonPtr &res) override;
68 
69     IMAGE_EFFECT_EXPORT static std::shared_ptr<ImageEffect> Restore(std::string &info);
70 
71     IMAGE_EFFECT_EXPORT virtual ErrorCode SetOutputPixelMap(PixelMap *pixelMap);
72 
73     IMAGE_EFFECT_EXPORT virtual ErrorCode SetOutputSurface(sptr<Surface> &surface);
74 
75     IMAGE_EFFECT_EXPORT virtual ErrorCode SetOutNativeWindow(OHNativeWindow *nativeWindow);
76     IMAGE_EFFECT_EXPORT sptr<Surface> GetInputSurface();
77 
78     IMAGE_EFFECT_EXPORT virtual ErrorCode Configure(const std::string &key, const Plugin::Any &value);
79 
80     IMAGE_EFFECT_EXPORT void Stop();
81 
82     IMAGE_EFFECT_EXPORT ErrorCode SetInputSurfaceBuffer(OHOS::SurfaceBuffer *surfaceBuffer);
83 
84     IMAGE_EFFECT_EXPORT ErrorCode SetOutputSurfaceBuffer(OHOS::SurfaceBuffer *surfaceBuffer);
85 
86     IMAGE_EFFECT_EXPORT ErrorCode SetInputUri(const std::string &uri);
87 
88     IMAGE_EFFECT_EXPORT ErrorCode SetOutputUri(const std::string &uri);
89 
90     IMAGE_EFFECT_EXPORT ErrorCode SetInputPath(const std::string &path);
91 
92     IMAGE_EFFECT_EXPORT ErrorCode SetOutputPath(const std::string &path);
93 
94     IMAGE_EFFECT_EXPORT ErrorCode SetExtraInfo(EffectJsonPtr res);
95 
96     IMAGE_EFFECT_EXPORT ErrorCode SetInputPicture(Picture *picture);
97 
98     IMAGE_EFFECT_EXPORT ErrorCode SetOutputPicture(Picture *picture);
99 
100 protected:
101     IMAGE_EFFECT_EXPORT virtual ErrorCode Render();
102 
103     IMAGE_EFFECT_EXPORT static void ClearDataInfo(DataInfo &dataInfo);
104 
105     IMAGE_EFFECT_EXPORT static ErrorCode ParseDataInfo(DataInfo &dataInfo, std::shared_ptr<EffectBuffer> &effectBuffer,
106         bool isOutputData);
107 
108     DataInfo inDateInfo_;
109     DataInfo outDateInfo_;
110 
111 private:
112     ErrorCode LockAll(std::shared_ptr<EffectBuffer> &srcEffectBuffer, std::shared_ptr<EffectBuffer> &dstEffectBuffer);
113 
114     static void UnLockData(DataInfo &dataInfo);
115 
116     static BufferRequestConfig GetBufferRequestConfig(const sptr<SurfaceBuffer>& buffer);
117 
118     void UnLockAll();
119 
120     void InitEGLEnv();
121 
122     void DestroyEGLEnv();
123 
124     IMAGE_EFFECT_EXPORT
125     bool ConsumerBufferAvailable(sptr<SurfaceBuffer> &inBuffer, sptr<SurfaceBuffer> &outBuffer,
126         const OHOS::Rect &damages, int64_t timestamp);
127     void UpdateProducerSurfaceInfo();
128 
129     void ExtInitModule();
130     void ExtDeinitModule();
131 
132     unsigned long int RequestTaskId();
133 
134     void ConsumerBufferWithGPU(sptr<SurfaceBuffer>& buffer);
135     bool OnBufferAvailableWithCPU(sptr<SurfaceBuffer> &inBuffer, sptr<SurfaceBuffer> &outBuffer,
136         const OHOS::Rect &damages, int64_t timestamp);
137     void CopyMetaData(sptr<SurfaceBuffer>& inBuffer, sptr<SurfaceBuffer>& outBuffer);
138     bool OnBufferAvailableToProcess(sptr<SurfaceBuffer> &inBuffer, sptr<SurfaceBuffer> &outBuffer,
139         int64_t timestamp, bool isNeedRender);
140     void FlushBuffer(sptr<SurfaceBuffer>& flushBuffer, int64_t timestamp, bool isNeedRender);
141 
142     sptr<Surface> toProducerSurface_;   // from ImageEffect to XComponent
143     sptr<Surface> fromProducerSurface_; // to camera hal
144     volatile int32_t imageEffectFlag_ = 0;
145 
146     GraphicTransformType toProducerTransform_ = GRAPHIC_ROTATE_BUTT;
147 
148     // envSupportIpType
149     std::vector<IPType> ipType_ = {
150         { IPType::CPU, IPType::GPU },
151     };
152 
153     std::map<ConfigType, Plugin::Any> config_ = { { ConfigType::IPTYPE, ipType_ } };
154 
155     EffectJsonPtr extraInfo_ = nullptr;
156 
157     std::string name_;
158 
159     class Impl;
160     std::shared_ptr<Impl> impl_;
161     RenderThread<> *m_renderThread{ nullptr };
162     std::atomic_ullong m_currentTaskId{0};
163 
164     std::mutex innerEffectMutex;
165 };
166 } // namespace Effect
167 } // namespace Media
168 } // namespace OHOS
169 #endif // IMAGE_EFFECT_IMAGE_EFFECT_H
170