176fd607bSopenharmony_ci/* 276fd607bSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 376fd607bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 476fd607bSopenharmony_ci * you may not use this file except in compliance with the License. 576fd607bSopenharmony_ci * You may obtain a copy of the License at 676fd607bSopenharmony_ci * 776fd607bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 876fd607bSopenharmony_ci * 976fd607bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1076fd607bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1176fd607bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1276fd607bSopenharmony_ci * See the License for the specific language governing permissions and 1376fd607bSopenharmony_ci * limitations under the License. 1476fd607bSopenharmony_ci */ 1576fd607bSopenharmony_ci 1676fd607bSopenharmony_ci#ifndef INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_THUMBNAIL_MANAGER_H 1776fd607bSopenharmony_ci#define INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_THUMBNAIL_MANAGER_H 1876fd607bSopenharmony_ci 1976fd607bSopenharmony_ci#include <condition_variable> 2076fd607bSopenharmony_ci#include <list> 2176fd607bSopenharmony_ci#include <memory> 2276fd607bSopenharmony_ci#include <mutex> 2376fd607bSopenharmony_ci#include <string> 2476fd607bSopenharmony_ci#include <thread> 2576fd607bSopenharmony_ci 2676fd607bSopenharmony_ci#include "image_type.h" 2776fd607bSopenharmony_ci#include "napi/native_api.h" 2876fd607bSopenharmony_ci#include "nocopyable.h" 2976fd607bSopenharmony_ci#include "safe_map.h" 3076fd607bSopenharmony_ci#include "safe_queue.h" 3176fd607bSopenharmony_ci#include "pixel_map.h" 3276fd607bSopenharmony_ci#include "unique_fd.h" 3376fd607bSopenharmony_ci#include "userfile_manager_types.h" 3476fd607bSopenharmony_ci 3576fd607bSopenharmony_cinamespace OHOS { 3676fd607bSopenharmony_cinamespace Media { 3776fd607bSopenharmony_ci#define EXPORT __attribute__ ((visibility ("default"))) 3876fd607bSopenharmony_ci 3976fd607bSopenharmony_ciclass ThumbnailRequest; 4076fd607bSopenharmony_ciclass ThumbnailManager; 4176fd607bSopenharmony_ciusing RequestSharedPtr = std::shared_ptr<ThumbnailRequest>; 4276fd607bSopenharmony_ciusing PixelMapPtr = std::unique_ptr<PixelMap>; 4376fd607bSopenharmony_ci 4476fd607bSopenharmony_cienum class ThumbnailStatus : int32_t { 4576fd607bSopenharmony_ci THUMB_INITIAL = 0, 4676fd607bSopenharmony_ci THUMB_FAST, 4776fd607bSopenharmony_ci THUMB_QUALITY, 4876fd607bSopenharmony_ci THUMB_REMOVE, 4976fd607bSopenharmony_ci}; 5076fd607bSopenharmony_ci 5176fd607bSopenharmony_cistruct RequestPhotoParams { 5276fd607bSopenharmony_ci std::string uri; 5376fd607bSopenharmony_ci std::string path; 5476fd607bSopenharmony_ci Size size; 5576fd607bSopenharmony_ci RequestPhotoType type; 5676fd607bSopenharmony_ci}; 5776fd607bSopenharmony_ci 5876fd607bSopenharmony_ciclass ThumbnailCallback { 5976fd607bSopenharmony_cipublic: 6076fd607bSopenharmony_ci ThumbnailCallback(napi_env env, napi_ref callback) : env_(env), callBackRef_(callback) 6176fd607bSopenharmony_ci { } 6276fd607bSopenharmony_ci virtual ~ThumbnailCallback() = default; 6376fd607bSopenharmony_ci napi_env env_; 6476fd607bSopenharmony_ci napi_ref callBackRef_; 6576fd607bSopenharmony_ci}; 6676fd607bSopenharmony_ci 6776fd607bSopenharmony_ciclass ThumnailUv { 6876fd607bSopenharmony_cipublic: 6976fd607bSopenharmony_ci ThumnailUv(const RequestSharedPtr &request, ThumbnailManager *manager) : request_(request), 7076fd607bSopenharmony_ci manager_(manager) {} 7176fd607bSopenharmony_ci RequestSharedPtr request_; 7276fd607bSopenharmony_ci ThumbnailManager *manager_; 7376fd607bSopenharmony_ci}; 7476fd607bSopenharmony_ci 7576fd607bSopenharmony_ciclass ThumbnailRequest { 7676fd607bSopenharmony_cipublic: 7776fd607bSopenharmony_ci explicit ThumbnailRequest(const RequestPhotoParams ¶ms, napi_env env, napi_ref callback); 7876fd607bSopenharmony_ci virtual ~ThumbnailRequest(); 7976fd607bSopenharmony_ci bool UpdateStatus(ThumbnailStatus status); 8076fd607bSopenharmony_ci void ReleaseCallbackRef(); 8176fd607bSopenharmony_ci ThumbnailStatus GetStatus(); 8276fd607bSopenharmony_ci bool NeedContinue(); 8376fd607bSopenharmony_ci 8476fd607bSopenharmony_ci std::string GetUri() const 8576fd607bSopenharmony_ci { 8676fd607bSopenharmony_ci return uri_; 8776fd607bSopenharmony_ci } 8876fd607bSopenharmony_ci 8976fd607bSopenharmony_ci std::string GetPath() const 9076fd607bSopenharmony_ci { 9176fd607bSopenharmony_ci return path_; 9276fd607bSopenharmony_ci } 9376fd607bSopenharmony_ci 9476fd607bSopenharmony_ci Size GetRequestSize() const 9576fd607bSopenharmony_ci { 9676fd607bSopenharmony_ci return requestSize_; 9776fd607bSopenharmony_ci } 9876fd607bSopenharmony_ci 9976fd607bSopenharmony_ci PixelMapPtr GetPixelMap() 10076fd607bSopenharmony_ci { 10176fd607bSopenharmony_ci return std::move(pixelMap); 10276fd607bSopenharmony_ci } 10376fd607bSopenharmony_ci 10476fd607bSopenharmony_ci void SetPixelMap(PixelMapPtr ptr) 10576fd607bSopenharmony_ci { 10676fd607bSopenharmony_ci pixelMap = std::move(ptr); 10776fd607bSopenharmony_ci } 10876fd607bSopenharmony_ci 10976fd607bSopenharmony_ci PixelMapPtr GetFastPixelMap() 11076fd607bSopenharmony_ci { 11176fd607bSopenharmony_ci return std::move(fastPixelMap); 11276fd607bSopenharmony_ci } 11376fd607bSopenharmony_ci 11476fd607bSopenharmony_ci void SetFastPixelMap(PixelMapPtr ptr) 11576fd607bSopenharmony_ci { 11676fd607bSopenharmony_ci fastPixelMap = std::move(ptr); 11776fd607bSopenharmony_ci } 11876fd607bSopenharmony_ci 11976fd607bSopenharmony_ci void SetUUID(const std::string &uuid) 12076fd607bSopenharmony_ci { 12176fd607bSopenharmony_ci uuid_ = uuid; 12276fd607bSopenharmony_ci } 12376fd607bSopenharmony_ci 12476fd607bSopenharmony_ci std::string GetUUID() const 12576fd607bSopenharmony_ci { 12676fd607bSopenharmony_ci return uuid_; 12776fd607bSopenharmony_ci } 12876fd607bSopenharmony_ci 12976fd607bSopenharmony_ci void SetFd(int32_t fd) 13076fd607bSopenharmony_ci { 13176fd607bSopenharmony_ci fd_ = UniqueFd(fd); 13276fd607bSopenharmony_ci } 13376fd607bSopenharmony_ci 13476fd607bSopenharmony_ci const UniqueFd &GetFd() const 13576fd607bSopenharmony_ci { 13676fd607bSopenharmony_ci return fd_; 13776fd607bSopenharmony_ci } 13876fd607bSopenharmony_ci 13976fd607bSopenharmony_ci ThumbnailCallback callback_; 14076fd607bSopenharmony_ci RequestPhotoType requestPhotoType; 14176fd607bSopenharmony_ci int32_t error = 0; 14276fd607bSopenharmony_ciprivate: 14376fd607bSopenharmony_ci std::string uri_; 14476fd607bSopenharmony_ci std::string path_; 14576fd607bSopenharmony_ci Size requestSize_; 14676fd607bSopenharmony_ci ThumbnailStatus status_ = ThumbnailStatus::THUMB_INITIAL; 14776fd607bSopenharmony_ci std::mutex mutex_; 14876fd607bSopenharmony_ci std::string uuid_; 14976fd607bSopenharmony_ci UniqueFd fd_; 15076fd607bSopenharmony_ci 15176fd607bSopenharmony_ci PixelMapPtr fastPixelMap; 15276fd607bSopenharmony_ci PixelMapPtr pixelMap; 15376fd607bSopenharmony_ci}; 15476fd607bSopenharmony_ci 15576fd607bSopenharmony_ciclass MMapFdPtr { 15676fd607bSopenharmony_cipublic: 15776fd607bSopenharmony_ci explicit MMapFdPtr(int32_t fd, bool isNeedRelease); 15876fd607bSopenharmony_ci ~MMapFdPtr(); 15976fd607bSopenharmony_ci void* GetFdPtr(); 16076fd607bSopenharmony_ci off_t GetFdSize(); 16176fd607bSopenharmony_ci bool IsValid(); 16276fd607bSopenharmony_ciprivate: 16376fd607bSopenharmony_ci void* fdPtr_ = nullptr; 16476fd607bSopenharmony_ci off_t size_ = 0; 16576fd607bSopenharmony_ci bool isValid_ = false; 16676fd607bSopenharmony_ci bool isNeedRelease_ = false; 16776fd607bSopenharmony_ci}; 16876fd607bSopenharmony_ci 16976fd607bSopenharmony_ciconstexpr int THREAD_NUM = 5; 17076fd607bSopenharmony_ciclass ThumbnailManager : NoCopyable { 17176fd607bSopenharmony_cipublic: 17276fd607bSopenharmony_ci virtual ~ThumbnailManager(); 17376fd607bSopenharmony_ci static std::shared_ptr<ThumbnailManager> GetInstance(); 17476fd607bSopenharmony_ci 17576fd607bSopenharmony_ci void Init(); 17676fd607bSopenharmony_ci std::string AddPhotoRequest(const RequestPhotoParams ¶ms, napi_env env, napi_ref callback); 17776fd607bSopenharmony_ci void RemovePhotoRequest(const std::string &requestId); 17876fd607bSopenharmony_ci EXPORT static std::unique_ptr<PixelMap> QueryThumbnail(const std::string &uri, const Size &size, 17976fd607bSopenharmony_ci const std::string &path); 18076fd607bSopenharmony_ci EXPORT static std::unique_ptr<PixelMap> QueryKeyFrameThumbnail(const std::string &uriStr, const int32_t &beginStamp, 18176fd607bSopenharmony_ci const int32_t &type, const std::string &path); 18276fd607bSopenharmony_ci void DeleteRequestIdFromMap(const std::string &requestId); 18376fd607bSopenharmony_ci void AddQualityPhotoRequest(const RequestSharedPtr &request); 18476fd607bSopenharmony_ciprivate: 18576fd607bSopenharmony_ci ThumbnailManager() = default; 18676fd607bSopenharmony_ci void DealWithFastRequest(const RequestSharedPtr &request); 18776fd607bSopenharmony_ci void DealWithQualityRequest(const RequestSharedPtr &request); 18876fd607bSopenharmony_ci 18976fd607bSopenharmony_ci void ImageWorker(int num); 19076fd607bSopenharmony_ci void AddFastPhotoRequest(const RequestSharedPtr &request); 19176fd607bSopenharmony_ci void NotifyImage(const RequestSharedPtr &request); 19276fd607bSopenharmony_ci bool RequestFastImage(const RequestSharedPtr &request); 19376fd607bSopenharmony_ci 19476fd607bSopenharmony_ci SafeMap<std::string, RequestSharedPtr> thumbRequest_; 19576fd607bSopenharmony_ci SafeQueue<RequestSharedPtr> fastQueue_; 19676fd607bSopenharmony_ci SafeQueue<RequestSharedPtr> qualityQueue_; 19776fd607bSopenharmony_ci 19876fd607bSopenharmony_ci std::mutex queueLock_; 19976fd607bSopenharmony_ci std::condition_variable queueCv_; 20076fd607bSopenharmony_ci std::vector<std::thread> threads_; 20176fd607bSopenharmony_ci 20276fd607bSopenharmony_ci static std::shared_ptr<ThumbnailManager> instance_; 20376fd607bSopenharmony_ci static std::mutex mutex_; 20476fd607bSopenharmony_ci static bool init_; 20576fd607bSopenharmony_ci std::atomic<bool> isThreadRunning_; 20676fd607bSopenharmony_ci}; 20776fd607bSopenharmony_ci} // Media 20876fd607bSopenharmony_ci} // OHOS 20976fd607bSopenharmony_ci 21076fd607bSopenharmony_ci#endif // INTERFACES_KITS_JS_MEDIALIBRARY_INCLUDE_THUMBNAIL_MANAGER_H 21176fd607bSopenharmony_ci 212