最近,一个朋友考虑做个类似门铃的应用,用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
