最近,一个朋友考虑做个类似门铃的应用,用PJSIP来做。
验证套装:
要求,带显示屏的那一端能自动显示远端摄像头的视频,且不影响语音通话,但是这个显示要求能通过lvgl的GUI应用来完成。
结合这个需求,做了个简单的demo原型。
结合上一篇解码得到的BITMAP,将BITMAP通过共享内存的方式发给LVGL_DEMO,由GUI负责界面的切换和显示。
因为有h264软解码,rv1106 cpu达到75%,帧率显示15帧,80% CPU。
bitmap显示刷新demo代码
#include "lvgl/lvgl.h" #define LV_HOR_RES 800 #define LV_VER_RES 480 lv_img_dsc_t w = { .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA, .header.always_zero = 0, .header.reserved = 0, .header.w = LV_HOR_RES, .header.h = LV_VER_RES, #ifdef USE_RGB24 .data_size = LV_HOR_RES * LV_VER_RES* 4, #else .data_size = LV_HOR_RES * LV_VER_RES* 3, #endif // .data = w_map, }; static char bitmap_data[LV_HOR_RES * LV_VER_RES* 4]; static lv_obj_t *image_obj = NULL; void flash_image_test(char *data, int data_size) { if (data_size > w.data_size){ printf("data_size:%d, w.data_size:%d\n", data_size, w.data_size); return; } lv_obj_t *Screen = lv_scr_act();//lv_obj_create(NULL); // 创建一个屏幕对象 lv_obj_set_size(Screen, LV_HOR_RES, LV_VER_RES); // 设置屏幕大小 lv_obj_set_style_bg_color(Screen, lv_color_hex(0x000000), 0); // 设置背景色 // 创建LVGL图像对象 if (image_obj == NULL){ image_obj = lv_img_create(Screen); } w.data = data; lv_img_set_src(image_obj, &w); lv_obj_align(image_obj, LV_ALIGN_TOP_RIGHT, 0, 0); //调节位置 lv_scr_load(Screen); } #define VWIDTH 800 #define VHEIGHT 600 #define SEP_LEN 26 int quit = 0; void do_read_test(){ char start_sep[32] = "\0"; uint8_t last_get_flag = 0; int width =0 ; int height =0 ; int temp_value; int count = 0; char file_name[255] = ""; while(!quit){ if (get_shared_buffer() == 0){ do{ last_get_flag = 1; // 获取信号量的锁,确保互斥 P(semid_4_lvgl); memcpy(start_sep, shm_ptr_4_lvgl, SEP_LEN); start_sep[SEP_LEN] = '\0'; if (strstr(start_sep, "s:start")){ count = sscanf((char * )start_sep, "s:start:%d,%d,%d", &temp_value, &width, &height); printf("Client: Data received: %d,width:%d,height:%d,count:%d\n", temp_value, width, height, count); if (count == 3) { char *argbData = shm_ptr_4_lvgl + SEP_LEN; // 释放信号量 V(semid_4_lvgl); // 设置图像对象的数据源为从FLASH读取的数据 memcpy(bitmap_data, argbData, temp_value); static int save_index = 0; save_index++; sprintf(file_name, "/tmp/%d_10.bmp", save_index); flash_image_test(bitmap_data, temp_value); //SaveARGBAsBMP(file_name, argbData, VWIDTH, VHEIGHT); }else{ // 释放信号量 V(semid_4_lvgl); } lv_timer_handler(); }else if (strstr(start_sep, "s:stop")){ printf("Client: Data received: quit\n"); // 释放信号量 V(semid_4_lvgl); break; }else{ // 释放信号量 V(semid_4_lvgl); lv_timer_handler(); usleep(10 * 1000); } }while(1); // 分离共享内存 if (shmdt(shm_ptr_4_lvgl) == -1) { printf("Client: shmdt failed\n"); } } lv_timer_handler(); usleep(20 * 1000); } }
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com