video_dec_srv.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900
  1. /*
  2. * Copyright (c) 2020 Actions Technology Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file video_dec_srv.c
  8. *
  9. */
  10. #include <string.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <msg_manager.h>
  14. #include <thread_timer.h>
  15. #include "srv_manager.h"
  16. #include <os_common_api.h>
  17. #include "video_player.h"
  18. #include "video_player_defs.h"
  19. #include "audio_system.h"
  20. #include "audio_track.h"
  21. #include "vp_engine.h"
  22. #include "dvfs.h"
  23. #include <sys_wakelock.h>
  24. #include <soc_dsp.h>
  25. #include <file_stream.h>
  26. #include <video_mem.h>
  27. #include <ui_mem.h>
  28. #ifdef CONFIG_DVFS
  29. #include "dvfs.h"
  30. #endif
  31. #include "acts_ringbuf.h"
  32. #define AUDIO_WR_THRESHOLD (4*1024)
  33. #define AUDIO_TRACK_BUG_SIZE (1024 + ADPCM_MAX_FRAME_SIZE *2)
  34. #define AUD_TRACK_BUF_PSRAM
  35. #ifdef AUD_TRACK_BUF_PSRAM
  36. static char __aligned(4) audio_track_buf[AUDIO_TRACK_BUG_SIZE] __in_section_unique(VIDEO_PSRAM_REGION);
  37. #endif
  38. video_player_data_t *video_player_data = NULL;
  39. extern unsigned int Samples_per_sec;
  40. static uint32_t t_begin = 0;
  41. static int frame_num = 0;
  42. static int video_dec_stop(video_player_data_t * data, bool mem_release);
  43. static void calculate_fps_check(void);
  44. #define VIDEO_DEC_WORKQ_STACKSIZE (1024*2)
  45. struct k_work_q video_dec_workq;
  46. static uint8_t video_dec_workq_stack[VIDEO_DEC_WORKQ_STACKSIZE] __aligned(4);
  47. static OS_SEM_DEFINE(video_sem, 0, 1);
  48. static char video_frame_buf[sizeof(frame_info_t) * 2];
  49. static void video_dec_work_handle(struct k_work *work);
  50. static K_WORK_DEFINE(video_dec_work, video_dec_work_handle);
  51. static int video_dec_parse_frame(frame_info_t *frame_info);
  52. //load next frame when decoding
  53. static void video_dec_work_handle(struct k_work *work)
  54. {
  55. video_player_data_t *data = video_player_data;
  56. frame_info_t *frame_info;
  57. uint32_t size;
  58. packet_type_t packet_type;
  59. while (acts_ringbuf_space(data->frame_ringbuf) >= sizeof(frame_info_t)) {
  60. frame_info = video_mem_malloc(sizeof(frame_info_t));
  61. video_dec_parse_frame(frame_info);
  62. packet_type = frame_info->packet_type;
  63. size = acts_ringbuf_put(data->frame_ringbuf, frame_info, sizeof(frame_info_t));
  64. video_mem_free(frame_info);
  65. if (packet_type == VIDEO_ES)
  66. break;
  67. }
  68. os_sem_give(&video_sem);
  69. }
  70. static int video_dec_parse_frame(frame_info_t *frame_info)
  71. {
  72. video_player_data_t *data = video_player_data;
  73. int ret = EN_NORMAL;
  74. int padding = 0;
  75. av_buf_t *av_dec_buf = &frame_info->av_dec_buf;
  76. demuxer_packet_t *packet_buf = &data->packet_buf;
  77. if (!packet_buf->data) {
  78. return EN_MEMERR;
  79. }
  80. memset(packet_buf->data, 0, MAX_PACKET_LEN);
  81. ret = data->dem_plugin->getframe(data->dem_handle, packet_buf);
  82. frame_info->pts = packet_buf->pts;
  83. frame_info->packet_type = packet_buf->packet_type;
  84. memset(av_dec_buf, 0, sizeof(av_buf_t));
  85. if (ret != EN_NORMAL)
  86. {
  87. if(EN_FILEISEND)
  88. {
  89. SYS_LOG_INF("### FILE END.");
  90. frame_info->status = FRAME_END;
  91. return ret;
  92. }
  93. else if(EN_FILESTARTPOS)
  94. {
  95. SYS_LOG_INF("### FILE STARTPOS.");
  96. frame_info->status = FRAME_ERROR;
  97. return ret;
  98. }
  99. else
  100. {
  101. SYS_LOG_ERR("get frame failed! ret %d", ret);
  102. frame_info->status = FRAME_ERROR;
  103. return ret;
  104. }
  105. }
  106. av_dec_buf->data_len = packet_buf->data_len;
  107. av_dec_buf->src_para.w = data->video_info.width;
  108. av_dec_buf->src_para.h = data->video_info.height;
  109. av_dec_buf->out_para.w = data->video_info.width;
  110. av_dec_buf->out_para.h = data->video_info.height;
  111. av_dec_buf->file_stream = data->file_stream;
  112. // video
  113. if(packet_buf->packet_type == VIDEO_ES)
  114. {
  115. av_dec_buf->data = data->init_param.alloc(av_dec_buf->data_len);
  116. if (!av_dec_buf->data) {
  117. SYS_LOG_WRN("buf alloc %d fail", av_dec_buf->data_len);
  118. return EN_MEMERR;
  119. }
  120. padding = ((4 - ((av_dec_buf->data_len)&(0x3)))&0x3);
  121. stream_read(av_dec_buf->file_stream, av_dec_buf->data, av_dec_buf->data_len);
  122. //skip padding
  123. if (padding)
  124. {
  125. char *temp_buf = video_mem_malloc(padding);
  126. stream_read(data->file_stream, temp_buf, padding);
  127. video_mem_free(temp_buf);
  128. }
  129. }
  130. // audio
  131. else if(packet_buf->packet_type == AUDIO_ES)
  132. {
  133. av_dec_buf->data = data->init_param.alloc(av_dec_buf->data_len);
  134. if (!av_dec_buf->data) {
  135. SYS_LOG_WRN("buf alloc %d fail", av_dec_buf->data_len);
  136. return EN_MEMERR;
  137. }
  138. memcpy(av_dec_buf->data, packet_buf->data, av_dec_buf->data_len);
  139. }
  140. frame_info->status = FRAME_NORMAL;
  141. return EN_NORMAL;
  142. }
  143. static void calculate_fps_begin(void)
  144. {
  145. if(frame_num == 0)
  146. t_begin = k_cycle_get_32();
  147. }
  148. static void calculate_fps_check(void)
  149. {
  150. uint32_t total_time = 0;
  151. frame_num ++;
  152. total_time = k_cyc_to_us_floor32(k_cycle_get_32() - t_begin);
  153. if(total_time >= 1000000)
  154. {
  155. SYS_LOG_INF("time: %dus, frame: %d", total_time, frame_num);
  156. frame_num = 0;
  157. t_begin = 0;
  158. }
  159. }
  160. static int video_audio_open(video_player_data_t *data)
  161. {
  162. int audio_mode = AUDIO_MODE_MONO; //AUDIO_MODE_STEREO;
  163. dsp_powergate_enable();
  164. #ifdef AUD_TRACK_BUF_PSRAM
  165. data->aud_ringbuf = video_mem_malloc(sizeof(struct acts_ringbuf));
  166. if (data->aud_ringbuf == NULL)
  167. goto err_out;
  168. acts_ringbuf_init(data->aud_ringbuf, audio_track_buf, AUDIO_TRACK_BUG_SIZE);
  169. #else
  170. data->aud_ringbuf = acts_ringbuf_alloc(AUDIO_TRACK_BUG_SIZE);
  171. if (data->aud_ringbuf == NULL)
  172. {
  173. goto err_out;
  174. }
  175. #endif
  176. SYS_LOG_INF("sample rate: %d\n", Samples_per_sec);
  177. data->aud_track = audio_track_create(AUDIO_STREAM_LOCAL_MUSIC,
  178. Samples_per_sec/1000, AUDIO_FORMAT_PCM_16_BIT, audio_mode, data->aud_ringbuf, NULL, NULL);
  179. if (data->aud_track == NULL)
  180. {
  181. goto err_out;
  182. }
  183. data->audio_stream = audio_track_get_stream(data->aud_track);
  184. audio_track_start(data->aud_track);
  185. SYS_LOG_INF("### data->mute %d", data->mute);
  186. audio_track_mute(data->aud_track, data->mute);
  187. audio_track_set_fade_in(data->aud_track, 10);
  188. //bt_transmit_catpure_start(audio_track_get_stream(data->aud_track),
  189. // Samples_per_sec/1000, 1, AUDIO_STREAM_VIDEO);
  190. return 0;
  191. err_out:
  192. if(data->aud_ringbuf)
  193. {
  194. #ifdef AUD_TRACK_BUF_PSRAM
  195. video_mem_free(data->aud_ringbuf);
  196. #else
  197. acts_ringbuf_free(data->aud_ringbuf);
  198. #endif
  199. data->aud_ringbuf = NULL;
  200. }
  201. if(data->aud_track)
  202. {
  203. audio_track_destory(data->aud_track);
  204. data->aud_track = NULL;
  205. dsp_powergate_disable();
  206. }
  207. SYS_LOG_INF("error --");
  208. return -1;
  209. }
  210. static void video_audio_close(video_player_data_t *data)
  211. {
  212. if (data->aud_track) {
  213. audio_track_set_fade_out(data->aud_track, 10);
  214. os_sleep(10);
  215. //bt_transmit_catpure_stop(audio_track_get_stream(data->aud_track));
  216. //audio_track_pause(data->aud_track);
  217. audio_track_stop(data->aud_track);
  218. audio_track_destory(data->aud_track);
  219. data->aud_track = NULL;
  220. dsp_powergate_disable();
  221. }
  222. if(data->aud_ringbuf) {
  223. #ifdef AUD_TRACK_BUF_PSRAM
  224. video_mem_free(data->aud_ringbuf);
  225. #else
  226. acts_ringbuf_free(data->aud_ringbuf);
  227. #endif
  228. data->aud_ringbuf= NULL;
  229. }
  230. }
  231. static int video_dec_init(video_player_data_t **vp_data)
  232. {
  233. video_player_data_t *data;
  234. if(*vp_data) // already open
  235. {
  236. SYS_LOG_ERR("error: video player already open!");
  237. return -1;
  238. }
  239. data = video_mem_malloc(sizeof(video_player_data_t));
  240. if(data == NULL)
  241. {
  242. SYS_LOG_ERR("malloc failed!");
  243. return -1;
  244. }
  245. memset(data, 0, sizeof(video_player_data_t));
  246. data->status = VP_STATUS_IDLE;
  247. data->packet_buf.data = video_mem_malloc(MAX_PACKET_LEN);
  248. if(data == NULL)
  249. {
  250. SYS_LOG_ERR("malloc failed!");
  251. goto err_out;
  252. }
  253. *vp_data = data;
  254. SYS_LOG_INF("ok");
  255. return 0;
  256. err_out:
  257. video_mem_free(data);
  258. return -1;
  259. }
  260. static void video_dec_deinit(video_player_data_t *data)
  261. {
  262. if (data == NULL)
  263. return;
  264. video_dec_stop(data, true);
  265. if(data->decode_buf) {
  266. data->init_param.free(data->decode_buf);
  267. data->decode_buf = NULL;
  268. data->decode_buf_size = 0;
  269. }
  270. if (data->file_stream) {
  271. stream_close(data->file_stream);
  272. stream_destroy(data->file_stream);
  273. data->file_stream = NULL;
  274. }
  275. if (data->packet_buf.data)
  276. video_mem_free(data->packet_buf.data);
  277. if (data)
  278. video_mem_free(data);
  279. SYS_LOG_INF("ok");
  280. }
  281. static int video_dec_set_file(video_player_data_t *data, char *url)
  282. {
  283. unsigned char header_buf[512];
  284. video_data_t video_data = {0};
  285. int ret;
  286. io_stream_t file_stream = NULL;
  287. if (data->file_stream) {
  288. SYS_LOG_INF("file stream has esixt, please close file!");
  289. return -1;
  290. }
  291. file_stream = file_stream_create(url);
  292. if (!file_stream) {
  293. goto err_out;
  294. }
  295. ret = stream_open(file_stream, MODE_IN);
  296. if (ret < 0) {
  297. SYS_LOG_INF("stream_open error !");
  298. goto err_out;
  299. }
  300. ret = stream_read(file_stream, header_buf, 512);
  301. if (ret < 0) {
  302. SYS_LOG_INF("stream_read error !");
  303. goto err_out;
  304. }
  305. if ((header_buf[8] == 'A')&&(header_buf[9] == 'V')&&(header_buf[10] == 'I')&&(header_buf[11] == ' '))
  306. {
  307. SYS_LOG_INF("video format avi");
  308. if (!((header_buf[0x156] == 'A')&&(header_buf[0x157] == 'V')&&(header_buf[0x158] == 'I')&&(header_buf[0x159] == '1')))
  309. {
  310. SYS_LOG_INF("format avi check error !");
  311. goto err_out;
  312. }
  313. }
  314. else
  315. {
  316. SYS_LOG_ERR("video format invalid!");
  317. goto err_out;
  318. }
  319. // seek to head
  320. stream_seek(file_stream, 0, SEEK_DIR_BEG);
  321. data->dem_plugin = avi_api();
  322. data->dec_plugin = mjpeg_api();
  323. data->wav_plugin = adpcm_api();
  324. if(data->dem_plugin==NULL || data->dec_plugin==NULL || data->wav_plugin==NULL)
  325. {
  326. goto err_out;
  327. }
  328. ve_media_info_t media_info;
  329. data->dem_handle = data->dem_plugin->open(file_stream, &media_info);
  330. if (data->dem_handle == NULL)
  331. {
  332. SYS_LOG_ERR("dem_plugin->open failed!");
  333. goto err_out;
  334. }
  335. SYS_LOG_INF("index_flag: %d", media_info.index_flag);
  336. SYS_LOG_INF("v_width: %d", media_info.video_info.width);
  337. SYS_LOG_INF("v_height: %d", media_info.video_info.height);
  338. SYS_LOG_INF("vtotal_time: %d", media_info.video_info.vtotal_time);
  339. SYS_LOG_INF("frame_rate: %d", media_info.video_info.frame_rate);
  340. if (media_info.video_info.width>VIDEO_PIXEL_WIDTH || media_info.video_info.height>VIDEO_PIXEL_HEIGHT)
  341. {
  342. SYS_LOG_ERR("video %dx%d not support!", media_info.video_info.width, media_info.video_info.height);
  343. goto err_out;
  344. }
  345. memcpy(&data->video_info, &media_info.video_info, sizeof(ve_video_info_t));
  346. data->dec_handle = data->dec_plugin->open(&data->video_info);
  347. if (data->dec_handle == NULL)
  348. {
  349. SYS_LOG_ERR("dec_plugin->open failed!");
  350. goto err_out;
  351. }
  352. data->wav_handle = data->wav_plugin->open(NULL);
  353. if (data->wav_handle == NULL)
  354. {
  355. SYS_LOG_ERR("wav_plugin->open failed!");
  356. goto err_out;
  357. }
  358. data->frame_ringbuf = acts_ringbuf_init_ext(video_frame_buf, sizeof(video_frame_buf));
  359. if (data->frame_ringbuf == NULL)
  360. {
  361. SYS_LOG_ERR("ringbuf init failed!");
  362. goto err_out;
  363. }
  364. SYS_LOG_INF("set file ok");
  365. data->file_stream = file_stream;
  366. video_data.height = media_info.video_info.height;
  367. video_data.width = media_info.video_info.width;
  368. return 0;
  369. err_out:
  370. if (data->wav_handle) {
  371. data->wav_plugin->dispose(data->wav_handle);
  372. data->wav_handle = NULL;
  373. }
  374. if (data->dec_handle) {
  375. data->dec_plugin->dispose(data->dec_handle);
  376. data->dec_handle = NULL;
  377. }
  378. if (data->dem_handle) {
  379. data->dem_plugin->dispose(data->dem_handle);
  380. data->dem_handle = NULL;
  381. }
  382. if (file_stream) {
  383. stream_close(file_stream);
  384. stream_destroy(file_stream);
  385. }
  386. data->init_param.cb(VP_STATUS_ERROR, data->init_param.cb_data, NULL);
  387. return -1;
  388. }
  389. static int video_dec_play(video_player_data_t *data)
  390. {
  391. if (data->dem_handle==NULL || data->dec_handle==NULL || data->wav_handle==NULL
  392. || data->file_stream == NULL)
  393. {
  394. return -1;
  395. }
  396. if (data->status == VP_STATUS_PLAYING)
  397. return 0;
  398. if (!data->mute) {
  399. if(video_audio_open(data) != 0)
  400. return -1;
  401. }
  402. if(data->decode_buf == NULL) {
  403. data->decode_buf_size = data->video_info.height * data->video_info.width * 2;
  404. data->decode_buf = data->init_param.alloc(data->decode_buf_size);
  405. }
  406. data->start_time = os_uptime_get_32();
  407. data->status = VP_STATUS_PLAYING;
  408. return 0;
  409. }
  410. static int video_dec_stop(video_player_data_t *data, bool mem_release)
  411. {
  412. if(data->status == VP_STATUS_STOPED)
  413. return 0;
  414. if (!data->mute) {
  415. video_audio_close(data);
  416. }
  417. if (data->dem_handle) {
  418. data->dem_plugin->dispose(data->dem_handle);
  419. data->dem_handle = NULL;
  420. }
  421. if (data->dec_handle) {
  422. data->dec_plugin->dispose(data->dec_handle);
  423. data->dec_handle = NULL;
  424. }
  425. if (data->wav_handle) {
  426. data->wav_plugin->dispose(data->wav_handle);
  427. data->wav_handle = NULL;
  428. }
  429. if (data->file_stream) {
  430. stream_close(data->file_stream);
  431. stream_destroy(data->file_stream);
  432. data->file_stream = NULL;
  433. }
  434. if(mem_release) {
  435. if(data->decode_buf) {
  436. data->init_param.free(data->decode_buf);
  437. data->decode_buf = NULL;
  438. data->decode_buf_size = 0;
  439. }
  440. }
  441. if (data->frame_ringbuf)
  442. {
  443. while (acts_ringbuf_length(data->frame_ringbuf) >= sizeof(frame_info_t)) {
  444. frame_info_t frame_info;
  445. acts_ringbuf_get(data->frame_ringbuf, &frame_info, sizeof(frame_info_t));
  446. if (frame_info.av_dec_buf.data) {
  447. data->init_param.free(frame_info.av_dec_buf.data);
  448. }
  449. }
  450. acts_ringbuf_destroy_ext(data->frame_ringbuf);
  451. }
  452. data->start_time = 0;
  453. data->cur_pts = 0;
  454. data->status = VP_STATUS_STOPED;
  455. if(data->freq_boot) {
  456. data->freq_boot = 0;
  457. #ifdef CONFIG_ACTS_DVFS_DYNAMIC_LEVEL
  458. dvfs_unset_level(DVFS_LEVEL_HIGH_PERFORMANCE, VIDEODEC_SRV_NAME);
  459. #endif
  460. }
  461. return 0;
  462. }
  463. static int video_dec_pause(video_player_data_t *data, bool mem_release)
  464. {
  465. data->status = VP_STATUS_PAUSED;
  466. if (!data->mute) {
  467. video_audio_close(data);
  468. }
  469. data->init_param.cb(VP_STATUS_PAUSED, data->init_param.cb_data, NULL);
  470. if(mem_release && data->decode_buf) {
  471. data->init_param.free(data->decode_buf);
  472. data->decode_buf = NULL;
  473. data->decode_buf_size = 0;
  474. }
  475. if(data->freq_boot) {
  476. data->freq_boot = 0;
  477. #ifdef CONFIG_ACTS_DVFS_DYNAMIC_LEVEL
  478. dvfs_unset_level(DVFS_LEVEL_HIGH_PERFORMANCE, VIDEODEC_SRV_NAME);
  479. #endif
  480. }
  481. return 0;
  482. }
  483. static int video_dec_resume(video_player_data_t *data)
  484. {
  485. if (!data->mute) {
  486. if(video_audio_open(data) != 0)
  487. return -1;
  488. }
  489. if(data->decode_buf == NULL) {
  490. data->decode_buf_size = data->video_info.height * data->video_info.width * 2;
  491. data->decode_buf = data->init_param.alloc(data->decode_buf_size);
  492. }
  493. data->start_time = os_uptime_get_32() - data->cur_pts;
  494. data->status = VP_STATUS_PLAYING;
  495. return 0;
  496. }
  497. static int video_dec_seek(video_player_data_t *data, uint32_t pos_ms)
  498. {
  499. seek_info_t seek_info = {0};
  500. //bt_transmit_on_seek();
  501. seek_info.seek_cmd = SEEK_TIME;
  502. seek_info.curtime = pos_ms;
  503. data->dem_plugin->seek(data->dem_handle, &seek_info);
  504. return 0;
  505. }
  506. static int video_playing_handle(video_player_data_t *data)
  507. {
  508. frame_info_t frame_info;
  509. av_buf_t *av_dec_buf;
  510. int ret = EN_NORMAL;
  511. int audio_len;
  512. video_data_t video_data;
  513. calculate_fps_begin();
  514. if(!data->freq_boot) {
  515. data->freq_boot = 1;
  516. #ifdef CONFIG_ACTS_DVFS_DYNAMIC_LEVEL
  517. dvfs_set_level(DVFS_LEVEL_HIGH_PERFORMANCE, VIDEODEC_SRV_NAME);
  518. #endif
  519. }
  520. uint32_t size = acts_ringbuf_get(data->frame_ringbuf, &frame_info, sizeof(frame_info_t));
  521. if (size == 0) {
  522. video_dec_parse_frame(&frame_info);
  523. }
  524. data->cur_pts = frame_info.pts;
  525. if (frame_info.status == FRAME_END) {
  526. video_dec_stop(data, false);
  527. data->init_param.cb(VP_STATUS_STOPED, data->init_param.cb_data, NULL);
  528. if (data->init_param.repeat == true && data->user_stop == false) {
  529. video_dec_set_file(data, data->init_param.url);
  530. video_dec_play(data);
  531. }
  532. return EN_FILEISEND;
  533. } else if (frame_info.status == FRAME_ERROR) {
  534. video_dec_stop(data, false);
  535. return EN_DECERR;
  536. }
  537. av_dec_buf = &frame_info.av_dec_buf;
  538. // video
  539. if(frame_info.packet_type == VIDEO_ES)
  540. {
  541. av_dec_buf->outbuf = data->decode_buf;
  542. if(data->init_param.need_decode) {
  543. os_work_submit_to_queue(&video_dec_workq, &video_dec_work);
  544. ret = data->dec_plugin->decode(data->dec_handle, av_dec_buf);
  545. os_sem_take(&video_sem, OS_FOREVER);
  546. video_data.decode_buf_size = data->decode_buf_size;
  547. } else {
  548. memcpy(av_dec_buf->outbuf, av_dec_buf->data, av_dec_buf->data_len);
  549. video_data.decode_buf_size = av_dec_buf->data_len;
  550. }
  551. video_data.decode_buf = (char *)av_dec_buf->outbuf;
  552. video_data.width = data->video_info.width;
  553. video_data.height = data->video_info.height;
  554. video_data.format = 0;
  555. if(ret != EN_NORMAL)
  556. {
  557. SYS_LOG_ERR("dec_plugin.decode failed!");
  558. data->init_param.cb(VP_STATUS_ERROR, data->init_param.cb_data, &video_data);
  559. }
  560. else
  561. {
  562. if (data->mute && data->start_time) {
  563. uint32_t actual_pts = os_uptime_get_32() - data->start_time;
  564. SYS_LOG_DBG("cur_pts: %u, actual_pts: %u", data->cur_pts, actual_pts);
  565. if (data->cur_pts > actual_pts) {
  566. SYS_LOG_DBG("wait time: %u", data->cur_pts - actual_pts);
  567. os_sleep(data->cur_pts - actual_pts);
  568. }
  569. }
  570. data->init_param.cb(VP_STATUS_PLAYING, data->init_param.cb_data, &video_data);
  571. }
  572. calculate_fps_check();
  573. }
  574. // audio
  575. else if(frame_info.packet_type == AUDIO_ES)
  576. {
  577. if (!data->mute && data->aud_track) {
  578. int len;
  579. av_dec_buf->outbuf = data->adpcm_outbuf;
  580. len = data->wav_plugin->decode(data->wav_handle, av_dec_buf);
  581. if (len < EN_NORMAL) {
  582. SYS_LOG_ERR("wav_plugin->decode failed!");
  583. } else {
  584. audio_len = stream_get_length(data->audio_stream);
  585. SYS_LOG_DBG("audio_len : %d", audio_len);
  586. if (audio_len >= AUDIO_WR_THRESHOLD)
  587. {
  588. int wait_time = (audio_len -AUDIO_WR_THRESHOLD)*1000/2/Samples_per_sec;
  589. if (wait_time>0 && wait_time<100) {
  590. SYS_LOG_DBG("wait_time : %d", wait_time);
  591. os_sleep(wait_time);
  592. } else {
  593. if (wait_time)
  594. SYS_LOG_WRN("### wait time: %d ms !!!", wait_time);
  595. }
  596. }
  597. audio_track_write(data->aud_track, (unsigned char *)data->adpcm_outbuf, len);
  598. }
  599. }
  600. }
  601. if(av_dec_buf->data) {
  602. data->init_param.free(av_dec_buf->data);
  603. }
  604. return ret;
  605. }
  606. static int video_error_handle(void)
  607. {
  608. return 0;
  609. }
  610. static void video_dec_handle(video_player_data_t *data)
  611. {
  612. switch(data->status)
  613. {
  614. case VP_STATUS_PLAYING:
  615. video_playing_handle(data);
  616. break;
  617. case VP_STATUS_ERROR:
  618. video_error_handle();
  619. break;
  620. default:
  621. break;
  622. }
  623. }
  624. static void video_cmd_handle(video_player_data_t *data, struct app_msg *msg)
  625. {
  626. int ret;
  627. if (data == NULL) {
  628. goto cmd_handle_finished;
  629. }
  630. switch(msg->cmd)
  631. {
  632. case CMD_VP_OPEN:
  633. memset(&data->init_param, 0, sizeof(video_init_param_t));
  634. memcpy(&data->init_param, msg->ptr, sizeof(video_init_param_t));
  635. SYS_LOG_INF("### CMD_VP_OPEN, url: %s", data->init_param.url);
  636. data->mute = data->init_param.mute;
  637. data->status = VP_STATUS_STOPED;
  638. data->user_stop = false;
  639. if (data->init_param.preload == true) {
  640. ret = video_dec_set_file(data, data->init_param.url);
  641. if (ret)
  642. break;
  643. if (data->decode_buf == NULL) {
  644. data->decode_buf_size = data->video_info.height * data->video_info.width * 2;
  645. data->decode_buf = data->init_param.alloc(data->decode_buf_size);
  646. }
  647. video_playing_handle(data);
  648. data->status = VP_STATUS_PRELOAD;
  649. }
  650. break;
  651. case CMD_VP_CLOSE:
  652. SYS_LOG_INF("### CMD_VP_CLOSE");
  653. if(data->freq_boot) {
  654. data->freq_boot = 0;
  655. #ifdef CONFIG_ACTS_DVFS_DYNAMIC_LEVEL
  656. dvfs_unset_level(DVFS_LEVEL_HIGH_PERFORMANCE, VIDEODEC_SRV_NAME);
  657. #endif
  658. }
  659. break;
  660. case CMD_VP_PLAY:
  661. SYS_LOG_INF("### CMD_VP_PLAY");
  662. data->user_stop = false;
  663. if (data->status == VP_STATUS_IDLE) {
  664. SYS_LOG_WRN("### video not open");
  665. } else if (data->status == VP_STATUS_PRELOAD) {
  666. video_dec_play(data);
  667. } else if (data->status == VP_STATUS_PAUSED) {
  668. video_dec_resume(data);
  669. } else if (data->status == VP_STATUS_STOPED) {
  670. video_dec_set_file(data, data->init_param.url);
  671. video_dec_play(data);
  672. }
  673. break;
  674. case CMD_VP_PAUSE:
  675. SYS_LOG_INF("### CMD_VP_PAUSE");
  676. data->user_stop = true;
  677. if(data->status == VP_STATUS_PLAYING)
  678. {
  679. video_dec_pause(data, (bool)msg->ptr);
  680. }
  681. break;
  682. case CMD_VP_STOP:
  683. SYS_LOG_INF("### CMD_VP_STOP");
  684. data->user_stop = true;
  685. if(data->status == VP_STATUS_PLAYING)
  686. {
  687. video_dec_stop(data, (bool)msg->ptr);
  688. }
  689. break;
  690. case CMD_VP_SEEK:
  691. SYS_LOG_INF("### CMD_VP_SEEK");
  692. if(data->status != VP_STATUS_STOPED && data->status != VP_STATUS_ERROR)
  693. {
  694. video_dec_seek(data, (uint32_t)msg->ptr);
  695. }
  696. break;
  697. case CMD_VP_MUTE:
  698. SYS_LOG_INF("### CMD_VP_MUTE");
  699. data->mute = 1;
  700. break;
  701. case CMD_VP_DEMUTE:
  702. SYS_LOG_INF("### CMD_VP_DEMUTE");
  703. data->mute = 0;
  704. break;
  705. default:
  706. SYS_LOG_ERR("no cmd found!");
  707. break;
  708. }
  709. cmd_handle_finished:
  710. if(msg->sync_sem)
  711. os_sem_give(msg->sync_sem);
  712. }
  713. static void videodec_srv_main_loop(void *parama1, void *parama2, void *parama3)
  714. {
  715. struct app_msg msg = { 0 };
  716. bool terminated = false;
  717. int msg_timeout;
  718. k_work_queue_start(&video_dec_workq, (os_thread_stack_t *)video_dec_workq_stack,
  719. VIDEO_DEC_WORKQ_STACKSIZE, 1, NULL);
  720. k_thread_name_set(&video_dec_workq.thread, "video_dec_workq");
  721. while (!terminated) {
  722. if(video_player_data && video_player_data->status == VP_STATUS_PLAYING)
  723. msg_timeout = 0;
  724. else
  725. msg_timeout = 10;
  726. if (receive_msg(&msg, msg_timeout)) {
  727. SYS_LOG_INF("type %d, value 0x%x, cmd %d\n", msg.type, msg.value, msg.cmd);
  728. switch (msg.type) {
  729. case MSG_VIDEO_PLAYER:
  730. if (msg.cmd == CMD_VP_OPEN) {
  731. if (!video_player_data) {
  732. video_dec_init(&video_player_data);
  733. }
  734. }
  735. video_cmd_handle(video_player_data, &msg);
  736. if (msg.cmd == CMD_VP_CLOSE) {
  737. if (video_player_data) {
  738. video_dec_deinit(video_player_data);
  739. video_player_data = NULL;
  740. }
  741. SYS_LOG_INF("exit --");
  742. }
  743. break;
  744. case MSG_EXIT_APP:
  745. SYS_LOG_INF("### MSG_EXIT_APP");
  746. srv_manager_thread_exit(VIDEODEC_SRV_NAME);
  747. terminated = true;
  748. break;
  749. default:
  750. break;
  751. }
  752. if(msg.callback)
  753. msg.callback(&msg, 0, NULL);
  754. }
  755. if(video_player_data)
  756. {
  757. video_dec_handle(video_player_data);
  758. }
  759. }
  760. }
  761. #define CONFIG_VIDEO_PLAYER_STACKSIZE 4096
  762. static char __aligned(ARCH_STACK_PTR_ALIGN) videodec_srv_stack_area[CONFIG_VIDEO_PLAYER_STACKSIZE];
  763. SERVICE_DEFINE(videodec_srv, videodec_srv_stack_area, sizeof(videodec_srv_stack_area),
  764. 1, BACKGROUND_APP, NULL, NULL, NULL,
  765. videodec_srv_main_loop);