作者 ookk303

save1

... ... @@ -56,7 +56,8 @@
"mediaparm.h": "c",
"videostream_push.h": "c",
"v4l2_record.h": "c",
"deviceinfo.h": "c"
"deviceinfo.h": "c",
"mediaproc.h": "c"
},
"Codegeex.GenerationPreference": "automatic",
"C_Cpp.dimInactiveRegions": false
... ...
... ... @@ -15,14 +15,9 @@
#define THREAD_POOL_SIZE 5 // 线程池大小
typedef struct {
void (*task_function)(void*); //任务函数指针,用于指定 执行的任务
void* data; // 任务参数 //任务参数的地址 用于输入任务内容
} t_JZsdk_TaskMgmt_TaskInput;
typedef struct {
pthread_t thread; // 线程 //调用的线程
int is_busy; // 标识线程是否忙碌
t_JZsdk_TaskMgmt_TaskInput* task; // 线程执行的任务
t_JZsdk_TaskFuntionInput* task; // 线程执行的任务
pthread_mutex_t lock; // 互斥锁
pthread_cond_t condition; // 条件变量
} t_ThreadPool;
... ... @@ -73,7 +68,7 @@ T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void*
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
t_JZsdk_TaskMgmt_TaskInput *task = (t_JZsdk_TaskMgmt_TaskInput*)malloc(sizeof(t_JZsdk_TaskMgmt_TaskInput));
t_JZsdk_TaskFuntionInput *task = (t_JZsdk_TaskFuntionInput*)malloc(sizeof(t_JZsdk_TaskFuntionInput));
if (task == NULL)
{
// 处理内存分配失败的情况
... ... @@ -81,7 +76,7 @@ T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void*
}
task->task_function = task_function;
task->data = data;
task->args = data;
//将发送内容放入任务
TaskPool[i].task = task;
... ... @@ -109,7 +104,7 @@ static void* TaskManagement_ThreadFunction(void* arg)
if (pool->task->task_function != NULL)
{
pool->task->task_function(pool->task->data);
pool->task->task_function(pool->task->args);
}
// 执行完成,将状态置为未忙碌
... ...
... ... @@ -23,6 +23,12 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
//用于传递指针函数的类型
typedef struct t_JZsdk_TaskFuntionInput{
void (*task_function)(void*); //任务函数指针,用于指定 执行的任务
void *args; // 任务参数 //任务参数的地址 用于输入任务内容
} t_JZsdk_TaskFuntionInput;
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode TaskManagement_Init();
T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void* data);
... ...
... ... @@ -7,7 +7,7 @@
#define VERSION_CHOOSE_H
#include "./ConfigParams.h"
//1~10行 除了D可以修改版本选择 禁止动任何东西
#define DEVICE_VERSION JZ_C1
#define DEVICE_VERSION JZ_H150S
//禁止修改行 选择是串口程序 还是 psdk程序
#define APP_VERSION APP_PSDK
... ... @@ -19,7 +19,7 @@
#define MAJOR_VERSION 0x01
#define MINOR_VERSION 0x03
#define MODIFY_VERSION 0x09
#define DEBUG_VERSION 0x05
#define DEBUG_VERSION 0x02
//禁止修改行 滤波方式
#define FILTERING_TYPE HIGH_PASS_FILTERING
... ... @@ -75,10 +75,13 @@
//是否加载RTK_MPP模块
#ifdef MACRO_RTK_MPP_MODULE
#define RTK_MPP_STATUS VERSION_SWITCH_ON
#define RTK_MPP_STATUS_ON
#else
#define RTK_MPP_STATUS VERSION_SWITCH_OFF
#endif
//是否加载WIRINGPI模块
#ifdef MACRO_WIRINGPI_MODULE
#define WIRINGPI_STATUS_ON
... ... @@ -109,6 +112,7 @@
//是否加载RTK_MPP模块
#define RTK_MPP_STATUS VERSION_SWITCH_ON
#define RTK_MPP_STATUS_ON
//是否加载WIRINGPI模块
#define WIRINGPI_STATUS_ON
... ...
... ... @@ -17,6 +17,14 @@
static int CameraFd = 0;
//临时方案 后续会改写法合并到t_JZsdk_TaskFuntionInput(搞起来有点麻烦)
typedef struct t_FrameCatch_TaskFuntionInput
{
void (*task_function)(void*); //任务函数指针,用于指定 执行的任务
void* data; //数据指针
unsigned int data_size; //数据大小
} t_FrameCatch_TaskFuntionInput;
//多线程抓取数据线程
static void *JZsdk_Catch_MultiThread(void *args)
{
... ... @@ -45,11 +53,55 @@ static void *JZsdk_Catch_MultiThread(void *args)
}
/******************************
*
* 相机抓取初始化
* ThreadMode: 0为单线程 1为多线程
*
* ******************************/
T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode)
{
T_JZsdkReturnCode ret;
//初始化数据接收线程
pthread_t ReadDataTask;
pthread_attr_t task_attribute; //线程属性
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
if (ThreadMode == 0)
{
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread,NULL); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
else if (ThreadMode == 1)
{
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread,NULL); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//单线程抓取数据线程
static void *JZsdk_Catch_SingleThread(void *args)
static void *JZsdk_Catch_SingleThread2(void *args)
{
t_FrameCatch_TaskFuntionInput *task = (t_FrameCatch_TaskFuntionInput *)args;
while (1)
{
task->task_function();
unsigned int buf_size = 0;
unsigned char *buf = NULL;
... ... @@ -66,19 +118,25 @@ static void *JZsdk_Catch_SingleThread(void *args)
//进行数据处理
VideoMgmt_Single_FrameIn(buf, buf_size);
task->task_function();
//归还图片
V4L2_CameraFrameRecord_OnlyReturnFrame();
}
}
/******************************
/********************************************
*
*
* 相机抓取初始化
* ThreadMode: 0为单线程 1为多线程
*
* ******************************/
T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode)
* 传入线程的抓取模式 ThreadMode: 0为单线程 1为多线程
* 传入线程的处理函数 task_function
*
* *****************************************/
T_JZsdkReturnCode JZsdk_FrameCatch_Init2(int ThreadMode, T_JZsdkReturnCode (*task_function)(void*))
{
T_JZsdkReturnCode ret;
... ... @@ -88,9 +146,19 @@ T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode)
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
t_FrameCatch_TaskFuntionInput *task = (t_FrameCatch_TaskFuntionInput*)malloc(sizeof(t_FrameCatch_TaskFuntionInput));
if (task == NULL)
{
// 处理内存分配失败的情况
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
task->task_function = task_function;
task->args = NULL;
if (ThreadMode == 0)
{
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread,NULL); //线程
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread,(void *)task); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
... ... @@ -99,7 +167,7 @@ T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode)
}
else if (ThreadMode == 1)
{
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread,NULL); //线程
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread,(void *)task); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
... ...
#include <stdio.h>
#include "MediaProc.h"
#include "IrcC1.h"
#include "MediaParm.h"
#include "JZsdkLib.h"
#include "BaseConfig.h"
#ifdef RTK_MPP_STATUS_ON
#include "MediaProc/MultProc/RTK_mmp/RTK_mmp.h"
//c1的红外编码权柄
void *JZC1_Irc_enc_handle = NULL;
//c1的光学相机编码权柄
void *JZC1_Opt_enc_handle = NULL;
void *JZC1_Opt_dec_handle = NULL;
#endif
T_JZsdkReturnCode JZC1_Init()
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#ifdef RTK_MPP_STATUS_ON
//1、初始化编解码模块
//初始化红外的编解码器
RTK_mmp_enc_Init(&JZC1_Irc_enc_handle, MPP_VIDEO_CodingAVC, MPP_FMT_YUV420P, FIRST_WIDTH, FIRST_HEIGHT, 25, 5);
//初始化光学的编解码器
RTK_mmp_enc_Init(&JZC1_Opt_enc_handle, MPP_VIDEO_CodingAVC, MPP_FMT_YUV420P, SECOND_WIDTH, SECOND_HEIGHT, 25, 5);
RTK_mmp_dec_Init(&JZC1_Opt_dec_handle, MPP_VIDEO_CodingAVC, MPP_FMT_YUV420P, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
//2、相机初始化
Camera_Init();
//初始化光学相机
ret = JZsdk_Kt_Camera_Init();
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("光学相机初始化失败");
}
else
{
//初始化数据转换模块
JZsdk_Kt_Cam_DataDeal_Init();
}
#endif
}
\ No newline at end of file
... ...
... ... @@ -36,7 +36,6 @@ extern "C" {
#define SATURATION (128) //饱和度 摄像头饱和度范围为 1-255 默认128
#define EXPSURE (100) //曝光值 摄像头曝光值范围: 5-2500 默认auto设置
#define SECOND_WIDTH 1920
#define SECOND_HEIGHT 1080
#define SECOND_FRAME_NUM 30
... ...
... ... @@ -26,6 +26,13 @@ static T_JZsdkReturnCode MediaProc_SingleThreading()
//2、转码模块初始化
VideoStreamTransCode_Init();
}
//如果是昆腾相机 红外+光学 则红外为1号,光学为2号
if (DEVICE_VERSION == JZ_C1)
{
//1、初始化编解码处理模块
JZsdk_Kt_IrcMMP_Init(FIRST_WIDTH ,FIRST_HEIGHT, 25, 5 ,SECOND_WIDTH ,SECOND_HEIGHT, 30, 15);
}
}
//多线程方案
... ...
... ... @@ -12,6 +12,15 @@
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "BaseConfig.h"
#ifdef RTK_MPP_STATUS_ON
#include "MediaProc/MultProc/RTK_mmp/Dec/RTK_mmp_dec.h"
#include "MediaProc/MultProc/RTK_mmp/Enc/RTK_mmp_enc.h"
#endif
#ifdef __cplusplus
extern "C" {
... ...