1 /* 2 * Copyright (C) 2022-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 FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_ 17 #define FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_ 18 19 #include <mutex> 20 #include <condition_variable> 21 22 #include "ability_context.h" 23 #include "avmetadatahelper.h" 24 #include "datashare_result_set.h" 25 #include "image_source.h" 26 #include "rdb_helper.h" 27 #include "single_kvstore.h" 28 #include "thumbnail_const.h" 29 30 namespace OHOS { 31 namespace Media { 32 #define EXPORT __attribute__ ((visibility ("default"))) 33 struct ThumbRdbOpt { 34 EXPORT std::shared_ptr<NativeRdb::RdbStore> store; 35 #ifdef DISTRIBUTED 36 EXPORT std::shared_ptr<DistributedKv::SingleKvStore> kvStore; 37 #endif 38 EXPORT std::shared_ptr<AbilityRuntime::Context> context; 39 EXPORT std::string networkId; 40 EXPORT std::string path; 41 EXPORT std::string table; 42 EXPORT std::string udid; 43 EXPORT std::string row; 44 EXPORT std::string uri; 45 EXPORT std::string dateAdded; 46 EXPORT std::string fileUri; 47 EXPORT Size screenSize; 48 }; 49 50 struct ThumbnailData { ThumbnailDataThumbnailData51 EXPORT ThumbnailData() {} ~ThumbnailDataThumbnailData52 EXPORT virtual ~ThumbnailData() 53 { 54 source = nullptr; 55 thumbnail.clear(); 56 lcd.clear(); 57 monthAstc.clear(); 58 yearAstc.clear(); 59 } 60 61 EXPORT int mediaType {-1}; 62 EXPORT int64_t dateModified {0}; 63 EXPORT float degrees; 64 EXPORT bool isThumbAdded {false}; 65 EXPORT std::shared_ptr<PixelMap> source; 66 EXPORT std::vector<uint8_t> thumbnail; 67 EXPORT std::vector<uint8_t> thumbAstc; 68 EXPORT std::vector<uint8_t> monthAstc; 69 EXPORT std::vector<uint8_t> yearAstc; 70 EXPORT std::vector<uint8_t> lcd; 71 EXPORT std::string dateAdded; 72 EXPORT std::string displayName; 73 EXPORT std::string fileUri; 74 EXPORT std::string id; 75 EXPORT std::string cloudId; 76 EXPORT std::string udid; 77 EXPORT std::string path; 78 EXPORT std::string thumbnailKey; 79 EXPORT std::string lcdKey; 80 }; 81 82 class ThumbnailUtils { 83 public: 84 EXPORT ThumbnailUtils() = delete; 85 EXPORT ~ThumbnailUtils() = delete; 86 // utils 87 EXPORT static bool ResizeImage(const std::vector<uint8_t> &data, const Size &size, 88 std::unique_ptr<PixelMap> &pixelMap); 89 EXPORT static bool CompressImage(std::shared_ptr<PixelMap> &pixelMap, std::vector<uint8_t> &data, 90 bool isHigh = false, std::shared_ptr<std::string> pathPtr = nullptr, bool isAstc = false); 91 EXPORT static bool CleanThumbnailInfo(ThumbRdbOpt &opts, bool withThumb, bool withLcd = false); 92 93 // RDB Store Query 94 EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryThumbnailInfo(ThumbRdbOpt &opts, 95 ThumbnailData &data, int &err); 96 #ifdef DISTRIBUTED 97 static bool QueryRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 98 // KV Store 99 static bool RemoveDataFromKv(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore, const std::string &key); 100 static bool IsImageExist(const std::string &key, const std::string &networkId, 101 const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore); 102 static bool DeleteDistributeLcdData(ThumbRdbOpt &opts, ThumbnailData &thumbnailData); 103 #endif 104 static bool DeleteThumbFile(ThumbnailData &data, ThumbnailType type); 105 #ifdef DISTRIBUTED 106 static bool DeleteDistributeThumbnailInfo(ThumbRdbOpt &opts); 107 #endif 108 109 EXPORT static bool DeleteOriginImage(ThumbRdbOpt &opts); 110 // Steps 111 EXPORT static bool LoadSourceImage(ThumbnailData &data, const bool isThumbnail = true, 112 const std::string &targetPath = ""); 113 static bool GenTargetPixelmap(ThumbnailData &data, const Size &desiredSize); 114 115 static int TrySaveFile(ThumbnailData &Data, ThumbnailType type); 116 EXPORT static bool UpdateLcdInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 117 EXPORT static bool UpdateVisitTime(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 118 #ifdef DISTRIBUTED 119 static bool DoUpdateRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 120 #endif 121 122 // RDB Store generate and aging 123 EXPORT static bool QueryLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err); 124 EXPORT static bool QueryDistributeLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err); 125 EXPORT static bool QueryAgingLcdInfos(ThumbRdbOpt &opts, int LcdLimit, 126 std::vector<ThumbnailData> &infos, int &err); 127 #ifdef DISTRIBUTED 128 static bool QueryAgingDistributeLcdInfos(ThumbRdbOpt &opts, int LcdLimit, 129 std::vector<ThumbnailData> &infos, int &err); 130 #endif 131 EXPORT static bool QueryNoLcdInfos(ThumbRdbOpt &opts, int LcdLimit, std::vector<ThumbnailData> &infos, int &err); 132 EXPORT static bool QueryNoThumbnailInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err); 133 static bool QueryNoAstcInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err); 134 static bool QueryNewThumbnailCount(ThumbRdbOpt &opts, const int64_t &time, int &count, int &err); 135 #ifdef DISTRIBUTED 136 static bool QueryDeviceThumbnailRecords(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err); 137 #endif 138 static bool QueryLcdCountByTime(const int64_t &time, const bool &before, ThumbRdbOpt &opts, int &outLcdCount, 139 int &err); 140 EXPORT static bool ResizeThumb(int& width, int& height); 141 EXPORT static bool ResizeLcd(int& width, int& height); 142 static bool IsSupportGenAstc(); 143 EXPORT static void QueryThumbnailDataFromFileId(ThumbRdbOpt &opts, const std::string &id, 144 ThumbnailData &data, int &err); 145 static bool CheckDateAdded(ThumbRdbOpt &opts, ThumbnailData &data); 146 147 private: 148 EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryThumbnailSet(ThumbRdbOpt &opts); 149 static int SaveThumbDataToLocalDir(ThumbnailData &data, 150 const ThumbnailType &type, const std::string &suffix, uint8_t *output, const int writeSize); 151 static int ToSaveFile(ThumbnailData &data, const ThumbnailType &type, const std::string &fileName, 152 uint8_t *output, const int &writeSize); 153 static int SaveFileCreateDir(const std::string &path, const std::string &suffix, std::string &fileName); 154 EXPORT static int32_t SetSource(std::shared_ptr<AVMetadataHelper> avMetadataHelper, const std::string &path); 155 EXPORT static int64_t UTCTimeMilliSeconds(); 156 EXPORT static void ParseQueryResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, 157 ThumbnailData &data, int &err); 158 EXPORT static void ParseStringResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, 159 int index, std::string &data, int &err); 160 161 EXPORT static bool CheckResultSetCount(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, int &err); 162 // utils 163 static Size ConvertDecodeSize(const Size &sourceSize, Size &desiredSize, const bool isThumbnail); 164 EXPORT static bool ScaleTargetPixelMap(ThumbnailData &data, const Size &targetSize); 165 EXPORT static bool LoadImageFile(ThumbnailData &data, const bool isThumbnail, Size &desiredSize, 166 const std::string &targetPath); 167 EXPORT static bool LoadVideoFile(ThumbnailData &data, const bool isThumbnail, Size &desiredSize); 168 static bool LoadAudioFileInfo(std::shared_ptr<AVMetadataHelper> avMetadataHelper, ThumbnailData &data, 169 const bool isThumbnail, Size &desiredSize, uint32_t &errCode); 170 EXPORT static bool LoadAudioFile(ThumbnailData &data, const bool isThumbnail, Size &desiredSize); 171 172 #ifdef DISTRIBUTED 173 // RDB Store 174 static bool GetUdidByNetworkId(ThumbRdbOpt &opts, const std::string &networkId, 175 std::string &outUdid, int &err); 176 static bool UpdateRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 177 static bool InsertRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err); 178 static bool CleanDistributeLcdInfo(ThumbRdbOpt &opts); 179 #endif 180 181 // scale 182 static bool ScaleFastThumb(ThumbnailData &data, const Size &size); 183 184 static int SaveAstcDataToKvStore(ThumbnailData &data, const ThumbnailType &type); 185 static bool GenerateKvStoreKey(const std::string &fieldId, const std::string &dateAdded, std::string &key); 186 }; 187 } // namespace Media 188 } // namespace OHOS 189 190 #endif // FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_ 191