作者 潘浩彬

合并分支 'dev' 到 'master'

Dev



查看合并请求 !9
正在显示 49 个修改的文件 包含 870 行增加392 行删除
... ... @@ -3,7 +3,7 @@
ThirdParty
ModuleLib
备份
linux_kernel
project_build/AUTEL_道通PSDK
project_build/GDU_普宙PSDK
... ...
... ... @@ -40,7 +40,9 @@
"paramterparsing.h": "c",
"megtempcontrol.h": "c",
"jzsdk_uart_send.h": "c",
"espeak_tts.h": "c"
"espeak_tts.h": "c",
"buffersrc.h": "c",
"audiodeal.h": "c"
},
"Codegeex.GenerationPreference": "automatic"
}
\ No newline at end of file
... ...
# 编译链的配置
#1、编译链与设备类型的选择
set(DEVICE_NAME JZ_U3S)
set(DEVICE_NAME JZ_C1)
#上一行为禁止修改行
if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
... ... @@ -31,6 +31,9 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S")
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_U30")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "TF_A1")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
... ...
... ... @@ -146,6 +146,29 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_U30")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
# 添加Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_ON)
# 添加IRCUT 引脚处理模块
set(IRCUT_MODULE VERSION_SWITCH_ON)
# 添加LIGHTING 光源处理模块
set(LIGHTING_MODULE VERSION_SWITCH_ON)
# 添加喊话器模块
set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
# 添加电源管理模块
set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
# 添加Gimbal 云台处理模块
... ...
... ... @@ -290,6 +290,7 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
memcpy(str, sendbuf, 12);
*str_len = 12;
}
break;
case JZ_INSCODE_5BFRAME_FILE_DECODE_DEFEAT:
{
... ... @@ -297,6 +298,7 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
memcpy(str, sendbuf, 12);
*str_len = 12;
}
break;
case JZ_INSCODE_5BFRAME_DEFEAT:
{
... ... @@ -389,15 +391,15 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
}
break;
case JZ_INSCODE_5BFRAME_MUSICLIST_STOP:
case JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE:
{
char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 12);
*str_len = 12;
char sendbuf[14] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x01, 0x00, 0x58, 0x03, 0x00, 0x00, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 14);
*str_len = 14;
}
break;
case JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE:
case JZ_INSCODE_5BFRAME_MUSICLIST_STOP:
{
char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x23};
memcpy(str, sendbuf, 12);
... ... @@ -405,6 +407,8 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
}
break;
break;
case JZ_INSCODE_5BFRAME_OPUS_DECODE_STATUS:
{
char sendbuf[13] = { 0x5b, 0x5b, 0x77, 0x00, 0x0D, 0x00, 0x00, 0x59, 0xf2, 0x00, 0x00, 0x00, 0x23};
... ...
... ... @@ -50,16 +50,16 @@ static T_JZsdkReturnCode JZsdk_Check_Src32(unsigned char *DIR, unsigned char *ch
//3、校验
//将unsigned char的码值转换成U32_t
U32_t CheckSum = 0;
memcpy(&CheckSum, checksum, checksum_len);
if (CheckSum != LocalCheckSum)
U32_t SRC_CheckSum = checksum[0] << 24 | checksum[1] << 16 | checksum[2] << 8 | checksum[3];
if (SRC_CheckSum != LocalCheckSum)
{
JZSDK_LOG_ERROR("checksum error\n");
JZSDK_LOG_ERROR("checksum error local:%x src:%x", LocalCheckSum, SRC_CheckSum);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
JZSDK_LOG_INFO("checksum success\n");
JZSDK_LOG_INFO("checksum success local:%x src:%x", LocalCheckSum, SRC_CheckSum);
ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -75,7 +75,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode)
if (*mode == JZ_FLAGCODE_ON)
{
//先关闭播放
Megaphone_StopPlay(JZ_FLAGCODE_OFF);
//Megaphone_StopPlay(JZ_FLAGCODE_OFF);
//修改滤波
AudioDeal_SetFilterMode(0x01);
... ... @@ -83,7 +83,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode)
else
{
//先关闭播放
Megaphone_StopPlay(JZ_FLAGCODE_OFF);
//Megaphone_StopPlay(JZ_FLAGCODE_OFF);
//修改滤波
AudioDeal_SetFilterMode(0x00);
... ... @@ -322,6 +322,29 @@ T_JZsdkReturnCode Main_APP_Psdk()
JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_U30)
{
//串口设备1初始化
//JZsdk_Uart_Init(UART_DEV_1);
//串口设备2初始化
JZsdk_Uart_Init(UART_DEV_2);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init();
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_C1)
{
//引脚初始化
... ... @@ -349,7 +372,7 @@ int Main_APP_Uart()
//lib库初始化
JZsdk_LibInit();
JZSDK_LOG_INFO("%x,UartVersion%x.%x.%x.%x\n",DEVICE_VERSION,MAJOR_VERSION, MINOR_VERSION, MODIFY_VERSION, DEBUG_VERSION);
JZSDK_LOG_INFO("0x%x,UartVersion%x.%x.%x.%x\n",DEVICE_VERSION,MAJOR_VERSION, MINOR_VERSION, MODIFY_VERSION, DEBUG_VERSION);
//引脚初始化
Ircut_Init();
... ... @@ -543,6 +566,28 @@ int Main_APP_Uart()
}
else if (DEVICE_VERSION == JZ_U30)
{
//串口设备1初始化
JZsdk_Uart_Init(UART_DEV_1);
//串口设备2初始化
JZsdk_Uart_Init(UART_DEV_2);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init();
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
if (DEVICE_VERSION == TF_A1)
{
... ... @@ -707,7 +752,7 @@ static void *Main_WorkModeTask(void *arg)
exit(0);
}
#elif APP_VERSION == APP_PSDK
JZSDK_LOG_INFO("选择开始psdk播报");
#endif
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
... ...
... ... @@ -178,6 +178,23 @@ extern "C" {
#define NET_WORK_TARGET_IPADDR NULL
#define NET_WORK_NETMASK NULL
#elif DEVICE_VERSION == JZ_U30
#define UART_DEV1_NUM "/dev/ttyS1"
#define UART_DEV1_BITRATE (115200)
#define UART_DEV2_NUM "/dev/ttyS2"
#define UART_DEV2_BITRATE (115200)
#define COMM_4G_UART_NUM NULL
#define COMM_4G_UART_BITRATE (0)
#define GIMBAL_UART_NUM NULL
#define GIMBAL_UART_BITRATE (0)
#define NET_WORK_IPADDR NULL
#define NET_WORK_TARGET_IPADDR NULL
#define NET_WORK_NETMASK NULL
#elif DEVICE_VERSION == TF_A1
#define UART_DEV1_NUM "/dev/ttyS2"
#define UART_DEV1_BITRATE (115200)
... ...
... ... @@ -41,6 +41,7 @@
#define JZ_U3 0x0017
#define JZ_U3S 0x0018
#define JZ_U3D 0x0019
#define JZ_U30 0x001A
#define JZ_H150S 0x0013
#define JZ_H150T 0x0015
... ...
... ... @@ -7,19 +7,19 @@
#define VERSION_CHOOSE_H
#include "./ConfigParams.h"
//1~10行 除了D可以修改版本选择 禁止动任何东西
#define DEVICE_VERSION JZ_U3S
#define DEVICE_VERSION JZ_C1
//禁止修改行 选择是串口程序 还是 psdk程序
#define APP_VERSION APP_UART
#define APP_VERSION APP_PSDK
//禁止修改行 板子型号
#define PLATFORM_VERSION PLATFORM_V3S
//禁止修改行 串口连接程序的软件版本号
#define MAJOR_VERSION 0x00
#define MINOR_VERSION 0x00
#define MODIFY_VERSION 0x02
#define DEBUG_VERSION 0x07
#define MAJOR_VERSION 0x01
#define MINOR_VERSION 0x03
#define MODIFY_VERSION 0x09
#define DEBUG_VERSION 0x05
//禁止修改行 滤波方式
#define FILTERING_TYPE HIGH_PASS_FILTERING
... ...
... ... @@ -611,7 +611,6 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop_and_check(int Port, ch
if (CodeLenth != 0)
{
memcpy(checkCode, &getbuf[10], CodeLenth);
JZSDK_LOG_INFO("checkCode :%s", checkCode);
}
else
{
... ... @@ -625,10 +624,12 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop_and_check(int Port, ch
if (getbuf[9] == 0)
{
checkType = JZSDK_CHECK_SUM_TYPE_MD5;
JZSDK_LOG_INFO("checkCode :%s", checkCode);
}
else if (getbuf[9] == 1)
{
checkType = JZSDK_CHECK_SUM_TYPE_SRC32;
JZSDK_LOG_INFO("checkCode :%x", checkCode);
}
else
{
... ... @@ -909,8 +910,10 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_AudioDetailMessage(int Port, char
//4、解析音频名字
char AudioName[128];
int AudioNameLength = 0;
AudioNameLength = frameLenth - 9 - 2;
memcpy(AudioName, getbuf + 9, AudioNameLength);
AudioNameLength = frameLenth - 11 - 2;
memcpy(AudioName, getbuf + 11, AudioNameLength);
JZSDK_LOG_INFO("解析%s",AudioName);
#if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
... ...
... ... @@ -425,7 +425,7 @@ T_JZsdkReturnCode JZsdk_Uart_SentDeal_Reply_Musiclist(int UartPort ,int FrameSeq
//发送音频详细信息帧
T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioDetailMessage(int Uartport, int FrameSequence, unsigned char type ,unsigned char *data, unsigned int datalen)
{
printf("发送播放状态结束\n");
printf("发送音频详细信息\n");
unsigned char sendbuf[256];
int send_buf_len;
... ...
... ... @@ -284,6 +284,27 @@ T_JZsdkReturnCode Pcm_AlsaPlay(struct AudioDealInfo *IndexInfo, unsigned char *b
//当输入的数据长度 》 每次写入音频设备时处理的帧数量384
int UnDeal_samples = num_samples;
// 无论哪种都是暂时不行
// //加入一个降噪
// if (1)
// {
// //降噪处理
// //把数据组成一个数组
// short TempPcm;
// for (int i = 0; i < num_samples; i+=2)
// {
// // TempPcm = (buf[i] & 0xFF) | ((short)buf[i+1] << 8);
// // TempPcm = PcmNoiseReduction(TempPcm);
// // buf[i] = TempPcm & 0xFF;
// // buf[i+1] = (TempPcm >> 8) & 0xFF;
// TempPcm = (buf[i+1] & 0xFF) | ((short)buf[i] << 8);
// TempPcm = PcmNoiseReduction(TempPcm);
// buf[i+1] = TempPcm & 0xFF;
// buf[i] = (TempPcm >> 8) & 0xFF;
// }
// }
while(UnDeal_samples > 0 && IndexInfo->AudioDeal_Alsa_Execute_Flag != JZ_FLAGCODE_OFF)
{
... ...
... ... @@ -59,6 +59,9 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam
//重采样 //仅处理一半样本量
void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen/2, &out_nb_samples);
//void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen, &out_nb_samples);
//JZSDK_LOG_INFO("播放 %d 数据",out_nb_samples
//如果滤波打开
//滤波处理
... ...
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "JZsdkLib.h"
// T_JZsdkReturnCode PcmNoiseReduction(unsigned char *data, int len, int threshold)
// {
// for (int i = 0; i < len; i++)
// {
// if (abs(data) >= 0xFF)
// {
// data[i] = 0;
// }
// }
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
#define NOISE_THRESHOLD 0.05 // 降噪阈值
short PcmNoiseReduction(short data)
{
// 转换为浮点数并进行降噪
short re_data;
float float_buffer = data / 32768.0f;
if (fabs(float_buffer) < NOISE_THRESHOLD)
{
float_buffer = 0.0f; // 如果样本小于阈值,则将其置为零
}
re_data = (short)(float_buffer * 32767.0f); // 溢出处理
return re_data;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file FF_FilterParam.h
* FF_FilterParam.h
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef NOISE_REDUCTION_H
#define NOISE_REDUCTION_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
short PcmNoiseReduction(short data);
#ifdef __cplusplus
}
#endif
#endif
... ...
... ... @@ -141,14 +141,18 @@ void *FF_Resample_Send_And_Get_ResampleData(struct AudioDealInfo *AD_Info, unsig
struct pcm_Resample *ResampleInfo = (struct pcm_Resample *)AD_Info->ResampleInfo;
//按采样率缩放样本数量
*out_nb_samples = av_rescale_rnd(nb_samples, ResampleInfo->Out_SampleRate, ResampleInfo->In_SampleRate, AV_ROUND_UP);
//printf("重采样得到的预计输出样本数量为%d\n",*out_nb_samples);
//放置输出数据的数组
ret = av_samples_alloc(&dst, NULL, 2, *out_nb_samples, AV_SAMPLE_FMT_S16, 0);
if (ret < 0) {
printf("[ERROR][Resample]av_samples_alloc failed\n");
return NULL;
}
//重采样
ret = swr_convert(ResampleInfo->m_swr, &dst, *out_nb_samples, (const uint8_t**)src, nb_samples);
if (ret < 0) {
printf("[ERROR][Resample]swr_convert failed\n");
... ...
... ... @@ -190,7 +190,7 @@ static T_JZsdkReturnCode DeviceMessage_Enter_Default(unsigned char *message)
#endif
//如果为组合版
#if (DEVICE_VERSION == TF_A1 || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S ||DEVICE_VERSION == JZ_U3D)
#if (DEVICE_VERSION == TF_A1 || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S ||DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
// //组合板写入
// snprintf(new_message,128,"光斑y值%d\n",Widget_GetCenter_ValueY());
... ...
... ... @@ -392,7 +392,7 @@ T_JZsdkReturnCode Gimbal_CheckStatus_Angle(int *PitchAngle, int *YawAngle, int *
T_JZsdkReturnCode Gimbal_Obtain_Gimbal_Pitch(int Pitch)
{
//目前 U3和 H1T会接受到云台返回值
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
//不做处理,避免出现什么问题
}
... ...
... ... @@ -38,7 +38,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_init()
#elif DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_C1
// 不用去特地初始化t60的云台
#elif DEVICE_VERSION == JZ_H10 || DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 \
|| DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == TF_A1
|| DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 || DEVICE_VERSION == TF_A1
//设置0度
#else
... ... @@ -94,7 +94,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetRealAngle(int angle)
Ircut_PWM_control(PWM_num);
#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D \
#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 \
|| DEVICE_VERSION == TF_A1
//发送角度给串口2
... ... @@ -139,7 +139,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetPitchRange(int Range)
//还没想好怎么弄
#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D \
#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 \
|| DEVICE_VERSION == TF_A1
if (Range == 0xFF)
... ...
... ... @@ -52,7 +52,7 @@ extern "C" {
#define MAX_PITCH 0
#define MIN_PITCH -600
#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D \
#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 \
|| DEVICE_VERSION == TF_A1
#define PITCH_PWM_MAX 0
... ...
... ... @@ -12,7 +12,7 @@ static int OutPutPower = JZ_FLAGCODE_OFF;
void Ircut_Init()//引脚初始化
{
if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T ||
DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D ||
DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30||
DEVICE_VERSION == TF_A1)
{
V3s_Ircut_Init();
... ... @@ -53,7 +53,7 @@ int Ircut_uInit()
void set_amplifier(int amplifier_mode)
{
if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T ||
DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D ||
DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 ||
DEVICE_VERSION == TF_A1)
{
V3s_set_amplifier(amplifier_mode);
... ... @@ -119,7 +119,7 @@ T_JZsdkReturnCode Ircut_CheckStatus_OutPutPower(int *value)
T_JZsdkReturnCode Ircut_PinControl(int port, int num, int status)
{
if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T ||
DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D ||
DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 ||
DEVICE_VERSION == TF_A1)
{
V3s_PinControl(port, num, status);
... ...
... ... @@ -69,7 +69,7 @@ T_JZsdkReturnCode Lighting_SearchLightControl(int mode)
SearchLight_Mode = mode;
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
return SearchLight_V3S_U3_SearchLightControl(mode);
}
... ... @@ -122,7 +122,7 @@ T_JZsdkReturnCode Lighting_Set_SearchLightLumen(int LeftLumen, int RightLumen)
{
printf("设置%x探照灯灯光亮度\n",DEVICE_VERSION);
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
SearchLight_RightLumen = RightLumen;
SearchLight_LeftLumen = LeftLumen;
... ... @@ -148,7 +148,7 @@ T_JZsdkReturnCode Lighting_Obtain_SearchLightLumen(int LeftLumen, int RightLumen
printf("接收到%x探照灯灯光亮度 左灯%d 右灯%d\n",DEVICE_VERSION, LeftLumen, RightLumen);
//如果是主喊话器副灯的单一设备
if (DEVICE_VERSION == TF_A1 || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
if (DEVICE_VERSION == TF_A1 || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
}
... ... @@ -190,7 +190,7 @@ T_JZsdkReturnCode Lighting_Set_SearchLightFrequency(int value)
{
printf("设置0x%x:探照灯爆闪频率\n",DEVICE_VERSION);
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
return SearchLight_V3S_U3_Set_SearchLightFrequency(value);
}
... ... @@ -248,7 +248,7 @@ T_JZsdkReturnCode Lighting_Obtain_SearchLightTemperature(int LeftTemperature, in
}
//如果是JZ u3
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
//输入温度进温度控制线程
SearchLightTemControl_Set_g_InputTemp(Max_tmeperature);
... ... @@ -302,7 +302,7 @@ T_JZsdkReturnCode Lighting_Set_WarningLight_Status(int status, int mode)
#elif DEVICE_VERSION == TF_A1
return WarningLight_V3S_TFA1_Set_WarningLight_Status(status, mode);
#elif DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D
#elif DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30
return JZsdk_Uart_Send_Set_WarningLight_Status(UART_DEV_2, status, mode);
#else
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ... @@ -363,7 +363,7 @@ T_JZsdkReturnCode Lighting_Set_WarningLight_Color(int color1, int color2)
#elif DEVICE_VERSION == TF_A1
return WarningLight_V3S_TFA1_Set_WarningLight_Color(color1, color2);
#elif DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D
#elif DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30
JZsdk_Uart_Send_Set_WarningLight_Color(UART_DEV_2, color1, color2);
#else
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ...
... ... @@ -85,6 +85,10 @@ static int JZsdk_SearchLightGetLimitTemp(int DeviceMode)
return 70;
break;
case JZ_U30:
return 70;
break;
case TF_A1:
return 70;
break;
... ...
... ... @@ -238,10 +238,17 @@ static void *JZsdk_Kt_Irc_DataDeal_Thread(void *args)
//4、将原始码流数据转换成h264流,为避免多次复制,这里的h264会直接放入视频流管理的缓冲区
JZsdk_RTKMMP_RawData_to_h264(raw_data, raw_data_len);
if (raw_data != NULL)
{
free(raw_data);
raw_data = NULL;
}
if (gary_data != NULL)
{
free(gary_data);
gary_data = NULL;
}
//JZSDK_LOG_DEBUG("得到了一帧红外h264");
}
... ...
... ... @@ -105,6 +105,8 @@ typedef struct IRC_param
unsigned int IRC_outPixelMode; //IRC输出像素模式 RGB888 YUV420
unsigned int RingRepair; //环状修复
//IRC画框坐标
unsigned int RegionBox[4]; // 0 一号点x 1 一号点y 2 二号点x 3 二号点y
... ...
... ... @@ -159,7 +159,7 @@ T_JZsdkReturnCode IRC_SPC_ParamCorrect(struct IRC_param *dealInfo, U16_t *MarkDa
}
}
JZSDK_LOG_INFO("重新计算IPC参数 Avg%f",Avg);
//JZSDK_LOG_INFO("重新计算IPC参数 Avg%f",Avg);
}
... ...
... ... @@ -200,6 +200,14 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize,
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height)
{
return (x + y*width);
}
/*
功能:IRC后处理
... ... @@ -212,6 +220,8 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
if (MirrorImageFlag == JZ_FLAGCODE_ON)
{
int x, y = 0;
int bytes_per_row = dealInfo->Width * 3; // 每行的字节数
unsigned char *temp_row = (unsigned char *)malloc(bytes_per_row); // 临时缓冲区,用于存储一行的像素数据
... ... @@ -221,13 +231,13 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
}
// 遍历图像的每一行
for (int y = 0; y < dealInfo->Height; y++)
for (y = 0; y < dealInfo->Height; y++)
{
// 复制当前行到临时缓冲区
memcpy(temp_row, rgb_data + y * bytes_per_row, bytes_per_row);
// 从右向左(即反向)复制临时缓冲区的数据回原位置
for (int x = 0; x < dealInfo->Width; x++) {
for (x = 0; x < dealInfo->Width; x++) {
int source_index = (dealInfo->Width - 1 - x) * 3; // 计算源像素的索引
int dest_index = x * 3; // 计算目标像素的索引
... ... @@ -242,40 +252,147 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
}
// 在rgb图上画图形
//修复外圈图像
if (dealInfo->RingRepair == JZ_FLAGCODE_ON)
{
int x, y = 0;
//不画
if (dealInfo->RegionMode == 0)
//修复上边
for (x = 2; x <= dealInfo->Width - 2; x++)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
int SourceIndex = Get_2DImage_PointToArray(x, 3, dealInfo->Width, dealInfo->Height) * 3;
int FirstIndex = Get_2DImage_PointToArray(x, 0, dealInfo->Width, dealInfo->Height) * 3;
int SecondIndex = Get_2DImage_PointToArray(x, 1, dealInfo->Width, dealInfo->Height) * 3;
rgb_data[FirstIndex] = rgb_data[SourceIndex];
rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[FirstIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[SecondIndex] = rgb_data[SourceIndex];
rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
}
//画十字
if (dealInfo->RegionMode == 1)
//修复下边
for (x = 2; x <= dealInfo->Width - 2; x++)
{
Stream_rgb888_WriteCross(rgb_data,
dealInfo->Width, dealInfo->Height,
dealInfo->RegionBox[0],
dealInfo->RegionBox[1],
255, 215, 0, 20, 20);
int SourceIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 3, dealInfo->Width, dealInfo->Height) * 3;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
int FirstIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 1, dealInfo->Width, dealInfo->Height) * 3;
int SecondIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 2, dealInfo->Width, dealInfo->Height) * 3;
rgb_data[FirstIndex] = rgb_data[SourceIndex];
rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[FirstIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[SecondIndex] = rgb_data[SourceIndex];
rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
}
//画十字
if (dealInfo->RegionMode == 2)
//修复左边
for (int y = 0; y < dealInfo->Height; y++)
{
Stream_rgb888_WriteRectangle(rgb_data,
dealInfo->Width, dealInfo->Height,
dealInfo->RegionBox[0],
dealInfo->RegionBox[1],
dealInfo->RegionBox[2],
dealInfo->RegionBox[3],
255, 215, 0, 1);
int SourceIndex = Get_2DImage_PointToArray(3, y, dealInfo->Width, dealInfo->Height) * 3;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
int FirstIndex = Get_2DImage_PointToArray(0, y, dealInfo->Width, dealInfo->Height) * 3;
int SecondIndex = Get_2DImage_PointToArray(1, y, dealInfo->Width, dealInfo->Height) * 3;
int ThirdIndex = Get_2DImage_PointToArray(2, y, dealInfo->Width, dealInfo->Height) * 3;
rgb_data[FirstIndex] = rgb_data[SourceIndex];
rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[FirstIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[SecondIndex] = rgb_data[SourceIndex];
rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[ThirdIndex] = rgb_data[SourceIndex];
rgb_data[ThirdIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[ThirdIndex + 2] = rgb_data[SourceIndex + 2];
}
// 修复右边
for (int y = 0; y < dealInfo->Height; y++)
{
int SourceIndex = Get_2DImage_PointToArray(dealInfo->Width - 7, y, dealInfo->Width, dealInfo->Height) * 3;
int FirstIndex = Get_2DImage_PointToArray(dealInfo->Width - 1, y, dealInfo->Width, dealInfo->Height) * 3;
int SecondIndex = Get_2DImage_PointToArray(dealInfo->Width - 2, y, dealInfo->Width, dealInfo->Height) * 3;
int ThirdIndex = Get_2DImage_PointToArray(dealInfo->Width - 3, y, dealInfo->Width, dealInfo->Height) * 3;
int FourthIndex = Get_2DImage_PointToArray(dealInfo->Width - 4, y, dealInfo->Width, dealInfo->Height) * 3;
int FifthIndex = Get_2DImage_PointToArray(dealInfo->Width - 5, y, dealInfo->Width, dealInfo->Height) * 3;
int SixthIndex = Get_2DImage_PointToArray(dealInfo->Width - 6, y, dealInfo->Width, dealInfo->Height) * 3;
int SeventhIndex = Get_2DImage_PointToArray(dealInfo->Width - 7, y, dealInfo->Width, dealInfo->Height) * 3;
rgb_data[FirstIndex] = rgb_data[SourceIndex];
rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[FirstIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[SecondIndex] = rgb_data[SourceIndex];
rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[ThirdIndex] = rgb_data[SourceIndex];
rgb_data[ThirdIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[ThirdIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[FourthIndex] = rgb_data[SourceIndex];
rgb_data[FourthIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[FourthIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[FifthIndex] = rgb_data[SourceIndex];
rgb_data[FifthIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[FifthIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[SixthIndex] = rgb_data[SourceIndex];
rgb_data[SixthIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[SixthIndex + 2] = rgb_data[SourceIndex + 2];
rgb_data[SeventhIndex] = rgb_data[SourceIndex];
rgb_data[SeventhIndex + 1] = rgb_data[SourceIndex + 1];
rgb_data[SeventhIndex + 2] = rgb_data[SourceIndex + 2];
}
}
// 在rgb图上画图形
// //不画
// if (dealInfo->RegionMode == 0)
// {
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
// //画十字
// if (dealInfo->RegionMode == 1)
// {
// Stream_rgb888_WriteCross(rgb_data,
// dealInfo->Width, dealInfo->Height,
// dealInfo->RegionBox[0],
// dealInfo->RegionBox[1],
// 255, 215, 0, 20, 20);
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
// //画十字
// if (dealInfo->RegionMode == 2)
// {
// Stream_rgb888_WriteRectangle(rgb_data,
// dealInfo->Width, dealInfo->Height,
// dealInfo->RegionBox[0],
// dealInfo->RegionBox[1],
// dealInfo->RegionBox[2],
// dealInfo->RegionBox[3],
// 255, 215, 0, 1);
// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -307,6 +424,10 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u
KtLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
break;
case IRC_DEALMODE_JZSDK:
JZIrcLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
break;
default:
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
break;
... ... @@ -934,7 +1055,7 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
IrcDealCfg->DealWay = IRC_DEALMODE_KTLIB;
IrcDealCfg->DealWay = IRC_DEALMODE_JZSDK;
IrcDealCfg->ImgDataBits = 14; //图像为14位图像
IrcDealCfg->Height = height;
IrcDealCfg->Width = width;
... ... @@ -955,6 +1076,8 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
IrcDealCfg->OutputPixelColorMode = 0;
IrcDealCfg->RingRepair = JZ_FLAGCODE_ON;
//单点部分
IrcDealCfg->FirstSPC_flag = JZ_FLAGCODE_OFF;
IrcDealCfg->SPC_ResetFlag = JZ_FLAGCODE_OFF;
... ...
... ... @@ -505,6 +505,260 @@ static T_JZsdkReturnCode JZIrcLib_SPC(U16_t *ImageData,struct IRC_param *dealInf
}
/******
*
* 两点矫正
*
*
* *****/
T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo)
{
//无图像
if (ImageData == NULL || dealInfo == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
// 如果tpc的斜率和tpc的截距都为0,重新计算斜率与斜距
int allZeroSlope_flag = 1, allZeroDiff_flag = 1;
for (int i = 0; i < dealInfo->PixelNum; i++)
{
if (dealInfo->TPC_Slope[i] != 0)
{
allZeroSlope_flag = 0;
}
if (dealInfo->TPC_Diff[i] != 0) {
allZeroDiff_flag = 0;
}
}
//如果出现tpc的斜率和tpc的截距都为0,重新计算斜率与斜距
if (allZeroSlope_flag && allZeroDiff_flag)
{
double AvgSingleFrame_LowT = 0, AvgSingleFrame_HighT = 0;
for (int i = 0; i < dealInfo->PixelNum; i++)
{
AvgSingleFrame_LowT += dealInfo->LowT_NineFrame_Avg[i];
AvgSingleFrame_HighT += dealInfo->HighT_NineFrame_Avg[i];
}
AvgSingleFrame_LowT = AvgSingleFrame_LowT / dealInfo->PixelNum;
AvgSingleFrame_HighT = AvgSingleFrame_HighT / dealInfo->PixelNum;
for (int i = 0; i < dealInfo->PixelNum; i++)
{
if (dealInfo->HighT_NineFrame_Avg[i] > dealInfo->LowT_NineFrame_Avg[i])
{
dealInfo->TPC_Slope[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]);
}
else
{
dealInfo->TPC_Slope[i] = 0;
}
dealInfo->TPC_Diff[i] = AvgSingleFrame_LowT - dealInfo->TPC_Slope[i] * dealInfo->LowT_NineFrame_Avg[i];
}
}
// 应用两点校正公式
for (int i = 0; i < dealInfo->PixelNum; i++)
{
ImageData[i] = (int)(dealInfo->TPC_Slope[i] * ImageData[i] + dealInfo->TPC_Diff[i]);
if (ImageData[i] < 0)
{
ImageData[i] = 0;
}
else if (ImageData[i] > dealInfo->ExpectedMax)
{
ImageData[i] = dealInfo->ExpectedMax;
}
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; // 返回校正后的灰度数组
}
/*计算直方图均衡化并转换为8位灰度值
U16_t in_str 输入的数据
int in_str_len 输入的数据长度
灰度0为黑色,灰度255为白色
*/
static T_JZsdkReturnCode JZIrcLib_vKT(U16_t *in_str, U8_t **out_str, int *out_str_len, struct IRC_param *dealInfo)
{
//无图像
if (in_str == NULL || dealInfo == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
// 分配输出结果的内存空间
*out_str = (unsigned char*)malloc(sizeof(unsigned char) * dealInfo->PixelNum);
if (*out_str == NULL) {
// 如果内存分配失败,打印错误信息并返回空指针
JZSDK_LOG_ERROR("Error: Memory allocation failed\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
/**********************************************
*
* 获取图像的直方图
*
*
* *****************************************************/
// 初始化变量
unsigned int ThisPixelGray = 0; //当前处理像素点的灰度值
long SumAllLegalGray = 0; //存储的总灰度值
// 分配当前灰度值出现次数的内存空间,并初始化为0
//用于记录每个灰度值在输入向量中出现的次数。具体来说,它是一个无符号整型数组,
//其索引表示灰度值,数组中的值表示该灰度值在输入向量中出现的次数。
//在遍历输入向量时,将每个像素的灰度值记录在相应的 ThisGrayAppendTime 数组中。
//这是直方图均衡化算法中需要用到的一个重要步骤,用于统计每个灰度值的出现次数
//为保证每一个灰度值都被包括,所以用 dealInfo->ExpectedMax 写长度
unsigned int* ThisGrayAppendTime = (unsigned int*)calloc(dealInfo->ExpectedMax + 1, sizeof(unsigned int));
if (ThisGrayAppendTime == NULL) {
JZSDK_LOG_ERROR("Error: Memory allocation failed\n");
free(*out_str);
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
// 遍历输入向量,统计各灰度值出现次数和总灰度和
for (int i = 0; i < dealInfo->PixelNum; ++i)
{
//获取本像素点的灰度值,且避免超过最大灰度值
ThisPixelGray = in_str[i];
if (ThisPixelGray > dealInfo->ExpectedMax)
{
ThisPixelGray = dealInfo->ExpectedMax;
}
//直方图的 x坐标ThisPixelGray 的y值 即次数+1
ThisGrayAppendTime[ThisPixelGray]++;
//计算总灰度值
SumAllLegalGray += ThisPixelGray;
}
/*
注:图像对比度:直方图分布越均匀,图像的对比度越高
图像亮度: 直方图分布越靠右(最大值),则亮度越高
*/
/**********************************************************************************************************/
// 初始化边界值和阈值增益
unsigned int LowLimit = 0; //用于指定直方图均衡化的最低灰度值范围,通常为0。
unsigned int HighLimit = 0; //用于指定直方图均衡化的最高灰度值范围,通常为最大灰度值。
unsigned int VMax = dealInfo->ExpectedMax; //表示输入图像中可能的最大灰度值。
unsigned int VMin = 0; //通常为0,表示输入图像中可能的最小灰度值。
unsigned int ThresholdLimits = dealInfo->Gain * dealInfo->ImgDataBits; //阈值参数,是一个根据增益和位深度计算得出的阈值,用于在直方图均衡化时进行限制,确保输出图像的对比度合适。
double AvgGray = SumAllLegalGray / (dealInfo->PixelNum * 1.0); //平均灰度值,表示输入图像中所有合法灰度值的平均值,用于直方图均衡化算法中计算每个像素点的增益值。
// 计算灰度直方图的边界值,找到合适的灰度范围用于直方图均衡化
for (int i = 0; i < dealInfo->ExpectedMax; ++i)
{
if (LowLimit < dealInfo->LeftDrop) {
LowLimit += ThisGrayAppendTime[i];
VMin = i;
}
if (HighLimit < (dealInfo->PixelNum - dealInfo->RightDrop))
{
HighLimit += ThisGrayAppendTime[i];
VMax = i;
}
}
//(ThresholdLimits / 12) 是一个阈值的限制
//根据增益和位深度计算得出的阈值,用于在直方图均衡化时进行限制,确保输出图像的对比度合适
//将 VMax 增加 (ThresholdLimits / 12) 的目的是为了保证直方图均衡化后的最高灰度值范围与阈值限制的要求相符,
//从而确保输出图像的对比度得到合适的控制,并且不会超出预期的范围。
if (VMax < dealInfo->ExpectedMax - (ThresholdLimits / 12))
{
VMax += (ThresholdLimits / 12); //最大范围右移 1/12个阈值
}
//ThresholdDiff 阈值差异,计算阈值和灰度均值之间的差值
//ThresholdDiff 被计算为 VMax - VMin + (ThresholdLimits / 6.0)
//代表最高和最低灰度值范围之间的差距,再加上阈值的六分之一
//ThresholdDiff 用于衡量最大最小灰度范围的宽度,以确定是否需要对像素进行进一步处理。
double ThresholdDiff = VMax - VMin + (ThresholdLimits / 6.0);
int LowThreshold = 0;
if (AvgGray > (ThresholdDiff / 2.0))
{
//a. 如果 AvgGray 大于 ThresholdDiff / 2.0,则将 LowThreshold 的值设为 AvgGray - (ThresholdDiff / 2.0)
//的无符号整数部分。让 LowThreshold 在保证图像对比度的同时,尽可能地靠近平均灰度值 AvgGray。
LowThreshold = (unsigned int)(AvgGray - (ThresholdDiff / 2.0));
}
else
{
//如果 AvgGray 小于等于 ThresholdDiff / 2.0,则将 LowThreshold 的值设为零。
//避免 LowThreshold 取负值,确保不会对图像的过滤效果产生不良影响。
LowThreshold = 0;
}
//重新计算阈值差值
ThresholdDiff = VMax - LowThreshold;
//避免阈值差值低于阈值限制,
if (ThresholdDiff < ThresholdLimits)
{
ThresholdDiff = ThresholdLimits;
//根据新的阈值差值,重新计算 低阈值
LowThreshold = (unsigned int)(AvgGray - ThresholdDiff / 2.0);
//最大灰度值与低阈值加上阈值限制之间的差异,如果仍然满足条件
if (VMax > LowThreshold + ThresholdLimits)
{
//重新计算阈值差值
ThresholdDiff = VMax - LowThreshold;
}
}
// 对输入向量进行直方图均衡化处理,并转换为8位灰度值
for (int i = 0; i < dealInfo->PixelNum; ++i)
{
//如果该像素点的灰度值小于最小阈值,使其等于最小阈值
//确保直方图均衡化的值不会低于设定的阈值,从而保证图像的对比度和亮度的均衡。
if (in_str[i] < LowThreshold)
{
in_str[i] = LowThreshold;
}
//原始直方图值in_str[i]减去低阈值LowThreshold
//然后乘以一个缩放系数(dealInfo->ExpectedMax / (ThresholdDiff * 1.0)),将结果赋值回in_str[i]。
//目的将直方图的灰度值映射到更广的范围,以增强图像的对比度和细节。
in_str[i] = (unsigned int)((in_str[i] - LowThreshold) * (dealInfo->ExpectedMax / (ThresholdDiff * 1.0)));
//避免超出灰度最大值
if (in_str[i] > dealInfo->ExpectedMax)
{
in_str[i] = dealInfo->ExpectedMax;
}
}
// 将均衡化后的灰度值转换为8位,并存储在输出向量中
//直方图均衡化后的结果进行操作,将每个值转换为8位灰度值。具体操作是将in_str[i]中的值右移(InBits - 8)位
//然后将结果转换为unsigned char类型,存储到输出向量对应的位置上。这样操作的目的是将原本可能不是8位的灰度值转换为8位灰度值,以便后续的处理和存储。
for (int i = 0; i < dealInfo->PixelNum; i += 4) {
(*out_str)[i] = (unsigned char)(in_str[i] >> (dealInfo->ImgDataBits - 8));
(*out_str)[i + 1] = (unsigned char)(in_str[i + 1] >> (dealInfo->ImgDataBits - 8));
(*out_str)[i + 2] = (unsigned char)(in_str[i + 2] >> (dealInfo->ImgDataBits - 8));
(*out_str)[i + 3] = (unsigned char)(in_str[i + 3] >> (dealInfo->ImgDataBits - 8));
}
*out_str_len = dealInfo->PixelNum;
// 释放动态分配的内存空间
free(ThisGrayAppendTime);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
... ... @@ -532,8 +786,76 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
// 如果打开了两点校正
if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC)
{
JZIrcLib_TPC(u16_CorrentData, dealInfo);
}
U8_t *GrayImage = NULL;
int GrayImageLen = 0;
//直方图
JZIrcLib_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);
//图像输出模式
// 图像输出模式
switch (dealInfo->OutputPixelColorMode)
{
case 0: // 默认输出模式
{
// 灰度图转rgb888
IRC_GrayTo_RGB(GrayImage, RGB_data, RGB_dataSize, dealInfo);
}
break;
case 1: // 伪彩输出模式
{
// 灰度图转伪彩rgb888
ret = PseudoColor_Gray2Rgb(GrayImage, RGB_data, RGB_dataSize, dealInfo->PixelNum);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
IRC_GrayTo_RGB(GrayImage, RGB_data, RGB_dataSize, dealInfo);
}
}
break;
case 2: // 气体色彩增强输出模式
{
// 转为rgb
IRC_GrayTo_RGB(GrayImage, RGB_data, RGB_dataSize, dealInfo);
// 灰度图转气体增强rgb888
IRC_DynamicGasesColorEnhance(*RGB_data, U16_data, dealInfo);
}
break;
default:
if (u16_CorrentData != NULL)
{
free(u16_CorrentData);
u16_CorrentData = NULL;
}
if (GrayImage != NULL)
{
free(GrayImage);
GrayImage = NULL;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
break;
}
if (u16_CorrentData != NULL)
{
free(u16_CorrentData);
u16_CorrentData = NULL;
}
if (GrayImage != NULL)
{
free(GrayImage);
GrayImage = NULL;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/* ********************************************************************
*
*
*
***********************************************/
#ifndef JZIRC_LIB_H
#define JZIRC_LIB_H
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "MediaProc/IRC_funtion/IRC_Param.h"
#ifdef __cplusplus
extern "C" {
#endif
T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
U8_t **RGB_data, unsigned int *RGB_dataSize,
struct IRC_param *dealInfo);
#ifdef __cplusplus
}
#endif
#endif
... ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "JZsdkLib.h"
#include "../IRC_data_deal/IRC_data_deal.h"
#include "MediaProc/IRC_funtion/IRC_param.h"
#include "MediaProc/ImageProc/PseudoColor/PseudoColor.h"
/*计算直方图均衡化并转换为8位灰度值
U16_t in_str 输入的数据
int in_str_len 输入的数据长度
灰度0为黑色,灰度255为白色
*/
static T_JZsdkReturnCode Kt_Irc_Histogram_vKT(U16_t *in_str, U8_t **out_str, int *out_str_len, struct IRC_param *dealInfo)
{
//无图像
if (in_str == NULL || dealInfo == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
// 分配输出结果的内存空间
*out_str = (unsigned char*)malloc(sizeof(unsigned char) * dealInfo->PixelNum);
if (*out_str == NULL) {
// 如果内存分配失败,打印错误信息并返回空指针
JZSDK_LOG_ERROR("Error: Memory allocation failed\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
/**********************************************
*
* 获取图像的直方图
*
*
* *****************************************************/
// 初始化变量
unsigned int ThisPixelGray = 0; //当前处理像素点的灰度值
long SumAllLegalGray = 0; //存储的总灰度值
// 分配当前灰度值出现次数的内存空间,并初始化为0
//用于记录每个灰度值在输入向量中出现的次数。具体来说,它是一个无符号整型数组,
//其索引表示灰度值,数组中的值表示该灰度值在输入向量中出现的次数。
//在遍历输入向量时,将每个像素的灰度值记录在相应的 ThisGrayAppendTime 数组中。
//这是直方图均衡化算法中需要用到的一个重要步骤,用于统计每个灰度值的出现次数
//为保证每一个灰度值都被包括,所以用 dealInfo->ExpectedMax 写长度
unsigned int* ThisGrayAppendTime = (unsigned int*)calloc(dealInfo->ExpectedMax + 1, sizeof(unsigned int));
if (ThisGrayAppendTime == NULL) {
JZSDK_LOG_ERROR("Error: Memory allocation failed\n");
free(*out_str);
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
// 遍历输入向量,统计各灰度值出现次数和总灰度和
for (int i = 0; i < dealInfo->PixelNum; ++i)
{
//获取本像素点的灰度值,且避免超过最大灰度值
ThisPixelGray = in_str[i];
if (ThisPixelGray > dealInfo->ExpectedMax)
{
ThisPixelGray = dealInfo->ExpectedMax;
}
//直方图的 x坐标ThisPixelGray 的y值 即次数+1
ThisGrayAppendTime[ThisPixelGray]++;
//计算总灰度值
SumAllLegalGray += ThisPixelGray;
}
/*
注:图像对比度:直方图分布越均匀,图像的对比度越高
图像亮度: 直方图分布越靠右(最大值),则亮度越高
*/
/**********************************************************************************************************/
// 初始化边界值和阈值增益
unsigned int LowLimit = 0; //用于指定直方图均衡化的最低灰度值范围,通常为0。
unsigned int HighLimit = 0; //用于指定直方图均衡化的最高灰度值范围,通常为最大灰度值。
unsigned int VMax = dealInfo->ExpectedMax; //表示输入图像中可能的最大灰度值。
unsigned int VMin = 0; //通常为0,表示输入图像中可能的最小灰度值。
unsigned int ThresholdLimits = dealInfo->Gain * dealInfo->ImgDataBits; //阈值参数,是一个根据增益和位深度计算得出的阈值,用于在直方图均衡化时进行限制,确保输出图像的对比度合适。
double AvgGray = SumAllLegalGray / (dealInfo->PixelNum * 1.0); //平均灰度值,表示输入图像中所有合法灰度值的平均值,用于直方图均衡化算法中计算每个像素点的增益值。
// 计算灰度直方图的边界值,找到合适的灰度范围用于直方图均衡化
for (int i = 0; i < dealInfo->ExpectedMax; ++i)
{
if (LowLimit < dealInfo->LeftDrop) {
LowLimit += ThisGrayAppendTime[i];
VMin = i;
}
if (HighLimit < (dealInfo->PixelNum - dealInfo->RightDrop))
{
HighLimit += ThisGrayAppendTime[i];
VMax = i;
}
}
//(ThresholdLimits / 12) 是一个阈值的限制
//根据增益和位深度计算得出的阈值,用于在直方图均衡化时进行限制,确保输出图像的对比度合适
//将 VMax 增加 (ThresholdLimits / 12) 的目的是为了保证直方图均衡化后的最高灰度值范围与阈值限制的要求相符,
//从而确保输出图像的对比度得到合适的控制,并且不会超出预期的范围。
if (VMax < dealInfo->ExpectedMax - (ThresholdLimits / 12))
{
VMax += (ThresholdLimits / 12); //最大范围右移 1/12个阈值
}
//ThresholdDiff 阈值差异,计算阈值和灰度均值之间的差值
//ThresholdDiff 被计算为 VMax - VMin + (ThresholdLimits / 6.0)
//代表最高和最低灰度值范围之间的差距,再加上阈值的六分之一
//ThresholdDiff 用于衡量最大最小灰度范围的宽度,以确定是否需要对像素进行进一步处理。
double ThresholdDiff = VMax - VMin + (ThresholdLimits / 6.0);
int LowThreshold = 0;
if (AvgGray > (ThresholdDiff / 2.0))
{
//a. 如果 AvgGray 大于 ThresholdDiff / 2.0,则将 LowThreshold 的值设为 AvgGray - (ThresholdDiff / 2.0)
//的无符号整数部分。让 LowThreshold 在保证图像对比度的同时,尽可能地靠近平均灰度值 AvgGray。
LowThreshold = (unsigned int)(AvgGray - (ThresholdDiff / 2.0));
}
else
{
//如果 AvgGray 小于等于 ThresholdDiff / 2.0,则将 LowThreshold 的值设为零。
//避免 LowThreshold 取负值,确保不会对图像的过滤效果产生不良影响。
LowThreshold = 0;
}
//重新计算阈值差值
ThresholdDiff = VMax - LowThreshold;
//避免阈值差值低于阈值限制,
if (ThresholdDiff < ThresholdLimits)
{
ThresholdDiff = ThresholdLimits;
//根据新的阈值差值,重新计算 低阈值
LowThreshold = (unsigned int)(AvgGray - ThresholdDiff / 2.0);
//最大灰度值与低阈值加上阈值限制之间的差异,如果仍然满足条件
if (VMax > LowThreshold + ThresholdLimits)
{
//重新计算阈值差值
ThresholdDiff = VMax - LowThreshold;
}
}
// 对输入向量进行直方图均衡化处理,并转换为8位灰度值
for (int i = 0; i < dealInfo->PixelNum; ++i)
{
//如果该像素点的灰度值小于最小阈值,使其等于最小阈值
//确保直方图均衡化的值不会低于设定的阈值,从而保证图像的对比度和亮度的均衡。
if (in_str[i] < LowThreshold)
{
in_str[i] = LowThreshold;
}
//原始直方图值in_str[i]减去低阈值LowThreshold
//然后乘以一个缩放系数(dealInfo->ExpectedMax / (ThresholdDiff * 1.0)),将结果赋值回in_str[i]。
//目的将直方图的灰度值映射到更广的范围,以增强图像的对比度和细节。
in_str[i] = (unsigned int)((in_str[i] - LowThreshold) * (dealInfo->ExpectedMax / (ThresholdDiff * 1.0)));
//避免超出灰度最大值
if (in_str[i] > dealInfo->ExpectedMax)
{
in_str[i] = dealInfo->ExpectedMax;
}
}
// 将均衡化后的灰度值转换为8位,并存储在输出向量中
//直方图均衡化后的结果进行操作,将每个值转换为8位灰度值。具体操作是将in_str[i]中的值右移(InBits - 8)位
//然后将结果转换为unsigned char类型,存储到输出向量对应的位置上。这样操作的目的是将原本可能不是8位的灰度值转换为8位灰度值,以便后续的处理和存储。
for (int i = 0; i < dealInfo->PixelNum; i += 4) {
(*out_str)[i] = (unsigned char)(in_str[i] >> (dealInfo->ImgDataBits - 8));
(*out_str)[i + 1] = (unsigned char)(in_str[i + 1] >> (dealInfo->ImgDataBits - 8));
(*out_str)[i + 2] = (unsigned char)(in_str[i + 2] >> (dealInfo->ImgDataBits - 8));
(*out_str)[i + 3] = (unsigned char)(in_str[i + 3] >> (dealInfo->ImgDataBits - 8));
}
*out_str_len = dealInfo->PixelNum;
// 释放动态分配的内存空间
free(ThisGrayAppendTime);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/******
*
* 两点矫正
*
*
* *****/
T_JZsdkReturnCode Kt_Irc_TPC(U16_t *ImageData,struct IRC_param *dealInfo)
{
//无图像
if (ImageData == NULL || dealInfo == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
// 如果tpc的斜率和tpc的截距都为0,重新计算斜率与斜距
int allZeroSlope_flag = 1, allZeroDiff_flag = 1;
for (int i = 0; i < dealInfo->PixelNum; i++)
{
if (dealInfo->TPC_Slope[i] != 0)
{
allZeroSlope_flag = 0;
}
if (dealInfo->TPC_Diff[i] != 0) {
allZeroDiff_flag = 0;
}
}
//如果出现tpc的斜率和tpc的截距都为0,重新计算斜率与斜距
if (allZeroSlope_flag && allZeroDiff_flag)
{
double AvgSingleFrame_LowT = 0, AvgSingleFrame_HighT = 0;
for (int i = 0; i < dealInfo->PixelNum; i++)
{
AvgSingleFrame_LowT += dealInfo->LowT_NineFrame_Avg[i];
AvgSingleFrame_HighT += dealInfo->HighT_NineFrame_Avg[i];
}
AvgSingleFrame_LowT = AvgSingleFrame_LowT / dealInfo->PixelNum;
AvgSingleFrame_HighT = AvgSingleFrame_HighT / dealInfo->PixelNum;
for (int i = 0; i < dealInfo->PixelNum; i++)
{
if (dealInfo->HighT_NineFrame_Avg[i] > dealInfo->LowT_NineFrame_Avg[i])
{
dealInfo->TPC_Slope[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]);
}
else
{
dealInfo->TPC_Slope[i] = 0;
}
dealInfo->TPC_Diff[i] = AvgSingleFrame_LowT - dealInfo->TPC_Slope[i] * dealInfo->LowT_NineFrame_Avg[i];
}
}
// 应用两点校正公式
for (int i = 0; i < dealInfo->PixelNum; i++)
{
ImageData[i] = (int)(dealInfo->TPC_Slope[i] * ImageData[i] + dealInfo->TPC_Diff[i]);
if (ImageData[i] < 0)
{
ImageData[i] = 0;
}
else if (ImageData[i] > dealInfo->ExpectedMax)
{
ImageData[i] = dealInfo->ExpectedMax;
}
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; // 返回校正后的灰度数组
}
... ... @@ -43,7 +43,7 @@ T_JZsdkReturnCode MediaProc_Init()
VideoStreamTransCode_Init();
//5、打开默认选项
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND); //默认推送光学摄像头
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头
JZsdk_Kt_Irc_ShutterSwitch(JZ_FLAGCODE_ON);
//6、修改部分参数
... ...
... ... @@ -35,6 +35,7 @@ T_JZsdkReturnCode AudioFile_StartPlay_Interface(unsigned char* FilePath)
AVCodecContext *codec_ctx = NULL;
double total_duration = 0; // 累计播放时间(秒)
int last_printed_second = -1; // 上次打印的秒数,初始化为-1表示还没有打印过
//3、创建一个音频上下文
AVFormatContext *fmt_ctx = avformat_alloc_context();
... ... @@ -157,9 +158,14 @@ T_JZsdkReturnCode AudioFile_StartPlay_Interface(unsigned char* FilePath)
// 累计总持续时间
total_duration += frame_duration;
//JZSDK_LOG_INFO("当前播放时间%f",total_duration);
if (Last_duration != (int)total_duration)
// 检查是否需要打印
int current_second = (int)floor(total_duration); // 获取当前总时间的整数秒部分
if (current_second > last_printed_second)
{
printf("nb:%d rate:%d duration:%f total_duration:%f\n", frame->nb_samples, codec_ctx->sample_rate, frame_duration, total_duration);
printf("nb:%d rate:%d duration:%f total_duration:%f\n", frame->nb_samples, codec_ctx->sample_rate, frame_duration, current_second);
last_printed_second = current_second; // 更新上次打印的秒数
}
AudioFile_Stream_DataInput(frame);
... ...
... ... @@ -872,7 +872,7 @@ T_JZsdkReturnCode Megaphone_Init()
int language = 0x01;
Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
}
else if (OriginValue == ORIGIN_EN)
else
{
int language = 0x11;
Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
... ... @@ -1317,7 +1317,7 @@ T_JZsdkReturnCode Meg_SetVolumeFun(int volume)
{
snprintf(cmdBuffer,128, "amixer set -c 0 Master %d",volume);
}
else if (DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
else if (DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
snprintf(cmdBuffer,128, "amixer sset -c 0 'Headphone' %d unmute",volume);
}
... ...
... ... @@ -26,7 +26,7 @@ T_JZsdkReturnCode Start_voice()
//播放喊话器启动中
Megaphone_TTS_Play("喊话器直连模式启动中", strlen("喊话器直连模式启动中"), JZ_FLAGCODE_OFF);
}
else if (OriginValue == ORIGIN_EN)
else
{
int language = 0x11;
Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
... ... @@ -34,6 +34,7 @@ T_JZsdkReturnCode Start_voice()
//播放喊话器启动中
Megaphone_TTS_Play("The direct connection mode of the speaker is being activated", strlen("The direct connection mode of the speaker is being activated"), JZ_FLAGCODE_OFF);
delayS(2);
}
delayS(4);
... ... @@ -55,7 +56,7 @@ T_JZsdkReturnCode Start_up_and_broadcast_voice()
//播放喊话器启动中
Megaphone_TTS_Play("喊话器准备就绪", strlen("喊话器准备就绪"), JZ_FLAGCODE_OFF);
}
else if (OriginValue == ORIGIN_EN)
else
{
int language = 0x11;
Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
... ... @@ -95,7 +96,7 @@ T_JZsdkReturnCode Start_up_and_broadcast_voice()
//播放喊话器启动中
Megaphone_TTS_Play("喊话器直连模式准备就绪", strlen("喊话器直连模式准备就绪"), JZ_FLAGCODE_OFF);
}
else if (OriginValue == ORIGIN_EN)
else
{
int language = 0x11;
Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
... ...
... ... @@ -56,7 +56,8 @@ static T_JZsdkReturnCode TTS_Synthesis(const char* src_text, const char* params)
while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON)
{
/* 获取合成音频 */
const void* data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
//const void* data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
unsigned char *data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
if (ret != MSP_SUCCESS)
{
break;
... ... @@ -68,6 +69,26 @@ static T_JZsdkReturnCode TTS_Synthesis(const char* src_text, const char* params)
#if TTS_SAVE
fwrite((unsigned char *)data, sizeof(unsigned char), audio_len, fp); // 写入数据
#endif
// //降噪
// if (1)
// {
// //降噪处理
// //把数据组成一个数组
// short TempPcm;
// for (int i = 0; i < audio_len; i+=2)
// {
// TempPcm = ( data[i] & 0xFF) | ((short)data[i+1] << 8);
// TempPcm = PcmNoiseReduction(TempPcm);
// data[i] = TempPcm & 0xFF;
// data[i+1] = (TempPcm >> 8) & 0xFF;
// // TempPcm = (data[i+1] & 0xFF) | ((short)data[i] << 8);
// // TempPcm = PcmNoiseReduction(TempPcm);
// // data[i+1] = TempPcm & 0xFF;
// // data[i] = (TempPcm >> 8) & 0xFF;
// }
// }
//没将数据放入PCM通道
//printf("产生了%d 的数据\n",audio_len);
AudioDeal_PcmDataInput(16000, (unsigned char *)data, audio_len);
... ...
... ... @@ -58,6 +58,9 @@ extern "C" {
#elif DEVICE_VERSION == JZ_U3D
#define MAX_VOLUME (80)
#define MAX_TTS_VOLUME (90)
#elif DEVICE_VERSION == JZ_U30
#define MAX_VOLUME (80)
#define MAX_TTS_VOLUME (90)
#elif DEVICE_VERSION == JZ_U3S
#define MAX_VOLUME (74)
#define MAX_TTS_VOLUME (82)
... ...
... ... @@ -170,9 +170,15 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len
}
//转换
for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) {
pcm_bytes[2 * i] = out[i] & 0xFF;
pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF;
opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS];
for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++)
{
TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
pcm_bytes[2 * i] = TempPcm[i] & 0xFF;
pcm_bytes[2 * i + 1] = (TempPcm[i] >> 8) & 0xFF;
}
AudioDeal_PcmDataInput(RealTimeDecodeRate, pcm_bytes, frame_size*2);
... ...
... ... @@ -391,7 +391,8 @@ static T_JZsdkReturnCode Opus_Decode()
while (1)
{
int i;
unsigned char pcm_bytes[OPUS_MAX_FRAME_SIZE * OPUS_CHANNELS * 2];
opus_int16 TempPcm[OPUS_MAX_FRAME_SIZE * OPUS_CHANNELS];
frame_size = 0;
//读取opus内容
... ... @@ -419,13 +420,14 @@ static T_JZsdkReturnCode Opus_Decode()
//解码完成
printf("decode data to file: %d\r\n", frame_size * OPUS_CHANNELS);
/* Convert to little-endian ordering. */
for (i = 0; i < OPUS_CHANNELS * frame_size; i++) {
pcm_bytes[2 * i] = out[i] & 0xFF;
pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF;
TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
}
//保存解码内容
fwrite(pcm_bytes, sizeof(short), frame_size * OPUS_CHANNELS, fout);
fwrite(TempPcm, sizeof(short), frame_size * OPUS_CHANNELS, fout);
}
DecodeFinsh:
... ...
... ... @@ -469,7 +469,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(int flag, int
//输入亮度
if (flag == 0)
{
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
if (value + widget_volume > 150)
{
... ... @@ -480,7 +480,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(int flag, int
//输入音量
else if (flag == 1)
{
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
{
if (value + widget_lumen > 150 )
{
... ... @@ -617,7 +617,7 @@ int JZsdk_Psdk_UI_io_GetTTSTone_ByValue(int value)
}
if (OriginValue == ORIGIN_EN)
else
{
switch (value)
{
... ... @@ -1007,7 +1007,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_SearchLightLumen(int wheather_control,int
if (wheather_control == AUTO_CONTROL)
{
//u3比较特殊,单片机拉亮度,u3会亮,所以关闭灯的情况下,不准发给处理模块
if ((DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)&& SearchLightMode == JZ_FLAGCODE_OFF)
if ((DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)&& SearchLightMode == JZ_FLAGCODE_OFF)
{
Lumen_sync_flag = JZ_FLAGCODE_ON; //打开u3的同步flag
ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ...
#更新日志
功能表
U3: 云台+喊话器+探照灯
U3S: 云台+喊话器+探照灯+激光+爆闪灯
U3D:云台+喊话器+探照灯+爆闪灯
U30:云台+喊话器+探照灯+爆闪灯
H10:云台+喊话器
H10T:云台+喊话器+4G+对外供电
H150S:云台+喊话器+摄像头
H150T:云台+喊话器+4G+摄像头
H1E:喊话器
H1T:喊话器+4G
A1:喊话器+探照灯
C1:红外相机+摄像头
\ No newline at end of file
... ...
# 2024年8月21日
潘浩彬:创建了git目录,及工程的更新功能
\ No newline at end of file
# 2024年8月21日
潘浩彬:创建了git目录,及工程的更新功能
# 版本0.0.2.6
# 2024年9月2日
潘浩彬:0.0.2.6 更新云台内容,并且更新了滤波
# 版本0.0.2.7
# 2024年9月25日
潘浩彬:
1、更新了红外相机kt库
2、更新了m30滤波
3、增加文件信息帧
4、修改了部分型号的音量
5、增加了外置的超时输入
6、增加了文件校验功能
7、优化了喊话器温控后音量跳转的问题
... ...
... ... @@ -187,7 +187,7 @@ static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
};
static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem);
int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND, //视频流
int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST, //视频流
OFF, //测温模式
ON, //光圈开关
OFF, //冻结开关
... ... @@ -239,15 +239,15 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
{
snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/cn",WIDGET_FILE_DIR);
}
else if (originValue == ORIGIN_EN)
{
snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/en",WIDGET_FILE_DIR);
}
else
{
JZSDK_LOG_ERROR("控件加载错误");
snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/cn",WIDGET_FILE_DIR);
snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/en",WIDGET_FILE_DIR);
}
// else
// {
// JZSDK_LOG_ERROR("控件加载错误");
// snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/cn",WIDGET_FILE_DIR);
// }
//检查是否存在开启测试的文件
if (JZsdk_check_file_exists("/root/ShakedownTest") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
... ...
... ... @@ -257,7 +257,8 @@ static void *DecodeAudioData_task(void *arg)
while (1) {
int i;
unsigned char pcm_bytes[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * 2];
//unsigned char pcm_bytes[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * 2];
opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS];
int frame_size;
/* Read a 16 bits/sample audio frame. 16000/8000*2 */
... ... @@ -283,12 +284,16 @@ static void *DecodeAudioData_task(void *arg)
USER_LOG_INFO("decode data to file: %d\r\n", frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS);
/* Convert to little-endian ordering. */
for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) {
pcm_bytes[2 * i] = out[i] & 0xFF;
pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF;
TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
}
fwrite(TempPcm, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout);
/* Write the decoded audio to file. */
fwrite(pcm_bytes, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout);
//fwrite(pcm_bytes, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout);
}
... ...
... ... @@ -87,7 +87,8 @@ T_DjiReturnCode DjiTest_XPortStartService(void)
}
limitAngle.upperLimit = 300;
limitAngle.lowerLimit = -1000;
//limitAngle.lowerLimit = -1000;
limitAngle.lowerLimit = -350;
djiStat = DjiXPort_SetLimitAngleSync(DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_JOINT_ANGLE, limitAngle);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("set pitch joint angle limit angle for XPort error: 0x%08llX.", djiStat);
... ... @@ -96,6 +97,7 @@ T_DjiReturnCode DjiTest_XPortStartService(void)
limitAngle.upperLimit = 300;
limitAngle.lowerLimit = -800;
//limitAngle.lowerLimit = -300;
djiStat = DjiXPort_SetLimitAngleSync(DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE, limitAngle);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("set pitch euler angle limit angle for XPort error: 0x%08llX.", djiStat);
... ...
# cmake 最低版本要求 第三行名字不能动
cmake_minimum_required(VERSION 2.8)
project(JZ_U3S)
project(JZ_C1)
set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++")
#"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。
... ...
... ... @@ -52,7 +52,7 @@ extern "C" {
#define USER_APP_LICENSE "qHRtELC2A04PRBt1xOJ1pqkowJ2OZqwdAUPqOVc7WcWwVIR3Fnadjakhl0i7F1wnFNUKELlDLaDsCYLIhkzOd0kDPQcCksVk3Dla498xLD3Z1b5BcI+hlZXETwTmi+7Td0k1E3Rnt9OPGdqrA8W9mBg333EGGjARFGDfaK2BHhDexUE8yLoVhwkqk3t/0wV8kbyrlZzKsvo0kMUifbALCoLPoCO622Rdu056z+opYUX1OlXCGhDxVSDD43Oaab5bupcC4CGrmkpfiCvS78H7Uinc9b9Xf5Ocy373Cpoet7blux66DOiH5muSQVcrY3gnVKQVk7GRnO6piQh9mKHDdQ=="
#define USER_DEVELOPER_ACCOUNT "jizhisdk@163.com"
#if (DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_U3|| DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)
#if (DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_U3|| DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
#define USER_BAUD_RATE "921600"
#elif (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T || DEVICE_VERSION == JZ_H10 || DEVICE_VERSION == JZ_C1)
#define USER_BAUD_RATE "230400"
... ...
... ... @@ -222,10 +222,6 @@ int main(int argc, char *argv[])
{
memcpy(psdk_name, "JZ_H1T", sizeof("JZ_H1T"));
}
else if (originValue == ORIGIN_EN)
{
memcpy(psdk_name, "JZ-H1T", sizeof("JZ-H1T"));
}
else
{
memcpy(psdk_name, "JZ_H1T", sizeof("JZ_H1T"));
... ... @@ -244,29 +240,16 @@ int main(int argc, char *argv[])
}
else if (DEVICE_VERSION == JZ_U3S)
{
if (originValue == ORIGIN_DEFAULT || originValue == ORIGIN_CN)
{
memcpy(psdk_name, "JZ_U3S", sizeof("JZ_U3S"));
}
else if (originValue == ORIGIN_EN)
{
memcpy(psdk_name, "JZ-U3S", sizeof("JZ-U3S"));
}
else
{
memcpy(psdk_name, "JZ_U3S", sizeof("JZ_U3S"));
}
}
else if (DEVICE_VERSION == JZ_U3D)
{
if (FIRMWARE_ORIGIN == OVERSEAS_VERSION)
{
memcpy(psdk_name, "JZ-U3D", sizeof("JZ-U3D"));
}
else if (FIRMWARE_ORIGIN == DOMESTIC_VERSION)
{
memcpy(psdk_name, "JZ_U3D", sizeof("JZ_U3D"));
}
else if (DEVICE_VERSION == JZ_U30)
{
memcpy(psdk_name, "JZ_U30", sizeof("JZ_U30"));
}
... ...