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 &params, 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 &params, 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