作者 ookk303

00212更新 2025/1/3

优化了jsdklib的code部分,加入了 最新最潮的osal库
昆腾红外相机修改为最新的sdk,并修复了高低温数据溢出的问题
修复了mp3实时语音的崩溃问题
优化了hal层 处理修改了hal相关的关系
    移除了无帧头帧尾的不健康帧
简化了uart的层,使得再也不会混进奇怪的内容了
    数据传输上限修改至2048,优化了打印,使得数据传输快了
优化了log.c避免log日志没有及时保存导致的丢失
正在显示 53 个修改的文件 包含 1640 行增加269 行删除
... ... @@ -99,7 +99,14 @@
"jzsdk_flagcode.h": "c",
"jzsdk_typedef.h": "c",
"jzsdk_errorcode.h": "c",
"jzsdk_portcode.h": "c"
"jzsdk_portcode.h": "c",
"jzsdk_osal.h": "c",
"jzsdk_time.h": "c",
"jzsdk_task.h": "c",
"jzsdk_semaphore.h": "c",
"jzsdk_filesystm.h": "c",
"jzsdk_memoryadapter.h": "c",
"jzsdk_errorcodedef.h": "c"
},
"Codegeex.GenerationPreference": "automatic",
"C_Cpp.dimInactiveRegions": false
... ...
# 编译链的配置
#1、编译链与设备类型的选择
set(DEVICE_NAME JZ_C1)
set(DEVICE_NAME JZ_H10)
#上一行为禁止修改行
message("**************************JZSDK构建编译开始***************************\n")
... ...
#include <stdio.h>
#include "JZsdkLib.h"
#include "./JZsdk_TaskManagement/TaskManagement.h"
static T_JZsdkReturnCode JZsdk_PrepareSystemEnvironment()
{
T_JZsdkReturnCode ret;
ret = JZsdk_OsalInit();
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
}
else
{
JZSDK_LOG_INFO("JZSDK_OSAL_INIT_SUCCESS");
}
return ret;
}
//初始化sdk
T_JZsdkReturnCode JZsdk_LibInit()
{
//环境初始化
JZsdk_PrepareSystemEnvironment();
//1、初始化log
JZsdk_LoggerInit();
//2、任务管理系统初始化
TaskManagement_Init();
JZSDK_LOG_INFO("Lib加载已完成");
JZSDK_LOG_INFO("JZSDK_LIB_INIT_SUCCESS");
}
\ No newline at end of file
... ...
... ... @@ -19,11 +19,8 @@ extern "C" {
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
#include "JZsdk_Logger/JZsdk_Logger.h"
#include "JZsdk_Osal/JZsdk_FileSystm.h"
#include "JZsdk_Delay/JZsdk_Delay.h"
#include "JZsdk_Code/JZsdk_FLagCode.h"
#include "JZsdk_Osal/JZsdk_MemoryAdapter.h"
#include "JZsdk_Osal/JZsdk_CheckSum/JZsdk_CheckSum.h"
#include "JZsdk_Osal/JZsdk_Osal.h"
/* Exported types ------------------------------------------------------------*/
... ...
... ... @@ -19,10 +19,12 @@ extern "C" {
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
#include "./JZsdk_typedef/JZsdk_typedef.h"
#include "./JZsdk_ReturnCode/JZsdk_ReturnCode.h"
#include "./JZsdk_InsCode.h"
#include "./JZsdk_FLagCode.h"
#include "./JZsdk_ReturnCode.h"
#include "./JZsdk_FileType.h"
#include "./JZsdk_WidgetCode.h"
#include "./JZsdk_DeviceCode.h"
#include "./JZsdk_DefineCode.h"
... ...
... ... @@ -7,62 +7,26 @@
#define JZSDK_DEVICE_CODE_H
//特殊版本号
typedef enum SpecialVersion
{
SPECIAL_NORMAL = 0x01, //普通版本
SPECIAL_DAOTONG = 0x02, //道通版本
}SpecialVersion;
#define SPECIAL_NORMAL 0x01 //普通版本
#define SPECIAL_DAOTONG 0x02 //道通版本
//软件模式
typedef enum AppMode
{
APP_PSDK = 0x01, //psdk设备
APP_UART = 0x02, //串口设备
APP_TEST = 0x03, //测试设备
}AppMode;
#define APP_PSDK 0x01
#define APP_UART 0x02
#define APP_TEST 0x03
//平台选择
typedef enum Platform
{
PLATFORM_H3 = 0x01, //H3平台
PLATFORM_V3S = 0x02, //V3S平台
}Platform;
#define PLATFORM_H3 0x01
#define PLATFORM_V3S 0x02
//固件属地
typedef enum FirmwarePlace
{
OVERSEAS_VERSION = 0x01, //海外版
DOMESTIC_VERSION = 0x02, //国内版
}FirmwarePlace;
#define OVERSEAS_VERSION 0x01
#define DOMESTIC_VERSION 0x02
//加载开关
// typedef enum VersionLoadSwitch
// {
// VERSION_SWITCH_ON = 0x0001, //加载
// VERSION_SWITCH_OFF = 0x0000, //不加载
// }VersionLoadSwitch;
#define VERSION_SWITCH_ON 0x0001 //加载
#define VERSION_SWITCH_OFF 0x0000 //不加载
// //设备名
// typedef enum DeviceName
// {
// JZ_H1E = 0x0011, //H1E
// JZ_H1T = 0x0016, //H1T
// JZ_U3 = 0x0017, //U3
// JZ_U3S = 0x0018, //U3S
// JZ_U3D = 0x0019, //U3D
// JZ_U30 = 0x001A, //U30
// JZ_H150S = 0x0013, //H150S
// JZ_H150T = 0x0015, //H150T
// JZ_H10 = 0x0012, //H10
// JZ_H10T = 0x0014, //H10T
// TF_A1 = 0x1010, //TF-A1
// JZ_C1 = 0x1011, //C1
// }DeviceName;
//设备选择
#define JZ_H1E 0x0011
... ...
/**
********************************************************************
* @file JZsdk_typedef.h
* 用于记录各类码的表
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_TYPEDEF_H
#define JZSDK_TYPEDEF_H
/* Includes ------------------------------------------------------------------*/
#include "../JZsdk_typedef/JZsdk_typedef.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported macro ------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif
... ...
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "./JZsdk_Code.h"
#include "./JZsdk_ReturnCode.h"
//获取返回码的信息
const char* JZsdk_GetReturnCodeMessage(T_JZsdkReturnCode ReturnCode)
... ...
... ... @@ -13,8 +13,7 @@
#define JZSDK_RETURNCODE_H
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "JZsdk_ErrorCode.h"
#include "../JZsdk_typedef/JZsdk_typedef.h"
#ifdef __cplusplus
extern "C" {
... ... @@ -30,21 +29,7 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
//重定义一个返回码
typedef uint64_t T_JZsdkReturnCode;
typedef uint8_t U8_t;
typedef uint16_t U16_t;
typedef uint32_t U32_t;
typedef uint64_t U64_t;
// typedef unsigned long T_JZsdkReturnCode;
// typedef unsigned char U8_t;
// typedef unsigned short U16_t;
// typedef unsigned int U32_t;
// typedef unsigned long U64_t;
typedef double F64_t;
typedef float F32_t;
/* Exported functions --------------------------------------------------------*/
const char* JZsdk_GetReturnCodeMessage(T_JZsdkReturnCode ReturnCode);
... ...
... ... @@ -24,7 +24,9 @@ extern "C" {
typedef enum {
JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS = 0x0000,
JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE = 0x0001,
JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE = 0x0003, //严重错误
JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER = 0x0002, //文件指针错误
JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED = 0x0004, //内存分配失败
} JZ_SYSTEM_Code;
typedef enum {
... ...
/**
********************************************************************
* @file JZsdk_typedef.h
* 用于记录各类码的表
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_TYPEDEF_H
#define JZSDK_TYPEDEF_H
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
#include "./JZsdk_ErrorCodeDef.h"
#include "./JZsdk_FileTypeDef.h"
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported macro ------------------------------------------------------------*/
//重定义一个返回码
typedef uint64_t T_JZsdkReturnCode;
typedef uint8_t U8_t;
typedef uint16_t U16_t;
typedef uint32_t U32_t;
typedef uint64_t U64_t;
// typedef unsigned long T_JZsdkReturnCode;
// typedef unsigned char U8_t;
// typedef unsigned short U16_t;
// typedef unsigned int U32_t;
// typedef unsigned long U64_t;
typedef double F64_t;
typedef float F32_t;
//线程权柄
typedef void *T_JZTaskHandle;
//互斥锁权柄
typedef void *T_JZsdkMutexHandle;
//信号量权柄
typedef void *T_JZsdkSemaHandle;
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif
... ...
#include <stdio.h>
#include "JZsdk_Delay.h"
#include <unistd.h>
/*
* 用于延时(粗略)
* 需要优化
*/
int delayUs(unsigned long msec)
{
usleep(msec);
}
/*
* 用于延时(粗略)
* 需要优化
*/
int delayMs(unsigned long msec)
{
usleep(msec * 1000);
}
/*
* 用于延时(粗略)
* 需要优化
*/
int delayS(unsigned long sec)
{
delayMs(sec * 1000);
}
\ No newline at end of file
... ... @@ -13,7 +13,7 @@
#define CHECK_SUM_H
/* Includes ------------------------------------------------------------------*/
#include "../../JZsdk_Code/JZsdk_Code.h"
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
... ...
... ... @@ -13,7 +13,7 @@
#define JZSDK_CHECK_SUM_H
/* Includes ------------------------------------------------------------------*/
#include "../../JZsdk_Code/JZsdk_Code.h"
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
... ...
#include <stdio.h>
#include "JZsdk_FileSystm.h"
#include "./JZsdk_FileSystm.h"
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
... ... @@ -446,3 +446,16 @@ T_JZsdkReturnCode JZsdk_Fs_ReadFileSize(const unsigned char* FilePath, int *File
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**************
*
* 进行一次系统的保存
*
*
* *****************/
T_JZsdkReturnCode JZsdk_Sync()
{
sync();
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -11,7 +11,7 @@
#define JZSDK_FILESYSTEM_H
/* Includes ------------------------------------------------------------------*/
#include "../JZsdk_Code/JZsdk_Code.h"
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "./JZsdk_FS_Standards.h"
#ifdef __cplusplus
... ... @@ -39,6 +39,7 @@ T_JZsdkReturnCode JZsdk_Fs_ReadFileSize(const unsigned char* FilePath, int *File
T_JZsdkReturnCode JZsdk_copy_file_byC(const char* source_path, const char* dest_path);
T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult(char *systemCmd, unsigned int *result);
T_JZsdkReturnCode JZsdk_RunSystemCmd_ReturnResult_Str(char *systemCmd, unsigned char *str);
T_JZsdkReturnCode JZsdk_Sync();
#ifdef __cplusplus
}
... ...
... ... @@ -3,9 +3,7 @@
#include <stdbool.h>
#include <string.h>
#include "JZsdkLib.h"
#include "./JZsdk_MemoryAdapter.h"
/**********************************
*
... ... @@ -55,3 +53,17 @@ T_JZsdkReturnCode JZsdk_Free(void *ptr)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
void *JZsdk_Osal_Malloc(U32_t size)
{
return malloc(size);
}
void JZsdk_Osal_Free(void *ptr)
{
free(ptr);
}
... ...
... ... @@ -11,7 +11,7 @@
#define JZSDK_MEMORY_ADAPTER_H
/* Includes ------------------------------------------------------------------*/
#include "../JZsdk_Code/JZsdk_Code.h"
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
... ... @@ -26,6 +26,8 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_Malloc(void **ptr, unsigned int size);
T_JZsdkReturnCode JZsdk_Free(void *ptr);
void *JZsdk_Osal_Malloc(U32_t size);
void JZsdk_Osal_Free(void *ptr);
#ifdef __cplusplus
}
... ...
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "./JZsdk_Mutex.h"
/**
* @brief Declare the mutex container, initialize the mutex, and
* create mutex ID.
* @param mutex: pointer to the created mutex ID.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_MutexCreate(T_JZsdkMutexHandle *mutex)
{
int result;
if (!mutex)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
*mutex = malloc(sizeof(pthread_mutex_t));
if (*mutex == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
}
result = pthread_mutex_init(*mutex, NULL);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* @brief Delete the created mutex.
* @param mutex: pointer to the created mutex ID.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_MutexDestroy(T_JZsdkMutexHandle mutex)
{
int result = 0;
if (!mutex)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
result = pthread_mutex_destroy(mutex);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
free(mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* @brief Acquire and lock the mutex when peripheral access is required
* @param mutex: pointer to the created mutex ID.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_MutexLock(T_JZsdkMutexHandle mutex)
{
int result = 0;
if (!mutex)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
result = pthread_mutex_lock(mutex);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* @brief Unlock and release the mutex, when done with the peripheral access.
* @param mutex: pointer to the created mutex ID.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_MutexUnlock(T_JZsdkMutexHandle mutex)
{
int result = 0;
if (!mutex)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
result = pthread_mutex_unlock(mutex);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file JZsdk_FileSystem.h
* 用于文件系统操作
* @file JZsdk_Mutex.h
* JZsdk_Mutex.c 的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_DELAY_H
#define JZSDK_DELAY_H
#ifndef JZSDK_MUTEX_H
#define JZSDK_MUTEX_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
... ... @@ -19,14 +20,17 @@ extern "C" {
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported macro ------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
int delayMs(unsigned long msec);
int delayS(unsigned long sec);
int delayUs(unsigned long msec);
T_JZsdkReturnCode JZsdk_Osal_MutexCreate(T_JZsdkMutexHandle *mutex);
T_JZsdkReturnCode JZsdk_Osal_MutexDestroy(T_JZsdkMutexHandle mutex);
T_JZsdkReturnCode JZsdk_Osal_MutexLock(T_JZsdkMutexHandle mutex);
T_JZsdkReturnCode JZsdk_Osal_MutexUnlock(T_JZsdkMutexHandle mutex);
#ifdef __cplusplus
}
... ...
// #include "../JZsdk_Code/JZsdk_Code.h"
// #include "./JZsdk_Osal.h"
#include "../JZsdk_Code/JZsdk_Code.h"
#include "./JZsdk_Osal.h"
// T_JZsdkReturnCode JZsdk_Osal_TaskCreate(const char *name, void *(*taskFunc)(void *), uint32_t stackSize, void *arg,
// T_JzTaskHandle *task)
static T_JZsdkOsalHandler* g_osalHandler = NULL;
static T_JZsdkReturnCode JZsdk_Platform_RegOsalHandler(const T_JZsdkOsalHandler *osalHandler)
{
g_osalHandler = (T_JZsdkOsalHandler*)osalHandler; // 存储传入的 OSAL 处理器
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkOsalHandler *JZsdk_Platform_GetOsalHandler(void)
{
return g_osalHandler; // 返回已注册的 OSAL 处理器
}
T_JZsdkReturnCode JZsdk_OsalInit()
{
T_JZsdkOsalHandler osalHandler = {
.TaskCreate = JZsdk_Osal_TaskCreate,
.TaskDestroy = JZsdk_Osal_TaskDestroy,
.TaskSleepMs = delayMs,
.MutexCreate= JZsdk_Osal_MutexCreate,
.MutexDestroy = JZsdk_Osal_MutexDestroy,
.MutexLock = JZsdk_Osal_MutexLock,
.MutexUnlock = JZsdk_Osal_MutexUnlock,
.SemaphoreCreate = JZsdk_Osal_SemaphoreCreate,
.SemaphoreDestroy = JZsdk_Osal_SemaphoreDestroy,
.SemaphoreWait = JZsdk_Osal_SemaphoreWait,
.SemaphoreTimedWait = JZsdk_Osal_SemaphoreTimedWait,
.SemaphorePost = JZsdk_Osal_SemaphorePost,
.Malloc = JZsdk_Osal_Malloc,
.Free = JZsdk_Osal_Free,
.GetTimeMs = JZsdk_Osal_GetTimeMs,
.GetTimeUs = JZsdk_Osal_GetTimeUs,
.GetRandomNum = JZsdk_Osal_GetRandomNum,
};
JZsdk_Platform_RegOsalHandler(&osalHandler);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -13,6 +13,14 @@
/* Includes ------------------------------------------------------------------*/
#include "../JZsdk_Code/JZsdk_Code.h"
#include "./JZsdk_CheckSum/JZsdk_CheckSum.h"
#include "./JZsdk_FileSystm/JZsdk_FileSystm.h"
#include "./JZsdk_MemoryAdapter/JZsdk_MemoryAdapter.h"
#include "./JZsdk_Mutex/JZsdk_Mutex.h"
#include "./JZsdk_Semaphore/JZsdk_Semaphore.h"
#include "./JZsdk_Task/JZsdk_Task.h"
#include "./JZsdk_Timer/JZsdk_Timer.h"
#ifdef __cplusplus
extern "C" {
#endif
... ... @@ -20,12 +28,60 @@ extern "C" {
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
typedef void *T_JzTaskHandle;
/****************
*
* osal权柄
*
*
* ******************/
typedef struct {
T_JZsdkReturnCode (*TaskCreate)(const char *name, void *(*taskFunc)(void *),
unsigned int stackSize, void *arg, T_JZTaskHandle *task);
T_JZsdkReturnCode (*TaskDestroy)(T_JZTaskHandle task);
T_JZsdkReturnCode (*TaskSleepMs)(U32_t timeMs);
T_JZsdkReturnCode (*MutexCreate)(T_JZsdkMutexHandle *mutex);
T_JZsdkReturnCode (*MutexDestroy)(T_JZsdkMutexHandle mutex);
T_JZsdkReturnCode (*MutexLock)(T_JZsdkMutexHandle mutex);
T_JZsdkReturnCode (*MutexUnlock)(T_JZsdkMutexHandle mutex);
T_JZsdkReturnCode (*SemaphoreCreate)(U32_t initValue, T_JZsdkSemaHandle *semaphore);
T_JZsdkReturnCode (*SemaphoreDestroy)(T_JZsdkSemaHandle semaphore);
T_JZsdkReturnCode (*SemaphoreWait)(T_JZsdkSemaHandle semaphore);
T_JZsdkReturnCode (*SemaphoreTimedWait)(T_JZsdkSemaHandle semaphore, U32_t waitTimeMs);
T_JZsdkReturnCode (*SemaphorePost)(T_JZsdkSemaHandle semaphore);
T_JZsdkReturnCode (*GetTimeMs)(U32_t *ms);
T_JZsdkReturnCode (*GetTimeUs)(U64_t *us);
T_JZsdkReturnCode (*GetRandomNum)(U16_t *randomNum);
void *(*Malloc)(U32_t size);
void (*Free)(void *ptr);
} T_JZsdkOsalHandler;
/* Exported macro ------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_OsalInit();
T_JZsdkOsalHandler *JZsdk_Platform_GetOsalHandler(void);
#ifdef __cplusplus
... ...
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/time.h>
#include "./JZsdk_Semaphore.h"
/**
* @brief Declare the semaphore container, initialize the semaphore, and
* create semaphore ID.
* @param semaphore: pointer to the created semaphore ID.
* @param initValue: initial value of semaphore.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_SemaphoreCreate(U32_t initValue, T_JZsdkSemaHandle *semaphore)
{
int result;
*semaphore = malloc(sizeof(sem_t));
if (*semaphore == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
}
result = sem_init(*semaphore, 0, (unsigned int) initValue);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* @brief Delete the created semaphore.
* @param semaphore: pointer to the created semaphore ID.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_SemaphoreDestroy(T_JZsdkSemaHandle semaphore)
{
int result;
result = sem_destroy((sem_t *) semaphore);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
free(semaphore);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* @brief Wait the semaphore until token becomes available.
* @param semaphore: pointer to the created semaphore ID.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_SemaphoreWait(T_JZsdkSemaHandle semaphore)
{
int result;
result = sem_wait(semaphore);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* @brief Wait the semaphore until token becomes available.
* @param semaphore: pointer to the created semaphore ID.
* @param waitTime: timeout value of waiting semaphore, unit: millisecond.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_SemaphoreTimedWait(T_JZsdkSemaHandle semaphore, U32_t waitTime)
{
int result;
struct timespec semaphoreWaitTime;
struct timeval systemTime;
gettimeofday(&systemTime, NULL);
systemTime.tv_usec += waitTime * 1000;
if (systemTime.tv_usec >= 1000000)
{
systemTime.tv_sec += systemTime.tv_usec / 1000000;
systemTime.tv_usec %= 1000000;
}
semaphoreWaitTime.tv_sec = systemTime.tv_sec;
semaphoreWaitTime.tv_nsec = systemTime.tv_usec * 1000;
result = sem_timedwait(semaphore, &semaphoreWaitTime);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**
* @brief Release the semaphore token.
* @param semaphore: pointer to the created semaphore ID.
* @return an enum that represents a status of PSDK
*/
T_JZsdkReturnCode JZsdk_Osal_SemaphorePost(T_JZsdkSemaHandle semaphore)
{
int result;
result = sem_post(semaphore);
if (result != 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
/**
********************************************************************
* @file JZsdk_Semaphore.h
* JZsdk_Semaphore.c 的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_SEMAPHORE_H
#define JZSDK_SEMAPHORE_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported macro ------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_Osal_SemaphoreCreate(U32_t initValue, T_JZsdkSemaHandle *semaphore);
T_JZsdkReturnCode JZsdk_Osal_SemaphoreDestroy(T_JZsdkSemaHandle semaphore);
T_JZsdkReturnCode JZsdk_Osal_SemaphoreWait(T_JZsdkSemaHandle semaphore);
T_JZsdkReturnCode JZsdk_Osal_SemaphoreTimedWait(T_JZsdkSemaHandle semaphore, U32_t waitTime);
T_JZsdkReturnCode JZsdk_Osal_SemaphorePost(T_JZsdkSemaHandle semaphore);
#ifdef __cplusplus
}
#endif
#endif
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
... ...
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "./JZsdk_Task.h"
T_JZsdkReturnCode JZsdk_Osal_TaskCreate(const char *name, void *(*taskFunc)(void *), unsigned int stackSize, void *arg,
T_JZTaskHandle *task)
{
int result;
char nameDealed[16] = {0};
//为任务句柄分配内存空间,大小为sizeof(pthread_t)。如果内存分配失败,则返回一个错误代码
*task = malloc(sizeof(pthread_t));
if (*task == NULL) {
return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
}
//使用pthread_create函数创建一个新的线程,传递给它任务函数指针taskFunc和参数arg。如果创建线程失败,则返回一个错误代码
result = pthread_create(*task, NULL, taskFunc, arg);
if (result != 0) {
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//如果任务名称name不为空,则将其拷贝到nameDealed字符数组中(最多拷贝sizeof(nameDealed) - 1个字符)。
if (name != NULL)
strncpy(nameDealed, name, sizeof(nameDealed) - 1);
//使用pthread_setname_np函数将任务线程的名称设置为nameDealed。如果设置线程名称失败,则返回一个错误代码
result = pthread_setname_np(*(pthread_t *) *task, nameDealed);
if (result != 0) {
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
/*int pthread_setcanceltype(int type, int *oldtype);
```
- `type`参数指定了取消类型,可以是以下两个值之一:
- `PTHREAD_CANCEL_DEFERRED`:线程将在下一个取消点取消。取消点是指线程可以响应取消请求的一些特定操作点,例如函数调用、线程等待等。线程将继续运行,直到到达取消点后才会被取消。
- `PTHREAD_CANCEL_ASYNCHRONOUS`:线程立即取消,不论是否在取消点。线程将立即终止执行,不会进行清理操作。这种取消类型可能导致资源泄漏和数据不一致,因此需要谨慎使用。
- `oldtype`参数是一个可选的输出参数,用于获取之前的取消类型。
*/
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
/*
- `state`参数指定了取消状态,可以是以下两个值之一:
- `PTHREAD_CANCEL_ENABLE`:线程可以接收取消请求。
- `PTHREAD_CANCEL_DISABLE`:线程忽略取消请求。
- `oldstate`参数是一个可选的输出参数,用于获取之前的取消状态。
通过调用`pthread_setcancelstate`函数,您可以选择线程的取消状态。默认情况下,线程的取消状态是`PTHREAD_CANCEL_ENABLE`。*/
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode JZsdk_Osal_TaskDestroy(T_JZTaskHandle task)
{
pthread_cancel(*(pthread_t *) task);
free(task);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file JZsdk_Task.h
* JZsdk_Task.c 的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_TASK_H
#define JZSDK_TASK_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported macro ------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_Osal_TaskCreate(const char *name, void *(*taskFunc)(void *), unsigned int stackSize, void *arg,
T_JZTaskHandle *task);
T_JZsdkReturnCode JZsdk_Osal_TaskDestroy(T_JZTaskHandle task);
#ifdef __cplusplus
}
#endif
#endif
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
... ...
#include <sys/time.h> // 为了使用 gettimeofday 函数
#include <time.h> // 为了使用 time 函数
#include "./JZsdk_TimeR.h"
static U32_t s_localTimeMsOffset = 0;
static U64_t s_localTimeUsOffset = 0;
/**
* @brief Get the system time for ms.
* @return an uint32 that the time of system, uint:ms
*/
T_JZsdkReturnCode JZsdk_Osal_GetTimeMs(U32_t *ms)
{
struct timeval time;
gettimeofday(&time, NULL);
*ms = (time.tv_sec * 1000 + time.tv_usec / 1000);
if (s_localTimeMsOffset == 0)
{
s_localTimeMsOffset = *ms;
} else {
*ms = *ms - s_localTimeMsOffset;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode JZsdk_Osal_GetTimeUs(U64_t *us)
{
struct timeval time;
gettimeofday(&time, NULL);
*us = (time.tv_sec * 1000000 + time.tv_usec);
if (s_localTimeUsOffset == 0) {
s_localTimeUsOffset = *us;
} else {
*us = *us - s_localTimeMsOffset;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode JZsdk_Osal_GetRandomNum(U16_t *randomNum)
{
srand(time(NULL));
*randomNum = random() % 65535;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
* 用于延时(粗略)
* 需要优化
*/
T_JZsdkReturnCode delayUs(U32_t msec)
{
usleep(msec);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
* 用于延时(粗略)
* 需要优化
*/
T_JZsdkReturnCode delayMs(U32_t msec)
{
usleep(msec * 1000);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
* 用于延时(粗略)
* 需要优化
*/
T_JZsdkReturnCode delayS(U32_t sec)
{
delayMs(sec * 1000);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file JZsdk_Timer.h
* JZsdk_Timer.c 的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef JZSDK_TIMER_H
#define JZSDK_TIMER_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported macro ------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_Osal_GetTimeMs(U32_t *ms);
T_JZsdkReturnCode JZsdk_Osal_GetTimeUs(U64_t *us);
T_JZsdkReturnCode JZsdk_Osal_GetRandomNum(U16_t *randomNum);
T_JZsdkReturnCode delayUs(U32_t msec);
T_JZsdkReturnCode delayMs(U32_t msec);
T_JZsdkReturnCode delayS(U32_t sec);
#ifdef __cplusplus
}
#endif
#endif
/************************ (C) COPYRIGHT DJI Innovations *******END OF FILE******/
... ...
... ... @@ -25,8 +25,11 @@
#include "JZsdk_Hal.h"
#if APP_VERSION == APP_PSDK
#include "fc_subscription/test_fc_subscription.h"
#endif
#include "DeviceInfo/DeviceInfo.h"
#ifdef MEGAPHONE_CONFIG_STATUS_ON
... ...
... ... @@ -7,19 +7,19 @@
#define VERSION_CHOOSE_H
#include "JZsdk_Base/JZsdk_Code/JZsdk_DeviceCode.h"
//1~10行 除了D可以修改版本选择 禁止动任何东西
#define DEVICE_VERSION JZ_C1
#define DEVICE_VERSION JZ_H10
//禁止修改行 选择是串口程序 还是 psdk程序
#define APP_VERSION APP_PSDK
#define APP_VERSION APP_UART
//禁止修改行 板子型号
#define PLATFORM_VERSION PLATFORM_V3S
//禁止修改行 串口连接程序的软件版本号
#define MAJOR_VERSION 0x01
#define MINOR_VERSION 0x03
#define MODIFY_VERSION 0x09
#define DEBUG_VERSION 0x07
#define MAJOR_VERSION 0x00
#define MINOR_VERSION 0x00
#define MODIFY_VERSION 0x02
#define DEBUG_VERSION 0x12
//禁止修改行 滤波方式
#define FILTERING_TYPE HIGH_PASS_FILTERING
... ...
... ... @@ -59,6 +59,7 @@ T_JZsdkReturnCode JZsdk_HalUsbBulk_Init(void **index, int interfaceNum, int isUs
ret = libusb_init(NULL);
if (ret < 0) {
JZSDK_LOG_ERROR("init usb bulk failed, errno = %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ... @@ -147,6 +148,7 @@ T_JZsdkReturnCode JZsdk_HalUsbBulk_ReadData(void **index ,unsigned char *buf, un
buf, len, &actualLen, LINUX_USB_BULK_TRANSFER_WAIT_FOREVER);
if (ret < 0) {
JZSDK_LOG_ERROR("Read usb bulk data failed, errno = %d", ret);
delayMs(100);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
#endif
... ...
... ... @@ -69,7 +69,7 @@ T_JZsdkReturnCode AudioDeal_Init()
AudioDeakInfo_index->FilterInfo = NULL;
FF_Filter_Init(AudioDeakInfo_index, 0x00);
//初始化mp2音频
//初始化实时
File_Stream_deal_Init(AV_CODEC_ID_MP2);
Audiodeal_status = JZ_FLAGCODE_ON;
... ... @@ -195,11 +195,20 @@ T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer,
//1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志
AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON;
mp3_Stream_Interface_Mp3Data(AudioDeakInfo_index, In_Bitrate, buffer, bytesRead);
T_JZsdkReturnCode ret = mp3_Stream_Interface_Mp3Data(AudioDeakInfo_index, In_Bitrate, buffer, bytesRead);
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode AudioDeal_Mp3DataStop()
{
mp3_Stream_Interface_Mp3Data_Stop(AudioDeakInfo_index);
}
/*******************
*
* 暂停播放
... ... @@ -264,9 +273,6 @@ T_JZsdkReturnCode AudioDeal_StopDeal()
//清空alsa里的缓冲区
Alsa_DropPcm(AudioDeakInfo_index);
//清空mp3音频流
Stream_Player_Stop(AudioDeakInfo_index);
while (AudioDeakInfo_index->AudioDeal_Alsa_Finish_Flag != JZ_FLAGCODE_OFF)
{
delayMs(1);
... ...
... ... @@ -99,6 +99,7 @@ T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer,
T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status);
T_JZsdkReturnCode Get_AudioDealStatus();
T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode);
T_JZsdkReturnCode AudioDeal_Mp3DataStop();
#ifdef __cplusplus
}
... ...
... ... @@ -30,9 +30,8 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam
int PCM_PooL_Interface_PcmData_WithoutReply(struct AudioDealInfo *AD_Info,unsigned int in_sampleRate, AVChannelLayout in_ch_layout, enum AVSampleFormat in_format , unsigned char* data, int dataSize);
T_JZsdkReturnCode AudioFile_Stream_Interface_PcmData(struct AudioDealInfo *AD_Info, AVFrame *frame);
T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize);
T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id);
T_JZsdkReturnCode Stream_Player_Stop(struct AudioDealInfo *AD_Info);
T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data_Stop(struct AudioDealInfo *AD_Info);
#ifdef __cplusplus
}
... ...
... ... @@ -23,60 +23,48 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id)
{
//注册包
pkt = av_packet_alloc();
if(!pkt)
{
JZSDK_LOG_ERROR("av_packet_alloc failed.");
}
//寻找解码器
codec = avcodec_find_decoder(id);
if (!codec) {
JZSDK_LOG_ERROR("Codec not found\n");
}
//获得裸流的解析器
parser = av_parser_init(codec->id);
if (!parser) {
JZSDK_LOG_ERROR("Parser not found\n");
}
//分配解码上下文
cdc_ctx = avcodec_alloc_context3(codec);
if (!cdc_ctx) {
JZSDK_LOG_ERROR("Could not allocate audio codec context\n");
}
//将解码器和解码上下文绑定
/* open it */
if (avcodec_open2(cdc_ctx, codec, NULL) < 0)
{
JZSDK_LOG_ERROR("Could not open codec\n");
}
JZSDK_LOG_INFO("file stream init complete");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
JZSDK_LOG_INFO("File_Stream_deal_Init success");
}
//输入mp3的实时数据,以及本次数据的长度
T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize)
{
//JZSDK_LOG_DEBUG("mp3 stream输入 %d 字节数据", dataSize);
//JZSDK_LOG_DEBUG("mp3_Stream_Interface_Mp3Data");
//重置重采样器
FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16);
//检查滤波器
FF_Filter_Init(AD_Info, 0x01);
int ret = 0;
unsigned char *databufPtr = data;
int databufSize = dataSize;
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//将数据输入到
while(databufSize > 0)
while(dataSize > 0 && (AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON))
{
//printf("开始解码\n");
//如果解码器不存在,初始化解码器
if (!decoded_frame)
{
... ... @@ -87,31 +75,47 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un
}
}
//printf("alloc后\n");
//检查参数,并将正确的数据输入到pkt中
//parser 解析器
//cdc_ctx 上下文
//pkt输出的数据指针
//data datasize 输入的数据指针
//pts、dts、pos:时间戳和位置信息,一般可以设置为AV_NOPTS_VALUE和0。
ret = av_parser_parse2(parser, cdc_ctx, &pkt->data, &pkt->size, databufPtr, databufSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
int ret = av_parser_parse2(parser, cdc_ctx, &pkt->data, &pkt->size, data, dataSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
if (ret < 0) {
printf("Error while parsing\n");
JZSDK_LOG_ERROR("Error while parsing\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//printf("av_parser_parse2\n");
//重置重采样器
FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16);
//printf("FF_Resample_Reset\n");
//检查滤波器
FF_Filter_Init(AD_Info, 0x01);
//printf("FF_Filter_Init %d \n", pkt->size );
//数据指针 往后一个解析长度
//长度指针 减少一个被解析数据的长度
databufPtr += ret;
databufSize -= ret;
data += ret;
dataSize -= ret;
//如果输出有长度 解码输出的数据
if (pkt->size > 0)
{
Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);
ret = Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);
if(ret == JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
}
}
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -121,17 +125,14 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
{
int ret;
//JZSDK_LOG_DEBUG("Stream_Player_decode");
//发送数据包给解码器解码,已将数据解码为pcm原始数据
ret = avcodec_send_packet(dec_ctx, pkt);
if (ret == AVERROR(EAGAIN))
{
char errbuf[128];
av_strerror(ret, errbuf, sizeof(errbuf));
JZSDK_LOG_ERROR("Error while sending a packet to the decoder %s",errbuf);
}
else if (ret < 0)
if (ret < 0)
{
JZSDK_LOG_ERROR("Error submitting the packet to the decoder, ret=%d\n",ret);
//return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ... @@ -139,27 +140,36 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
AVFrame *eq_frame = av_frame_alloc();
AVFrame *temp_frame = av_frame_alloc();
//JZSDK_LOG_DEBUG("alloc");
/* read all the output frames (in general there may be any number of them */
//读取输出的帧
while ( (ret >= 0) && AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON)
while ( (ret >= 0) && (AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON) )
{
//从解码器中读取解码后的音频帧数据
ret = avcodec_receive_frame(dec_ctx, frame);
//输出帧不可用 、 输出帧 已用完
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
{
break;
continue;;
}
else if (ret < 0)
{
JZSDK_LOG_ERROR("Error during decoding\n");
//释放掉输出的变量
av_frame_free(&eq_frame);
av_frame_free(&temp_frame);
//JZSDK_LOG_DEBUG("提前释放后\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//printf("输出了:%d的数据\n",frame->nb_samples);
int out_nb_samples = 0;
//JZSDK_LOG_DEBUG("播放前");
//重采样解码后的数据
void* resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, frame->data, frame->nb_samples, &out_nb_samples);
... ... @@ -181,8 +191,6 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
break;
}
//printf("pcm播放 %d 数据\n",eq_frame->nb_samples);
//播放改滤波后的帧
Pcm_AlsaPlay(AD_Info, (unsigned char*)eq_frame->data[0], eq_frame->nb_samples);
... ... @@ -201,17 +209,18 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
FF_Resample_freeReasmpleData(resampledData);
}
//JZSDK_LOG_DEBUG("怀疑释放前\n");
//释放掉输出的变量
av_frame_unref(temp_frame);
av_frame_unref(eq_frame);
//JZSDK_LOG_DEBUG("怀疑释放后\n");
}
T_JZsdkReturnCode Stream_Player_Stop(struct AudioDealInfo *AD_Info)
T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data_Stop(struct AudioDealInfo *AD_Info)
{
pkt->data = NULL;
pkt->size = 0;
Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// pkt->data = NULL;
// pkt->size = 0;
// Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);
}
\ No newline at end of file
... ...
... ... @@ -821,6 +821,7 @@ T_JZsdkReturnCode Gimbal_Flush_Pitch()
static T_JZsdkReturnCode Gimbal_Init_Gimbal_Init_TransparentControl()
{
//
g_Gimbal_Mode = JZ_MODULE_CONTROL_WAY_TRANSPARENT;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ... @@ -835,6 +836,9 @@ static T_JZsdkReturnCode Gimbal_Init_Gimbal_Init_TransparentControl()
* **************************/
static T_JZsdkReturnCode Gimbal_Init_IndependentControl()
{
g_Gimbal_Mode = JZ_MODULE_CONTROL_WAY_INDEPENDENT;
//舵机初始化
Gimal_MotorInit();
... ...
... ... @@ -11,6 +11,7 @@
#include "Hal_Send/HalSend.h"
#include "JZsdk_uart/JZsdk_Uart.h"
#include "Ircut/H3_ircut/H3_ircut.h"
#ifdef WIRINGPI_STATUS_ON
#include <wiringPi.h>
... ...
... ... @@ -145,6 +145,7 @@ T_JZsdkReturnCode H3_ircut_init()
if (DEVICE_VERSION == JZ_H10)
{
pinMode(MOTOR_IRCUT_PIN,PWM_OUTPUT);//设置输出模式
JZSDK_LOG_INFO("H3 gimbal Init Complete");
}
JZSDK_LOG_INFO("H3 Init Complete");
... ...
... ... @@ -25,6 +25,9 @@ typedef struct IRC_param
{
int DealWay; //0为JZSDK自带的红外处理,1为KT库的红外处理
int Filp_V; //垂直翻转
int Filp_H; //水平翻转
int ImgDataBits; //图像位数
int ExpectedMax; //最大灰度值
int Gain; //对比度,这里设为 11
... ... @@ -89,11 +92,11 @@ typedef struct IRC_param
U16_t *Factory_LowT_Mark_Data; //出厂的低温标定帧灰度
unsigned int Factory_LowT_Mark_Data_flag; //出厂的高温标定帧灰度标志位
U16_t *HighT_NineFrameAdd; //高温温度判定时的9帧综合数组
int *HighT_NineFrameAdd; //高温温度判定时的9帧综合数组
U16_t *HighT_NineFrame_Avg; //高温温度判定时的9帧综合数组平均值
unsigned int HighT_flag; //高温判定标志 0~9 0关闭,1~9 为计数
U16_t *LowT_NineFrameAdd; //低温温度判断时的9帧综合数组
int *LowT_NineFrameAdd; //低温温度判断时的9帧综合数组
U16_t *LowT_NineFrame_Avg; //低温温度判定时的9帧综合数组平均值
unsigned int LowT_flag; //低温判定标志 0~9 0关闭,1~9 为计数
... ...
... ... @@ -50,7 +50,10 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
{
JZSDK_LOG_DEBUG("开始低温标定");
memset(dealInfo->LowT_NineFrameAdd, 0, dealInfo->PixelNum);
memcpy(dealInfo->LowT_NineFrameAdd, ImageData, dealInfo->PixelNum * sizeof(U16_t));
for (int i = 0; i < dealInfo->PixelNum; i++)
{
dealInfo->LowT_NineFrameAdd[i] += ImageData[i];
}
dealInfo->LowT_flag++;
}
else if (dealInfo->LowT_flag == JZ_FLAGCODE_OFF)
... ... @@ -61,7 +64,7 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
else
{
//否则累加存储数组
for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++)
for (int i = 0; i < dealInfo->PixelNum; i++)
{
dealInfo->LowT_NineFrameAdd[i] += ImageData[i];
}
... ... @@ -75,7 +78,7 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
{
for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++)
{
dealInfo->LowT_NineFrame_Avg[i] = dealInfo->LowT_NineFrameAdd[i] / 9;
dealInfo->LowT_NineFrame_Avg[i] = (int)(dealInfo->LowT_NineFrameAdd[i] / 9);
}
dealInfo->LowT_flag = JZ_FLAGCODE_OFF; //将标志位归位
... ... @@ -104,7 +107,11 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
{
JZSDK_LOG_DEBUG("开始高温标定");
memset(dealInfo->HighT_NineFrameAdd, 0, dealInfo->PixelNum);
memcpy(dealInfo->HighT_NineFrameAdd, ImageData, dealInfo->PixelNum * sizeof(U16_t));
for (int i = 0; i < dealInfo->PixelNum; i++)
{
dealInfo->HighT_NineFrameAdd[i] += ImageData[i];
}
dealInfo->HighT_flag++;
}
else if (dealInfo->HighT_flag == JZ_FLAGCODE_OFF)
... ... @@ -115,7 +122,7 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
else
{
//否则累加存储数组
for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++)
for (int i = 0; i < dealInfo->PixelNum; i++)
{
dealInfo->HighT_NineFrameAdd[i] += ImageData[i];
}
... ... @@ -128,7 +135,7 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
{
for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++)
{
dealInfo->HighT_NineFrame_Avg[i] = dealInfo->HighT_NineFrameAdd[i] / 9;
dealInfo->HighT_NineFrame_Avg[i] = (U16_t)(dealInfo->HighT_NineFrameAdd[i] / 9);
}
dealInfo->HighT_flag = JZ_FLAGCODE_OFF; //将标志位归位
... ... @@ -886,7 +893,8 @@ T_JZsdkReturnCode IRC_LocalFrame_DataWrite(int flag,struct IRC_param *dealInfo,
//写入数据
for (int i = 0; i < image_size; i++) {
fprintf(fp, "%d ", image[i]);
//fprintf(fp, "%d ", image[i]);
fprintf(fp, "%u ", (unsigned int)image[i]);
}
fclose(fp); // 关闭文件
... ...
... ... @@ -21,6 +21,8 @@ int g_temp_GasValueMin = 30;
struct IRC_param *g_IRC_Param = NULL;
static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, int width, int frameRate);
static int lastSPCMode = -1; //0低温数据 1手动打档 2自动打档
static int lastTPCMode = -1;
static FILE *temp_fp = NULL;
... ... @@ -107,6 +109,15 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *
JZsdk_CutBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, dealInfo->BadPixelNum,dealInfo->BadPixelExtern, 1);
}
// //盲点过后进行数据复查
// for (int i = 0; i < *rawSize; i++)
// {
// if (rawData[i] > dealInfo->ExpectedMax)
// {
// rawData[i] = dealInfo->ExpectedMax;
// }
// }
/*************************************两点纠正部分******************************************************************/
//判断两点的数据模式是否有改变
... ... @@ -345,6 +356,35 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *
dealInfo->FirstSPC_flag = JZ_FLAGCODE_ON;
}
//判断单点下石佛切换过单点模式(切换低温数据 或 手动打挡),如果切换过,鲲腾要重新注入spc数据
if ( (dealInfo->SPC_mode == 0 && lastSPCMode != 0 ) || (dealInfo->SPC_mode == 1 && lastSPCMode != 1))
{
#ifdef KTIRC_LIB_STATUS_ON
if (dealInfo->SPC_mode == 0)
{
KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->LowT_NineFrame_Avg ,dealInfo->PixelNum);
}
if (dealInfo->SPC_mode == 1)
{
//此时spc数据应该是换过的
KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->SPC_Mark_Data ,dealInfo->PixelNum);
}
#endif
}
lastSPCMode = dealInfo->SPC_mode;
//判断单点模式 选择了低温数据的情况下,是否切换过低温数据组
if (dealInfo->SPC_mode == 0)
{
if (lastTPCMode != dealInfo->TPC_mode)
{
KtLib_writeMarkData(SPC_MARK_DATA, dealInfo->LowT_NineFrame_Avg ,dealInfo->PixelNum);
lastTPCMode = dealInfo->TPC_mode;
}
}
//如果处于自动打档模式
if (dealInfo->SPC_mode == 2)
{
... ... @@ -374,9 +414,11 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *
IRC_LocalFrame_DataWrite(SPC_MARK_DATA, dealInfo, (U16_t *)dealInfo->SPC_Mark_Data, dealInfo->PixelNum);
//如果开启开启的昆腾库,则载入昆腾数据
if (g_IRC_Param->DealWay == IRC_DEALMODE_KTLIB)
if (g_IRC_Param->DealWay == IRC_DEALMODE_KTLIB && dealInfo->SPC_mode == 1)
{
#ifdef KTIRC_LIB_STATUS_ON
KtLib_writeMarkData(SPC_MARK_DATA ,dealInfo->SPC_Mark_Data, dealInfo->PixelNum);
#endif
}
dealInfo->SPC_ResetFlag = JZ_FLAGCODE_OFF;
... ... @@ -417,14 +459,8 @@ unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height)
static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param *dealInfo)
{
//将rgb图形镜像
int MirrorImageFlag = JZ_FLAGCODE_ON;
if (dealInfo->DealWay == IRC_DEALMODE_KTLIB)
{
MirrorImageFlag = JZ_FLAGCODE_OFF;
}
if (MirrorImageFlag == JZ_FLAGCODE_ON)
//水平镜像
if (dealInfo->Filp_H == JZ_FLAGCODE_ON)
{
int x, y = 0;
... ... @@ -457,6 +493,32 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
free(temp_row); // 释放临时缓冲区
}
//垂直镜像
if (dealInfo->Filp_V == JZ_FLAGCODE_ON) // 假设Filp_V是控制垂直翻转的标志
{
int x, y = 0;
int bytes_per_row = dealInfo->Width * 3; // 每行的字节数,假设图像是RGB格式
unsigned char *temp_image = (unsigned char *)malloc(dealInfo->Height * bytes_per_row); // 临时缓冲区,用于存储整个图像的像素数据
if (temp_image == NULL) {
// 内存分配失败处理
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
// 复制整个图像到临时缓冲区
memcpy(temp_image, rgb_data, dealInfo->Height * bytes_per_row);
// 遍历图像的每一行
for (y = 0; y < dealInfo->Height; y++) {
// 从临时缓冲区中复制对应行的数据回原图像,但是是从底部向上(即反向)复制
memcpy(rgb_data + (dealInfo->Height - 1 - y) * bytes_per_row,
temp_image + y * bytes_per_row,
bytes_per_row);
}
free(temp_image); // 释放临时缓冲区
}
//修复外圈图像
if (dealInfo->RingRepair == JZ_FLAGCODE_ON)
{
... ... @@ -618,12 +680,12 @@ T_JZsdkReturnCode IRC_FrameDeal(U16_t *rawData ,unsigned int dataSize, unsigned
//JZSDK_LOG_DEBUG("数据预处理完成");
if (temp_fp != NULL)
{
fwrite(rawData, sizeof(U16_t), dataSize, temp_fp);
// if (temp_fp != NULL)
// {
// fwrite(rawData, sizeof(U16_t), dataSize, temp_fp);
fflush(temp_fp);
}
// fflush(temp_fp);
// }
//2、数据前处理,将原始数据和16位数据 合成为rgb数据
... ... @@ -1194,6 +1256,24 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
//IrcDealCfg->DealWay = IRC_DEALMODE_JZSDK;
IrcDealCfg->DealWay = IRC_DEALMODE_KTLIB;
//我们自己库要水平翻转
if (IrcDealCfg->DealWay == IRC_DEALMODE_JZSDK)
{
IrcDealCfg->Filp_H = JZ_FLAGCODE_ON;
}
//鲲腾的库要垂直翻转
else if (IrcDealCfg->DealWay == IRC_DEALMODE_KTLIB)
{
IrcDealCfg->Filp_V = JZ_FLAGCODE_ON;
}
//否则都不翻转
else
{
IrcDealCfg->Filp_H = JZ_FLAGCODE_OFF;
IrcDealCfg->Filp_V = JZ_FLAGCODE_OFF;
}
IrcDealCfg->ImgDataBits = 14; //图像为14位图像
IrcDealCfg->Height = height;
IrcDealCfg->Width = width;
... ... @@ -1238,13 +1318,13 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
JZSDK_LOG_ERROR("TPC_Gain注册失败");
}
IrcDealCfg->HighT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
IrcDealCfg->HighT_NineFrameAdd = (int *)malloc(IrcDealCfg->PixelNum * sizeof(int));
if (IrcDealCfg->HighT_NineFrameAdd == NULL)
{
JZSDK_LOG_ERROR("HighT_NineFrameAdd注册失败");
}
IrcDealCfg->LowT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
IrcDealCfg->LowT_NineFrameAdd = (int *)malloc(IrcDealCfg->PixelNum * sizeof(int));
if (IrcDealCfg->LowT_NineFrameAdd == NULL)
{
JZSDK_LOG_ERROR("LowT_NineFrameAdd注册失败");
... ...
... ... @@ -40,7 +40,7 @@ T_JZsdkReturnCode KtLib_Init(struct IRC_param *dealInfo)
/**********************************************
*
*
*
* ktlib 写入标定的数据
*
*
* **********************************************/
... ... @@ -51,12 +51,19 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
// 加锁
std::lock_guard<std::mutex> lock(ktLibMutex);
int TempBuffer[size];
for (int i = 0; i < size; i++)
{
TempBuffer[i] = in[i];
}
#ifdef KTIRC_LIB_STATUS_ON
switch (type)
{
//高温标记数据
case HIGH_TEMP_DATA:
bool_ret = LoadMarkData((int *)in ,size,HIGH_MARK_DATA);
bool_ret = LoadMarkData(TempBuffer ,size,HIGH_MARK_DATA);
if (bool_ret == false)
{
JZSDK_LOG_ERROR("LoadMarkData HIGH_TEMP_DATA error");
... ... @@ -71,7 +78,7 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
//低温标记数据
case LOW_TEMP_DATA:
bool_ret = LoadMarkData((int *)in ,size,LOW_MARK_DATA);
bool_ret = LoadMarkData(TempBuffer ,size,LOW_MARK_DATA);
if (bool_ret == false)
{
JZSDK_LOG_ERROR("LoadMarkData LOW_TEMP_DATA error");
... ... @@ -87,7 +94,7 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
//单点标记数据
case SPC_MARK_DATA:
bool_ret = LoadMarkData((int *)in ,size, SINGLE_MARK_DATA);
bool_ret = LoadMarkData(TempBuffer ,size, SINGLE_MARK_DATA);
if (bool_ret == false)
{
JZSDK_LOG_ERROR("LoadMarkData SPC_MARK_DATA error");
... ... @@ -110,6 +117,9 @@ T_JZsdkReturnCode KtLib_writeMarkData(int type, U16_t* in ,int size)
}
static int lastCorrectMode = JZ_FLAGCODE_OFF;
static int DynamicGasesColorFlag = JZ_FLAGCODE_OFF;
T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
U8_t **RGB_data, unsigned int *RGB_dataSize,
... ... @@ -184,17 +194,41 @@ T_JZsdkReturnCode KtLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
switch (dealInfo->OutputPixelColorMode)
{
case 0: // 默认输出模式
case 2: // 气体色彩增强输出模式
{
if (DynamicGasesColorFlag == JZ_FLAGCODE_ON)
{
CloseDynamicGasesColorEnhance();
DynamicGasesColorFlag = JZ_FLAGCODE_OFF;
}
bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据
}
break;
case 1: // 伪彩输出模式
{
if (DynamicGasesColorFlag == JZ_FLAGCODE_ON)
{
CloseDynamicGasesColorEnhance();
DynamicGasesColorFlag = JZ_FLAGCODE_OFF;
}
bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据
//将rgb888数据反转为灰度数据并进行颜色映射
PseudoColor_GrayRgb2Rgb((*RGB_data), dealInfo->PixelNum);
}
break;
case 2: // 气体色彩增强输出模式
{
if (DynamicGasesColorFlag == JZ_FLAGCODE_OFF)
{
OpenDynamicGasesColorEnhance();
DynamicGasesColorFlag = JZ_FLAGCODE_ON;
}
bool_ret = GetImageSynchronous(inputDataChar, inputDataSize, (char *)*RGB_data, dealInfo->PixelNum*3, (int *)RGB_dataSize); //同步处理数据
}
break;
... ...
... ... @@ -265,7 +265,7 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns
int Avged = (newPixel-image[tempLen])/8;
if ((fabs(image[tempLen] - Avged) < Buildextern))
{
newPixel = 0;
for (int dy = -2; dy <= 2; dy++)
{
for (int dx = -2; dx <= 2; dx++)
... ... @@ -294,12 +294,13 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns
unsigned int newPixel = 0;
//获取xy轴坐标
//把盲点长度坐标转化为xy坐标
int tempLen = Blind[i];
PointY = tempLen/width;
PointX = tempLen%width;
int index=0;
int Avged=0;
int index=0; //索引值
int Avged=0; //平均值
int tempPixel[25];
... ... @@ -307,16 +308,23 @@ T_JZsdkReturnCode JZsdk_CutBadPixel_U16(U16_t *image, int width, int height, uns
{
for (int dx = -2; dx <= 2; dx++)
{
// 计算5x5窗口中当前元素的索引
int newY = PointY + dy;
int newX = PointX + dx;
tempPixel[index] = image[newY * width + newX];
newPixel += tempPixel[index];
index++;
}
}
Avged = (newPixel-image[tempLen])/24;
//移除中心点
newPixel -= image[tempLen];
//计算周围24个点的平均值
Avged = newPixel/24;
int MaxAvgd = 0;
int MinAvgd = 0;
... ...
... ... @@ -112,6 +112,12 @@ T_JZsdkReturnCode PseudoColor_256Gray2Rgb_ResetColor(int value)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*****************************
*
* 灰度图转伪彩rgb
*
*
* ***************************/
T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned int *out_str_len, int PixelNum)
{
if (P_Color_FinishFlag != JZ_FLAGCODE_ON)
... ... @@ -140,3 +146,27 @@ T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned in
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*****************************
*
* 灰度rgb转伪彩rgb
*
*
* ***************************/
T_JZsdkReturnCode PseudoColor_GrayRgb2Rgb(U8_t *str, unsigned int PixelNum)
{
if (P_Color_FinishFlag != JZ_FLAGCODE_ON)
{
JZSDK_LOG_ERROR("伪彩配置文件未初始化");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
for (int i = 0; i < PixelNum; i += 1)
{
str[3*i] = P_Color.R_color[str[3*i]];
str[3*i + 1] = P_Color.G_color[str[3*i + 1]];
str[3*i + 2] = P_Color.B_color[str[3*i + 2]];
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -41,6 +41,8 @@ typedef enum e_PseudoColor
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned int *out_str_len, int PixelNum);
T_JZsdkReturnCode PseudoColor_GrayRgb2Rgb(U8_t *str, unsigned int PixelNum);
T_JZsdkReturnCode PseudoColor_256Gray2Rgb_ResetColor(int value);
#ifdef __cplusplus
... ...
... ... @@ -11,6 +11,9 @@
static int RealTimeMp2_StatusFlag = JZ_FLAGCODE_OFF;
static int MP2_Loop_Flag = JZ_FLAGCODE_OFF;
static int MP2_Write_Flag = JZ_FLAGCODE_OFF;
//解码播放部分
static unsigned char RealTimeMP2_PlayData_Loop[ (256 + 1) ][128];//解码缓存池
static int RealTimeMP2_PlayData_LoopHead = 0; //池数头
... ... @@ -96,8 +99,6 @@ T_JZsdkReturnCode RealTimeMP2_start()
return ret;
}
JZSDK_LOG_INFO("MP2实时喊话初始化成功");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -123,7 +124,13 @@ T_JZsdkReturnCode RealTimeMP2_Close()
}
RealTimeMp2_StatusFlag = JZ_FLAGCODE_OFF;
//关闭loop线程
MP2_Loop_Flag = JZ_FLAGCODE_ON;
RealTimeMP2s_PlayData_LoopReadFlag = JZ_FLAGCODE_OFF;
//关闭write线程
//MP2_Write_Flag = JZ_FLAGCODE_ON;
RealTimeMP2_WriteFlag = JZ_FLAGCODE_OFF;
Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
... ... @@ -132,9 +139,15 @@ T_JZsdkReturnCode RealTimeMP2_Close()
int amplifier = JZ_FLAGCODE_OFF;
Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
//关闭音频库
AudioDeal_StopDeal();
//等候mp2全部关闭
while ((MP2_Loop_Flag == JZ_FLAGCODE_ON) )//| (MP2_Write_Flag == JZ_FLAGCODE_ON))
{
JZSDK_LOG_DEBUG("等待mp2关闭 Lopp:%d Write:%d", MP2_Loop_Flag, MP2_Write_Flag);
delayMs(100);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -169,14 +182,15 @@ static T_JZsdkReturnCode RealTimeMP2_Play_init()
//解码并播放
static T_JZsdkReturnCode RealTimeMP2_PlayData(unsigned char *data,int len)
{
unsigned char playFile[len];
//清空
memset(playFile, 0, len);
memcpy(playFile, data, len);
T_JZsdkReturnCode ret = AudioDeal_Mp3DataInput(8000, data, len);
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE)
{
JZSDK_LOG_ERROR("严重错误,清空缓冲区");
RealTimeMP2_ClearLoop();
return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
}
AudioDeal_Mp3DataInput(8000, playFile, len);
//printf("播放结束\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -191,7 +205,7 @@ static void *RealTimeMP2_LoopPlay(void *arg)
//设立缓冲区域
int range = 0;
while (range < 15) // 1.5s
while (range < 15 && RealTimeMP2s_PlayData_LoopReadFlag != JZ_FLAGCODE_OFF) // 1.5s
{
range = (RealTimeMP2_PlayData_LoopEnd-RealTimeMP2_PlayData_LoopHead);
if (range < 0)
... ... @@ -200,7 +214,7 @@ static void *RealTimeMP2_LoopPlay(void *arg)
}
}
printf("开始播放函数\n");
//printf("开始播放函数\n");
while(RealTimeMP2s_PlayData_LoopReadFlag != JZ_FLAGCODE_OFF)
{
... ... @@ -212,8 +226,11 @@ static void *RealTimeMP2_LoopPlay(void *arg)
RealTimeMP2_PlayData_LoopHead++;
RealTimeMP2_PlayLoop_HeadReset(); //池满判断
}
}
MP2_Loop_Flag = JZ_FLAGCODE_OFF;
}
// 池子头部到底了,重置池头
... ... @@ -284,7 +301,7 @@ static void *RealTimeMP2_WriteData_Task(void *arg)
{
int ret;
JZSDK_LOG_DEBUG("MP2实施喊话,输入数据缓冲线程建立");
printf("MP2实施喊话,输入数据缓冲线程建立\n");
RealTimeMP2_WriteFlag = JZ_FLAGCODE_ON;
while(RealTimeMP2_WriteFlag == JZ_FLAGCODE_ON)
... ... @@ -305,6 +322,8 @@ static void *RealTimeMP2_WriteData_Task(void *arg)
pthread_cond_signal(&RealTimeMP2_WriteCond);
pthread_mutex_unlock(&RealTimeMP2_WriteDataLock);
}
MP2_Write_Flag = JZ_FLAGCODE_OFF;
}
//写入数据缓存池重置
... ... @@ -449,5 +468,7 @@ static T_JZsdkReturnCode RealTimeMP2_WriteDataToLoop(unsigned char *buf,int leng
* **************/
T_JZsdkReturnCode RealTimeMP2_GetStatusFlag()
{
return RealTimeMp2_StatusFlag;
}
\ No newline at end of file
... ...
... ... @@ -75,7 +75,6 @@ T_JZsdkReturnCode OpusFile_FlushList()
OpusFile_FreeAudioList();
}
while ((entry = readdir(dir)) != NULL)
{
const unsigned char *filename = entry->d_name;
... ... @@ -153,14 +152,6 @@ T_JZsdkReturnCode OpusFile_FlushList()
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*********
*
* opus文件初始化
... ... @@ -168,6 +159,6 @@ T_JZsdkReturnCode OpusFile_FlushList()
**********/
T_JZsdkReturnCode Megaphone_OpusFile_Init()
{
//刷新opus列表
//刷新opus列表(用于加载新的opus文件)
OpusFile_FlushList();
}
\ No newline at end of file
... ...
/**
********************************************************************
* @file OpusFile.h
* OpusFile.c OpusFileSave.c 的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef OPUS_FILE_H
#define OPUS_FILE_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode Megaphone_OpusFile_Init();
T_JZsdkReturnCode OpusFile_FlushList();
T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile);
T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName);
T_JZsdkReturnCode OpusFile_SaveOpusFileStream(unsigned char *Stream, int StreamLen);
T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCode, int SaveFlag);
#ifdef __cplusplus
}
#endif
#endif
... ...
#include "JZsdkLib.h"
#include "../../Megaphone.h"
#include "../Megaphone_Opus.h"
#include "version_choose.h"
#include "BaseConfig.h"
#include "AudioDeal/AudioDeal.h"
#include "opus.h"
#define OPUS_MAX_FRAME_SIZE (6 * 960)
#define OPUS_CHANNELS (1)
#define OPUS_MAX_PACKET_SIZE (3 * 1276)
#define PCM_PLAY_FILE_NAME "/root/test_audio.pcm" //用于播放的pcm
#define PCM_RATE 16000 //解码得到的pcm码率 目前仅支持16000码率
static int g_opus_decodeBitrate = 16000; //解码码率
static int g_Opus_play_Flag = JZ_FLAGCODE_OFF; //opus的播放标志位
static int g_Opus_decode_Flag = JZ_FLAGCODE_OFF; //opus的解码标志位
static T_JZTaskHandle g_DecodeOpus_task = NULL;
static T_JZTaskHandle g_OpusPlay_task = NULL;
/***************************************************************************************************************
*
* 播放部分
*
*
****************************************************************************************************************/
static T_JZsdkReturnCode FixedFilePlay()
{
FILE *PlayFixedFile_pcm_fp = NULL;
unsigned int nbBytes;
uint8_t cbits[3 * 1276];
int timeNum = 0;
int loop = JZ_FLAGCODE_OFF;
int loop_interval;
if(g_Opus_decode_Flag != JZ_FLAGCODE_OFF)
{
JZSDK_LOG_ERROR("opus解码超时,无法播放");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
g_Opus_play_Flag = JZ_FLAGCODE_ON;
JZSDK_LOG_INFO("播放指定位置的opus pcm文件\n");
PlayFixedFile_pcm_fp = fopen(PCM_PLAY_FILE_NAME, "r");
if (PlayFixedFile_pcm_fp == NULL)
{
JZSDK_LOG_ERROR("打开固定opus pcm文件失败\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// 将文件指针移动到文件开头
if (fseek(PlayFixedFile_pcm_fp, 0, SEEK_SET) != 0)
{
JZSDK_LOG_ERROR("Failed to move file pointer to the beginning of the file");
fclose(PlayFixedFile_pcm_fp);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON)
{
nbBytes = fread(cbits, 1, 3 * 1276, PlayFixedFile_pcm_fp);
if(nbBytes > 0)
{
AudioDeal_PcmDataInput(PCM_RATE, (unsigned char *)cbits, nbBytes);
}
if (feof(PlayFixedFile_pcm_fp))
{
//如果循环播放没打开
Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP, &loop);
Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP_INTERVAL, &loop_interval);
if (loop == JZ_FLAGCODE_OFF)
{
timeNum = 0;
// //播放结束延迟
// while ((timeNum <=3000) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
// {
// delayMs(10);
// timeNum +=10;
// }
break;
}
//如果循环播放打开
else if (loop == JZ_FLAGCODE_ON)
{
timeNum = 0;
JZSDK_LOG_INFO("循环播放opus");
// //播放结束延迟
// while ((loop == 1) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
// {
// delayMs(10);
// timeNum +=10;
// }
//重置文件光标 继续播放
fseek(PlayFixedFile_pcm_fp, 0, SEEK_SET);
//循环播放延时
while (loop_interval > 0 && (loop == JZ_FLAGCODE_ON) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
{
delayMs(50);
loop_interval -= 50;
}
continue;
}
}
}
fclose(PlayFixedFile_pcm_fp);
g_Opus_play_Flag = JZ_FLAGCODE_OFF;
}
/*
*
* 播放固定位置pcm线程
*
*/
static void *PlayFixedFile_task(void *arg)
{
Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
//广播开始
Megaphone_status_Broadcast(AUDIO_PLAY_STATUS_OPUS_RECORD);
int amplifier = JZ_FLAGCODE_ON;
Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
FixedFilePlay();
amplifier = JZ_FLAGCODE_OFF;
Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
//广播关闭
Megaphone_status_Broadcast(JZ_FLAGCODE_OFF);
}
/*******************************
*
* 播放规定位置的opus文件
* 旧接口,无需定位传入的位置
*
************************************/
T_JZsdkReturnCode OpusFile_PlayFixedFile()
{
T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
OsalHandler->TaskCreate("PiayFilexdFile", PlayFixedFile_task, 8192, NULL, &g_DecodeOpus_task);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*************************************************************************************************************/
/*
解码函数
*/
static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile)
{
FILE *fin = NULL;
FILE *fout = NULL;
OpusDecoder *decoder;
opus_int16 out[OPUS_MAX_FRAME_SIZE * OPUS_CHANNELS];
uint8_t cbits[OPUS_MAX_PACKET_SIZE];
int32_t nbBytes;
int32_t err;
if (g_Opus_decode_Flag != JZ_FLAGCODE_OFF)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
g_Opus_decode_Flag = JZ_FLAGCODE_ON;
printf("Decode Start 解码开始\n"); //解码开始
//打开解码的opus文件
//TODO: need delete
//attention: you can use "ffmpeg -i xxx.mp3 -ar 16000 -ac 1 out.wav" and "./test_opus_tool out.wav out.opus" to generate opus file to test
fin = fopen(OpusFile, "r");
if (fin == NULL) {
JZSDK_LOG_ERROR("fin打开失败");
goto DecodeFinsh;
}
//创建一个解码器
decoder = opus_decoder_create(PCM_RATE, OPUS_CHANNELS, &err);
if (err < 0) {
JZSDK_LOG_ERROR("解码器创建失败 %s",opus_strerror(err));
goto DecodeFinsh;
}
//创建一个opus输出文件
fout = fopen(PCM_PLAY_FILE_NAME, "w");
if (fout == NULL) {
JZSDK_LOG_ERROR("创建opus输出文件失败");
goto DecodeFinsh;
}
printf("opus解码初始化完成\n");
int frame_size;
while (1)
{
int i;
opus_int16 TempPcm[OPUS_MAX_FRAME_SIZE * OPUS_CHANNELS];
frame_size = 0;
//读取opus内容
/* Read a 16 bits/sample audio frame. */
nbBytes = fread(cbits, 1, g_opus_decodeBitrate / 8000 * 40, fin);
if (feof(fin))
{
break;
}
printf("fread nbBytes=%d\n",nbBytes);
//printf("s_decodeBitrate=%d",s_decodeBitrate / OPUS_DECODE_BITRATE_8KBPS * OPUS_DECODE_FRAME_SIZE_8KBPS);
/* Decode the data. In this example, frame_size will be constant because
the encoder is using a constant frame size. However, that may not
be the case for all encoders, so the decoder must always check
the frame size returned. */
//向解码器输入opus内容
frame_size = opus_decode(decoder, cbits, nbBytes, out, OPUS_MAX_FRAME_SIZE, 0);
if (frame_size < 0) {
JZSDK_LOG_ERROR("decoder failed: %s",opus_strerror(frame_size));
goto DecodeFinsh;
}
//解码完成
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++) {
TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
//TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
}
fwrite(TempPcm, sizeof(short), frame_size * OPUS_CHANNELS, fout);
}
DecodeFinsh:
//释放解码器
if (decoder != NULL)
{
opus_decoder_destroy(decoder);
printf("opus_decoder_destroy(decoder)\n");
}
//关闭文件
if (fin != NULL)
{
fclose(fin);
fin = NULL;
printf("fclose(fin);\n");
}
//关闭文件
if (fout != NULL)
{
fclose(fout);
fout = NULL;
printf("fclose(fout);\n");
}
if (frame_size < 0)
{
JZSDK_LOG_ERROR("opus解码失败");
g_Opus_decode_Flag = JZ_FLAGCODE_OFF;
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//解码完成
JZSDK_LOG_INFO("Decode Finished...\n");
g_Opus_decode_Flag = JZ_FLAGCODE_OFF;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*******************
*
* opus解码线程
*
*******************/
static void *DecodeOpus_task(void *arg)
{
unsigned char *opusFile = (unsigned char *)arg;
T_JZsdkReturnCode ret = OpusDecodeFun(opusFile);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//广播解码失败
Megaphone_Broadcast_OpusDecodeStatus(1);
}
else
{
Megaphone_Broadcast_OpusDecodeStatus(0);
}
free(opusFile);
}
T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile)
{
T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//因为播放的流通pcm文件只有一份,所以播放时,不能进行解码,不然会导致相当多问题
int i = 0;
while (i <= 4 && g_Opus_play_Flag == JZ_FLAGCODE_ON)
{
i++;
delayMs(50);
}
//判断上一次播放是否结束 判断解码是否完成
if(i == 4)
{
JZSDK_LOG_ERROR("超时200ms,上一次opus录音播放未结束,无法解码");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
i = 0;
while (i<=4 && g_Opus_decode_Flag == JZ_FLAGCODE_ON)
{
i++;
delayMs(50);
}
if(i == 4)
{
JZSDK_LOG_ERROR("超时,上一次opus仍在解码,无法开始新的解码");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
unsigned char *DecodeFile = OsalHandler->Malloc(strlen(opusFile));
if(DecodeFile == NULL)
{
JZSDK_LOG_ERROR("DecodeFile malloc failed");
return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
}
memset(DecodeFile, strlen(opusFile), 0);
memcpy(DecodeFile, opusFile, strlen(opusFile));
OsalHandler->TaskCreate("DecodeOpus", DecodeOpus_task((void *)DecodeFile), 8192,NULL, &g_DecodeOpus_task);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
#include <stdio.h>
#include "JZsdkLib.h"
#include "OpusFile.h"
static int g_OpusFile_SaveLen = 0;
static FILE *g_OpusFile_SaveFp = NULL;
static int g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
static int g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; //opus存储标志位
#define OPUS_FILE_DIR "/root/sdcard/opus"
#define OPUS_TEMP_SAVE_DIR "/root/opusFileTemp.opus"
#define OPUS_TEMP_SAVE_DIR "/root/test_audio.opus"
static unsigned char opus_SaveFile[128];
static int OpusFile_SaveThread_Flag = JZ_FLAGCODE_OFF;
static T_JZTaskHandle s_OpusSaveThread = NULL;
/******************
*
... ... @@ -18,19 +20,21 @@ static int OpusFile_SaveThread_Flag = JZ_FLAGCODE_OFF;
*
*
* **********************/
static T_JZsdkReturnCode OpusFile_SaveOpusFileShowLen(void)
static void *OpusFile_SaveOpusPrint(void *arg)
{
if (OpusFile_SaveThread_Flag != JZ_FLAGCODE_OFF)
while (g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
{
JZSDK_LOG_ERROR("存储显示线程已经启动,请先关闭");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
OpusFile_SaveThread_Flag = JZ_FLAGCODE_ON;
int num = 0;
JZSDK_LOG_INFO("opus存储功能开启中,当前已存入 %d 字节",g_OpusFile_SaveLen);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//适时延迟
while (num < 100 && g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
{
delayMs(10);
num++;
}
}
}
/******************
... ... @@ -42,6 +46,14 @@ static T_JZsdkReturnCode OpusFile_SaveOpusFileShowLen(void)
* **********************/
T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName)
{
T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
if (g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
{
JZSDK_LOG_ERROR("opus文件保存功能已经开启");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
g_OpusFile_SaveLen = 0;
memset(opus_SaveFile, 0, sizeof(opus_SaveFile));
... ... @@ -64,6 +76,9 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName)
g_OpusFile_SaveFlag = JZ_FLAGCODE_ON;
//创建存储显示线程
OsalHandler->TaskCreate("OpusSavePrint", OpusFile_SaveOpusPrint, 8192,NULL, &s_OpusSaveThread);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -107,9 +122,12 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStream(unsigned char *Stream, int StreamL
*
* 结束存储opus文件
*
* checkflag是否需要校正 或校正类型
* checkcode 校正码
* saveflag 是否需要保存
*
* **********************/
T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCode)
T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCode, int SaveFlag)
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
unsigned char cmd[128];
... ... @@ -136,15 +154,16 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
JZSDK_LOG_INFO("已存储opus文件, 其长度为:%d", g_OpusFile_SaveLen);
switch (CheckFlag)
/***********************************************************
*
* 校验部分
*
*
* *********************************************************/
if (CheckFlag != JZ_FLAGCODE_OFF)
{
case JZ_FLAGCODE_OFF:
switch (CheckFlag)
{
JZSDK_LOG_INFO("opus保存无需校验码");
ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
break;
case JZSDK_CHECK_SUM_TYPE_MD5:
{
JZSDK_LOG_INFO("opus保存使用md5校验码");
... ... @@ -159,6 +178,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
//1、获取文件的src32校验码
ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_SRC32, OPUS_TEMP_SAVE_DIR, CheckCode, 4);
}
break;
default:
{
... ... @@ -178,6 +198,55 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
else
{
JZSDK_LOG_INFO("opus保存无需校验码");
}
/***********************************************************
*
* 额外存储部分
*
*
* *********************************************************/
if (SaveFlag != JZ_FLAGCODE_OFF)
{
//将临时的opus文件移动到指定的目录
memset(cmd, 0, sizeof(cmd));
sprintf(cmd, "mv %s %s", OPUS_TEMP_SAVE_DIR, opus_SaveFile);
ret = JZsdk_RunSystemCmd(cmd);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("opus保存文件移动失败");
memset(cmd, 0, sizeof(cmd));
sprintf(cmd, "rm -rf %s", OPUS_TEMP_SAVE_DIR);
JZsdk_RunSystemCmd(cmd);
g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//移动成功
JZsdk_Sync(); //同步文件系统
JZSDK_LOG_INFO("opus保存成功,刷新列表");
OpusFile_FlushList(); //刷新opus文件列表
}
/********************************************************************
*
*
* 如果不进行额存储,则进行一次opus解码
*
*
/********************************************************************/
else
{
OpusFile_DecodeOpus(opus_SaveFile);
}
JZSDK_LOG_INFO("opus_save_end");
g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -189,7 +189,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_FIRST, //视频流
int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD, //视频流
OFF, //测温模式
ON, //光圈开关
OFF, //冻结开关
... ...