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 "medialibrary_rdbstore.h"
27 #include "rdb_helper.h"
28 #include "rdb_predicates.h"
29 #include "single_kvstore.h"
30 #include "thumbnail_const.h"
31 #include "thumbnail_data.h"
32 
33 namespace OHOS {
34 namespace Media {
35 #define EXPORT __attribute__ ((visibility ("default")))
36 struct ThumbRdbOpt {
37     EXPORT std::shared_ptr<MediaLibraryRdbStore> store;
38 #ifdef DISTRIBUTED
39     EXPORT std::shared_ptr<DistributedKv::SingleKvStore> kvStore;
40 #endif
41     EXPORT std::shared_ptr<AbilityRuntime::Context> context;
42     EXPORT std::string networkId;
43     EXPORT std::string path;
44     EXPORT std::string table;
45     EXPORT std::string udid;
46     EXPORT std::string row;
47     EXPORT std::string uri;
48     EXPORT std::string dateAdded;
49     EXPORT std::string dateTaken;
50     EXPORT std::string fileUri;
51     EXPORT std::string fileId;
52     EXPORT Size screenSize;
53 };
54 
55 class ThumbnailUtils {
56 public:
57     EXPORT ThumbnailUtils() = delete;
58     EXPORT ~ThumbnailUtils() = delete;
59     // utils
60     EXPORT static bool ResizeImage(const std::vector<uint8_t> &data, const Size &size,
61         std::unique_ptr<PixelMap> &pixelMap);
62     EXPORT static bool CompressImage(std::shared_ptr<PixelMap> &pixelMap, std::vector<uint8_t> &data,
63         bool isHigh = false, bool isAstc = false, bool forceSdr = true);
64     EXPORT static bool CompressPicture(ThumbnailData &data, bool isSourceEx);
65     EXPORT static bool CopyPictureSource(std::shared_ptr<Picture> &picture, std::shared_ptr<Picture> &copySource);
66     EXPORT static bool CleanThumbnailInfo(ThumbRdbOpt &opts, bool withThumb, bool withLcd = false);
67 
68     // RDB Store Query
69     EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryThumbnailInfo(ThumbRdbOpt &opts,
70         ThumbnailData &data, int &err);
71 #ifdef DISTRIBUTED
72     EXPORT static bool QueryRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
73     // KV Store
74     EXPORT static bool RemoveDataFromKv(const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore,
75         const std::string &key);
76     EXPORT static bool IsImageExist(const std::string &key, const std::string &networkId,
77         const std::shared_ptr<DistributedKv::SingleKvStore> &kvStore);
78     EXPORT static bool DeleteDistributeLcdData(ThumbRdbOpt &opts, ThumbnailData &thumbnailData);
79 #endif
80     EXPORT static bool DeleteThumbFile(ThumbnailData &data, ThumbnailType type);
81     EXPORT static bool DeleteThumbExDir(ThumbnailData &data);
82 #ifdef DISTRIBUTED
83     EXPORT static bool DeleteDistributeThumbnailInfo(ThumbRdbOpt &opts);
84 #endif
85 
86     EXPORT static bool DeleteOriginImage(ThumbRdbOpt &opts);
87     EXPORT static bool DoDeleteMonthAndYearAstc(ThumbRdbOpt &opts);
88     // Steps
89     EXPORT static bool LoadSourceImage(ThumbnailData &data);
90     EXPORT static bool GenTargetPixelmap(ThumbnailData &data, const Size &desiredSize);
91 
92     EXPORT static int TrySaveFile(ThumbnailData &Data, ThumbnailType type);
93     EXPORT static bool UpdateLcdInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
94     EXPORT static bool UpdateVisitTime(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
95     EXPORT static bool UpdateLcdReadyStatus(ThumbRdbOpt &opts, ThumbnailData &data, int &err, LcdReady status);
96     EXPORT static bool DoUpdateAstcDateTaken(ThumbRdbOpt &opts, ThumbnailData &data);
97 #ifdef DISTRIBUTED
98     EXPORT static bool DoUpdateRemoteThumbnail(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
99 #endif
100 
101     // RDB Store generate and aging
102     EXPORT static bool QueryLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err);
103     EXPORT static bool QueryDistributeLcdCount(ThumbRdbOpt &opts, int &outLcdCount, int &err);
104     EXPORT static bool QueryAgingLcdInfos(ThumbRdbOpt &opts, int LcdLimit,
105         std::vector<ThumbnailData> &infos, int &err);
106 #ifdef DISTRIBUTED
107     EXPORT static bool QueryAgingDistributeLcdInfos(ThumbRdbOpt &opts, int LcdLimit,
108         std::vector<ThumbnailData> &infos, int &err);
109 #endif
110     EXPORT static bool QueryNoLcdInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
111     EXPORT static bool QueryLocalNoLcdInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
112     EXPORT static bool QueryNoThumbnailInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
113     EXPORT static bool QueryUpgradeThumbnailInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos,
114         bool isWifiConnected, int &err);
115     EXPORT static bool QueryNoAstcInfosRestored(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
116     EXPORT static bool QueryNoAstcInfos(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
117     EXPORT static bool QueryNewThumbnailCount(ThumbRdbOpt &opts, const int64_t &time, int &count, int &err);
118     EXPORT static bool QueryNoAstcInfosOnDemand(ThumbRdbOpt &opts,
119         std::vector<ThumbnailData> &infos, NativeRdb::RdbPredicates &rdbPredicate, int &err);
120 
121 #ifdef DISTRIBUTED
122     EXPORT static bool QueryDeviceThumbnailRecords(ThumbRdbOpt &opts, std::vector<ThumbnailData> &infos, int &err);
123 #endif
124     EXPORT static bool QueryLcdCountByTime(const int64_t &time, const bool &before, ThumbRdbOpt &opts, int &outLcdCount,
125         int &err);
126     EXPORT static bool ResizeThumb(int& width, int& height);
127     EXPORT static bool ResizeLcd(int& width, int& height);
128     EXPORT static bool IsSupportGenAstc();
129     EXPORT static void QueryThumbnailDataFromFileId(ThumbRdbOpt &opts, const std::string &id,
130         ThumbnailData &data, int &err);
131     EXPORT static bool CheckDateTaken(ThumbRdbOpt &opts, ThumbnailData &data);
132     EXPORT static void GetThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &outData);
133     EXPORT static bool ScaleThumbnailFromSource(ThumbnailData &data, bool isSourceEx);
134     EXPORT static bool ScaleTargetPixelMap(std::shared_ptr<PixelMap> &dataSource, const Size &targetSize,
135         const AntiAliasingOption &option);
136     EXPORT static bool CenterScaleEx(std::shared_ptr<PixelMap> &dataSource, const Size &desiredSize,
137         const std::string path);
138     EXPORT static std::string GetThumbnailSuffix(ThumbnailType type);
139 
140     EXPORT static void RecordStartGenerateStats(ThumbnailData::GenerateStats &stats, GenerateScene scene,
141         LoadSourceType sourceType);
142     EXPORT static void RecordCostTimeAndReport(ThumbnailData::GenerateStats &stats);
143 
144     EXPORT static bool GetLocalThumbSize(const ThumbnailData &data, const ThumbnailType& type, Size& size);
145     EXPORT static void SetThumbnailSizeValue(NativeRdb::ValuesBucket& values, Size& size, const std::string& column);
146     EXPORT static bool LoadVideoFile(ThumbnailData &data, Size &desiredSize);
147     EXPORT static bool CheckCloudThumbnailDownloadFinish(const std::shared_ptr<MediaLibraryRdbStore> rdbStorePtr);
148     EXPORT static bool QueryOldKeyAstcInfos(const std::shared_ptr<MediaLibraryRdbStore> rdbStorePtr,
149         const std::string &table, std::vector<ThumbnailData> &infos);
150 
151 private:
152     EXPORT static std::shared_ptr<NativeRdb::ResultSet> QueryThumbnailSet(ThumbRdbOpt &opts);
153     EXPORT static int SaveThumbDataToLocalDir(ThumbnailData &data, const std::string &suffix,
154         uint8_t *output, const int writeSize);
155     EXPORT static int ToSaveFile(ThumbnailData &data, const std::string &fileName,
156         uint8_t *output, const int &writeSize);
157     EXPORT static int SaveFileCreateDir(const std::string &path, const std::string &suffix, std::string &fileName);
158     EXPORT static int32_t SetSource(std::shared_ptr<AVMetadataHelper> avMetadataHelper, const std::string &path);
159     EXPORT static int64_t UTCTimeMilliSeconds();
160     EXPORT static void ParseQueryResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet,
161         ThumbnailData &data, int &err, const std::vector<std::string> &column);
162     EXPORT static void ParseStringResult(const std::shared_ptr<NativeRdb::ResultSet> &resultSet,
163         int index, std::string &data, int &err);
164 
165     EXPORT static bool CheckResultSetCount(const std::shared_ptr<NativeRdb::ResultSet> &resultSet, int &err);
166     // utils
167     EXPORT static bool LoadImageFile(ThumbnailData &data, Size &desiredSize);
168     EXPORT static bool LoadAudioFileInfo(std::shared_ptr<AVMetadataHelper> avMetadataHelper, ThumbnailData &data,
169         Size &desiredSize, uint32_t &errCode);
170     EXPORT static bool LoadAudioFile(ThumbnailData &data, Size &desiredSize);
171     EXPORT static bool ConvertStrToInt32(const std::string &str, int32_t &ret);
172     EXPORT static bool ParseVideoSize(std::shared_ptr<AVMetadataHelper> &avMetadataHelper,
173         int32_t &videoWidth, int32_t &videoHeight);
174 #ifdef DISTRIBUTED
175     // RDB Store
176     EXPORT static bool GetUdidByNetworkId(ThumbRdbOpt &opts, const std::string &networkId,
177         std::string &outUdid, int &err);
178     EXPORT static bool UpdateRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
179     EXPORT static bool InsertRemoteThumbnailInfo(ThumbRdbOpt &opts, ThumbnailData &data, int &err);
180     EXPORT static bool CleanDistributeLcdInfo(ThumbRdbOpt &opts);
181 #endif
182 
183     // scale
184     EXPORT static bool ScaleFastThumb(ThumbnailData &data, const Size &size);
185 
186     EXPORT static int SaveAstcDataToKvStore(ThumbnailData &data, const ThumbnailType &type);
187     EXPORT static bool DeleteAstcDataFromKvStore(ThumbRdbOpt &opts, const ThumbnailType &type);
188     EXPORT static bool UpdateAstcDateTakenFromKvStore(ThumbRdbOpt &opts, const ThumbnailData &data);
189 };
190 } // namespace Media
191 } // namespace OHOS
192 
193 #endif // FRAMEWORKS_SERVICES_THUMBNAIL_SERVICE_INCLUDE_THUMBNAIL_UTILS_H_
194