1、添加virfat备份与恢复;

2、修复sensorhub低功耗越界问题;
3、修复rcsp传输相关问题;
4、更新flash_params_v3.bin;
5、修复摄像头、科大讯飞相关问题;
This commit is contained in:
huxi
2025-12-26 15:26:30 +08:00
parent 48416abdf1
commit dc11ee3fc4
78 changed files with 3688 additions and 3538 deletions
@@ -1,3 +1,4 @@
#ifndef UI_TOOL_ENAME
#define UI_TOOL_ENAME
@@ -562,7 +563,7 @@
#define BASEFORM_1355 0XA61000
#define BASEFORM_1356 0XA60C00
#define BASEFORM_1357 0XA63000
#define BASEFORM_1358 0XA83002
#define BASEFORM_1358 0XA83001
#define BASEFORM_1359 0X7C0C0D
#define BASEFORM_136 0X4A3C12
#define BASEFORM_1360 0X7C3002
@@ -1725,17 +1726,14 @@
#define DISCONN_QR_BUTTON 0X303004
#define DISCONN_QR_LAYOUT 0X300C01
#define DISCONN_YES_BUTTON 0X302001
#define DUER_BASEFORM_ERROR 0XA80C00
#define DUER_BASEFORM_RECORD 0XA80C03
#define DUER_BASEFORM_RESPONSE 0XA80C01
#define DUER_BASEFORM_THINK 0XA80C02
#define DUER_ERROR_NOTE 0XA83000
#define DUER_BASEFORM_NOTE 0XA80C00
#define DUER_BASEFORM_RECORD 0XA80C02
#define DUER_BASEFORM_THINK 0XA80C01
#define DUER_NOTE 0XA83000
#define DUER_RECORD_BUTTON 0XA81C00
#define DUER_RECORD_TIME 0XA83C00
#define DUER_RECORD_TXT 0XA83003
#define DUER_RESPONSE_TTS 0XA82000
#define DUER_RESPONSE_TXT 0XA83001
#define DUER_THINKING 0XA82001
#define DUER_RECORD_TXT 0XA83002
#define DUER_THINKING 0XA82000
#define ENGINEERING_MODE_VLIST 0X8A1400
#define FACE_INDEX 0X803C00
#define FINDMY_BINDING 0X942002
@@ -2568,7 +2566,7 @@
#define TIME_UNDISTURB_MODE_START_TIME 0X102800
#define TRANSIT_LOADING_PIC 0X22200C
#define UI_ROTATE 0X0
#define UI_VERSION 0X74A92D3
#define UI_VERSION 0X55236CC
#define UNDISTURB_MODE_ESETTING_BACK_BUTTON 0X102004
#define UNDISTURB_MODE_ESETTING_HOUR_VLIST 0X101401
#define UNDISTURB_MODE_ESETTING_LAYOUT 0X100C05
+1
View File
@@ -59,6 +59,7 @@
#define CFG_VBG_TRIM 47 //保存VBG配置参数id
#define CFG_DIAL_TYPE_SEL 48 //保存VBG配置参数id
#define CFG_DUER_ACCESS_TOKEN 49 //小度token
//#MAX 50
//=================================================================================//
+1 -1
View File
@@ -70,7 +70,7 @@ const int UI_RES_FLASH_TAB_OFFSET = 0x0;
const int config_jpeg_isr_delay_us = 50; //参考值100,最小50
const int JLJPEG_STREAM_ENABLE = 1;
#if TCFG_HOST_UVC_ENABLE
const int config_jpeg_sync_wait_in_irq = 1; //在中断同步等待,效率低
const int config_jpeg_sync_wait_in_irq = 0; //在中断同步等待,效率低
const int config_jpeg_ff_rst_enable = 1; //支持带DRI标志的图片,部分摄像头只输出这种类型的图片
#else
const int config_jpeg_sync_wait_in_irq = 0; //在中断同步等待
+146 -48
View File
@@ -23,16 +23,18 @@ const int CONFIG_LWIP_NET_ENABLE = 1;
set 0-----use ram mem
*/
#define LWIP_MEM_USE_PSRAM 1 //lwip内存分配
#define HTTP_MEM_USE_PSRAM 1 //http内存分配
#define HTTPS_MEM_USE_PSRAM 1 //https内存分配
#define NET_AUDIO_MEM_USE_PSRAM 1 //net_audio内存分配
#define MBEDTLS_MEM_USE_PSRAM 1 //mbedtls库内存分配
#define WEBSOCKET_API_USE_PSRAM 1 //websocket使用psram
/*注意:libmpeg、net_audio、net_down的分配介质需保持一致*/
#define JL_LWIP_USE_PSRAM 0 //lwip使用psram
#define JL_HTTP_USE_PSRAM 0 //http使用psram
#define JL_HTTPS_USE_PSRAM 0 //https使用psram
#define JL_NET_AUDIO_USE_PSRAM 0 //net_audio使用psram
#define JL_MBEDTLS_USE_PSRAM 0 //mbedtls库使用psram
#define JL_WEBSOCKET_USE_PSRAM 0 //websocket使用psram
#define JL_MPEG_USE_PSRAM 0 //libmpeg使用psram
#define JL_NET_DOWN_USE_PSRAM 0 //net_download使用psram
extern void *realloc_psram(void *pv, size_t size);
#if LWIP_MEM_USE_PSRAM
#if JL_LWIP_USE_PSRAM
#define LWIP_ALLOC(size) malloc_psram(size)
#define LWIP_FREE(ptr) free_psram(ptr)
#else
@@ -63,9 +65,7 @@ void lwip_free(void *pv)
}
#if HTTP_MEM_USE_PSRAM
#if JL_HTTP_USE_PSRAM
#define HTTP_MALLOC(size) malloc_psram(size)
#define HTTP_REALLOC(ptr,size) realloc_psram(ptr,size)
#define HTTP_FREE(ptr) free_psram(ptr)
@@ -75,17 +75,17 @@ void lwip_free(void *pv)
#define HTTP_FREE(ptr) free(ptr)
#endif
void *http_malloc(size_t size)
void *jl_http_malloc(size_t size)
{
return HTTP_MALLOC(size);
}
void *http_realloc(void *ptr, size_t size)
void *jl_http_realloc(void *ptr, size_t size)
{
return HTTP_REALLOC(ptr, size);
}
void http_free(void *pv)
void jl_http_free(void *pv)
{
if (pv != NULL) {
HTTP_FREE(pv);
@@ -93,11 +93,7 @@ void http_free(void *pv)
}
#if HTTPS_MEM_USE_PSRAM
#if JL_HTTPS_USE_PSRAM
#define HTTPS_ALLOC(size) malloc_psram(size)
#define HTTPS_FREE(ptr) free_psram(ptr)
#else
@@ -106,12 +102,12 @@ void http_free(void *pv)
#endif
void *https_malloc(size_t size)
void *jl_https_malloc(size_t size)
{
return HTTPS_ALLOC(size);
}
void *https_calloc(unsigned long count, unsigned long size)
void *jl_https_calloc(unsigned long count, unsigned long size)
{
size_t total_size = count * size;
void *p = HTTPS_ALLOC(total_size);
@@ -122,7 +118,7 @@ void *https_calloc(unsigned long count, unsigned long size)
}
void https_free(void *pv)
void jl_https_free(void *pv)
{
if (pv != NULL) {
HTTPS_FREE(pv);
@@ -132,8 +128,7 @@ void https_free(void *pv)
#if NET_AUDIO_MEM_USE_PSRAM
#if JL_NET_AUDIO_USE_PSRAM
#define NET_AUDIO_ALLOC(size) malloc_psram(size)
#define NET_AUDIO_FREE(ptr) free_psram(ptr)
#else
@@ -142,21 +137,24 @@ void https_free(void *pv)
#endif
void *net_audio_malloc(size_t size)
void *jl_net_audio_malloc(size_t size)
{
printf(">>>zwz info: %s %d %s\n", __FUNCTION__, __LINE__, __FILE__);
void *p = NET_AUDIO_ALLOC(size);
return p;
}
void net_audio_free(void *pv)
void jl_net_audio_free(void *pv)
{
printf(">>>zwz info: %s %d %s\n", __FUNCTION__, __LINE__, __FILE__);
if (pv != NULL) {
NET_AUDIO_FREE(pv);
}
}
void *net_audio_calloc(unsigned long count, unsigned long size)
void *jl_net_audio_calloc(unsigned long count, unsigned long size)
{
printf(">>>zwz info: %s %d %s\n", __FUNCTION__, __LINE__, __FILE__);
size_t total = count * size;
void *p = NET_AUDIO_ALLOC(total);
if (p) {
@@ -165,7 +163,11 @@ void *net_audio_calloc(unsigned long count, unsigned long size)
return p;
}
#if MBEDTLS_MEM_USE_PSRAM
#if JL_MBEDTLS_USE_PSRAM
#define MBEDTLS_MALLOC(size) malloc_psram(size)
#define MBEDTLS_FREE(ptr) free_psram(ptr)
#else
@@ -191,44 +193,33 @@ void *jl_mbedtls_calloc(unsigned long count, unsigned long size)
return p;
}
#if WEBSOCKET_API_USE_PSRAM
#if JL_WEBSOCKET_USE_PSRAM
#define WEBSOCKET_API_MALLOC(size) malloc_psram(size)
#define WEBSOCKET_API_REALLOC(ptr, size) realloc_psram(ptr, size)
#define WEBSOCKET_API_REALLOC(ptr,size) realloc_psram(ptr,size)
#define WEBSOCKET_API_FREE(ptr) free_psram(ptr)
#else
#define WEBSOCKET_API_MALLOC(size) malloc(size)
#define WEBSOCKET_API_REALLOC(ptr, size) realloc(ptr, size)
#define WEBSOCKET_API_REALLOC(ptr,size) realloc(ptr,size)
#define WEBSOCKET_API_FREE(ptr) free(ptr)
#endif
void websocket_api_free(void *pv)
{
if (pv != NULL) {
WEBSOCKET_API_FREE(pv);
}
}
void *websocket_api_malloc(size_t size)
{
void *p = WEBSOCKET_API_MALLOC(size);
if (p) {
memset(p, 0, size);
}
return p;
}
void jl_websocket_api_free(void *pv)
{
if (pv != NULL) {
WEBSOCKET_API_FREE(pv);
pv = NULL;
}
}
void *jl_websocket_api_malloc(size_t size)
{
void *p = WEBSOCKET_API_MALLOC(size);
if (p) {
memset(p, 0, size);
}
return p;
}
@@ -245,6 +236,113 @@ void *jl_websocket_api_realloc(void *ptr, size_t size)
{
return WEBSOCKET_API_REALLOC(ptr, size);
}
#if JL_MPEG_USE_PSRAM
#define MPEG_API_MALLOC(size) malloc_psram(size)
#define MPEG_API_REALLOC(ptr,size) realloc_psram(ptr,size)
#define MPEG_API_FREE(ptr) free_psram(ptr)
#else
#define MPEG_API_MALLOC(size) malloc(size)
#define MPEG_API_REALLOC(ptr,size) realloc(ptr,size)
#define MPEG_API_FREE(ptr) free(ptr)
#endif
void jl_mpeg_free(void *pv)
{
if (pv != NULL) {
MPEG_API_FREE(pv);
}
}
void *jl_mpeg_malloc(size_t size)
{
return MPEG_API_MALLOC(size);
}
void *jl_mpeg_calloc(unsigned long count, unsigned long size)
{
size_t total = count * size;
void *p = MPEG_API_MALLOC(total);
if (p) {
memset(p, 0, total);
}
return p;
}
void *jl_mpeg_realloc(void *ptr, size_t size)
{
return MPEG_API_REALLOC(ptr, size);
}
void *jl_mpeg_zalloc(size_t size)
{
void *ptr = MPEG_API_MALLOC(size);
if (ptr != NULL) {
memset(ptr, 0, size);
}
return ptr;
}
#if JL_NET_DOWN_USE_PSRAM
#define NET_DOWN_MALLOC(size) malloc_psram(size)
#define NET_DOWN_REALLOC(ptr,size) realloc_psram(ptr,size)
#define NET_DOWN_FREE(ptr) free_psram(ptr)
#else
#define NET_DOWN_MALLOC(size) malloc(size)
#define NET_DOWN_REALLOC(ptr,size) realloc(ptr,size)
#define NET_DOWN_FREE(ptr) free(ptr)
#endif
void *jl_net_down_malloc(size_t size)
{
return NET_DOWN_MALLOC(size);
}
void *jl_net_down_calloc(unsigned long count, unsigned long size)
{
size_t total_size = count * size;
void *p = NET_DOWN_MALLOC(total_size);
if (p) {
memset(p, 0, count * size);
}
return p;
}
void *jl_net_down_zalloc(size_t size)
{
void *ptr = NET_DOWN_MALLOC(size);
if (ptr) {
memset(ptr, 0, size);
}
return ptr;
}
void *jl_net_down_realloc(void *ptr, size_t size)
{
return NET_DOWN_REALLOC(ptr, size);
}
void jl_net_down_free(void *pv)
{
if (pv != NULL) {
NET_DOWN_FREE(pv);
}
}
#else
const int CONFIG_LWIP_NET_ENABLE = 0;
#endif
@@ -161,6 +161,8 @@ const int FATFS_SUPPORT_DEV_READ_SUCCESSION = 0; //是否保存非对齐读时
const int SDFILE_STORAGE_ENABLE = 1; //sdfile做设备接入VFS,扫描功能使能
const int FATFS_BACKUP_ENABLE = 0; //文件系统安全备份功能使能
const int VIRFAT_FLASH_ENABLE = 0; //精简jifat代码,不使用。
@@ -91,6 +91,13 @@ __check:
u8 *packet = frame.packet;
seqn = (packet[2] << 8) | packet[3];
#if TCFG_APP_VIDEO_EN
if (app_in_mode(APP_MODE_VIDEO)) {
a2dp_media_free_packet(detect->file, packet);
printf("%s curr mode is video\n", __func__);
continue;
}
#endif
/*
* 不检测,一直丢包
+2 -2
View File
@@ -1,4 +1,4 @@
.section .sys.version, "ax"
.long 314161597
.asciz "-@20251215-$2aa6cfb6"
.long 315125570
.asciz "-@20251226-$5dad1964"
@@ -44,7 +44,7 @@ REGISTER_UI_STYLE(STYLE_NAME)
#define DEV_LOGO "sd0"
#define DEV_ROOT "storage/sd0/C/"
#define PHOTO_DIR "PHOTO/"
#define VIDEO_DIR "VIDEO/"
@@ -110,8 +110,9 @@ static void camera_dec_flush(void)
struct element *elm;
elm = ui_core_get_element_by_id(CAM_CAMERA_LAYOUT);
if (elm != NULL) {
/* printf(">>>>>>elm != NULL"); */
/* printf("CAM_CAMERA_LAYOUT REDRAW_ENTER"); */
ui_redraw(CAM_CAMERA_LAYOUT);
/* printf("CAM_CAMERA_LAYOUT REDRAW_EXIT"); */
}
}
static void camera_rec_err()
@@ -180,7 +181,7 @@ static int cam_ctrl_view_video(int enable)
}
static void cam_camera_photo_savc_cb(char *path)
{
if (jljpeg_stream_src_data_get()) {
if (!jljpeg_stream_src_data_get()) {
return;
}
jljpeg_stream_src_data_save_to_file(path);
@@ -264,16 +265,20 @@ static int cam_file_handler_open(int show_temp, char *dir, char *ext_name)
{
cam_file_handler_close();
if (!dev_manager_get_total(1)) {// 获取有效可播放设备数量
log_error("%s %d", __func__, __LINE__);
return -1;
}
struct __dev *dev = dev_manager_find_active(1);//在有效设备中获取活跃设备
/* struct __dev *dev = dev_manager_find_active(1);//在有效设备中获取活跃设备 */
struct __dev *dev = dev_manager_check_by_logo(DEV_LOGO);
if (!dev) {
log_error("%s %d", __func__, __LINE__);
return -1;
}
log_debug("dev_root:%s dir:%s ext:%s \n", dev_manager_get_root_path(dev), dir, ext_name);
//活跃分区 与目标一致
if (!strstr(dev_manager_get_root_path(dev), DEV_ROOT)) {
log_error("%s dev:%s %d", __func__, dev_manager_get_root_path(dev), __LINE__);
return -1;
}
char path[64] = {0};
@@ -693,6 +693,7 @@ static void music_status_check(void *p)
ui_pic_show_image_by_id(SPORTING_MUSIC_PAUSE_START_PIC, 0);
}
}
return;
}
#endif
#if TCFG_APP_MUSIC_EN
@@ -133,12 +133,19 @@ static int ui_ifly_vad_event_cb(ifly_vad_event_enum evt, void *param)
sys_timeout_del(ifly_ui->vad_recv_timer);
ifly_ui->vad_recv_timer = 0;
}
ui_ifly_vad_button_touch(0);
break;
case IFLY_VAD_EVT_NETWORK_RECV_ERROR:
if (ifly_ui->vad_recv_timer) {
sys_timeout_del(ifly_ui->vad_recv_timer);
ifly_ui->vad_recv_timer = 0;
}
UI_MSG_POST("vad_network_recv_error");
break;
case IFLY_VAD_EVT_NETWORK_FAIL:
if (ifly_ui->vad_recv_timer) {
sys_timeout_del(ifly_ui->vad_recv_timer);
ifly_ui->vad_recv_timer = 0;
}
UI_MSG_POST("vad_network_fail");
break;
case IFLY_VAD_EVT_EXIT:
@@ -427,7 +434,6 @@ static void vad_recv_timer_handler(void *priv)
sys_timeout_del(ifly_ui->vad_recv_timer);
ifly_ui->vad_recv_timer = 0;
}
ui_ifly_vad_button_touch(0);
}
static int ifly_vad_button_ontouch(void *ctr, struct element_touch_event *e)
@@ -538,7 +544,11 @@ static int no_connect_ontouch(void *ctr, struct element_touch_event *e)
case ELM_EVENT_TOUCH_R_MOVE:
if (ifly_ui && ifly_ui->cur_layout) {
ui_hide(IFLY_LAYOUT_NO_CONNECT);
ui_show(ifly_ui->cur_layout);
if (ifly_ui->cur_layout != IFLY_LAYOUT_TTS) {
ui_show(IFLY_LAYOUT_VAD);
} else {
ui_show(IFLY_LAYOUT_TTS);
}
return true;
}
break;
@@ -654,6 +664,7 @@ static int vad_no_content()
ifly_ui->cur_layout = IFLY_LAYOUT_VAD;
ifly_ui->show_layout = IFLY_LAYOUT_NO_CONTENT;
ifly_no_content(IFLY_VAD_NO_DATA_CNT_MAX);
ui_ifly_vad_button_touch(0);
return 0;
}
@@ -663,7 +674,7 @@ static int vad_network_fail()
ifly_ui->cur_layout = IFLY_LAYOUT_CONNECTTING;
ifly_ui->show_layout = IFLY_LAYOUT_CONNECT_FAIL;
ifly_no_content(IFLY_VAD_NO_CONN_CNT_MAX);
ui_ifly_vad_button_touch(1);
ui_ifly_vad_button_touch(0);
return 0;
}
@@ -673,7 +684,7 @@ static int vad_network_recv_error()
ifly_ui->cur_layout = IFLY_LAYOUT_VAD;
ifly_ui->show_layout = IFLY_LAYOUT_CONNECT_FAIL;
ifly_no_content(IFLY_VAD_NO_CONN_CNT_MAX);
ui_ifly_vad_button_touch(1);
ui_ifly_vad_button_touch(0);
return 0;
}
@@ -691,6 +702,7 @@ static int ai_think()
{
ui_hide(IFLY_LAYOUT_VAD);
ui_show(IFLY_LAYOUT_AI);
ui_ifly_vad_button_touch(0);
return 0;
}
+5
View File
@@ -112,6 +112,11 @@ static int ui_key_event_prob_handle(void *arg)
struct key_event *key = (struct key_event *)arg;
u16 key_event;
log_debug("[%s] key->event:%d, key->value:%d", __func__, key->event, key->value);
if (app_get_current_mode_name() == APP_MODE_UPDATE ||
app_get_current_mode_name() == APP_MODE_RCSP) {
log_info("%s return", __func__);
return 0; // 传输的时候不处理
}
key_event = jlui_key_event_remap(key, jlui_key_watch_event_table);
if (__this->send_event_cb) {
+32 -4
View File
@@ -72,6 +72,7 @@
#include "audio_config.h"
#include "gpio.h"
#include "app_task.h"
#include "bt.h"
#define LOG_TAG_CONST AVI_VIDEO
#define LOG_TAG "[AVI_VIDEO]"
@@ -109,6 +110,15 @@ static const char *avi_files[] = {
// 可以继续添加更多文件
};
static u16 task_switch_flag;
u16 app_video_task_switch_flag_get()
{
return task_switch_flag;
}
u16 app_video_task_switch_flag_set(u16 flag)
{
task_switch_flag = flag;
return task_switch_flag;
}
/* static u8 __this->param.is_audio_mute = 1; */
#define AVI_FILE_COUNT (sizeof(avi_files) / sizeof(avi_files[0]))
@@ -2044,12 +2054,13 @@ void *get_avi_player_st_handle()
}
#if TCFG_APP_VIDEO_EN
static void app_video_mode_switch(void *priv)
void app_video_mode_switch(void *priv)
{
int ret = FALSE;
u16 flag = (u16)priv;
log_info("%s", __func__);
if (flag != task_switch_flag) {
log_info("\n\n %s, %d \n\n", __func__, __LINE__);
log_info("flag:%d, %d \n", flag, task_switch_flag);
log_info("%s %d %d--%d", __func__, __LINE__, flag, task_switch_flag);
return;
}
@@ -2057,7 +2068,15 @@ static void app_video_mode_switch(void *priv)
if (app_get_current_mode_name() == APP_MODE_VIDEO) {
return;
}
int ret = app_task_switch_to(APP_MODE_VIDEO, NULL_VALUE);
#if TCFG_APP_BT_EN && TCFG_BT_BACKGROUND_ENABLE
if (bt_check_already_initializes()) {
#else
if (1) {
#endif
ret = app_task_switch_to(APP_MODE_VIDEO, NULL_VALUE);
}
if (ret == FALSE) {
sys_timeout_add((void *)(long)task_switch_flag, app_video_mode_switch, 500);
}
@@ -2070,12 +2089,21 @@ void *animig_open(char *name, AVI_PARAM param, int arg)
u8 type = 0;
#if TCFG_APP_VIDEO_EN
#if TCFG_APP_BT_EN && TCFG_BT_BACKGROUND_ENABLE
if (app_get_current_mode_name() != APP_MODE_VIDEO && bt_check_already_initializes()) {
#else
if (app_get_current_mode_name() != APP_MODE_VIDEO) {
#endif
int ret = app_task_switch_to(APP_MODE_VIDEO, NULL_VALUE);
if (ret == FALSE) {
sys_timeout_add((void *)(long)task_switch_flag, app_video_mode_switch, 500);
}
}
#if TCFG_APP_BT_EN && TCFG_BT_BACKGROUND_ENABLE
else {
sys_timeout_add((void *)(long)task_switch_flag, app_video_mode_switch, 500);
}
#endif
#endif
FILE *f = fopen(name, "r");
+71 -3
View File
@@ -6,7 +6,7 @@
#include "pcm_data.h"
#include "mic_data.h"
#include "clock_manager/clock_manager.h"
#include "app_task.h"
#define LOG_TAG_CONST VIDEO_REC
#define LOG_TAG "[VIDEO_REC]"
#define LOG_ERROR_ENABLE
@@ -16,6 +16,8 @@
#define LOG_CLI_ENABLE
#include "debug.h"
#if TCFG_CAMERA_MANAGER_ENABLE
extern void app_video_mode_switch(void *priv);
extern u16 app_video_task_switch_flag_get();
/*
使pcm线程管理mic数据,
ram(11*4k)mic数据仅需要(3*4k+512)
@@ -87,6 +89,27 @@ static void jlcamera_ui_reflush(void)
if (__this && __this->ui_refresh_cb) {
__this->ui_refresh_cb(__this->write_error);
}
#if 0//刷新间隔测试
{
static int last_msec = 0;
static int frame_count_total_interval = 0;
static int frame_count_cnt = 0;
int curr_msec = jiffies_msec();
int interval = curr_msec - last_msec;
if (interval < 1000) {
frame_count_total_interval += interval;
frame_count_cnt ++;
int frame_count_avg = frame_count_total_interval / frame_count_cnt;
int frame_fps = 0 ;
if (frame_count_avg) {
frame_fps = 1000 / frame_count_avg;
}
printf("[camera-ui] avg:%d fps:%d interval%d total:%d cnt:%d\n",
frame_count_avg, frame_fps, interval, frame_count_total_interval, frame_count_cnt);
}
last_msec = curr_msec;
}
#endif
}
/* ------------------------------------------------------------------------------------*/
@@ -397,7 +420,30 @@ static void video_show_task(void *priv)
}
#endif
}
if (camera_manager_data_read(&jpeg_data, &jpeg_data_len) == 0) {
#if 0 //编码间隔
{
static int last_msec = 0;
static int frame_count_total_interval = 0;
static int frame_count_cnt = 0;
int curr_msec = jiffies_msec();
int interval = curr_msec - last_msec;
if (interval < 1000)
{
frame_count_total_interval += interval;
frame_count_cnt ++;
int frame_count_avg = frame_count_total_interval / frame_count_cnt;
int frame_fps = 0 ;
if (frame_count_avg) {
frame_fps = 1000 / frame_count_avg;
}
printf("[camera] avg:%d fps:%d interval%d total:%d cnt:%d\n",
frame_count_avg, frame_fps, interval, frame_count_total_interval, frame_count_cnt);
}
last_msec = curr_msec;
}
#endif
log_char('M');
read_data = 1;
frame_cnt ++;
@@ -409,8 +455,6 @@ static void video_show_task(void *priv)
}
#endif
if (out_fd) { //录像输出
if (!jljpeg_frame_dropping_judge()) {
__this->write_error = AVI_write_frame(out_fd, (char *)jpeg_data, jpeg_data_len, 1);
jljpeg_frame_fill_judge(out_fd, 1); //补帧计算
@@ -419,6 +463,10 @@ static void video_show_task(void *priv)
}
}
camera_manager_read_done(jpeg_data);
if (!out_fd) {
//不录像的时候,主动延时
os_time_dly(6);
}
#if 0
static int cam_last_msec = 0;
static int cam_frame_sum = 0;
@@ -505,6 +553,14 @@ int jlcamera_video_rec_init(void)
if (ret) {
goto __err;
}
#if TCFG_APP_VIDEO_EN
if (app_get_current_mode_name() != APP_MODE_VIDEO) {
int ret = app_task_switch_to(APP_MODE_VIDEO, NULL_VALUE);
if (ret == FALSE) {
sys_timeout_add((void *)(long) app_video_task_switch_flag_get(), app_video_mode_switch, 500);
}
}
#endif
int fps;
camera_manager_get_dev_fps(&fps);
//视频帧率
@@ -524,6 +580,12 @@ __err:
log_error("%s err\n", __func__);
camera_manager_stop();
camera_manager_deinit();
#if TCFG_APP_VIDEO_EN
if (app_get_current_mode_name() == APP_MODE_VIDEO) {
app_mode_stack_clr(APP_MODE_VIDEO);
app_task_switch_back();
}
#endif
if (__this) {
free(__this);
__this = NULL;
@@ -556,6 +618,12 @@ int jlcamera_video_rec_deinit(void)
}
camera_manager_deinit();
#if TCFG_APP_VIDEO_EN
if (app_get_current_mode_name() == APP_MODE_VIDEO) {
app_mode_stack_clr(APP_MODE_VIDEO);
app_task_switch_back();
}
#endif
clock_unlock("camera_video");
__this->busy = 0;
free(__this);