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