zoom_video_sdk_napi_util.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include <assert.h>
  2. #include <node_api.h>
  3. #include "zoom_video_sdk_napi_util.h"
  4. #define DECLARE_NAPI_METHOD(name, func) \
  5. { name, 0, func, 0, 0, 0, napi_default, 0 }
  6. napi_env g_napi_env = nullptr;
  7. napi_ref g_rawdata_callback = nullptr;
  8. static napi_value ZoomNodeApiModule(napi_env env, napi_callback_info info) {
  9. napi_value rc;
  10. napi_create_string_utf8(env, "ZoomNAPIUtil", NAPI_AUTO_LENGTH, &rc);
  11. return (rc);
  12. }
  13. static napi_value Init(napi_env env, napi_value exports) {
  14. g_napi_env = env;
  15. napi_status status;
  16. napi_property_descriptor reg_desc = DECLARE_NAPI_METHOD("ZoomNodeApiModule", ZoomNodeApiModule);
  17. status = napi_define_properties(env, exports, 1, &reg_desc);
  18. assert(status == napi_ok);
  19. return exports;
  20. }
  21. #define NODE_GYP_MODULE_NAME_NAPI ZOOMSDK_NAPI_MODULE
  22. NAPI_MODULE(NODE_GYP_MODULE_NAME_NAPI, Init)
  23. struct FreeDataBufferInfo
  24. {
  25. fnFreeDataBufferNotification fnCallback;
  26. void* hint;
  27. };
  28. void FreeExternalArrayBufferMemory(napi_env env, void* data, void* hint)
  29. {
  30. if (hint)
  31. {
  32. FreeDataBufferInfo* info = (FreeDataBufferInfo*)hint;
  33. if (info->fnCallback)
  34. info->fnCallback(info->hint);
  35. delete info;
  36. }
  37. }
  38. extern "C" NODE_MODULE_EXPORT void CallbackVideoFormatDataToJS(uint64_t recvHandle, const std::string & video_data_format,
  39. char* video_data_buf, int len, v8::Local<v8::Function>& executor, fnFreeDataBufferNotification notification, void* hint)
  40. {
  41. do
  42. {
  43. if (nullptr == g_napi_env || nullptr == video_data_buf)
  44. break;
  45. napi_value napi_executor = reinterpret_cast<napi_value>(*executor);
  46. if (nullptr == napi_executor)
  47. break;
  48. napi_value napi_video_array_buffer;
  49. #if 1
  50. napi_status status = napi_create_buffer_copy(g_napi_env, len, (void*)video_data_buf, nullptr, &napi_video_array_buffer);
  51. if (notification)
  52. notification(hint);
  53. #else
  54. FreeDataBufferInfo* info = new FreeDataBufferInfo;
  55. info->fnCallback = notification;
  56. info->hint = hint;
  57. napi_status status = napi_create_external_buffer(g_napi_env, len, (void*)video_data_buf,
  58. FreeExternalArrayBufferMemory, info, &napi_video_array_buffer);
  59. #endif
  60. if (napi_ok != status)
  61. break;
  62. napi_value napi_recv_handle;
  63. status = napi_create_bigint_uint64(g_napi_env, recvHandle, &napi_recv_handle);
  64. if (napi_ok != status)
  65. break;
  66. napi_value napi_video_foramt;
  67. status = napi_create_string_utf8(g_napi_env, video_data_format.c_str(), video_data_format.size(), &napi_video_foramt);
  68. if (napi_ok != status)
  69. break;
  70. napi_value global;
  71. status = napi_get_global(g_napi_env, &global);
  72. if (napi_ok != status)
  73. break;
  74. napi_value argv[3] = {napi_video_foramt, napi_recv_handle, napi_video_array_buffer };
  75. napi_value result;
  76. status = napi_call_function(g_napi_env, global, napi_executor, sizeof(argv) / sizeof(argv[0]), argv, &result);
  77. } while (false);
  78. }
  79. extern "C" NODE_MODULE_EXPORT void CallbackMixedAudioFormatDataToJS(const std::string & audio_data_format,
  80. char* audio_data_buf, int len, v8::Local<v8::Function>& executor, fnFreeDataBufferNotification notification, void* hint)
  81. {
  82. do
  83. {
  84. if (nullptr == g_napi_env || nullptr == audio_data_buf)
  85. break;
  86. napi_value napi_executor = reinterpret_cast<napi_value>(*executor);
  87. if (nullptr == napi_executor)
  88. break;
  89. napi_value napi_audio_array_buffer;
  90. #if 1
  91. napi_status status = napi_create_buffer_copy(g_napi_env, len, (void*)audio_data_buf, nullptr, &napi_audio_array_buffer);
  92. if (notification)
  93. notification(hint);
  94. #else
  95. FreeDataBufferInfo* info = new FreeDataBufferInfo;
  96. info->fnCallback = notification;
  97. info->hint = hint;
  98. napi_status status = napi_create_external_buffer(g_napi_env, len, (void*)audio_data_buf,
  99. FreeExternalArrayBufferMemory, info, &napi_audio_array_buffer);
  100. #endif
  101. if (napi_ok != status)
  102. break;
  103. napi_value napi_audio_foramt;
  104. status = napi_create_string_utf8(g_napi_env, audio_data_format.c_str(), audio_data_format.size(), &napi_audio_foramt);
  105. if (napi_ok != status)
  106. break;
  107. napi_value global;
  108. status = napi_get_global(g_napi_env, &global);
  109. if (napi_ok != status)
  110. break;
  111. napi_value argv[2] = { napi_audio_array_buffer, napi_audio_foramt};
  112. napi_value result;
  113. status = napi_call_function(g_napi_env, global, napi_executor, sizeof(argv) / sizeof(argv[0]), argv, &result);
  114. } while (false);
  115. }
  116. extern "C" NODE_MODULE_EXPORT void CallbackOnewayAudioFormatDataToJS(const std::string & nodeid, const std::string & audio_data_format,
  117. char* audio_data_buf, int len, v8::Local<v8::Function>& executor, fnFreeDataBufferNotification notification, void* hint)
  118. {
  119. do
  120. {
  121. if (nullptr == g_napi_env || nullptr == audio_data_buf)
  122. break;
  123. napi_value napi_executor = reinterpret_cast<napi_value>(*executor);
  124. if (nullptr == napi_executor)
  125. break;
  126. napi_value napi_audio_array_buffer;
  127. #if 1
  128. napi_status status = napi_create_buffer_copy(g_napi_env, len, (void*)audio_data_buf, nullptr, &napi_audio_array_buffer);
  129. if (notification)
  130. notification(hint);
  131. #else
  132. FreeDataBufferInfo* info = new FreeDataBufferInfo;
  133. info->fnCallback = notification;
  134. info->hint = hint;
  135. napi_status status = napi_create_external_buffer(g_napi_env, len, (void*)audio_data_buf,
  136. FreeExternalArrayBufferMemory, info, &napi_audio_array_buffer);
  137. #endif
  138. if (napi_ok != status)
  139. break;
  140. napi_value napi_audio_foramt;
  141. status = napi_create_string_utf8(g_napi_env, audio_data_format.c_str(), audio_data_format.size(), &napi_audio_foramt);
  142. if (napi_ok != status)
  143. break;
  144. napi_value napi_nodeid;
  145. status = napi_create_string_utf8(g_napi_env, nodeid.c_str(), nodeid.size(), &napi_nodeid);
  146. if (napi_ok != status)
  147. break;
  148. napi_value global;
  149. status = napi_get_global(g_napi_env, &global);
  150. if (napi_ok != status)
  151. break;
  152. napi_value argv[3] = { napi_audio_array_buffer, napi_audio_foramt, napi_nodeid };
  153. napi_value result;
  154. status = napi_call_function(g_napi_env, global, napi_executor, sizeof(argv) / sizeof(argv[0]), argv, &result);
  155. } while (false);
  156. }
  157. extern "C" NODE_MODULE_EXPORT void GetRawBufferPtr(v8::Local<v8::Uint8Array> & data_buffer, void** pp_raw_ptr, size_t & p_size)
  158. {
  159. do
  160. {
  161. if (nullptr == g_napi_env)
  162. break;
  163. napi_value napi_buffer = reinterpret_cast<napi_value>(*data_buffer);
  164. if (nullptr == napi_buffer)
  165. break;
  166. napi_status stauts = napi_get_buffer_info(g_napi_env,
  167. napi_buffer,
  168. pp_raw_ptr,
  169. &p_size);
  170. } while (false);
  171. }
  172. extern "C" NODE_MODULE_EXPORT void GetRawArrayBufferPtr(v8::Local<v8::ArrayBuffer> &data_buffer, void** pp_raw_ptr, size_t & p_size)
  173. {
  174. do
  175. {
  176. if (nullptr == g_napi_env)
  177. break;
  178. napi_value napi_buffer = reinterpret_cast<napi_value>(*data_buffer);
  179. if (nullptr == napi_buffer)
  180. break;
  181. napi_status stauts = napi_get_arraybuffer_info(g_napi_env,
  182. napi_buffer,
  183. pp_raw_ptr,
  184. &p_size);
  185. } while (false);
  186. }