ijkplayer_napi_proxy.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. /*
  2. * Copyright (C) 2022 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. #include "ijkplayer_napi_proxy.h"
  16. #include <hilog/log.h>
  17. static std::unordered_map<std::string, IjkMediaPlayer *> GLOBAL_IJKMP;
  18. void (*post_event)(int what, int arg1, int arg2, char *obj, std::string id);
  19. void IJKPlayerNapiProxy::message_loop_callback(void (*pe)(int what, int arg1, int arg2, char *obj,
  20. std::string id))
  21. {
  22. post_event = pe;
  23. }
  24. static void message_loop_n(IjkMediaPlayer *mp) {
  25. LOGI("napi_proxy-->message_loop_n");
  26. void *weak_thiz = ijkmp_get_weak_thiz(mp);
  27. while (1) {
  28. AVMessage msg;
  29. LOGI("napi_proxy-->message_loop_n-->go");
  30. int retval = ijkmp_get_msg(mp, &msg, 1);
  31. LOGI("napi_proxy-->message_loop_n-->go retval = %d", retval);
  32. if (retval <= 0) {
  33. break;
  34. }
  35. char *id = ijkmp_get_id(mp);
  36. if (!id) {
  37. break;
  38. }
  39. std::string idStr(id);
  40. switch (msg.what) {
  41. LOGI("napi_proxy-->message_loop_n-->go-->msg:%d", msg.what);
  42. case FFP_MSG_FLUSH:
  43. MPTRACE("FFP_MSG_FLUSH:\n");
  44. post_event(MEDIA_NOP, 0, 0, nullptr, idStr);
  45. break;
  46. case FFP_MSG_ERROR:
  47. MPTRACE("FFP_MSG_ERROR: %d\n", msg.arg1);
  48. post_event(MEDIA_ERROR, MEDIA_ERROR_IJK_PLAYER, msg.arg1, nullptr, idStr);
  49. break;
  50. case FFP_MSG_PREPARED:
  51. MPTRACE("FFP_MSG_PREPARED:\n");
  52. post_event(MEDIA_PREPARED, 0, 0, nullptr, idStr);
  53. break;
  54. case FFP_MSG_COMPLETED:
  55. MPTRACE("FFP_MSG_COMPLETED:\n");
  56. post_event(MEDIA_PLAYBACK_COMPLETE, 0, 0, nullptr, idStr);
  57. break;
  58. case FFP_MSG_VIDEO_SIZE_CHANGED:
  59. MPTRACE("FFP_MSG_VIDEO_SIZE_CHANGED: %d, %d\n", msg.arg1, msg.arg2);
  60. post_event(MEDIA_SET_VIDEO_SIZE, msg.arg1, msg.arg2, nullptr, idStr);
  61. break;
  62. case FFP_MSG_SAR_CHANGED:
  63. MPTRACE("FFP_MSG_SAR_CHANGED: %d, %d\n", msg.arg1, msg.arg2);
  64. post_event(MEDIA_SET_VIDEO_SAR, msg.arg1, msg.arg2, nullptr, idStr);
  65. break;
  66. case FFP_MSG_VIDEO_RENDERING_START:
  67. MPTRACE("FFP_MSG_VIDEO_RENDERING_START:\n");
  68. post_event(MEDIA_INFO, MEDIA_INFO_VIDEO_RENDERING_START, 0, nullptr, idStr);
  69. break;
  70. case FFP_MSG_AUDIO_RENDERING_START:
  71. MPTRACE("FFP_MSG_AUDIO_RENDERING_START:\n");
  72. post_event(MEDIA_INFO, MEDIA_INFO_AUDIO_RENDERING_START, 0, nullptr, idStr);
  73. break;
  74. case FFP_MSG_VIDEO_ROTATION_CHANGED:
  75. MPTRACE("FFP_MSG_VIDEO_ROTATION_CHANGED: %d\n", msg.arg1);
  76. post_event(MEDIA_INFO, MEDIA_INFO_VIDEO_ROTATION_CHANGED, msg.arg1, nullptr, idStr);
  77. break;
  78. case FFP_MSG_AUDIO_DECODED_START:
  79. MPTRACE("FFP_MSG_AUDIO_DECODED_START:\n");
  80. post_event(MEDIA_INFO, MEDIA_INFO_AUDIO_DECODED_START, 0, nullptr, idStr);
  81. break;
  82. case FFP_MSG_VIDEO_DECODED_START:
  83. MPTRACE("FFP_MSG_VIDEO_DECODED_START:\n");
  84. post_event(MEDIA_INFO, MEDIA_INFO_VIDEO_DECODED_START, 0, nullptr, idStr);
  85. break;
  86. case FFP_MSG_OPEN_INPUT:
  87. MPTRACE("FFP_MSG_OPEN_INPUT:\n");
  88. post_event(MEDIA_INFO, MEDIA_INFO_OPEN_INPUT, 0, nullptr, idStr);
  89. break;
  90. case FFP_MSG_FIND_STREAM_INFO:
  91. MPTRACE("FFP_MSG_FIND_STREAM_INFO:\n");
  92. post_event(MEDIA_INFO, MEDIA_INFO_FIND_STREAM_INFO, 0, nullptr, idStr);
  93. break;
  94. case FFP_MSG_COMPONENT_OPEN:
  95. MPTRACE("FFP_MSG_COMPONENT_OPEN:\n");
  96. post_event(MEDIA_INFO, MEDIA_INFO_COMPONENT_OPEN, 0, nullptr, idStr);
  97. break;
  98. case FFP_MSG_BUFFERING_START:
  99. MPTRACE("FFP_MSG_BUFFERING_START:\n");
  100. post_event(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, msg.arg1, nullptr, idStr);
  101. break;
  102. case FFP_MSG_BUFFERING_END:
  103. MPTRACE("FFP_MSG_BUFFERING_END:\n");
  104. post_event(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, msg.arg1, nullptr, idStr);
  105. break;
  106. case FFP_MSG_BUFFERING_UPDATE:
  107. post_event(MEDIA_BUFFERING_UPDATE, msg.arg1, msg.arg2, nullptr, idStr);
  108. break;
  109. case FFP_MSG_BUFFERING_BYTES_UPDATE:
  110. break;
  111. case FFP_MSG_BUFFERING_TIME_UPDATE:
  112. break;
  113. case FFP_MSG_SEEK_COMPLETE:
  114. MPTRACE("FFP_MSG_SEEK_COMPLETE:\n");
  115. post_event(MEDIA_SEEK_COMPLETE, 0, 0, nullptr, idStr);
  116. break;
  117. case FFP_MSG_ACCURATE_SEEK_COMPLETE:
  118. MPTRACE("FFP_MSG_ACCURATE_SEEK_COMPLETE:\n");
  119. post_event(MEDIA_INFO, MEDIA_INFO_MEDIA_ACCURATE_SEEK_COMPLETE, msg.arg1, nullptr, idStr);
  120. break;
  121. case FFP_MSG_PLAYBACK_STATE_CHANGED:
  122. break;
  123. case FFP_MSG_TIMED_TEXT:
  124. if (msg.obj) {
  125. post_event(MEDIA_TIMED_TEXT, 0, 0, (char *)msg.obj, idStr);
  126. } else {
  127. post_event(MEDIA_TIMED_TEXT, 0, 0, nullptr, idStr);
  128. }
  129. break;
  130. case FFP_MSG_GET_IMG_STATE:
  131. if (msg.obj) {
  132. post_event(MEDIA_GET_IMG_STATE, msg.arg1, msg.arg2, (char *)msg.obj, idStr);
  133. } else {
  134. post_event(MEDIA_GET_IMG_STATE, msg.arg1, msg.arg2, nullptr, idStr);
  135. }
  136. break;
  137. case FFP_MSG_VIDEO_SEEK_RENDERING_START:
  138. MPTRACE("FFP_MSG_VIDEO_SEEK_RENDERING_START:\n");
  139. post_event(MEDIA_INFO, MEDIA_INFO_VIDEO_SEEK_RENDERING_START, msg.arg1, nullptr, idStr);
  140. break;
  141. case FFP_MSG_AUDIO_SEEK_RENDERING_START:
  142. MPTRACE("FFP_MSG_AUDIO_SEEK_RENDERING_START:\n");
  143. post_event(MEDIA_INFO, MEDIA_INFO_AUDIO_SEEK_RENDERING_START, msg.arg1, nullptr, idStr);
  144. break;
  145. case FFP_MSG_AUDIO_INTERRUPT:
  146. MPTRACE("FFP_MSG_AUDIO_INTERRUPT:\n");
  147. post_event(MEDIA_AUDIO_INTERRUPT, msg.arg1, msg.arg2, nullptr, idStr);
  148. break;
  149. default:
  150. ALOGE("unknown FFP_MSG_xxx(%d)\n", msg.what);
  151. break;
  152. }
  153. msg_free_res(&msg);
  154. }
  155. }
  156. static int message_loop(void *arg);
  157. static int message_loop(void *arg) {
  158. LOGI("napi_proxy-->message_loop");
  159. IjkMediaPlayer *mp = (IjkMediaPlayer *)arg;
  160. message_loop_n(mp);
  161. ijkmp_dec_ref_p(&mp);
  162. return 0;
  163. }
  164. IjkMediaPlayer *IJKPlayerNapiProxy::get_media_player(std::string id)
  165. {
  166. IjkMediaPlayer *mp = nullptr;
  167. std::unordered_map<std::string, IjkMediaPlayer *>::iterator it = GLOBAL_IJKMP.find(id);
  168. if (it != GLOBAL_IJKMP.end()) {
  169. mp = it->second;
  170. }
  171. if (mp) {
  172. ijkmp_inc_ref(mp);
  173. }
  174. return mp;
  175. }
  176. IjkMediaPlayer *IJKPlayerNapiProxy::set_media_player(std::string id, IjkMediaPlayer *mp)
  177. {
  178. LOGI("napi_proxy-->set_media_player");
  179. if (mp) {
  180. ijkmp_inc_ref(mp);
  181. } else {
  182. std::unordered_map<std::string, IjkMediaPlayer *>::iterator it = GLOBAL_IJKMP.find(id);
  183. if (it != GLOBAL_IJKMP.end()) {
  184. mp = it->second;
  185. }
  186. ijkmp_dec_ref_p(&mp);
  187. }
  188. GLOBAL_IJKMP.insert(std::make_pair(id, mp));
  189. return GLOBAL_IJKMP[id];
  190. }
  191. void IJKPlayerNapiProxy::delete_media_player(std::string id)
  192. {
  193. auto it = GLOBAL_IJKMP.find(id);
  194. if (it != GLOBAL_IJKMP.end()) {
  195. GLOBAL_IJKMP.erase(it);
  196. }
  197. };
  198. void IJKPlayerNapiProxy::IjkMediaPlayer_native_setup(void *weak_this, void *native_window) {
  199. LOGI("napi_proxy-->IjkMediaPlayer_native_setup");
  200. if (!IJKMP_GLOABL_INIT) {
  201. ijkmp_global_init();
  202. }
  203. IJKMP_GLOABL_INIT = true;
  204. GLOBAL_NATIVE_WINDOW = native_window;
  205. IjkMediaPlayer *mp = ijkmp_android_create(message_loop);
  206. IJKPlayerNapiProxy::set_media_player(id_, mp);
  207. ijkmp_android_set_surface(mp, native_window);
  208. ijkmp_set_weak_thiz(mp, weak_this);
  209. ijkmp_set_id(mp, (char *)id_.c_str());
  210. ijkmp_set_inject_opaque(mp, ijkmp_get_weak_thiz(mp));
  211. ijkmp_set_ijkio_inject_opaque(mp, ijkmp_get_weak_thiz(mp));
  212. ijkmp_dec_ref_p(&mp);
  213. }
  214. void IJKPlayerNapiProxy::IjkMediaPlayer_native_setup_audio() {
  215. LOGI("napi_proxy-->IjkMediaPlayer_native_setup");
  216. if (!IJKMP_GLOABL_INIT) {
  217. ijkmp_global_init();
  218. }
  219. IJKMP_GLOABL_INIT = true;
  220. IjkMediaPlayer *mp = ijkmp_android_create(message_loop);
  221. IJKPlayerNapiProxy::set_media_player(id_, mp);
  222. ijkmp_set_id(mp, (char *)id_.c_str());
  223. ijkmp_set_inject_opaque(mp, ijkmp_get_weak_thiz(mp));
  224. ijkmp_set_ijkio_inject_opaque(mp, ijkmp_get_weak_thiz(mp));
  225. ijkmp_dec_ref_p(&mp);
  226. }
  227. void IJKPlayerNapiProxy::IjkMediaPlayer_setDataSource(char *url) {
  228. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  229. if (!mp) {
  230. LOGE("napi_proxy-->IjkMediaPlayer_setDataSource mp NULL");
  231. return;
  232. }
  233. ijkmp_set_data_source(mp, url);
  234. ijkmp_dec_ref_p(&mp);
  235. }
  236. void IJKPlayerNapiProxy::IjkMediaPlayer_setOption(int category, char *name, char *value) {
  237. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  238. if (!mp) {
  239. LOGE("napi_proxy-->IjkMediaPlayer_setOption mp NULL");
  240. return;
  241. }
  242. ijkmp_set_option(mp, category, name, value);
  243. ijkmp_dec_ref_p(&mp);
  244. }
  245. void IJKPlayerNapiProxy::IjkMediaPlayer_setOptionLong(int category, char *name, int64_t value) {
  246. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  247. if (!mp) {
  248. LOGE("napi_proxy-->IjkMediaPlayer_setOptionLong mp NULL");
  249. return;
  250. }
  251. ijkmp_set_option_int(mp, category, name, value);
  252. ijkmp_dec_ref_p(&mp);
  253. }
  254. void IJKPlayerNapiProxy::IjkMediaPlayer_prepareAsync() {
  255. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  256. if (!mp) {
  257. LOGE("napi_proxy-->IjkMediaPlayer_prepareAsync mp NULL");
  258. return;
  259. }
  260. ijkmp_prepare_async(mp);
  261. ijkmp_dec_ref_p(&mp);
  262. }
  263. void IJKPlayerNapiProxy::IjkMediaPlayer_start() {
  264. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  265. if (!mp) {
  266. LOGE("napi_proxy-->IjkMediaPlayer_start mp NULL");
  267. return;
  268. }
  269. ijkmp_start(mp);
  270. ijkmp_dec_ref_p(&mp);
  271. }
  272. void IJKPlayerNapiProxy::IjkMediaPlayer_pause() {
  273. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  274. if (!mp) {
  275. LOGE("napi_proxy-->IjkMediaPlayer_pause mp NULL");
  276. return;
  277. }
  278. ijkmp_pause(mp);
  279. ijkmp_dec_ref_p(&mp);
  280. }
  281. void IJKPlayerNapiProxy::IjkMediaPlayer_seekTo(int64_t msec) {
  282. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  283. if (!mp) {
  284. LOGE("napi_proxy-->IjkMediaPlayer_seekTo mp NULL");
  285. return;
  286. }
  287. ijkmp_seek_to(mp, msec);
  288. ijkmp_dec_ref_p(&mp);
  289. }
  290. bool IJKPlayerNapiProxy::IjkMediaPlayer_isPlaying() {
  291. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  292. if (!mp) {
  293. LOGE("napi_proxy-->IjkMediaPlayer_isPlaying mp NULL");
  294. return false;
  295. }
  296. bool bol = ijkmp_is_playing(mp) ? true : false;
  297. ijkmp_dec_ref_p(&mp);
  298. return bol;
  299. }
  300. int IJKPlayerNapiProxy::IjkMediaPlayer_getCurrentPosition() {
  301. int retval = 0;
  302. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  303. if (!mp) {
  304. LOGE("napi_proxy-->IjkMediaPlayer_getCurrentPosition mp NULL");
  305. return retval;
  306. }
  307. retval = ijkmp_get_current_position(mp);
  308. ijkmp_dec_ref_p(&mp);
  309. return retval;
  310. }
  311. int IJKPlayerNapiProxy::IjkMediaPlayer_getDuration() {
  312. int retval = 0;
  313. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  314. if (!mp) {
  315. LOGE("napi_proxy-->IjkMediaPlayer_getDuration mp NULL");
  316. return retval;
  317. }
  318. retval = ijkmp_get_duration(mp);
  319. ijkmp_dec_ref_p(&mp);
  320. return retval;
  321. }
  322. void IJKPlayerNapiProxy::IjkMediaPlayer_stop() {
  323. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  324. if (!mp) {
  325. LOGE("napi_proxy-->IjkMediaPlayer_stop mp NULL");
  326. return;
  327. }
  328. ijkmp_stop(mp);
  329. ijkmp_dec_ref_p(&mp);
  330. }
  331. void IJKPlayerNapiProxy::IjkMediaPlayer_release() {
  332. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  333. if (!mp) {
  334. LOGE("napi_proxy-->IjkMediaPlayer_release mp NULL");
  335. return;
  336. }
  337. ijkmp_shutdown(mp);
  338. IJKPlayerNapiProxy::set_media_player(id_, NULL);
  339. delete_media_player(id_);
  340. ijkmp_dec_ref_p(&mp);
  341. }
  342. void IJKPlayerNapiProxy::IjkMediaPlayer_reset() {
  343. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  344. if (!mp) {
  345. LOGE("napi_proxy-->IjkMediaPlayer_reset mp NULL");
  346. return;
  347. }
  348. ijkmp_android_set_surface(mp, NULL);
  349. void *weak_thiz = ijkmp_set_weak_thiz(mp, NULL);
  350. IjkMediaPlayer_release();
  351. LOGI("napi_proxy-->IjkMediaPlayer_reset");
  352. ijkmp_dec_ref_p(&mp);
  353. }
  354. void IJKPlayerNapiProxy::IjkMediaPlayer_setVolume(float leftVolume, float rightVolume) {
  355. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  356. if (!mp) {
  357. LOGE("napi_proxy-->IjkMediaPlayer_setVolume mp NULL");
  358. return;
  359. }
  360. ijkmp_android_set_volume(mp, leftVolume, rightVolume);
  361. ijkmp_dec_ref_p(&mp);
  362. }
  363. void IJKPlayerNapiProxy::ijkMediaPlayer_setPropertyFloat(int id, float value) {
  364. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  365. if (!mp) {
  366. LOGE("napi_proxy-->ijkMediaPlayer_setPropertyFloat mp NULL");
  367. return;
  368. }
  369. ijkmp_set_property_float(mp, id, value);
  370. ijkmp_dec_ref_p(&mp);
  371. }
  372. float IJKPlayerNapiProxy::ijkMediaPlayer_getPropertyFloat(int id, float default_value) {
  373. float retval = 0;
  374. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  375. if (!mp) {
  376. LOGE("napi_proxy-->ijkMediaPlayer_getPropertyFloat mp NULL");
  377. return retval;
  378. }
  379. retval = ijkmp_get_property_float(mp, id, default_value);
  380. if (retval == -1) {
  381. LOGE("napi_proxy-->ijkMediaPlayer_getPropertyFloat fail");
  382. retval = 0;
  383. }
  384. ijkmp_dec_ref_p(&mp);
  385. return retval;
  386. }
  387. void IJKPlayerNapiProxy::ijkMediaPlayer_setPropertyLong(int id, long value) {
  388. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  389. if (!mp) {
  390. LOGE("napi_proxy-->ijkMediaPlayer_setPropertyLong mp NULL");
  391. return;
  392. }
  393. ijkmp_set_property_int64(mp, id, value);
  394. ijkmp_dec_ref_p(&mp);
  395. }
  396. long IJKPlayerNapiProxy::ijkMediaPlayer_getPropertyLong(int id, long default_value) {
  397. long retval = 0;
  398. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  399. if (!mp) {
  400. LOGE("napi_proxy-->ijkMediaPlayer_getPropertyLong mp NULL");
  401. return retval;
  402. }
  403. retval = ijkmp_get_property_int64(mp, id, default_value);
  404. if (retval == -1) {
  405. LOGE("napi_proxy-->ijkMediaPlayer_getPropertyLong fail");
  406. retval = 0;
  407. }
  408. ijkmp_dec_ref_p(&mp);
  409. return retval;
  410. }
  411. int IJKPlayerNapiProxy::IjkMediaPlayer_getAudioSessionId() {
  412. int audio_session_id = 0;
  413. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  414. if (!mp) {
  415. LOGE("napi_proxy-->IjkMediaPlayer_getAudioSessionId mp NULL");
  416. return audio_session_id;
  417. }
  418. audio_session_id = ijkmp_android_get_audio_session_id(mp);
  419. ijkmp_dec_ref_p(&mp);
  420. return audio_session_id;
  421. }
  422. void IJKPlayerNapiProxy::IjkMediaPlayer_setLoopCount(int loop_count) {
  423. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  424. if (!mp) {
  425. LOGE("napi_proxy-->IjkMediaPlayer_setLoopCount mp NULL");
  426. return;
  427. }
  428. ijkmp_set_loop(mp, loop_count);
  429. ijkmp_dec_ref_p(&mp);
  430. }
  431. int IJKPlayerNapiProxy::IjkMediaPlayer_getLoopCount() {
  432. int loopCount = 0;
  433. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  434. if (!mp) {
  435. LOGE("napi_proxy-->IjkMediaPlayer_getLoopCount mp NULL");
  436. return loopCount;
  437. }
  438. loopCount = ijkmp_get_loop(mp);
  439. ijkmp_dec_ref_p(&mp);
  440. return loopCount;
  441. }
  442. char *IJKPlayerNapiProxy::IjkMediaPlayer_getVideoCodecInfo() {
  443. char *codec_info = NULL;
  444. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  445. if (!mp) {
  446. LOGE("napi_proxy-->IjkMediaPlayer_getVideoCodecInfo mp NULL");
  447. return codec_info;
  448. }
  449. ijkmp_get_video_codec_info(mp, &codec_info);
  450. ijkmp_dec_ref_p(&mp);
  451. return codec_info;
  452. }
  453. char *IJKPlayerNapiProxy::IjkMediaPlayer_getAudioCodecInfo() {
  454. MPTRACE("%s\n", __func__);
  455. char *codec_info = NULL;
  456. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  457. if (!mp) {
  458. LOGE("napi_proxy-->IjkMediaPlayer_getAudioCodecInfo mp NULL");
  459. return codec_info;
  460. }
  461. ijkmp_get_audio_codec_info(mp, &codec_info);
  462. ijkmp_dec_ref_p(&mp);
  463. return codec_info;
  464. }
  465. void IJKPlayerNapiProxy::ijkMediaPlayer_setStreamSelected(int stream, bool selected) {
  466. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  467. if (!mp) {
  468. LOGE("napi_proxy-->ijkMediaPlayer_setStreamSelected mp NULL");
  469. return;
  470. }
  471. int ret = 0;
  472. ret = ijkmp_set_stream_selected(mp, stream, selected);
  473. if (ret < 0) {
  474. LOGI("failed to %s %d", selected ? "select" : "deselect", stream);
  475. }
  476. ijkmp_dec_ref_p(&mp);
  477. }
  478. const char *getFromMediaMetaByKey(IjkMediaMeta *meta, char *key) {
  479. const char *value = ijkmeta_get_string_l(meta, key);
  480. return value;
  481. }
  482. static void IjkMediaPlayerFillHashMap(const char *type, HashMap map, IjkMediaMeta *streamRawMeta)
  483. {
  484. map->put(map, IJKM_KEY_CODEC_NAME,
  485. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_CODEC_NAME));
  486. map->put(map, IJKM_KEY_CODEC_PROFILE,
  487. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_CODEC_PROFILE));
  488. map->put(map, IJKM_KEY_CODEC_LEVEL,
  489. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_CODEC_LEVEL));
  490. map->put(map, IJKM_KEY_CODEC_LONG_NAME,
  491. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_CODEC_LONG_NAME));
  492. map->put(map, IJKM_KEY_CODEC_PIXEL_FORMAT,
  493. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_CODEC_PIXEL_FORMAT));
  494. map->put(map, IJKM_KEY_BITRATE, getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_BITRATE));
  495. map->put(map, IJKM_KEY_CODEC_PROFILE_ID,
  496. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_CODEC_PROFILE_ID));
  497. if (strcmp(type, IJKM_VAL_TYPE__VIDEO) == 0) {
  498. map->put(map, IJKM_KEY_WIDTH, getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_WIDTH));
  499. map->put(map, IJKM_KEY_HEIGHT,
  500. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_HEIGHT));
  501. map->put(map, IJKM_KEY_FPS_NUM,
  502. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_FPS_NUM));
  503. map->put(map, IJKM_KEY_TBR_NUM,
  504. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_TBR_NUM));
  505. map->put(map, IJKM_KEY_TBR_DEN,
  506. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_TBR_DEN));
  507. map->put(map, IJKM_KEY_SAR_NUM,
  508. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_SAR_NUM));
  509. map->put(map, IJKM_KEY_SAR_DEN,
  510. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_SAR_DEN));
  511. } else if (strcmp(type, IJKM_VAL_TYPE__AUDIO) == 0) {
  512. map->put(map, IJKM_KEY_SAMPLE_RATE,
  513. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_SAMPLE_RATE));
  514. map->put(map, IJKM_KEY_CHANNEL_LAYOUT,
  515. getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_CHANNEL_LAYOUT));
  516. }
  517. }
  518. HashMap IJKPlayerNapiProxy::IjkMediaPlayer_getMediaMeta() {
  519. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  520. HashMap map = hashmap_create();
  521. if (!mp) {
  522. LOGE("napi_proxy-->IjkMediaPlayer_getMediaMeta mp NULL");
  523. return map;
  524. }
  525. IjkMediaMeta *meta = ijkmp_get_meta_l(mp);
  526. if (!meta) {
  527. LOGE("napi_proxy-->IjkMediaPlayer_getMediaMeta meta NULL");
  528. ijkmp_dec_ref_p(&mp);
  529. return map;
  530. }
  531. size_t count = ijkmeta_get_children_count_l(meta);
  532. for (size_t i = 0; i < count; ++i) {
  533. IjkMediaMeta *streamRawMeta = ijkmeta_get_child_l(meta, i);
  534. if (streamRawMeta) {
  535. map->put(map, IJKM_KEY_TYPE, getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_TYPE));
  536. map->put(map, IJKM_KEY_TYPE, getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_TYPE));
  537. map->put(map, IJKM_KEY_LANGUAGE, getFromMediaMetaByKey(streamRawMeta, IJKM_KEY_LANGUAGE));
  538. const char *type = ijkmeta_get_string_l(streamRawMeta, IJKM_KEY_TYPE);
  539. if (type != nullptr) {
  540. IjkMediaPlayerFillHashMap(type, map, streamRawMeta);
  541. }
  542. }
  543. }
  544. ijkmp_dec_ref_p(&mp);
  545. return map;
  546. }
  547. void IJKPlayerNapiProxy::IjkMediaPlayer_native_openlog() {
  548. OHOS_LOG_ON = true;
  549. open_custom_ffmpeg_log_print();
  550. }
  551. void IJKPlayerNapiProxy::IjkMediaPlayer_setEqualizerEnabled(bool enabled) {
  552. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  553. if (!mp) {
  554. LOGE("napi_proxy-->IjkMediaPlayer_setEqualizerEnabled mp NULL");
  555. return;
  556. }
  557. ijkmp_android_set_equalizer_enabled(mp, enabled);
  558. ijkmp_dec_ref_p(&mp);
  559. }
  560. void IJKPlayerNapiProxy::IjkMediaPlayer_setEqualizerGains(const float *gains) {
  561. IjkMediaPlayer *mp = IJKPlayerNapiProxy::get_media_player(id_);
  562. if (!mp) {
  563. LOGE("napi_proxy-->IjkMediaPlayer_setEqualizerGains mp NULL");
  564. return;
  565. }
  566. ijkmp_android_set_equalizer_gains(mp, gains);
  567. ijkmp_dec_ref_p(&mp);
  568. }