1 /* 2 * Copyright (C) 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 AV_META_DATA_EXTRACTOR_NAPI_H 17 #define AV_META_DATA_EXTRACTOR_NAPI_H 18 19 #include "media_errors.h" 20 #include "napi/native_api.h" 21 #include "napi/native_node_api.h" 22 #include "helper_data_source_callback.h" 23 #include "common_napi.h" 24 #include "audio_info.h" 25 #include "audio_effect.h" 26 #include "task_queue.h" 27 #include "avmetadatahelper.h" 28 29 namespace OHOS { 30 namespace Media { 31 struct AVMetadataExtractorAsyncContext; 32 class AVMetadataExtractorNapi { 33 public: 34 __attribute__((visibility("default"))) static napi_value Init(napi_env env, napi_value exports); 35 36 private: 37 static napi_value Constructor(napi_env env, napi_callback_info info); 38 static void Destructor(napi_env env, void *nativeObject, void *finalize); 39 static napi_value JsCreateAVMetadataExtractor(napi_env env, napi_callback_info info); 40 static napi_value JsSetUrlSource(napi_env env, napi_callback_info info); 41 static napi_value JsResolveMetadata(napi_env env, napi_callback_info info); 42 static napi_value JsFetchArtPicture(napi_env env, napi_callback_info info); 43 static napi_value JsFetchFrameAtTime(napi_env env, napi_callback_info info); 44 static napi_value JsRelease(napi_env env, napi_callback_info info); 45 /** 46 * fdSrc: AVFileDescriptor 47 */ 48 static napi_value JsGetAVFileDescriptor(napi_env env, napi_callback_info info); 49 static napi_value JsSetAVFileDescriptor(napi_env env, napi_callback_info info); 50 /** 51 * dataSrc: DataSrcDescriptor 52 */ 53 static napi_value JsSetDataSrc(napi_env env, napi_callback_info info); 54 static napi_value JsGetDataSrc(napi_env env, napi_callback_info info); 55 56 static AVMetadataExtractorNapi *GetJsInstance(napi_env env, napi_callback_info info); 57 static AVMetadataExtractorNapi *GetJsInstanceWithParameter( 58 napi_env env, napi_callback_info info, size_t &argc, napi_value *argv); 59 static void FetchArtPictureComplete(napi_env env, napi_status status, void *data); 60 static void CreatePixelMapComplete(napi_env env, napi_status status, void *data); 61 static void CommonCallbackRoutine( 62 napi_env env, AVMetadataExtractorAsyncContext *&asyncContext, const napi_value &valueParam); 63 static void HandleMetaDataResult(napi_env env, AVMetadataExtractorAsyncContext* &promiseCtx, napi_value &result); 64 static void ResolveMetadataComplete(napi_env env, napi_status status, void *data); 65 static void GetTimeByFrameIndexComplete(napi_env env, napi_status status, void *data); 66 static void GetFrameIndexByTimeComplete(napi_env env, napi_status status, void *data); 67 static napi_value JSGetTimeByFrameIndex(napi_env env, napi_callback_info info); 68 static napi_value JSGetFrameIndexByTime(napi_env env, napi_callback_info info); 69 70 AVMetadataExtractorNapi(); 71 ~AVMetadataExtractorNapi(); 72 int32_t GetFetchFrameArgs(std::unique_ptr<AVMetadataExtractorAsyncContext> &asyncCtx, 73 napi_env env, napi_value timeUs, napi_value option, napi_value params); 74 75 private: 76 static thread_local napi_ref constructor_; 77 napi_env env_ = nullptr; 78 std::shared_ptr<AVMetadataHelper> helper_ = nullptr; 79 std::shared_ptr<HelperDataSourceCallback> dataSrcCb_ = nullptr; 80 struct AVFileDescriptor fileDescriptor_; 81 struct AVDataSrcDescriptor dataSrcDescriptor_; 82 std::mutex mutex_; 83 PixelMapParams param_; 84 HelperState state_ { HelperState::HELPER_STATE_IDLE }; 85 std::string url_ = ""; 86 std::map<std::string, std::string> header_; 87 }; 88 89 struct AVMetadataExtractorAsyncContext : public MediaAsyncContext { AVMetadataExtractorAsyncContextAVMetadataExtractorAsyncContext90 explicit AVMetadataExtractorAsyncContext(napi_env env) : MediaAsyncContext(env) {} 91 ~AVMetadataExtractorAsyncContext() = default; 92 93 AVMetadataExtractorNapi *napi = nullptr; 94 std::string opt_ = ""; 95 std::shared_ptr<Meta> metadata_ = nullptr; 96 std::shared_ptr<PixelMap> artPicture_ = nullptr; 97 std::shared_ptr<PixelMap> pixel_ = nullptr; 98 std::shared_ptr<AVMetadataHelper> innerHelper_ = nullptr; 99 int32_t status = 0; 100 int32_t option = 0; 101 int64_t timeUs = 0; 102 uint64_t timeStamp_; 103 uint32_t index_; 104 PixelMapParams param_; 105 }; 106 } // namespace Media 107 } // namespace OHOS 108 #endif // AV_META_DATA_EXTRACTOR_NAPI_H