作者 ookk303

配置文件修改

正在显示 47 个修改的文件 包含 1918 行增加1294 行删除
... ... @@ -122,7 +122,13 @@
"hardwareinfo.h": "c",
"jzsdk_attributedef.h": "c",
"msp_types.h": "c",
"attribute.h": "c"
"attribute.h": "c",
"rk_venc_rc.h": "c",
"rk_mpi.h": "c",
"cameradef.h": "c",
"cam_zoom.h": "c",
"videodev2.h": "c",
"jzsdk_widget.h": "c"
},
"Codegeex.GenerationPreference": "automatic",
"C_Cpp.dimInactiveRegions": false
... ...
# 编译链的配置
#1、编译链与设备类型的选择
set(DEVICE_NAME JZ_U3S)
set(DEVICE_NAME JZ_C1)
#上一行为禁止修改行
message("**************************JZSDK构建编译开始***************************\n")
if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H1T")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H150S")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H150T")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H10")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_H10T")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S")
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
set(DEVICE_TYPE MEGAPHONE)
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)
elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
set(MAKE_COMPILER ARM_X86_64_ARRCH64)
endif()
... ...
... ... @@ -19,8 +19,11 @@ file(GLOB_RECURSE JZSDK_COMMON_SRC ${ROOT_DIRS}JZsdk_Common/*.c)
list(APPEND ALL_SRC_FILES ${JZSDK_COMMON_SRC})
list(APPEND ALL_INC_FILES ${ROOT_DIRS}JZsdk_Common)
file(GLOB_RECURSE JZSDK_CONFIG_SRC ${ROOT_DIRS}JZsdk_Config/*.c)
list(APPEND ALL_SRC_FILES ${JZSDK_CONFIG_SRC})
file(GLOB_RECURSE JZSDK_CONFIG_SRC_baseConfig ${ROOT_DIRS}JZsdk_Config/BaseConfig.c)
file(GLOB_RECURSE JZSDK_CONFIG_SRC_Paramterpar ${ROOT_DIRS}JZsdk_Config/ParamterParsing.c)
list(APPEND ALL_SRC_FILES ${JZSDK_CONFIG_SRC_baseConfig})
list(APPEND ALL_SRC_FILES ${JZSDK_CONFIG_SRC_Paramterpar})
list(APPEND ALL_INC_FILES ${ROOT_DIRS}JZsdk_Config)
file(GLOB_RECURSE JZSDK_HAL_SRC ${ROOT_DIRS}JZsdk_hal/*.c)
... ... @@ -37,13 +40,6 @@ if(${DEVICE_INFO_MODULE} STREQUAL "VERSION_SWITCH_ON")
endif()
#如果要加载设备配置
if(${DEVICE_CONFIG_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n设备配置源码加载中")
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}Module/DeviceConfig/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
endif()
#如果要加载云台模块,需要加载以下附属内容
if(${GIMBAL_MODULE} STREQUAL "VERSION_SWITCH_ON")
message("\n云台模块源码加载中")
... ... @@ -188,7 +184,7 @@ if(${IMAGEPROCESSING_MODULE} STREQUAL "VERSION_SWITCH_ON")
list(APPEND ALL_SRC_FILES ${MODULE_IMAGEPROCESSING_cpp_SRC})
endif()
message("\n模组加载完毕\n")
# 头文件加载,后续再进行优化
list(APPEND ALL_INC_FILES ${ROOT_DIRS}Module/Megaphone)
... ...
... ... @@ -9,9 +9,6 @@ set(AUDIODEAL_MODULE VERSION_SWITCH_OFF)
# 信息模块
set(DEVICE_INFO_MODULE VERSION_SWITCH_OFF)
# 设备配置模块
set(DEVICE_CONFIG_MODULE VERSION_SWITCH_OFF)
# Gimbal 云台处理模块
set(GIMBAL_MODULE VERSION_SWITCH_OFF)
... ... @@ -60,9 +57,6 @@ set(IMAGEPROCESSING_MODULE VERSION_SWITCH_OFF)
# 添加信息模块
set(DEVICE_INFO_MODULE VERSION_SWITCH_ON)
# 添加设备配置模块
set(DEVICE_CONFIG_MODULE VERSION_SWITCH_ON)
# 添加UI管理模块
set(UI_CONTROL_MODULE VERSION_SWITCH_ON)
... ... @@ -75,6 +69,7 @@ message("通用库加载完成")
########################### 独立库加载 ##########################################
if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
... ... @@ -93,6 +88,12 @@ if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_H1_series/JZ_H1E/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("h1e基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_H1T")
# 添加AudioDeal 音频处理模块
... ... @@ -113,6 +114,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_H1T")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_H1_series/JZ_H1T/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("h1t基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3")
# 添加AudioDeal 音频处理模块
... ... @@ -133,6 +140,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_U3_series/JZ_U3/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("u3基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S")
# 添加AudioDeal 音频处理模块
... ... @@ -156,6 +169,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S")
# 添加激光模块
set(SIDE_LASER_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_U3_series/JZ_U3S/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("u3s基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
# 添加AudioDeal 音频处理模块
... ... @@ -176,6 +195,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_U3_series/JZ_U3D/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("u3d基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_U30")
# 添加AudioDeal 音频处理模块
... ... @@ -196,6 +221,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U30")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_U3_series/JZ_U30/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("u30基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_H10")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
... ... @@ -215,6 +246,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_H10")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_H10_series/JZ_H10/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("h10基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_H10T")
# 添加AudioDeal 音频处理模块
... ... @@ -232,6 +269,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_H10T")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_H10_series/JZ_H10T/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("h10t基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_H150S")
# 添加AudioDeal 音频处理模块
set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
... ... @@ -254,6 +297,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_H150S")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_H150S_H150T/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("h150s基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_H150T")
# 添加AudioDeal 音频处理模块
... ... @@ -277,6 +326,12 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_H150T")
# 添加FFMPEG及其附属模块
set(FFMPEG_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZ_H150S_H150T/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("h150t基础配置完毕\n")
elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
# 添加Gimbal 云台处理模块
... ... @@ -296,6 +351,13 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
# 添加昆腾模块
set(LIB_KT_MODULE VERSION_SWITCH_ON)
#设备独立配置源文件
file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}JZsdk_Config/DeviceSample/JZC1/*.c)
list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
message("C1基础配置完毕\n")
endif()
message("***********************模组模块配置完毕*********************************\n")
\ No newline at end of file
... ...
... ... @@ -47,6 +47,8 @@ typedef uint64_t U64_t;
typedef double F64_t;
typedef float F32_t;
#define JZSDK_SINGLE_THREAD 0 //jz单线程
#define JZSDK_MULTI_THREAD 1 //jz多线程
//线程权柄
typedef void *T_JZTaskHandle;
... ...
... ... @@ -20,7 +20,7 @@
#include "JZsdk_haldata_deal/JZsdk_data_transmisson.h"
#include "MediaProc/MediaProc.h"
#include "UI_control/WidegMgmt/JZsdk_Widget.h"
#include "DeviceConfig/DeviceConfig.h"
#include "DeviceSample/DeviceSample.h"
#include "CommonMod/CommonMod.h"
#include "JZsdk_Hal.h"
... ... @@ -163,228 +163,60 @@ T_JZsdkReturnCode Main_APP_Psdk()
//外接传输模块
JZsdk_data_transmisson_Receive_Init();
//喊话器功能被打开时
#ifdef MEGAPHONE_CONFIG_STATUS_ON
//音频库初始化
AudioDeal_Init();
//a1加载
#if DEVICE_VERSION == JZ_A1
JZ_a1_init(APP_PSDK);
#endif
if (DEVICE_VERSION == TF_A1)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_H1E)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//喊话器初始化
Megaphone_Init();
}
else if (DEVICE_VERSION == JZ_H1T)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_TRANSPARENT);
}
else if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
if (DEVICE_VERSION == JZ_H150T)
{
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
}
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//相机初始化
MediaProc_Init();
}
else if (DEVICE_VERSION == JZ_H10)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
}
else if (DEVICE_VERSION == JZ_H10T)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
}
else if (DEVICE_VERSION == JZ_U3)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_U3S)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
#ifdef SIDE_LASER_STATUS_ON
//侧边激光初始化
SideLaser_Init();
//h1e加载
#if DEVICE_VERSION == JZ_H1E
JZ_h1e_init(APP_PSDK);
#endif
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_U3D)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
//h1t加载
#if DEVICE_VERSION == JZ_H1T
JZ_h1t_init(APP_PSDK);
#endif
else if (DEVICE_VERSION == JZ_U30)
{
//串口设备1初始化
//value[0] = UART_DEV1_BITRATE;
//JZsdk_HalPort_Init(UART_DEV_1, value);
//h10加载
#if DEVICE_VERSION == JZ_H10
JZ_h10_init(APP_PSDK);
#endif
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//h10t加载
#if DEVICE_VERSION == JZ_H10T
JZ_h10t_init(APP_PSDK);
#endif
//喊话器初始化
Megaphone_Init();
//h150s h150t加载
#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
JZ_h150s_h150t_init(APP_PSDK);
#endif
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//u3加载
#if DEVICE_VERSION == JZ_U3
JZ_u3_init(APP_PSDK);
#endif
//灯类初始化
Lighting_Init();
//u3s加载
#if DEVICE_VERSION == JZ_U3S
JZ_u3s_init(APP_PSDK);
#endif
delayMs(1000);
//u3d加载
#if DEVICE_VERSION == JZ_U3D
JZ_u3d_init(APP_PSDK);
#endif
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
//u30加载
#if DEVICE_VERSION == JZ_U30
JZ_u30_init(APP_PSDK);
#endif
else if (DEVICE_VERSION == JZ_C1)
{
//初始化C1
//c1加载
#if DEVICE_VERSION == JZ_C1
JZC1_Init();
}
#endif
//初始化控件
JZSDK_WidgetMgMT_Init();
... ... @@ -422,246 +254,62 @@ int Main_APP_Uart()
//工作模式设置函数,用于超时,及播放启动语音等
Main_WorkMode();
//喊话器功能被打开时
#ifdef MEGAPHONE_CONFIG_STATUS_ON
//音频库初始化
AudioDeal_Init();
#endif
if (DEVICE_VERSION == JZ_H1E)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//喊话器初始化
Megaphone_Init();
}
if (DEVICE_VERSION == JZ_H1T)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_TRANSPARENT);
// //测试增加选项
// //开启循环
// JZsdk_Uart_audio_PlayLoop(UART_DEV_1, 1);
// //设置音量
// JZsdk_Uart_Set_Volume(UART_DEV_1, 50);
}
if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//网口初始化
JZsdk_NetWork_Init();
if (DEVICE_VERSION == JZ_H150T)
{
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
}
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//相机初始化
MediaProc_Init();
//喊话器初始化
Megaphone_Init();
}
if (DEVICE_VERSION == JZ_H10)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//H10和10t固定打开滤波
int filter_mode = JZ_FLAGCODE_ON;
Main_M30_all_filter_mode(&filter_mode);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
}
if (DEVICE_VERSION == JZ_H10T)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
//H10和10t固定打开滤波
int filter_mode = JZ_FLAGCODE_ON;
Main_M30_all_filter_mode(&filter_mode);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
}
if (DEVICE_VERSION == JZ_U3)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_OFF);
// //测试需要开启亮度
// JZsdk_Uart_SearchLight_Control(UART_DEV_1, 1);
// JZsdk_Uart_SearchLight_Lumen(UART_DEV_1, 20, 20);
}
else if (DEVICE_VERSION == JZ_U3S)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
#ifdef SIDE_LASER_STATUS_ON
//侧边激光初始化
SideLaser_Init();
//a1加载
#if DEVICE_VERSION == JZ_A1
JZ_a1_init(APP_UART);
#endif
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
else if (DEVICE_VERSION == JZ_U3D)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
// delayS(3);
// JZSDK_LOG_INFO("开起发光");
// //开灯
// UIcontrol_SearchLightControl(UART_DEV_1, 0x02);
// UIcontrol_Set_SearchLightLumen(UART_DEV_1, 1, 100, 100);
}
else if (DEVICE_VERSION == JZ_U30)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//h1e加载
#if DEVICE_VERSION == JZ_H1E
JZ_h1e_init(APP_UART);
#endif
//喊话器初始化
Megaphone_Init();
//h1t加载
#if DEVICE_VERSION == JZ_H1T
JZ_h1t_init(APP_UART);
#endif
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//h10加载
#if DEVICE_VERSION == JZ_H10
JZ_h10_init(APP_UART);
#endif
//灯类初始化
Lighting_Init();
//h10t加载
#if DEVICE_VERSION == JZ_H10T
JZ_h10t_init(APP_UART);
#endif
delayMs(1000);
//h150s h150t加载
#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
JZ_h150s_h150t_init(APP_UART);
#endif
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
//u3加载
#if DEVICE_VERSION == JZ_U3
JZ_u3_init(APP_UART);
#endif
if (DEVICE_VERSION == TF_A1)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
//u3s加载
#if DEVICE_VERSION == JZ_U3S
JZ_u3s_init(APP_UART);
#endif
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//u3d加载
#if DEVICE_VERSION == JZ_U3D
JZ_u3d_init(APP_UART);
#endif
//喊话器初始化
Megaphone_Init();
//u30加载
#if DEVICE_VERSION == JZ_U30
JZ_u30_init(APP_UART);
#endif
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//c1加载
#if DEVICE_VERSION == JZ_C1
JZC1_Init();
#endif
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
g_baseconfig_InitFlag = JZ_FLAGCODE_ON;
... ...
/**
********************************************************************
* @file DeviceConfig.h
* DeviceConfig.h的头文件
* @file DeviceSample.h
* DeviceSample.h的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef DEVICE_CONFIG_H
#define DEVICE_CONFIG_H
#ifndef DEVICE_SAMPLE_H
#define DEVICE_SAMPLE_H
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "DeviceConfig/JZC1/JZC1.h"
#include "DeviceSample/JZC1/JZC1.h"
/* Includes ------------------------------------------------------------------*/
... ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
#include "JZsdk_usb_bulk/JZsdk_usb_bulk.h"
#include "IRCUT/ircut.h"
#ifdef RTK_MPP_STATUS_ON
#include "MediaProc/MultProc/RTK_mmp/RTK_mmp.h"
#include "MediaProc/MultProc/RTK_mmp/Dec/RTK_mmp_dec.h"
#include "MediaProc/MultProc/RTK_mmp/Enc/RTK_mmp_enc.h"
#include "MediaProc/Camera/Camera.h"
#endif
#ifdef RTK_RGA_STATUS_ON
#include "MediaProc/RgaProc/RK_Rga/RK_Rga.h"
//c1的rga结构体
#endif
#include "MediaProc/MediaProc.h"
typedef struct C1_RgaInfo
{
//源图像
... ... @@ -42,27 +38,57 @@ typedef struct C1_RgaInfo
}C1_RgaInfo;
static C1_RgaInfo *g_C1_RgaIrcInfo = NULL;
static C1_RgaInfo *g_C1_RgaOptInfo = NULL;
typedef struct T_JZC1_info
{
/*************************************************************/
//红外相机的编码器信息
T_rtk_mmp_enc_info *IRC_enc_info;
static unsigned char *g_MixedIrc_Buffer = NULL;
//红外相机的rga信息
C1_RgaInfo *IRC_rga_info;
static unsigned char *g_MixedOpt_Buffer = NULL;
static unsigned int g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
/*************************************************************/
//光学相机的解码器信息
T_rtk_mmp_dec_info *Opt_dec_info;
#endif
//光学相机的编码器信息
T_rtk_mmp_enc_info *Opt_enc_info;
//光学相机的相机信息
JZsdk_CameraInfo *Opt_Camera_info;
C1_RgaInfo *Opt_rga_info;
/*************************************************************/
//融合相机的编码器信息
T_rtk_mmp_enc_info *Fuse_enc_info;
}T_JZC1_info;
#define JZ_C1_IRC_WIDTH 320
#define JZ_C1_IRC_HEIGHT 256
#define JZ_C1_IRC_FRAMERATE 30
#define JZ_C1_IRC_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST
#define JZ_C1_OPT_WIDTH 1920
#define JZ_C1_OPT_HEIGHT 1080
#define JZ_C1_OPT_FRAMERATE 30
#define JZ_C1_OPT_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND
#define JZ_C1_OPT_DEV_PATH ("/dev/video21")
#define JZ_C1_OPT_PIXEL V4L2_PIX_FMT_MJPEG
#ifdef MEDIA_PROC_CONFIG_STATUS_ON
#define JZ_C1_FUSE_WIDTH 1920
#define JZ_C1_FUSE_HEIGHT 1080
#define JZ_C1_FUSE_FRAMERATE 30
#define JZ_C1_FUSE_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD
#include "MediaProc/Camera/Cam_FrameCatch/Cam_FrameCatch.h"
#include "MediaProc/MediaParm.h"
#include "MediaProc/VideoMgmt/VideoStreamPush/VideoStream_Push.h"
#include "MediaProc/VideoMgmt/VideoMgmt.h"
#include "MediaProc/IRC_funtion/IRC_Param.h"
#include "MediaProc/IRC_funtion/IRC_funtion.h"
#include "MediaProc/MediaProc_Param.h"
static unsigned char *g_MixedIrc_Buffer = NULL;
static unsigned char *g_MixedOpt_Buffer = NULL;
static unsigned int g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
static T_JZC1_info g_JZC1_info;
static void *g_usb_index = NULL;
... ... @@ -72,15 +98,15 @@ static const unsigned char FRAME_HEADER[FRAME_HEADER_SIZE] = {0xaa, 0xbb, 0xcc,
#define NSEC_PER_SEC 1000000000L //1秒的纳秒数
#define TARGET_FPS 30
static unsigned char FrameBuffer[FIRST_HEIGHT * FIRST_WIDTH *2]; //用于存储帧数据的缓冲区
static unsigned char FrameBuffer[JZ_C1_IRC_HEIGHT * JZ_C1_IRC_WIDTH *2]; //用于存储帧数据的缓冲区
static unsigned int FrameBufferLen = 0; //用于存储帧数据的长度
static int FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
#ifdef RTK_RGA_STATUS_ON
static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned char *image, unsigned int *imgage_size);
static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo **rgaInfo, int dst_width, int dst_height, int dst_format);
#endif
//数据推送函数
static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, unsigned int data_len)
{
... ... @@ -93,7 +119,7 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un
}
//红外相机
if (currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST && CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST)
if (currentIndex == JZ_C1_IRC_INDEX && CameraIndex == JZ_C1_IRC_INDEX)
{
//推送数据到流转模块
... ... @@ -101,14 +127,14 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un
}
//光学相机
if(CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND && currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND)
if(CameraIndex == JZ_C1_OPT_INDEX && currentIndex == JZ_C1_OPT_INDEX)
{
//推送数据到流转模块
VideoMgmt_Single_FrameIn(data, data_len);
}
//组合视频流
if (currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD && CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD)
if (currentIndex == JZ_C1_FUSE_INDEX && CameraIndex == JZ_C1_FUSE_INDEX)
{
//推送数据到流转模块
VideoMgmt_Single_FrameIn(data, data_len);
... ... @@ -119,17 +145,13 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un
static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len)
{
#ifdef RTK_MPP_STATUS_ON
//JZSDK_LOG_INFO("JZC1_OptDeal");
MppFrame yuv_data = NULL; //用于传递yuv数据的地址
MppPacket Packet = NULL;
//输入数据进入解码器
RTK_mmp_dec_input(JZsdk_RtkMmpGetDecHandleAddr(1), data, data_len, &yuv_data);
RTK_mmp_dec_input(g_JZC1_info.Opt_dec_info, data, data_len, &yuv_data);
// int width = mpp_frame_get_width(yuv_data);
// int height = mpp_frame_get_height(yuv_data);
... ... @@ -180,7 +202,7 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len
unsigned char *temp_data = (unsigned char *)malloc(size);
memcpy(temp_data, mpp_buffer_get_ptr(temp), size);
JZC1_RgaDeal(g_C1_RgaOptInfo, ZoomRatio, temp_data, &size);
JZC1_RgaDeal(g_JZC1_info.Opt_rga_info, ZoomRatio, temp_data, &size);
//重新将数据放回
memcpy(mpp_buffer_get_ptr(temp), temp_data, size);
... ... @@ -200,7 +222,7 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len
//将返回的数据输入进编码器
RTK_mmp_enc_yuv_to_h264_byFrame(JZsdk_RtkMmpGetEncHandleAddr(1), yuv_data, &Packet);
RTK_mmp_enc_yuv_to_h264_byFrame(g_JZC1_info.Opt_enc_info, yuv_data, &Packet);
//获取数据指针与长度
int packet_len = mpp_packet_get_length(Packet);
... ... @@ -211,7 +233,6 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len
//释放掉编码图像
mpp_packet_deinit(&Packet);
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -230,7 +251,6 @@ static T_JZsdkReturnCode JZC1_Irc_DataCorrect(unsigned char *data)
//在这里将灰度图数据转换成目标数据
static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len)
{
#ifdef IRC_CONFIG_STATUS_ON
//JZSDK_LOG_DEBUG("irc数据处理");
if (data_len == 0)
{
... ... @@ -291,7 +311,7 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len
if (ZoomRatio != JZ_FLAGCODE_OFF)
{
JZC1_RgaDeal(g_C1_RgaIrcInfo, ZoomRatio, raw_data, &raw_data_len);
JZC1_RgaDeal(g_JZC1_info.IRC_rga_info, ZoomRatio, raw_data, &raw_data_len);
}
//将数据放入混合缓冲区
... ... @@ -304,10 +324,9 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len
unsigned char *h264Data = NULL;
unsigned int h264DataLen = 0;
#ifdef RTK_MPP_STATUS_ON
MppPacket Packet = NULL;
RTK_mmp_enc_data_to_h264(JZsdk_RtkMmpGetEncHandleAddr(0), raw_data, raw_data_len, &Packet);
RTK_mmp_enc_data_to_h264(g_JZC1_info.IRC_enc_info, raw_data, raw_data_len, &Packet);
h264DataLen = mpp_packet_get_length(Packet);
h264Data = (unsigned char *)mpp_packet_get_pos(Packet);
... ... @@ -316,7 +335,6 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len
//释放掉packet
mpp_packet_deinit(&Packet);
#endif
//将h264数据推送
JZC1_PushFrame(1, h264Data, h264DataLen);
... ... @@ -334,11 +352,10 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len
u16Data = NULL;
}
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static void *JZC1_IrcDataBuffer_Thread(void *args)
{
... ... @@ -355,8 +372,6 @@ static void *JZC1_IrcDataBuffer_Thread(void *args)
unsigned char *TempBuffer = (unsigned char *)malloc(163840);
unsigned int TempBufferLen = 0;
while (1)
{
//获取当前时间
... ... @@ -393,10 +408,9 @@ static void *JZC1_IrcDataBuffer_Thread(void *args)
struct timespec req = { .tv_sec = 0, .tv_nsec = 1000000 };
nanosleep(&req, NULL);
}
}
static T_JZsdkReturnCode JZC1_IrcDataSave(unsigned char *data, unsigned int data_len)
{
//避免缓冲区被同时操作
... ... @@ -419,7 +433,7 @@ static T_JZsdkReturnCode JZC1_IrcDataSave(unsigned char *data, unsigned int data
//红外数据接收线程
static void *JZC1_IrcDataRecv_Thread(void *args)
{
int frame_len = FIRST_WIDTH *2* FIRST_HEIGHT; //163840
int frame_len = g_JZC1_info.IRC_enc_info->width * g_JZC1_info.IRC_enc_info->height *2; //163840
unsigned char buf[frame_len]; //usb数据缓冲区需要为512的倍数
unsigned char frameData[frame_len]; // 存储整帧数据的画面缓冲区
unsigned int lineNum = 0;
... ... @@ -547,7 +561,6 @@ static void *JZC1_IrcDataRecv_Thread(void *args)
}
}
//C1 红外相机数据的初始化
static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init()
{
... ... @@ -584,44 +597,68 @@ static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init()
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("JZsdk_JZC1_Irc_Data_Init sucess");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// /********************
// *
// * 混合视频说明
// *
// * 1920*1088 做处理 并输出为 1920*1080
// * __________________________________________________________________
// * |_________________________________ |
// * | |________________________________|
// * | | |
// * | | 1920*1088 /2 960* 544 |
// * | | |
// * | 320*256 拉伸4到 1280*1024 | |
// * | 裁剪出 3/4 到 960 * 768 | |
// * | | |
// * | |________________________________|
// * |_________________________________| |
// * |__________________________________________________________________|
// *
// * ******************/
static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo *rgaInfo, int dst_width, int dst_height, int dst_format)
{
int width = dst_width;
int height = dst_height;
int rect_x = 0;
int rect_y = 0;
int rect_w = dst_width;
int rect_h = dst_height;
rgaInfo->src_img = NULL;
/********************
*
* 混合视频说明
*
* 1920*1088 做处理 并输出为 1920*1080
* __________________________________________________________________
* |_________________________________ |
* | |________________________________|
* | | |
* | | 1920*1088 /2 960* 544 |
* | | |
* | 320*256 拉伸4到 1280*1024 | |
* | 裁剪出 3/4 到 960 * 768 | |
* | | |
* | |________________________________|
* |_________________________________| |
* |__________________________________________________________________|
*
* ******************/
RK_Rga_ImageInit(&(rgaInfo->src_img), width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输入模块
rgaInfo->corp_img = NULL;
RK_Rga_ImageInit(&(rgaInfo->corp_img), width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化裁剪模块
/******************
*
* 混合视频处理
*
*
* ********************/
static void JZC1_MixedVideo_Deal()
{
rgaInfo->dst_img = NULL;
RK_Rga_ImageInit(&(rgaInfo->dst_img), width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输出模块
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// /******************
// *
// * 混合视频处理
// *
// *
// * ********************/
// static void JZC1_MixedVideo_Deal()
// {
// }
static void *MixedVideo_Thread(void *args)
{
#ifdef RTK_RGA_STATUS_ON
... ... @@ -642,16 +679,16 @@ static void *MixedVideo_Thread(void *args)
im_rect Irc_Rect;
Irc_Rect.x = 0;
Irc_Rect.y = 0;
Irc_Rect.width = JZ_ALIGN(FIRST_WIDTH, 16);
Irc_Rect.height = JZ_ALIGN(FIRST_HEIGHT, 16);
Irc_Rect.width = g_JZC1_info.IRC_enc_info->hor_stride;
Irc_Rect.height = g_JZC1_info.IRC_enc_info->ver_stride;
int IRc_Format = RK_FORMAT_YCbCr_420_SP;
//红外放大图像
im_rect Irc_ResizeRect;
Irc_ResizeRect.x = 0;
Irc_ResizeRect.y = 0;
Irc_ResizeRect.width = JZ_ALIGN(FIRST_WIDTH, 16) * 4;
Irc_ResizeRect.height = JZ_ALIGN(FIRST_HEIGHT, 16) * 4;
Irc_ResizeRect.width = g_JZC1_info.IRC_enc_info->hor_stride * 4;
Irc_ResizeRect.height = g_JZC1_info.IRC_enc_info->ver_stride * 4;
//红外裁剪区域
im_rect Irc_CropRect;
... ... @@ -678,16 +715,16 @@ static void *MixedVideo_Thread(void *args)
im_rect Opt_Rect;
Opt_Rect.x = 0;
Opt_Rect.y = 0;
Opt_Rect.width = JZ_ALIGN(SECOND_WIDTH, 16);
Opt_Rect.height = JZ_ALIGN(SECOND_HEIGHT, 16);
Opt_Rect.width = g_JZC1_info.Opt_enc_info->hor_stride;
Opt_Rect.height = g_JZC1_info.Opt_enc_info->ver_stride;
int Opt_Format = RK_FORMAT_YCbCr_420_SP;
//光学源缩小图像
im_rect Opt_ResizeRect;
Opt_ResizeRect.x = 0;
Opt_ResizeRect.y = 0;
Opt_ResizeRect.width = JZ_ALIGN(SECOND_WIDTH, 16) / 2;
Opt_ResizeRect.height = JZ_ALIGN(SECOND_HEIGHT, 16) / 2;
Opt_ResizeRect.width = g_JZC1_info.Opt_enc_info->hor_stride / 2;
Opt_ResizeRect.height = g_JZC1_info.Opt_enc_info->ver_stride / 2;
//光学源图像
RK_RgaImage *Opt_SrcImg = NULL;
... ... @@ -704,8 +741,8 @@ static void *MixedVideo_Thread(void *args)
im_rect Dst_Rect;
Dst_Rect.x = 0;
Dst_Rect.y = 0;
Dst_Rect.width = JZ_ALIGN(SECOND_WIDTH, 16);
Dst_Rect.height = JZ_ALIGN(SECOND_HEIGHT, 16);
Dst_Rect.width = g_JZC1_info.Opt_enc_info->hor_stride;
Dst_Rect.height = g_JZC1_info.Opt_enc_info->ver_stride;
int Dst_Format = RK_FORMAT_YCbCr_420_SP;
//目标图像中光学图像的矩形
... ... @@ -765,8 +802,8 @@ static void *MixedVideo_Thread(void *args)
memset(Opt_SrcImg->buf, 0, Opt_SrcImg->buf_size);
//将数据放入缓冲区
memcpy(Irc_SrcImg->buf, g_MixedIrc_Buffer, (JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
memcpy(Opt_SrcImg->buf, g_MixedOpt_Buffer, JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
memcpy(Irc_SrcImg->buf, g_MixedIrc_Buffer, (g_JZC1_info.IRC_enc_info->hor_stride) * (g_JZC1_info.IRC_enc_info->ver_stride) * 3 / 2);
memcpy(Opt_SrcImg->buf, g_MixedOpt_Buffer, g_JZC1_info.Opt_enc_info->hor_stride * g_JZC1_info.Opt_enc_info->ver_stride * 3 / 2);
g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
... ... @@ -817,10 +854,9 @@ static void *MixedVideo_Thread(void *args)
//JZSDK_LOG_DEBUG("DstImg->buf_size:%d", DstImg->buf_size);
#ifdef RTK_MPP_STATUS_ON
MppPacket Packet = NULL;
RTK_mmp_enc_data_to_h264(JZsdk_RtkMmpGetEncHandleAddr(2), DstImg->buf, DstImg->buf_size, &Packet);
RTK_mmp_enc_data_to_h264(g_JZC1_info.Fuse_enc_info, DstImg->buf, DstImg->buf_size, &Packet);
h264DataLen = mpp_packet_get_length(Packet);
h264Data = (unsigned char *)mpp_packet_get_pos(Packet);
... ... @@ -829,7 +865,6 @@ static void *MixedVideo_Thread(void *args)
//释放掉packet
mpp_packet_deinit(&Packet);
#endif
//推送视频流
JZC1_PushFrame(VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD, h264Data, h264DataLen);
... ... @@ -858,8 +893,9 @@ static void *MixedVideo_Thread(void *args)
static T_JZsdkReturnCode JZC1_MixedVideo_Init()
{
#ifdef IRC_CONFIG_STATUS_ON
g_MixedIrc_Buffer = (unsigned char *)malloc(JZ_ALIGN(FIRST_WIDTH, 16)*JZ_ALIGN(FIRST_HEIGHT, 16)*3/2);
g_MixedOpt_Buffer = (unsigned char *)malloc(JZ_ALIGN(SECOND_WIDTH, 16)*JZ_ALIGN(SECOND_HEIGHT, 16)*3/2);
g_MixedIrc_Buffer = (unsigned char *)malloc(g_JZC1_info.IRC_enc_info->hor_stride * g_JZC1_info.IRC_enc_info->ver_stride * 3/2);
g_MixedOpt_Buffer = (unsigned char *)malloc(g_JZC1_info.Opt_enc_info->hor_stride * g_JZC1_info.Opt_enc_info->ver_stride * 3/2);
//混合视频初始化
pthread_t Task;
... ... @@ -880,150 +916,13 @@ static T_JZsdkReturnCode JZC1_MixedVideo_Init()
}
#endif
//JZ_C1 的媒体初始化
static T_JZsdkReturnCode JZC1_MediaInit()
{
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//初始化媒体模块
#ifdef MEDIA_PROC_CONFIG_STATUS_ON
//初始化videoMgmt模块
VideoMgmt_Init();
//初始化Mulit模块
#ifdef RTK_MPP_STATUS_ON
//初始化红外的编解码器
RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(0), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, FIRST_WIDTH, FIRST_HEIGHT, 30, 5);
//初始化光学的编解码器
RTK_mmp_dec_Init(JZsdk_RtkMmpGetDecHandleAddr(1), MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT);
RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(1), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
// RTK_mmp_dec_Init(JZsdk_RtkMmpGetDecHandleAddr(1), MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT);
// RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(1), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
//初始化混合视频流的编码器
RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(2), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
#endif
//初始化Camera模块
int CameraFd = -1;
ret = V4l2_Camarainit2(&CameraFd, SECOND_WIDTH, SECOND_HEIGHT, 30);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("光学相机启动失败");
}
else
{
//光学相机的抓取
ret = JZsdk_FrameCatch_Single(JZC1_OptDeal);
}
//初始化IRC_funtion模块
ret = IRC_ParamInit(FIRST_HEIGHT, FIRST_WIDTH, 25);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("初始化红外的数据处理失败");
}
else
{
//初始化红外的数据输入
ret = JZsdk_JZC1_Irc_Data_Init();
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("红外相机初始化失败");
}
}
//设置默认参数
//默认推送红外摄像头 后续改成 红外+光学 的组合画面
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD);
//设置快门为开
JZsdk_Camera_ShutterSwitch(JZ_FLAGCODE_ON);
//设置伪彩颜色为hot
int value = 8;
Camera_param(JZ_FLAGCODE_SET, CAMERA_PSEUDO_COLOR, &value);
//设置为默认输出模式
value = 0;
Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value);
//设置默认打开自动校正
value = JZ_FLAGCODE_ON;
Proc_IRC_param(JZ_FLAGCODE_SET, JZSDK_WIDGET_BAD_PIXEL_CORRECT_MODE, &value);
//初始化变焦模块
Cam_Zoom_Init();
//初始化RGA模块
#ifdef RTK_RGA_STATUS_ON
ret = JZC1_RgaInit(&g_C1_RgaIrcInfo, JZ_ALIGN(FIRST_WIDTH, 16), JZ_ALIGN(FIRST_HEIGHT, 16), RK_FORMAT_YCbCr_420_SP);
ret = JZC1_RgaInit(&g_C1_RgaOptInfo, JZ_ALIGN(SECOND_WIDTH, 16), JZ_ALIGN(SECOND_HEIGHT, 16), RK_FORMAT_YCbCr_420_SP);
//混合视频初始化
JZC1_MixedVideo_Init();
#endif
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
#ifdef RTK_RGA_STATUS_ON
static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo **rgaInfo, int dst_width, int dst_height, int dst_format)
{
//初始化rga结构体
(*rgaInfo) = (C1_RgaInfo *)malloc(sizeof(C1_RgaInfo));
if ((*rgaInfo) == NULL)
{
JZSDK_LOG_ERROR("RGA初始化失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
int width = dst_width;
int height = dst_height;
int rect_x = 0;
int rect_y = 0;
int rect_w = dst_width;
int rect_h = dst_height;
(*rgaInfo)->src_img = NULL;
RK_Rga_ImageInit(&(*rgaInfo)->src_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输入模块
(*rgaInfo)->corp_img = NULL;
RK_Rga_ImageInit(&(*rgaInfo)->corp_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化裁剪模块
(*rgaInfo)->dst_img = NULL;
RK_Rga_ImageInit(&(*rgaInfo)->dst_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输出模块
}
#endif
//rga处理
#ifdef RTK_RGA_STATUS_ON
static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned char *image, unsigned int *imgage_size)
{
int d_ret;
if (g_C1_RgaIrcInfo == NULL || *imgage_size != rga_info->src_img->buf_size)
if (g_JZC1_info.IRC_rga_info == NULL || *imgage_size != rga_info->src_img->buf_size)
{
printf("C1_Rga_Deal failed imagesize:%d bufsize:%d\n", *imgage_size, rga_info->src_img->buf_size);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ... @@ -1089,33 +988,201 @@ static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned
}
T_JZsdkReturnCode JZC1_SetNextFrame_IDR(unsigned int index)
{
if (index == JZ_C1_IRC_INDEX)
{
RTK_mmp_enc_SetNextFrame_IDR(g_JZC1_info.IRC_enc_info);
}
else if (index == JZ_C1_OPT_INDEX)
{
RTK_mmp_enc_SetNextFrame_IDR(g_JZC1_info.Opt_enc_info);
}
else if (index == JZ_C1_FUSE_INDEX)
{
RTK_mmp_enc_SetNextFrame_IDR(g_JZC1_info.Fuse_enc_info);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
#endif
//c1的实际初始化函数
T_JZsdkReturnCode JZC1_Init()
{
T_JZsdkReturnCode ret;
#ifdef RTK_MPP_STATUS_ON
//初始化引脚
Ircut_Init();
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//初始化媒体模块
ret = JZC1_MediaInit();
T_JZsdkVideoMgmtHandler VideoMgmtHandler = {
.SetNextFrame_IDR = JZC1_SetNextFrame_IDR,
};
VideoMgmt_Init(VideoMgmtHandler);
JZSDK_LOG_INFO("JZ_C1 INIT COMPLETED\n");
//初始化红外的编码器
g_JZC1_info.IRC_enc_info = (T_rtk_mmp_enc_info *)malloc(sizeof(T_rtk_mmp_enc_info));
if (g_JZC1_info.IRC_enc_info == NULL)
{
JZSDK_LOG_ERROR("malloc enc_info failed");
}
return ret;
}
g_JZC1_info.IRC_enc_info->Input_fmt = MPP_FMT_YUV420SP;
g_JZC1_info.IRC_enc_info->encType = MPP_VIDEO_CodingAVC;
g_JZC1_info.IRC_enc_info->width = JZ_C1_IRC_WIDTH;
g_JZC1_info.IRC_enc_info->height = JZ_C1_IRC_HEIGHT;
g_JZC1_info.IRC_enc_info->FrameNum = JZ_C1_IRC_FRAMERATE;
g_JZC1_info.IRC_enc_info->IDR_gop = 5;
g_JZC1_info.IRC_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.IRC_enc_info->width, 16);
g_JZC1_info.IRC_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.IRC_enc_info->height, 16);
RTK_mmp_enc_Init(g_JZC1_info.IRC_enc_info);
//初始化光学摄像头的解码器
g_JZC1_info.Opt_dec_info = (T_rtk_mmp_dec_info *)malloc(sizeof(T_rtk_mmp_dec_info));
if (g_JZC1_info.Opt_dec_info == NULL)
{
JZSDK_LOG_ERROR("malloc dec_info failed");
}
g_JZC1_info.Opt_dec_info->Dec_type = MPP_VIDEO_CodingMJPEG;
g_JZC1_info.Opt_dec_info->out_format = MPP_FMT_YUV420SP;
g_JZC1_info.Opt_dec_info->width = JZ_C1_OPT_WIDTH;
g_JZC1_info.Opt_dec_info->height = JZ_C1_OPT_HEIGHT;
g_JZC1_info.Opt_dec_info->hor_stride = JZ_ALIGN(g_JZC1_info.Opt_dec_info->width, 16);
g_JZC1_info.Opt_dec_info->ver_stride = JZ_ALIGN(g_JZC1_info.Opt_dec_info->height, 16);
RTK_mmp_dec_Init(g_JZC1_info.Opt_dec_info);
//初始化光学的编码器
g_JZC1_info.Opt_enc_info = (T_rtk_mmp_enc_info *)malloc(sizeof(T_rtk_mmp_enc_info));
if (g_JZC1_info.Opt_enc_info == NULL)
{
JZSDK_LOG_ERROR("malloc enc_info failed");
}
g_JZC1_info.Opt_enc_info->Input_fmt = MPP_FMT_YUV420SP;
g_JZC1_info.Opt_enc_info->encType = MPP_VIDEO_CodingAVC;
g_JZC1_info.Opt_enc_info->width = JZ_C1_OPT_WIDTH;
g_JZC1_info.Opt_enc_info->height = JZ_C1_OPT_HEIGHT;
g_JZC1_info.Opt_enc_info->FrameNum = JZ_C1_OPT_FRAMERATE;
g_JZC1_info.Opt_enc_info->IDR_gop = 15;
g_JZC1_info.Opt_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.Opt_enc_info->width, 16);
g_JZC1_info.Opt_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.Opt_enc_info->height, 16);
RTK_mmp_enc_Init(g_JZC1_info.Opt_enc_info);
//初始化融合的编码器
g_JZC1_info.Fuse_enc_info = (T_rtk_mmp_enc_info *)malloc(sizeof(T_rtk_mmp_enc_info));
if (g_JZC1_info.Fuse_enc_info == NULL)
{
JZSDK_LOG_ERROR("malloc enc_info failed");
}
g_JZC1_info.Fuse_enc_info->Input_fmt = MPP_FMT_YUV420SP;
g_JZC1_info.Fuse_enc_info->encType = MPP_VIDEO_CodingAVC;
g_JZC1_info.Fuse_enc_info->width = JZ_C1_FUSE_WIDTH;
g_JZC1_info.Fuse_enc_info->height = JZ_C1_FUSE_HEIGHT;
g_JZC1_info.Fuse_enc_info->FrameNum = JZ_C1_FUSE_FRAMERATE;
g_JZC1_info.Fuse_enc_info->IDR_gop = 15;
g_JZC1_info.Fuse_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.Fuse_enc_info->width, 16);
g_JZC1_info.Fuse_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.Fuse_enc_info->height, 16);
RTK_mmp_enc_Init(g_JZC1_info.Fuse_enc_info);
//初始化光学相机
g_JZC1_info.Opt_Camera_info = (JZsdk_CameraInfo *)malloc(sizeof(JZsdk_CameraInfo));
if (g_JZC1_info.Opt_Camera_info == NULL)
{
JZSDK_LOG_ERROR("malloc camera_info failed");
}
g_JZC1_info.Opt_Camera_info->width = JZ_C1_OPT_WIDTH;
g_JZC1_info.Opt_Camera_info->height = JZ_C1_OPT_HEIGHT;
g_JZC1_info.Opt_Camera_info->FrameNum = JZ_C1_OPT_FRAMERATE;
g_JZC1_info.Opt_Camera_info->CameraFormat = JZ_C1_OPT_PIXEL;
g_JZC1_info.Opt_Camera_info->ThreadMode = JZSDK_SINGLE_THREAD;
memset(&(g_JZC1_info.Opt_Camera_info->CameraParam), 0, sizeof(JZsdk_CameraParam));
memset(g_JZC1_info.Opt_Camera_info->CmeraDevPath, 0, sizeof(g_JZC1_info.Opt_Camera_info->CmeraDevPath));
memcpy(g_JZC1_info.Opt_Camera_info->CmeraDevPath, JZ_C1_OPT_DEV_PATH, strlen(JZ_C1_OPT_DEV_PATH));
g_JZC1_info.Opt_Camera_info->SingleDataOutput = JZC1_OptDeal;
ret = Camera_Init_2(g_JZC1_info.Opt_Camera_info);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("光学相机启动失败");
}
//初始化IRC_funtion模块
ret = IRC_ParamInit(JZ_C1_IRC_HEIGHT, JZ_C1_IRC_WIDTH, 25);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("初始化红外的数据处理失败");
}
else
{
//初始化红外的数据输入
ret = JZsdk_JZC1_Irc_Data_Init();
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("红外相机初始化失败");
}
}
//默认推送红外摄像头 后续改成 红外+光学 的组合画面
VideoMgmt_VideoStreamFlowIndex(JZ_C1_FUSE_INDEX);
//设置快门为开
JZsdk_Camera_ShutterSwitch(JZ_FLAGCODE_ON);
//设置伪彩颜色为hot
int value = 8;
Camera_param(JZ_FLAGCODE_SET, CAMERA_PSEUDO_COLOR, &value);
//设置为默认输出模式
value = 0;
Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value);
//设置默认打开自动校正
value = JZ_FLAGCODE_ON;
Proc_IRC_param(JZ_FLAGCODE_SET, JZSDK_WIDGET_BAD_PIXEL_CORRECT_MODE, &value);
//初始化变焦模块
Cam_Zoom_Init();
//初始化C1的RGA模块
#ifdef RTK_RGA_STATUS_ON
g_JZC1_info.IRC_rga_info = (C1_RgaInfo *)malloc(sizeof(C1_RgaInfo));
if (g_JZC1_info.IRC_rga_info == NULL)
{
JZSDK_LOG_ERROR("malloc IRC_rga_info failed");
}
ret = JZC1_RgaInit(g_JZC1_info.IRC_rga_info, g_JZC1_info.IRC_enc_info->hor_stride, g_JZC1_info.IRC_enc_info->ver_stride, RK_FORMAT_YCbCr_420_SP);
g_JZC1_info.Opt_rga_info = (C1_RgaInfo *)malloc(sizeof(C1_RgaInfo));
if (g_JZC1_info.Opt_rga_info == NULL)
{
JZSDK_LOG_ERROR("malloc Opt_rga_info failed");
}
ret = JZC1_RgaInit(g_JZC1_info.Opt_rga_info, g_JZC1_info.Opt_enc_info->hor_stride, g_JZC1_info.Opt_enc_info->ver_stride, RK_FORMAT_YCbCr_420_SP);
//混合视频初始化
JZC1_MixedVideo_Init();
#endif
#endif
JZSDK_LOG_INFO("JZC1_Init success");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* h10 h10t 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_h10_init(int mode)
{
//音频库初始化
AudioDeal_Init();
int value[5] = {0};
if (mode == APP_UART)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* h10 h10t 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_h10t_init(int mode)
{
//音频库初始化
AudioDeal_Init();
int value[5] = {0};
if (mode == APP_UART)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* h150s h150t 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_h150s_h150t_init(int mode)
{
//音频库初始化
AudioDeal_Init();
if (mode == APP_PSDK)
{
//串口设备1初始化
int value[1];
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//h150t额外开启4g
if (DEVICE_VERSION == JZ_H150T)
{
//4g设备初始化
int value[1];
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
}
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//相机初始化
MediaProc_Init();
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* h1e 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_h1e_init(int mode)
{
//音频库初始化
AudioDeal_Init();
if (mode == APP_UART)
{
//串口设备1初始化
int value[1] = {0};
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_TRANSPARENT);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* h15tt 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_h1t_init(int mode)
{
int value[1] = {0};
//音频库初始化
AudioDeal_Init();
if (mode == APP_UART)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//4g设备初始化
value[0] = COMM_4G_UART_BITRATE;
JZsdk_HalPort_Init(UART_4G, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_TRANSPARENT);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* u3 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_u3_init(int mode)
{
//音频库初始化
AudioDeal_Init();
int value[5] = {0};
if (mode == APP_UART)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* u30 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_u30_init(int mode)
{
//音频库初始化
AudioDeal_Init();
int value[5] = {0};
if (mode == APP_UART)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* u3d 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_u3d_init(int mode)
{
//音频库初始化
AudioDeal_Init();
int value[5] = {0};
if (mode == APP_UART)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* u3s 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_u3s_init(int mode)
{
//音频库初始化
AudioDeal_Init();
int value[5] = {0};
if (mode == APP_UART)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
#ifdef SIDE_LASER_STATUS_ON
//侧边激光初始化
SideLaser_Init();
#endif
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
\ No newline at end of file
... ...
#include "JZsdkLib.h"
#include "BaseConfig.h"
#include <pthread.h>
/****************************
*
* a1 初始化
*
* mode psdk为psdk模式 uart为串口模式
*
* ****************************/
T_JZsdkReturnCode JZ_a1_init(int mode)
{
//音频库初始化
AudioDeal_Init();
int value[5] = {0};
if (mode == APP_UART)
{
//串口设备1初始化
value[0] = UART_DEV1_BITRATE;
JZsdk_HalPort_Init(UART_DEV_1, value);
}
//串口设备2初始化
value[0] = UART_DEV2_BITRATE;
JZsdk_HalPort_Init(UART_DEV_2, value);
//喊话器初始化
Megaphone_Init();
//云台初始化
Gimbal_Init(JZ_MODULE_CONTROL_WAY_INDEPENDENT);
//灯类初始化
Lighting_Init();
delayMs(1000);
//消息订阅初始化
HalSend_type1Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
}
\ No newline at end of file
... ...
... ... @@ -7,7 +7,7 @@
#define VERSION_CHOOSE_H
#include "JZsdk_Base/JZsdk_Code/JZsdk_DeviceCode.h"
//1~10行 除了D可以修改版本选择 禁止动任何东西
#define DEVICE_VERSION JZ_U3S
#define DEVICE_VERSION JZ_C1
//禁止修改行 选择是串口程序 还是 psdk程序
#define APP_VERSION APP_PSDK
... ... @@ -19,7 +19,7 @@
#define MAJOR_VERSION 0x01
#define MINOR_VERSION 0x03
#define MODIFY_VERSION 0x10
#define DEBUG_VERSION 0x00
#define DEBUG_VERSION 0x01
//禁止修改行 滤波方式
#define FILTERING_TYPE HIGH_PASS_FILTERING
... ...
... ... @@ -20,8 +20,8 @@ extern "C" {
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
#define SINGLE_THREAD_SEND 0
#define MULTI_THREAD_SEND 1
#define SINGLE_THREAD_SEND JZSDK_SINGLE_THREAD
#define MULTI_THREAD_SEND JZSDK_MULTI_THREAD
/* Exported types ------------------------------------------------------------*/
... ...
... ... @@ -83,6 +83,14 @@ T_JZsdkReturnCode FOMAT_FirewareOriginRegion_Init(int SerialType, unsigned char
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//检测是否是欧洲定制区域固件
if ((SerialNumber[4] == 'E' || SerialNumber[4] == 'e')
&& (SerialNumber[5] == 'U' || SerialNumber[5] == 'u'))
{
g_OriginRegionNum = ORIGIN_EU;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//无匹配序列号
if (FIRMWARE_ORIGIN == DOMESTIC_VERSION)
{
... ...
... ... @@ -94,39 +94,11 @@ T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode)
/*******************************************************************************************************************************************/
//多线程抓取数据线程
static void *JZsdk_Catch_MultiThread2(void *args)
{
while (1)
{
unsigned int buf_size = 0;
unsigned char *buf = NULL;
//从相机中读取一张照片
V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size);
//printf("read: len:%d data[3]:%x data[4]:%x\n", buf_size, buf[3], buf[4]);
if (buf == NULL)
{
JZSDK_LOG_ERROR("相机数据读取失败");
continue;
}
//放入缓冲池 //将数据放入缓冲池,从而被其他线程使用
VideoMgmt_write_data(&args, buf, buf_size);
//归还图片
V4L2_CameraFrameRecord_OnlyReturnFrame();
}
}
//单线程抓取数据线程
static void *JZsdk_Catch_SingleThread2(void *args)
static void *JZsdk_Catch_SingleThread(void *args)
{
t_FrameCatch_TaskFuntionInput *task = (t_FrameCatch_TaskFuntionInput *)args;
JZsdk_CameraInfo *CameraInfo = (JZsdk_CameraInfo *)args;
while (1)
{
... ... @@ -134,7 +106,7 @@ static void *JZsdk_Catch_SingleThread2(void *args)
unsigned char *buf = NULL;
//从相机中读取一张照片
V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size);
V4L2_CameraFrameRecord_OnlyGetFrame2(CameraInfo ,&buf, &buf_size);
//JZSDK_LOG_INFO("read: len:%d data[3]:%x data[4]:%x\n", buf_size, buf[3], buf[4]);
... ... @@ -145,10 +117,10 @@ static void *JZsdk_Catch_SingleThread2(void *args)
}
//进行数据处理
task->task_function(buf, buf_size);
CameraInfo->SingleDataOutput(buf, buf_size);
//归还图片
V4L2_CameraFrameRecord_OnlyReturnFrame();
V4L2_CameraFrameRecord_OnlyReturnFrame2(CameraInfo);
}
}
... ... @@ -161,43 +133,77 @@ static void *JZsdk_Catch_SingleThread2(void *args)
* 传入线程的处理函数 task_function
*
* *****************************************/
T_JZsdkReturnCode JZsdk_FrameCatch_Single(T_JZsdkReturnCode (*task_function)(unsigned char*, unsigned int))
T_JZsdkReturnCode JZsdk_FrameCatch_Single(JZsdk_CameraInfo *CameraInfo)
{
T_JZsdkReturnCode ret;
//初始化数据接收线程
pthread_t ReadDataTask;
pthread_attr_t task_attribute; //线程属性
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
T_JZTaskHandle single_task = NULL;
T_JZsdkOsalHandler *osal_handler = JZsdk_Platform_GetOsalHandler();
osal_handler->TaskCreate("framecatch_single",JZsdk_Catch_SingleThread, 8192, (void *)CameraInfo, &single_task);
//单线程模式
if (task_function == NULL)
if (single_task == NULL)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
t_FrameCatch_TaskFuntionInput *task = (t_FrameCatch_TaskFuntionInput*)malloc(sizeof(t_FrameCatch_TaskFuntionInput));
if (task == NULL)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//多线程抓取数据线程
static void *JZsdk_Catch_MultiThread2(void *args)
{
while (1)
{
// 处理内存分配失败的情况
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
unsigned int buf_size = 0;
unsigned char *buf = NULL;
//task->task_function = task_function;
task->task_function = (void (*)(unsigned char *, unsigned int))task_function;
//从相机中读取一张照片
V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size);
int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread2,(void *)task); //线程
if(opus_Protection != 0)
//printf("read: len:%d data[3]:%x data[4]:%x\n", buf_size, buf[3], buf[4]);
if (buf == NULL)
{
JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
JZSDK_LOG_ERROR("相机数据读取失败");
continue;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
//放入缓冲池 //将数据放入缓冲池,从而被其他线程使用
VideoMgmt_write_data(&args, buf, buf_size);
//归还图片
V4L2_CameraFrameRecord_OnlyReturnFrame();
}
}
/*************************
*
*
... ...
... ... @@ -24,10 +24,10 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode);
T_JZsdkReturnCode JZsdk_FrameCatch_Single(T_JZsdkReturnCode (*task_function)(unsigned char*, unsigned int));
T_JZsdkReturnCode JZsdk_FrameCatch_Single(JZsdk_CameraInfo *CameraInfo);
T_JZsdkReturnCode JZsdk_FrameCatch_Multi(void *FrameIndex);
T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode);
#ifdef __cplusplus
}
... ...
... ... @@ -97,6 +97,7 @@ T_JZsdkReturnCode Cam_Zoom_Init()
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("变焦模块初始化成功!");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -45,7 +45,7 @@ T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_n
T_JZsdkReturnCode ret;
//初始化摄像头
ret = V4l2_Camarainit2(&g_CameraFd,width,height,frame_num);
ret = V4l2_Camarainit(&g_CameraFd,width,height,frame_num);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
... ... @@ -65,7 +65,44 @@ T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_n
JZsdk_FrameCatch_Init(ThreadMode);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode Camera_Init_2(JZsdk_CameraInfo *CameraInfo)
{
T_JZsdkReturnCode ret;
//初始化摄像头
ret = V4L2_CameraInit_2(CameraInfo);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
}
// //初始化摄像头参数
// ret = V4L2_Parameter_Setting(CameraInfo->CameraFd);
// if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
// {
// JZSDK_LOG_ERROR("摄像头参数调整失败");
// return ret;
// }
if (CameraInfo->ThreadMode == JZSDK_SINGLE_THREAD && CameraInfo->SingleDataOutput != NULL)
{
JZsdk_FrameCatch_Single(CameraInfo);
}
else if(CameraInfo->ThreadMode == JZSDK_MULTI_THREAD)
{
//JZsdk_FrameCatch_Init(ThreadMode);
}
else
{
JZSDK_LOG_ERROR("线程模式错误");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -13,6 +13,7 @@
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "MediaProc/MediaProc_Param.h"
#include "MediaProc/Camera/CameraDef.h"
#include "MediaProc/Camera/Cam_FrameCatch/Cam_FrameCatch.h"
#include "MediaProc/Camera/V4L2_camera/V4L2_CameraParameterSetting.h"
... ... @@ -38,6 +39,7 @@ T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch();
T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch();
T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_num);
T_JZsdkReturnCode Camera_Init_2(JZsdk_CameraInfo *CameraInfo);
#ifdef __cplusplus
... ...
/**
********************************************************************
* @file CameraDef.h
* Camera的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef CMAERA_DEF_H
#define CMAERA_DEF_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
typedef struct JZsdk_CameraParam
{
unsigned int Brightness; //亮度,该摄像头亮度范围为 1-255 默认128
unsigned int Contrast; //对比度,该摄像头对比度范围为 1-255 默认128
unsigned int Saturation; //饱和度,该摄像头饱和度范围为 1-255 默认128
unsigned int expsure; //曝光,该摄像头曝光范围为 1-255 默认128
}JZsdk_CameraParam;
typedef struct JZsdk_CameraInfo
{
/***************** 摄像头基础配置 ******************/
int CameraFd; //摄像头文件描述符
unsigned char CmeraDevPath[JZSDK_FILE_PATH_SIZE_MAX]; //摄像头设备路径
int width;
int height;
int FrameNum;
int CameraFormat;
/***************** 摄像头参数配置 ******************/
JZsdk_CameraParam CameraParam;
/***************** 设置画面数据的输出配置 ******************/
//相机拍摄的画面流的输出模式 分为单线程和多线程
int ThreadMode;
//单线程时,需要提供一个数据输出的函数
T_JZsdkReturnCode (*SingleDataOutput)(unsigned char *data, unsigned int len);
//多线程时,输出的缓冲区索引值
int VideoMgmt_index;
}JZsdk_CameraInfo;
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif
... ...
... ... @@ -275,7 +275,7 @@ static int open_device()
return 0;
}
T_JZsdkReturnCode V4l2_Camarainit2(int *dev_fd, int width, int height, int frame_num)
T_JZsdkReturnCode V4l2_Camarainit(int *dev_fd, int width, int height, int frame_num)
{
int ret;
... ... @@ -314,7 +314,8 @@ T_JZsdkReturnCode V4l2_Camarainit2(int *dev_fd, int width, int height, int frame
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
int V4L2_CamaraUninit2()
int V4L2_CamaraUninit()
{
//停止采集
... ...
... ... @@ -12,6 +12,9 @@
/* Includes ------------------------------------------------------------------*/
#include "MediaProc/Camera/CameraDef.h"
#include <linux/videodev2.h>
#ifdef __cplusplus
extern "C" {
#endif
... ... @@ -22,13 +25,18 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode V4l2_Camarainit2(int *dev_fd, int width, int height, int frame_num);
T_JZsdkReturnCode V4l2_Camarainit(int *dev_fd, int width, int height, int frame_num);
int V4L2_CamaraUninit2();
int V4L2_CameraFrameRecord2(unsigned char **RecordReturnBuffer, int *RecordReturnLength, int Audlength);
//int V4L2_CameraFrameRecord2(unsigned char **RecordReturnBuffer, int *RecordReturnLength, int Audlength);
int V4L2_CameraFrameRecord_OnlyGetFrame(unsigned char **RecordReturnBuffer, int *RecordReturnLength);
int V4L2_CameraFrameRecord_OnlyReturnFrame();
T_JZsdkReturnCode V4L2_CameraInit_2(JZsdk_CameraInfo *CameraInfo);
T_JZsdkReturnCode V4L2_CameraFrameRecord_OnlyGetFrame2(JZsdk_CameraInfo *CameraInfo, unsigned char **RecordReturnBuffer, int *RecordReturnLength);
T_JZsdkReturnCode V4L2_CameraFrameRecord_OnlyReturnFrame2(JZsdk_CameraInfo *CameraInfo);
#ifdef __cplusplus
}
#endif
... ...
/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <getopt.h> /* getopt_long() */
#include <fcntl.h> /* low-level i/o */
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include "JZsdkLib.h"
#include "./V4L2_Record.h"
#include "MediaProc/MediaParm.h"
/* Private constants ---------------------------------------------------------*/
// 清空
#define CLEAR(x) memset(&(x), 0, sizeof(x))
/* Private types -------------------------------------------------------------*/
struct buffer
{
char *start;
size_t length;
};
// 存储队列
static struct buffer *buffers;
static unsigned int n_buffers;
static struct v4l2_buffer buf;
//unsigned char* pucVideBuf[4]; // 视频BUFF空间地址
/* Private functions declaration ---------------------------------------------*/
static int xioctl(int fh, int request, void *arg)
{
int num;
int r;
do
{
r = ioctl(fh, request, arg);
num++;
//delayMs(10);
} while ( (-1 == r));
return r;
}
static int stop_capturing()
{
// enum v4l2_buf_type type;
// type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
// if (-1 == xioctl(fd, VIDIOC_STREAMOFF, &type))
// {
// JZSDK_LOG_ERROR("VddIDIOC_STREAMOFF");
// return -1;
// }
// return 0;
}
static T_JZsdkReturnCode start_capturing(JZsdk_CameraInfo *CameraInfo)
{
unsigned int i;
enum v4l2_buf_type type;
for (i = 0; i < n_buffers; ++i)
{
//struct v4l2_buffer buf;
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP; //内存映射
buf.index = i;
//从缓存区中取出数据
if (-1 == xioctl(CameraInfo->CameraFd, VIDIOC_QBUF, &buf))
{
JZSDK_LOG_ERROR("VIDIOC_QBUF");
}
}
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (-1 == xioctl(CameraInfo->CameraFd, VIDIOC_STREAMON, &type))
{
JZSDK_LOG_ERROR("VIDIOC_STREAMON");
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static int uninit_device()
{
// unsigned int i;
// for (i = 0; i < n_buffers; ++i)
// {
// if (-1 == munmap(buffers[i].start, buffers[i].length))
// {
// JZSDK_LOG_ERROR("munmap");
// }
// }
// free(buffers);
}
static T_JZsdkReturnCode init_mmap(JZsdk_CameraInfo *CameraInfo)
{
//定义了缓存的数量,驱动会据此申请对应数量的视频缓存。多个缓存可以用于建立FIFO,来提高视频采集的效率。
struct v4l2_requestbuffers req;
CLEAR(req);
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if (xioctl(CameraInfo->CameraFd, VIDIOC_REQBUFS, &req) == -1)
{
JZSDK_LOG_ERROR("VIDIOC_REQBUFS");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
if (req.count < 2)
{
JZSDK_LOG_ERROR("摄像头mmap的缓冲区内存不足");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//分配req.count个 *Buffer长度的内存
buffers = calloc(req.count, sizeof(*buffers));
if (!buffers)
{
JZSDK_LOG_ERROR("摄像头buffers注册内存失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// 改变buffer数量 以改进视频质量
//映射所有的缓存
for (n_buffers = 0; n_buffers < req.count; ++n_buffers)
{
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_buffers;
if (-1 == xioctl(CameraInfo->CameraFd, VIDIOC_QUERYBUF, &buf))
{
JZSDK_LOG_ERROR("VIDIOC_QUERYBUF");
}
buffers[n_buffers].length = buf.length;
buffers[n_buffers].start =
mmap(NULL /* start anywhere */,
buf.length,
PROT_READ | PROT_WRITE /* required */,
MAP_SHARED /* recommended */,
CameraInfo->CameraFd, buf.m.offset);
if (MAP_FAILED == buffers[n_buffers].start)
{
JZSDK_LOG_ERROR("mmap");
}
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 初始化 程序
static T_JZsdkReturnCode init_device(JZsdk_CameraInfo *CameraInfo)
{
struct v4l2_capability cap;
struct v4l2_format fmt;
if (-1 == xioctl(CameraInfo->CameraFd, VIDIOC_QUERYCAP, &cap))
{ //测试参数
JZSDK_LOG_ERROR("VIDIOC_QUERYCAP");
}
if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
{
JZSDK_LOG_ERROR("no video capture device");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
if (!(cap.capabilities & V4L2_CAP_STREAMING))
{
JZSDK_LOG_ERROR("does not support streaming i/o");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// 设置摄像头使用格式
memset(&fmt, 0, sizeof(struct v4l2_format));
//描绘帧的格式
// fmt结构体 含有 tpye格式 和 fmt 联合体
// fmt 结构体
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = CameraInfo->width;
fmt.fmt.pix.height = CameraInfo->height;
fmt.fmt.pix.pixelformat = CameraInfo->CameraFormat;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
//写入格式参数
if (-1 == xioctl(CameraInfo->CameraFd, VIDIOC_S_FMT, &fmt)) //设置格式
{
JZSDK_LOG_ERROR("VIDIOC_S_FMT");
}
/*
修改: 加入帧数设置
*/
struct v4l2_streamparm streamparm;
streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
streamparm.parm.capture.timeperframe.numerator = 1; //每1秒
streamparm.parm.capture.timeperframe.denominator = CameraInfo->FrameNum; // 帧数
//streamparm.parm.capture.capturemode = 0; //低质量图片模式
//写入帧数设置
if (-1 == xioctl(CameraInfo->CameraFd, VIDIOC_S_PARM, &streamparm))
{
JZSDK_LOG_ERROR("failed in setting the fps in camera!");
}
JZSDK_LOG_DEBUG("camera is getting img-data in %d fps\n", streamparm.parm.capture.timeperframe.denominator);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static int close_device()
{
// if (-1 == close(fd))
// {
// JZSDK_LOG_ERROR("close");
// }
// fd = -1;
}
T_JZsdkReturnCode V4L2_CameraInit_2(JZsdk_CameraInfo *CameraInfo)
{
T_JZsdkReturnCode ret;
//打开摄像头
CameraInfo->CameraFd = open(CameraInfo->CmeraDevPath, O_RDWR , 0);
if (CameraInfo->CameraFd == -1)
{
JZSDK_LOG_ERROR("打开摄像头设备失败 %s",CameraInfo->CmeraDevPath);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//初始化设备
ret = init_device(CameraInfo);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("初始化摄像头设备失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//初始化映射
ret = init_mmap(CameraInfo);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("初始化摄像头映射失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//开始抓取
ret = start_capturing(CameraInfo);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("开始抓取失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("v4l2 camera init success");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
int V4L2_CamaraUninit2()
{
//停止采集
stop_capturing();
//释放设备
uninit_device();
//关闭设备
close_device();
return 0;
}
// /***********
// *
// * 取出画面数据memcpy类型
// *
// * ************/
// int V4L2_CameraFrameRecord2(unsigned char **RecordReturnBuffer, int *RecordReturnLength, int Audlength)
// {
// memset(&buf, 0, sizeof(struct v4l2_buffer));
// buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //每个结构体都需要设置type为这个参数要记住
// buf.memory = V4L2_MEMORY_MMAP;
// //取出画面
// if (-1 == xioctl(fd, VIDIOC_DQBUF, &buf))
// {
// JZSDK_LOG_ERROR("VIDIOC_DQBUF");
// }
// //画面长度
// *RecordReturnLength = buf.bytesused;
// //画面数组
// memcpy(*RecordReturnBuffer, buffers[buf.index].start, *RecordReturnLength);
// //放回画面内存
// if (-1 == xioctl(fd, VIDIOC_QBUF, &buf))
// {
// JZSDK_LOG_ERROR("VIDIOC_QBUF");
// }
// return 0;
// }
/***********
*
* 取出画面数据,单取地址不返还
* ************/
T_JZsdkReturnCode V4L2_CameraFrameRecord_OnlyGetFrame2(JZsdk_CameraInfo *CameraInfo, unsigned char **RecordReturnBuffer, int *RecordReturnLength)
{
memset(&buf, 0, sizeof(struct v4l2_buffer));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //每个结构体都需要设置type为这个参数要记住
buf.memory = V4L2_MEMORY_MMAP;
//取出画面
if (-1 == xioctl(CameraInfo->CameraFd, VIDIOC_DQBUF, &buf))
{
JZSDK_LOG_ERROR("VIDIOC_DQBUF");
}
//画面长度
*RecordReturnLength = buf.bytesused;
//画面数组
*RecordReturnBuffer = (unsigned char *)buffers[buf.index].start;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/***********
*
* 返还画面数据
* ************/
T_JZsdkReturnCode V4L2_CameraFrameRecord_OnlyReturnFrame2(JZsdk_CameraInfo *CameraInfo)
{
//放回画面内存
if (-1 == xioctl(CameraInfo->CameraFd, VIDIOC_QBUF, &buf))
{
JZSDK_LOG_ERROR("VIDIOC_QBUF");
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ...
... ... @@ -47,11 +47,11 @@ T_JZsdkReturnCode IRC_ParamInit(int height, int width, int frameRate)
#endif
}
temp_fp = fopen("IRC_temp.raw", "w");
if (temp_fp == NULL)
{
JZSDK_LOG_ERROR("IRC_temp.raw文件打开失败");
}
// temp_fp = fopen("IRC_temp.raw", "w");
// if (temp_fp == NULL)
// {
// JZSDK_LOG_ERROR("IRC_temp.raw文件打开失败");
// }
return ret;
}
... ...
... ... @@ -30,23 +30,23 @@ static T_JZsdkReturnCode MediaProc_SingleThreading()
//多线程方案
static T_JZsdkReturnCode MediaProc_MultiThreading()
{
//如果是150S相机 150T相机
if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
{
//1、启动视频流缓冲区模块
VideoMgmt_init_buffer(&VideoMgmt_FirstVideo_index);
// //如果是150S相机 150T相机
// if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T)
// {
// //1、启动视频流缓冲区模块
// VideoMgmt_init_buffer(&VideoMgmt_FirstVideo_index);
//2、相机初始化
Camera_Init(1,FIRST_WIDTH, FIRST_HEIGHT, FIRST_FRAME_NUM);
// //2、相机初始化
// Camera_Init(1,FIRST_WIDTH, FIRST_HEIGHT, FIRST_FRAME_NUM);
//3、启用推流模块
VideoMgmt_VideoStreamFlow_Init(FIRST_FRAME_NUM, &VideoMgmt_FirstVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST);
// //3、启用推流模块
// VideoMgmt_VideoStreamFlow_Init(FIRST_FRAME_NUM, &VideoMgmt_FirstVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST);
//转码模块
VideoStreamTransCode_Init();
// //转码模块
// VideoStreamTransCode_Init();
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头
}
// VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头
// }
}
//视频流模块初始化
... ...
... ... @@ -8,41 +8,7 @@
#include "./RTK_mmp_dec.h"
#ifdef RTK_MPP_STATUS_ON
#include "rockchip/mpp_common.h" //这个.h能在mpp的源码中找到
#include "rockchip/mpp_packet.h"
#include "rockchip/rk_mpi.h"
#include "./RTK_mmp_dec.h"
typedef struct {
//编码器编号,用于选择编码器
int index;
// 基础流上下文
MppCtx ctx;
MppApi *mpi;
// 输入/输出
MppPacket packet; //用于存放h264,h265数据
MppFrame frame; //用于存放yuv rgb数据
// 资源分配参数
unsigned int width;
unsigned int height;
unsigned int hor_stride;
unsigned int ver_stride;
MppCodingType type;
// 运行时配置
unsigned int need_split; //输入分割设置,整帧输入,这里为0
MppBufferGroup frm_grp;
MppBufferGroup pkt_grp;
MppBuffer frmBuf;
MppBuffer pktBuf;
unsigned char *dataBuf;
unsigned int packet_size; //写入的包大小
} MPP_DEC_CONFIG ;
void dump_frame(MppFrame frame, FILE *out_fp)
{
... ... @@ -130,52 +96,34 @@ void dump_frame(MppFrame frame, FILE *out_fp)
//rtk解码器初始化
//输入内容,编码器参数的地址
T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFrameFormat out_format, int width, int height)
T_JZsdkReturnCode RTK_mmp_dec_Init(T_rtk_mmp_dec_info *dec_info)
{
MPP_RET ret;
MppParam param = NULL;
//创建一解码器参数
MPP_DEC_CONFIG *DecConfigInput = NULL;
int ret;//返回值
//为编码器参数注册内存
DecConfigInput = (MPP_DEC_CONFIG *)malloc(sizeof(MPP_DEC_CONFIG));
if (DecConfigInput == NULL) {
JZSDK_LOG_ERROR("mpp编码器参数内存分配失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//初始化编码器参数
// 资源分配参数
DecConfigInput->height = height;
DecConfigInput->width = width;
DecConfigInput->hor_stride = MPP_ALIGN(width, 16);
DecConfigInput->ver_stride = MPP_ALIGN(height, 16);
DecConfigInput->type = int_type;
DecConfigInput->packet_size = (3*DecConfigInput->hor_stride*DecConfigInput->ver_stride); //一般这个值够了
dec_info->packet_size = (3*dec_info->hor_stride*dec_info->ver_stride); //一般这个值够了
// 运行时配置
DecConfigInput->need_split = 0;
dec_info->need_split = 0;
//如果是其他类型,dec_tpye为1 mjpeg则为0
int dec_type = (DecConfigInput->type != MPP_VIDEO_CodingMJPEG) ? (1) : (0);
int VideoType = (dec_info->Dec_type != MPP_VIDEO_CodingMJPEG) ? (1) : (0);
// /*************************************
// //创建输入输出的数组
// ************************************/
if (dec_type == 1) //普通的视频类型
if (VideoType == 1) //普通的视频类型
{
DecConfigInput->dataBuf = (unsigned char*)malloc(DecConfigInput->packet_size);
if(DecConfigInput->dataBuf == NULL)
dec_info->dataBuf = (unsigned char*)malloc(dec_info->packet_size);
if(dec_info->dataBuf == NULL)
{
JZSDK_LOG_ERROR("摄像头的视频回复帧内存注册错误");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
ret = mpp_packet_init(&DecConfigInput->packet, DecConfigInput->dataBuf, DecConfigInput->packet_size);
ret = mpp_packet_init(&dec_info->packet, dec_info->dataBuf, dec_info->packet_size);
if (ret) {
JZSDK_LOG_ERROR("mpp_packet_init failed");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ... @@ -183,19 +131,19 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram
}
else //mjpeg下的视频类型
{
ret = mpp_buffer_group_get_internal(&DecConfigInput->frm_grp, MPP_BUFFER_TYPE_ION);
ret = mpp_buffer_group_get_internal(&dec_info->frm_grp, MPP_BUFFER_TYPE_ION);
if (ret) {
JZSDK_LOG_ERROR("failed to get buffer group for input frame ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
ret = mpp_buffer_group_get_internal(&DecConfigInput->pkt_grp, MPP_BUFFER_TYPE_ION);
ret = mpp_buffer_group_get_internal(&dec_info->pkt_grp, MPP_BUFFER_TYPE_ION);
if (ret) {
JZSDK_LOG_ERROR("failed to get buffer group for output packet ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
ret = mpp_frame_init(&DecConfigInput->frame); /* output frame */
ret = mpp_frame_init(&dec_info->frame); /* output frame */
if (MPP_OK != ret)
{
JZSDK_LOG_ERROR("mpp_frame_init failed");
... ... @@ -209,7 +157,7 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram
* YUV422 buffer is 2 times of w*h.
* So create larger buffer with 2 times w*h.
*/
ret = mpp_buffer_get(DecConfigInput->frm_grp, &DecConfigInput->frmBuf, DecConfigInput->hor_stride * DecConfigInput->ver_stride * 4);
ret = mpp_buffer_get(dec_info->frm_grp, &dec_info->frmBuf, dec_info->hor_stride * dec_info->ver_stride * 4);
if (ret) {
JZSDK_LOG_ERROR("failed to get buffer for input frame ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ... @@ -217,25 +165,25 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram
// NOTE: for mjpeg decoding send the whole file
ret = mpp_buffer_get(DecConfigInput->pkt_grp, &DecConfigInput->pktBuf, DecConfigInput->packet_size);
ret = mpp_buffer_get(dec_info->pkt_grp, &dec_info->pktBuf, dec_info->packet_size);
if (ret) {
JZSDK_LOG_ERROR("failed to get buffer for input frame ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
mpp_packet_init_with_buffer(&DecConfigInput->packet, DecConfigInput->pktBuf);
DecConfigInput->dataBuf = mpp_buffer_get_ptr(DecConfigInput->pktBuf);
mpp_packet_init_with_buffer(&dec_info->packet, dec_info->pktBuf);
dec_info->dataBuf = mpp_buffer_get_ptr(dec_info->pktBuf);
mpp_frame_set_buffer(DecConfigInput->frame, DecConfigInput->frmBuf);
mpp_frame_set_buffer(dec_info->frame, dec_info->frmBuf);
}
printf("创建输入输出的数组初始化完毕\n");
// 创建解码器
ret = mpp_create(&DecConfigInput->ctx, &DecConfigInput->mpi);
ret = mpp_create(&dec_info->ctx, &dec_info->mpi);
if (ret != MPP_OK)
{
free(DecConfigInput);
free(dec_info);
JZSDK_LOG_ERROR("解码器创建失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ... @@ -249,11 +197,11 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram
* - 解码文件需要 split 模式
* - 设置非阻塞模式,0非阻塞(默认),-1阻塞,+val 超时(ms)
*/
param = &(DecConfigInput->need_split);
ret = DecConfigInput->mpi->control(DecConfigInput->ctx, MPP_DEC_SET_PARSER_SPLIT_MODE, param);
param = &(dec_info->need_split);
ret = dec_info->mpi->control(dec_info->ctx, MPP_DEC_SET_PARSER_SPLIT_MODE, param);
if (ret != MPP_OK) {
mpp_destroy(DecConfigInput->ctx); // 销毁创建的编码器
free(DecConfigInput);
mpp_destroy(dec_info->ctx); // 销毁创建的编码器
free(dec_info);
JZSDK_LOG_ERROR("mpi->control error MPP_DEC_SET_PARSER_SPLIT_MODE");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ... @@ -285,10 +233,10 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram
MPP_VIDEO_CodingVP8 : VP8
MPP_VIDEO_CodingVP9 : VP9
MPP_VIDEO_CodingMJPEG : MJPEG */
ret = mpp_init(DecConfigInput->ctx, MPP_CTX_DEC, DecConfigInput->type);
ret = mpp_init(dec_info->ctx, MPP_CTX_DEC, dec_info->Dec_type);
if (ret != MPP_OK) {
mpp_destroy(DecConfigInput->ctx);
free(DecConfigInput);
mpp_destroy(dec_info->ctx);
free(dec_info);
JZSDK_LOG_ERROR("mpp解码初始化失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ... @@ -300,8 +248,8 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram
//输出的码流格式
//param = &out_format;
//也不知道为什么只能设420sp没法设420p
MppFrameFormat format = out_format;
ret = DecConfigInput->mpi->control(DecConfigInput->ctx, MPP_DEC_SET_OUTPUT_FORMAT, &format);
MppFrameFormat format = dec_info->out_format;
ret = dec_info->mpi->control(dec_info->ctx, MPP_DEC_SET_OUTPUT_FORMAT, &format);
if (ret == MPP_OK)
{
printf("输出格式正确\n");
... ... @@ -312,44 +260,37 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram
}
//把编码器地址传递回去
*index = (void *)DecConfigInput;
printf("mmp解码器初始化完毕\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode RTK_mmp_dec_input(void **index ,unsigned char *input_data, unsigned int input_data_len, MppFrame *out_put_frame)
T_JZsdkReturnCode RTK_mmp_dec_input(T_rtk_mmp_dec_info *dec_info ,unsigned char *input_data, unsigned int input_data_len, MppFrame *out_put_frame)
{
int ret; //返回值
int pktEos = 0;
MppTask task = NULL;
//1、获取编码器参数
MPP_DEC_CONFIG *DecConfigInput = (MPP_DEC_CONFIG *)*index;
//2、将解码的数据放入划好的地址
memset(DecConfigInput->dataBuf,0,DecConfigInput->packet_size);
memcpy(DecConfigInput->dataBuf , input_data ,input_data_len );
memset(dec_info->dataBuf,0,dec_info->packet_size);
memcpy(dec_info->dataBuf , input_data ,input_data_len );
mpp_packet_set_pos(DecConfigInput->packet, DecConfigInput->dataBuf); //设置packet的 有效数据 的开始位置
mpp_packet_set_length(DecConfigInput->packet, input_data_len); //设置packet的 有效数据 的长度
mpp_packet_set_pos(dec_info->packet, dec_info->dataBuf); //设置packet的 有效数据 的开始位置
mpp_packet_set_length(dec_info->packet, input_data_len); //设置packet的 有效数据 的长度
if(pktEos) //结束标志,这边估计是不会用了
{
mpp_packet_set_eos(DecConfigInput->packet);
mpp_packet_set_eos(dec_info->packet);
}
ret = DecConfigInput->mpi->poll(DecConfigInput->ctx, MPP_PORT_INPUT, MPP_POLL_BLOCK);
ret = dec_info->mpi->poll(dec_info->ctx, MPP_PORT_INPUT, MPP_POLL_BLOCK);
if (ret)
{
JZSDK_LOG_ERROR("mpp input poll failed");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
ret = DecConfigInput->mpi->dequeue(DecConfigInput->ctx, MPP_PORT_INPUT, &task); /* input queue */
ret = dec_info->mpi->dequeue(dec_info->ctx, MPP_PORT_INPUT, &task); /* input queue */
if (ret)
{
JZSDK_LOG_ERROR("mpp task input dequeue failed");
... ... @@ -357,10 +298,10 @@ T_JZsdkReturnCode RTK_mmp_dec_input(void **index ,unsigned char *input_data, uns
}
//mpp_assert(task);
mpp_task_meta_set_packet(task, KEY_INPUT_PACKET, DecConfigInput->packet);
mpp_task_meta_set_frame (task, KEY_OUTPUT_FRAME, DecConfigInput->frame);
mpp_task_meta_set_packet(task, KEY_INPUT_PACKET, dec_info->packet);
mpp_task_meta_set_frame (task, KEY_OUTPUT_FRAME, dec_info->frame);
ret = DecConfigInput->mpi->enqueue(DecConfigInput->ctx, MPP_PORT_INPUT, task); /* input queue */
ret = dec_info->mpi->enqueue(dec_info->ctx, MPP_PORT_INPUT, task); /* input queue */
if (ret)
{
JZSDK_LOG_ERROR("mpp task input enqueue failed");
... ... @@ -368,14 +309,14 @@ T_JZsdkReturnCode RTK_mmp_dec_input(void **index ,unsigned char *input_data, uns
}
/* poll and wait here */
ret = DecConfigInput->mpi->poll(DecConfigInput->ctx, MPP_PORT_OUTPUT, MPP_POLL_BLOCK);
ret = dec_info->mpi->poll(dec_info->ctx, MPP_PORT_OUTPUT, MPP_POLL_BLOCK);
if (ret)
{
JZSDK_LOG_ERROR("mpp output poll failed");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
ret = DecConfigInput->mpi->dequeue(DecConfigInput->ctx, MPP_PORT_OUTPUT, &task); /* output queue */
ret = dec_info->mpi->dequeue(dec_info->ctx, MPP_PORT_OUTPUT, &task); /* output queue */
if (ret)
{
JZSDK_LOG_ERROR("mpp task output dequeue failed");
... ... @@ -386,22 +327,22 @@ T_JZsdkReturnCode RTK_mmp_dec_input(void **index ,unsigned char *input_data, uns
if (task)
{
mpp_task_meta_get_frame(task, KEY_OUTPUT_FRAME, &DecConfigInput->frame);
mpp_task_meta_get_frame(task, KEY_OUTPUT_FRAME, &dec_info->frame);
if (DecConfigInput->frame)
if (dec_info->frame)
{
//把解码出来的数据传递回去
*out_put_frame = DecConfigInput->frame;
*out_put_frame = dec_info->frame;
//printf("解码成功\n");
if (mpp_frame_get_eos(DecConfigInput->frame))
if (mpp_frame_get_eos(dec_info->frame))
{
printf("found eos frame\n");
}
}
ret = DecConfigInput->mpi->enqueue(DecConfigInput->ctx, MPP_PORT_OUTPUT, task);
ret = dec_info->mpi->enqueue(dec_info->ctx, MPP_PORT_OUTPUT, task);
if (ret)
{
JZSDK_LOG_ERROR("mpp task output enqueue failed\n");
... ...
#ifndef RTK_MMP_DEC_H
#define RTK_MMP_DEC_H
#include "version_choose.h"
#include "BaseConfig.h"
#include "../RTK_mmp_LibInclude.h"
#ifdef RTK_MPP_STATUS_ON
typedef struct T_rtk_mmp_dec_info
{
//输入的参数
unsigned int width; //输入的宽度
unsigned int height; //输入的高度
MppCodingType Dec_type; //解码的类型
MppFrameFormat out_format;
// 基础流上下文
MppCtx ctx;
MppApi *mpi;
// 输入/输出
MppPacket packet; //用于存放h264,h265数据
MppFrame frame; //用于存放yuv rgb数据
// 资源分配参数
unsigned int hor_stride;
unsigned int ver_stride;
// 运行时配置
unsigned int need_split; //输入分割设置,整帧输入,这里为0
MppBufferGroup frm_grp;
MppBufferGroup pkt_grp;
MppBuffer frmBuf;
MppBuffer pktBuf;
unsigned char *dataBuf;
unsigned int packet_size; //写入的包大小
}T_rtk_mmp_dec_info ;
#include "rockchip/rk_type.h"
#include "rockchip/mpp_frame.h"
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFrameFormat out_format,int width, int height);
T_JZsdkReturnCode RTK_mmp_dec_input(void **index ,unsigned char *input_data, unsigned int input_data_len, MppFrame *out_put_frame);
T_JZsdkReturnCode RTK_mmp_dec_Init(T_rtk_mmp_dec_info *dec_info);
T_JZsdkReturnCode RTK_mmp_dec_input(T_rtk_mmp_dec_info *dec_info ,unsigned char *input_data, unsigned int input_data_len, MppFrame *out_put_frame);
#endif
#endif
\ No newline at end of file
... ...
... ... @@ -6,110 +6,206 @@
#include "./RTK_mmp_enc.h"
#ifdef RTK_MPP_STATUS_ON
#include "rockchip/mpp_packet.h"
#include "rockchip/rk_mpi.h"
#include "rockchip/mpp_env.h" //这个.h能在mpp的源码中找到
#include "rockchip/rk_venc_rc.h"
#include "rockchip/mpp_common.h" //这个.h能在mpp的源码中找到
typedef struct {
// 基础流上下文
MppCtx ctx;
MppApi *mpi;
MppCodingType type; //处理的码流类型
// 输入/输出
MppBufferGroup BufferGop; //数据缓冲池
MppBuffer PacketBuffer; //输出数组缓冲区
unsigned int Packet_data_size; //packet包的长度
unsigned int Packet_eos; //packet包的结束标志
MppBuffer FrameBuffer; //输入数组缓冲区
unsigned int Frame_data_size; //Frame包的长度
unsigned int Frame_eos; //Frame包的结束标志
// 资源分配参数
unsigned int width;
unsigned int height;
unsigned int hor_stride;
unsigned int ver_stride;
unsigned int FrameNum; //帧数
unsigned int IDR_gop; //i帧间隔数
// 运行时的配置
MppEncCfg cfg;
MppEncHeaderMode header_mode;
int header_size;
MppFrameFormat Input_fmt;
MppEncSeiMode sei_mode;
} MPP_ENC_CONFIG ;
//设置编码器参数
int RTK_mmp_enc_cfg(MPP_ENC_CONFIG *EncCfg)
T_JZsdkReturnCode RTK_mmp_enc_Init(T_rtk_mmp_enc_info *enc_info)
{
int ret;
enc_info->ctx = NULL;
enc_info->mpi = NULL;
//编解码一体的情况下用不上这里了
switch (enc_info->Input_fmt & MPP_FRAME_FMT_MASK)
{
case MPP_FMT_YUV420SP:
case MPP_FMT_YUV420P: {
enc_info->Frame_data_size = MPP_ALIGN(enc_info->hor_stride, 64) * MPP_ALIGN(enc_info->ver_stride, 64) * 3 / 2;
} break;
case MPP_FMT_YUV422_YUYV :
case MPP_FMT_YUV422_YVYU :
case MPP_FMT_YUV422_UYVY :
case MPP_FMT_YUV422_VYUY :
case MPP_FMT_YUV422P :
case MPP_FMT_YUV422SP :
case MPP_FMT_RGB444 :
case MPP_FMT_BGR444 :
case MPP_FMT_RGB555 :
case MPP_FMT_BGR555 :
case MPP_FMT_RGB565 :
case MPP_FMT_BGR565 : {
enc_info->Frame_data_size = MPP_ALIGN(enc_info->hor_stride, 64) * MPP_ALIGN(enc_info->ver_stride, 64) * 2;
} break;
default: {
enc_info->Frame_data_size = MPP_ALIGN(enc_info->hor_stride, 64) * MPP_ALIGN(enc_info->ver_stride, 64) * 4;
} break;
}
//获取h264头长度
if (MPP_FRAME_FMT_IS_FBC(enc_info->Input_fmt))
{
enc_info->header_size = MPP_ALIGN(MPP_ALIGN(enc_info->width, 16) * MPP_ALIGN(enc_info->height, 16) / 16, SZ_4K);
}
else
{
enc_info->header_size = 0;
}
/***************************************************
*
* 注册输入输出数组的内存
*
* *****************************************************/
// 获取MPP缓冲区组,缓冲区类型为ION且可缓存
ret = mpp_buffer_group_get_internal(&enc_info->BufferGop, MPP_BUFFER_TYPE_ION);
if (ret) {
printf("获取MPP缓冲区组失败failed to get mpp buffer group ret %d\n", ret);
}
// 从缓冲区组中获取用于输入帧的缓冲区
ret = mpp_buffer_get(enc_info->BufferGop, &enc_info->FrameBuffer, enc_info->Frame_data_size + enc_info->header_size);
if (ret) {
printf("获取输入帧缓冲区失败failed to get buffer for input frame ret %d\n", ret);
}
// 从缓冲区组中获取用于输出包的缓冲区
ret = mpp_buffer_get(enc_info->BufferGop, &enc_info->PacketBuffer, enc_info->Frame_data_size);
if (ret) {
printf("获取输出包缓冲区失败failed to get buffer for output packet ret %d\n", ret);
}
// // 从缓冲区组中获取用于运动信息输出包的缓冲区
// ret = mpp_buffer_get(enc_info->BufferGop, &p->md_info, p->mdinfo_size);
// if (ret) {
// printf("获取运动信息输出包缓冲区失败failed to get buffer for motion info output packet ret %d\n", ret);
// }
//创建一个编码器
ret = mpp_create(&(enc_info->ctx), &enc_info->mpi);
if (ret != MPP_OK)
{
JZSDK_LOG_ERROR("mpp_create failed ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
printf("编码器创建完毕\n");
}
//设置编码超时(堵塞)
MppPollType timeout = MPP_POLL_BLOCK;
ret = enc_info->mpi->control(enc_info->ctx, MPP_SET_OUTPUT_TIMEOUT, &timeout);
if (ret != MPP_OK)
{
JZSDK_LOG_ERROR("编码超时设置失败 %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
printf("编码超时设置成功\n");
}
//初始化编码器
ret = mpp_init(enc_info->ctx, MPP_CTX_ENC, MPP_VIDEO_CodingAVC);
if (ret != MPP_OK)
{
JZSDK_LOG_ERROR("mpp_init failed ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
printf("编码器初始化完毕\n");
}
//初始化编码器配置
ret = mpp_enc_cfg_init(&enc_info->cfg);
if (ret) {
JZSDK_LOG_ERROR("mpp_enc_cfg_init failed ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
printf("编码器配置初始化完毕\n");
}
//获得基本编码器配置
ret = enc_info->mpi->control(enc_info->ctx, MPP_ENC_GET_CFG, enc_info->cfg);
if (ret) {
JZSDK_LOG_ERROR("get enc cfg failed ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
/***********************************************************************************************************************
*
*
* 设置编码器参数
*
*
************************************************************************************************************************/
//设置位固定码率模式
mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:mode", MPP_ENC_RC_MODE_CBR);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:mode", MPP_ENC_RC_MODE_CBR);
//设置码率 dji要小于8M 先填个4M 4000000
mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:bps_target", 4000000);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:bps_target", 4000000);
//设置输入帧率不变
mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:fps_in_flex", 0);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:fps_in_flex", 0);
//设置输入帧率的分子
mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:fps_in_num", EncCfg->FrameNum);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:fps_in_num", enc_info->FrameNum);
//设置输入帧率的分母
mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:fps_in_denorm", 1);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:fps_in_denorm", 1);
//设置输出帧率的分子
mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:fps_out_num", EncCfg->FrameNum);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:fps_out_num", enc_info->FrameNum);
//设置输出帧率的分母
mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:fps_out_denorm", 1);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:fps_out_denorm", 1);
//设置i帧间隔,跟随帧率 1秒1 I帧
mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:gop", EncCfg->IDR_gop);
mpp_enc_cfg_set_s32(enc_info->cfg, "rc:gop", enc_info->IDR_gop);
//一帧图像最大重编码次数,次数越小,重编码次数越小,越清晰
//这里暂不开启
//mpp_enc_cfg_set_s32(EncCfg->cfg, "rc:max_reenc_times", 1);
//mpp_enc_cfg_set_s32(enc_info->cfg, "rc:max_reenc_times", 1);
//设置输入图像的宽高
mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:width", EncCfg->width);
mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:height", EncCfg->height);
mpp_enc_cfg_set_s32(enc_info->cfg, "prep:width", enc_info->width);
mpp_enc_cfg_set_s32(enc_info->cfg, "prep:height", enc_info->height);
//垂直方向相邻两行之间的距离
mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:hor_stride", EncCfg->hor_stride);
mpp_enc_cfg_set_s32(enc_info->cfg, "prep:hor_stride", enc_info->hor_stride);
//入图像分量之间的以行数间隔数
mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:ver_stride", EncCfg->ver_stride);
mpp_enc_cfg_set_s32(enc_info->cfg, "prep:ver_stride", enc_info->ver_stride);
//MppFrameFormat 设置输入图像的像素格式
mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:format", EncCfg->Input_fmt);
mpp_enc_cfg_set_s32(enc_info->cfg, "prep:format", enc_info->Input_fmt);
//MppFrameColorSpace 设置输入图像的数据空间色彩范围, 不设置
//mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:color", MPP_FRAME_SPC_RGB);
//mpp_enc_cfg_set_s32(enc_info->cfg, "prep:color", MPP_FRAME_SPC_RGB);
//MppFrameColorRange 表示输入图像是 full range 还是 limit range 不设置
//mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:range", MPP_FRAME_RANGE_UNSPECIFIED);
//mpp_enc_cfg_set_s32(enc_info->cfg, "prep:range", MPP_FRAME_RANGE_UNSPECIFIED);
//MppEncRotationCfg 选择旋转方向 不旋转!
mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:rotation", MPP_ENC_ROT_0);
mpp_enc_cfg_set_s32(enc_info->cfg, "prep:rotation", MPP_ENC_ROT_0);
//是否镜像 0不镜像 水平镜像1 垂直镜像2
mpp_enc_cfg_set_s32(EncCfg->cfg, "prep:mirroring", 0);
mpp_enc_cfg_set_s32(enc_info->cfg, "prep:mirroring", 0);
//MppCodingType 表示 MppEncCodecCfg 对应的协议类型,需要与 MppCtx初始化函数 mpp_init 的参数一致。
mpp_enc_cfg_set_s32(EncCfg->cfg, "codec:type", MPP_VIDEO_CodingAVC); //h264类型
mpp_enc_cfg_set_s32(enc_info->cfg, "codec:type", MPP_VIDEO_CodingAVC); //h264类型
//h264流的码流格式类型 0 标识AnnexB 加入 00 00 00 01起始码 1 没有起始码
mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:stream_type", 0);
mpp_enc_cfg_set_s32(enc_info->cfg, "h264:stream_type", 0);
//h264流的表示 SPS 中的 profile_idc 参数:
//66 – 表示 Baseline profile。
//77 – 表示 Main profile。
//100 – 表示 High profile。
mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:profile", 66);
mpp_enc_cfg_set_s32(enc_info->cfg, "h264:profile", 66);
//sps档次 dji要求小于5.1 这里选4.1
//其中 10 表示 level 1.0:
... ... @@ -118,75 +214,75 @@ int RTK_mmp_enc_cfg(MPP_ENC_CONFIG *EncCfg)
// 30/31/32 – D1@25fps / 720p@30fps / 720p@60fps
// 40/41/42 – 1080p@30fps / 1080p@30fps / 1080p@60fps
// 50/51/52 – 4K@30fps / 4K@30fps / 4K@60fps
mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:level", 41);
mpp_enc_cfg_set_s32(enc_info->cfg, "h264:level", 41);
//表示编码器使用的熵编码格式: 0 CAVLC 1 CABAC cabac的精度更多,但是效率变低
mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:cabac_en", 1);
mpp_enc_cfg_set_s32(enc_info->cfg, "h264:cabac_en", 1);
//表示协议语法中的 cabac_init_idc,在 cabac_en 为 1 时有效,有效值为 0~2。
//DJI给的范围是1
mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:cabac_idc", 1);
mpp_enc_cfg_set_s32(enc_info->cfg, "h264:cabac_idc", 1);
//表示协议语法中的 8x8 变换使能标志。
//0 – 为关闭,在 Baseline/Main profile 时固定关闭。
//1 – 为开启,在 High profile 时可选可启。
mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:trans8x8", 0);
mpp_enc_cfg_set_s32(enc_info->cfg, "h264:trans8x8", 0);
//表示协议语法中 constrained_intra_pred_mode 模式使能标志。0 – 为关闭,1 – 为开启。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:const_intra", 0);
//mpp_enc_cfg_set_s32(enc_info->cfg, "h264:const_intra", 0);
//表示协议语法中 scaling_list_matrix 模式 0 – 为 flat matrix,1 – 默认 matrix。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:scaling_list", 0);
//mpp_enc_cfg_set_s32(enc_info->cfg, "h264:scaling_list", 0);
//表示协议语法中 chroma_cb_qp_offset 值。有效范围为[-12, 12]。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:cb_qp_offset", 0);
//mpp_enc_cfg_set_s32(enc_info->cfg, "h264:cb_qp_offset", 0);
//表示协议语法中 chroma_cr_qp_offset 值。有效范围为[-12, 12]。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:cr_qp_offset", 0);
//mpp_enc_cfg_set_s32(enc_info->cfg, "h264:cr_qp_offset", 0);
//表示协议语法中 deblock_disable 标志,有效范围为[0, 2]。0 – deblocking 使能。1 – deblocking 关闭。2 – 在 slice 边界关闭 deblocking。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:dblk_disable", 0);
//mpp_enc_cfg_set_s32(enc_info->cfg, "h264:dblk_disable", 0);
//表示协议语法中 deblock_offset_alpha 值。有效范围为[-6, 6]。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:dblk_alpha", 0);
//mpp_enc_cfg_set_s32(enc_info->cfg, "h264:dblk_alpha", 0);
//表示协议语法中 deblock_dblk_beta 值。有效范围为[-6, 6]。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:dblk_beta", 0)
//mpp_enc_cfg_set_s32(enc_info->cfg, "h264:dblk_beta", 0)
//表示初始 QP 值,一般情况请勿配置。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:qp_init", 26);
//mpp_enc_cfg_set_s32(enc_info->cfg, "h264:qp_init", 26);
// 表示最大 QP 值,一般情况请勿配置。
// mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:qp_max", 51);
// mpp_enc_cfg_set_s32(enc_info->cfg, "h264:qp_max", 51);
// 表示最小 QP 值,一般情况请勿配置。
// mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:qp_min", 10);
// mpp_enc_cfg_set_s32(enc_info->cfg, "h264:qp_min", 10);
// 表示最大 I 帧 QP 值,一般情况请勿配置。
// mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:qp_max_i", 51);
// mpp_enc_cfg_set_s32(enc_info->cfg, "h264:qp_max_i", 51);
// 表示最小 I 帧 QP 值,一般情况请勿配置。
// mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:qp_min_i", 10);
// mpp_enc_cfg_set_s32(enc_info->cfg, "h264:qp_min_i", 10);
// 表示相临两帧之间的帧级 QP 变化幅度。
// mpp_enc_cfg_set_s32(EncCfg->cfg, "h264:qp_step", 10);
// mpp_enc_cfg_set_s32(enc_info->cfg, "h264:qp_step", 10);
/***** h265 的自己翻阅文档********/
//表示 JPEG 编码器使用的量化参数等级,编码器一共内置了 11 级量化系数表格,从 0 到 10,图像质量从差到好。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "jpeg: quant", 10);
//mpp_enc_cfg_set_s32(enc_info->cfg, "jpeg: quant", 10);
//MppEncSplitMode 切分模式
//1– BY_BYTE 切分 slice 根据 slice 大小。 2– BY_CTU 切分 slice 根据宏块或 CTU 个数
//mpp_enc_cfg_set_s32(EncCfg->cfg, "split:mode", MPP_ENC_SPLIT_NONE);
//mpp_enc_cfg_set_s32(enc_info->cfg, "split:mode", MPP_ENC_SPLIT_NONE);
//切分参数 Slice 切分参数:
//在 BY_BYTE 模式下,参数表示每个 slice 的最大大小。
//在 BY_CTU 模式下,参数表示每个 slice 包含的宏块或CTU 个数。
//mpp_enc_cfg_set_s32(EncCfg->cfg, "split:arg", 1);
//mpp_enc_cfg_set_s32(enc_info->cfg, "split:arg", 1);
//将配置参数输入
int ret = EncCfg->mpi->control(EncCfg->ctx, MPP_ENC_SET_CFG, EncCfg->cfg);
ret = enc_info->mpi->control(enc_info->ctx, MPP_ENC_SET_CFG, enc_info->cfg);
if (ret)
{
printf("mpi control enc set cfg failed ret %d\n", ret);
... ... @@ -196,8 +292,8 @@ int RTK_mmp_enc_cfg(MPP_ENC_CONFIG *EncCfg)
//设置帧信息 (可选项)
RK_U32 sei_mode;
mpp_env_get_u32("sei_mode", &sei_mode, MPP_ENC_SEI_MODE_ONE_FRAME);
EncCfg->sei_mode = sei_mode;
ret = EncCfg->mpi->control(EncCfg->ctx, MPP_ENC_SET_SEI_CFG, &EncCfg->sei_mode);
enc_info->sei_mode = sei_mode;
ret = enc_info->mpi->control(enc_info->ctx, MPP_ENC_SET_SEI_CFG, &enc_info->sei_mode);
if (ret)
{
printf("mpi control enc set sei cfg failed ret %d\n", ret);
... ... @@ -206,10 +302,10 @@ int RTK_mmp_enc_cfg(MPP_ENC_CONFIG *EncCfg)
//设置头信息 (可选项)
//如果是264 或者h265 给个信息头
if (EncCfg->type == MPP_VIDEO_CodingAVC || EncCfg->type == MPP_VIDEO_CodingHEVC)
if (enc_info->encType == MPP_VIDEO_CodingAVC || enc_info->encType == MPP_VIDEO_CodingHEVC)
{
EncCfg->header_mode = MPP_ENC_HEADER_MODE_EACH_IDR;
ret = EncCfg->mpi->control(EncCfg->ctx, MPP_ENC_SET_HEADER_MODE, &EncCfg->header_mode);
enc_info->header_mode = MPP_ENC_HEADER_MODE_EACH_IDR;
ret = enc_info->mpi->control(enc_info->ctx, MPP_ENC_SET_HEADER_MODE, &enc_info->header_mode);
if (ret) {
printf("mpi control enc set header mode failed ret %d\n", ret);
return ret;
... ... @@ -238,164 +334,6 @@ int RTK_mmp_enc_cfg(MPP_ENC_CONFIG *EncCfg)
// mpp_enc_roi_init(&p->roi_ctx, p->width, p->height, p->type, 4);
// mpp_assert(p->roi_ctx);
// }
}
T_JZsdkReturnCode RTK_mmp_enc_Init(void **index, MppCodingType Out_video_tpye, MppFrameFormat In_format, int width, int height, int FrameNum, int IDR_gop)
{
//创建一个编码器参数
MPP_ENC_CONFIG *EncCfg = NULL;
//为编码器参数注册内存
EncCfg = (MPP_ENC_CONFIG *)malloc(sizeof(MPP_ENC_CONFIG));
if (EncCfg == NULL) {
printf("mpp编码器参数内存分配失败\n");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
int ret;
EncCfg->ctx = NULL;
EncCfg->mpi = NULL;
//EncCfg->type = MPP_VIDEO_CodingAVC; //默认输出类型为h264
EncCfg->type = Out_video_tpye; //默认输出类型为h264
EncCfg->height = height;
EncCfg->width = width;
EncCfg->hor_stride = (MPP_ALIGN(width, 16));
EncCfg->ver_stride = (MPP_ALIGN(height, 16));
EncCfg->FrameNum = FrameNum;
EncCfg->IDR_gop = IDR_gop;
//EncCfg->Input_fmt = MPP_FMT_YUV420SP;
EncCfg->Input_fmt = In_format;
//编解码一体的情况下用不上这里了
switch (EncCfg->Input_fmt & MPP_FRAME_FMT_MASK)
{
case MPP_FMT_YUV420SP:
case MPP_FMT_YUV420P: {
EncCfg->Frame_data_size = MPP_ALIGN(EncCfg->hor_stride, 64) * MPP_ALIGN(EncCfg->ver_stride, 64) * 3 / 2;
} break;
case MPP_FMT_YUV422_YUYV :
case MPP_FMT_YUV422_YVYU :
case MPP_FMT_YUV422_UYVY :
case MPP_FMT_YUV422_VYUY :
case MPP_FMT_YUV422P :
case MPP_FMT_YUV422SP :
case MPP_FMT_RGB444 :
case MPP_FMT_BGR444 :
case MPP_FMT_RGB555 :
case MPP_FMT_BGR555 :
case MPP_FMT_RGB565 :
case MPP_FMT_BGR565 : {
EncCfg->Frame_data_size = MPP_ALIGN(EncCfg->hor_stride, 64) * MPP_ALIGN(EncCfg->ver_stride, 64) * 2;
} break;
default: {
EncCfg->Frame_data_size = MPP_ALIGN(EncCfg->hor_stride, 64) * MPP_ALIGN(EncCfg->ver_stride, 64) * 4;
} break;
}
//获取h264头长度
if (MPP_FRAME_FMT_IS_FBC(EncCfg->Input_fmt))
{
EncCfg->header_size = MPP_ALIGN(MPP_ALIGN(EncCfg->width, 16) * MPP_ALIGN(EncCfg->height, 16) / 16, SZ_4K);
}
else
{
EncCfg->header_size = 0;
}
/***************************************************
*
* 注册输入输出数组的内存
*
* *****************************************************/
// 获取MPP缓冲区组,缓冲区类型为ION且可缓存
ret = mpp_buffer_group_get_internal(&EncCfg->BufferGop, MPP_BUFFER_TYPE_ION);
if (ret) {
printf("获取MPP缓冲区组失败failed to get mpp buffer group ret %d\n", ret);
}
// 从缓冲区组中获取用于输入帧的缓冲区
ret = mpp_buffer_get(EncCfg->BufferGop, &EncCfg->FrameBuffer, EncCfg->Frame_data_size + EncCfg->header_size);
if (ret) {
printf("获取输入帧缓冲区失败failed to get buffer for input frame ret %d\n", ret);
}
// 从缓冲区组中获取用于输出包的缓冲区
ret = mpp_buffer_get(EncCfg->BufferGop, &EncCfg->PacketBuffer, EncCfg->Frame_data_size);
if (ret) {
printf("获取输出包缓冲区失败failed to get buffer for output packet ret %d\n", ret);
}
// // 从缓冲区组中获取用于运动信息输出包的缓冲区
// ret = mpp_buffer_get(EncCfg->BufferGop, &p->md_info, p->mdinfo_size);
// if (ret) {
// printf("获取运动信息输出包缓冲区失败failed to get buffer for motion info output packet ret %d\n", ret);
// }
//创建一个编码器
ret = mpp_create(&(EncCfg->ctx), &EncCfg->mpi);
if (ret != MPP_OK)
{
JZSDK_LOG_ERROR("mpp_create failed ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
printf("编码器创建完毕\n");
}
//设置编码超时(堵塞)
MppPollType timeout = MPP_POLL_BLOCK;
ret = EncCfg->mpi->control(EncCfg->ctx, MPP_SET_OUTPUT_TIMEOUT, &timeout);
if (ret != MPP_OK)
{
JZSDK_LOG_ERROR("编码超时设置失败 %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
printf("编码超时设置成功\n");
}
//初始化编码器
ret = mpp_init(EncCfg->ctx, MPP_CTX_ENC, MPP_VIDEO_CodingAVC);
if (ret != MPP_OK)
{
JZSDK_LOG_ERROR("mpp_init failed ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
printf("编码器初始化完毕\n");
}
//初始化编码器配置
ret = mpp_enc_cfg_init(&EncCfg->cfg);
if (ret) {
JZSDK_LOG_ERROR("mpp_enc_cfg_init failed ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
else
{
printf("编码器配置初始化完毕\n");
}
//获得基本编码器配置
ret = EncCfg->mpi->control(EncCfg->ctx, MPP_ENC_GET_CFG, EncCfg->cfg);
if (ret) {
JZSDK_LOG_ERROR("get enc cfg failed ret %d", ret);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//设置编码器参数
RTK_mmp_enc_cfg(EncCfg);
//把编码器地址传递回去
*index = (void *)EncCfg;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -420,7 +358,7 @@ T_JZsdkReturnCode RTK_mmp_enc_Init(void **index, MppCodingType Out_video_tpye, M
// MppPacket m_packet = NULL;
// // 检查编码类型是否为AVC(H.264)或HEVC(H.265)
// if (EncCfg->type == MPP_VIDEO_CodingAVC || EncCfg->type == MPP_VIDEO_CodingHEVC)
// if (enc_info->type == MPP_VIDEO_CodingAVC || enc_info->type == MPP_VIDEO_CodingHEVC)
// {
// /*
// * 可以使用普通malloc分配的内存缓冲区作为输入,而不是pkt_buf。
... ... @@ -428,7 +366,7 @@ T_JZsdkReturnCode RTK_mmp_enc_Init(void **index, MppCodingType Out_video_tpye, M
// * 这里使用pkt_buf缓冲区只是为了简化演示。
// */
// // 使用pkt_buf缓冲区初始化packet
// mpp_packet_init_with_buffer(&m_packet, EncCfg->Packet_data);
// mpp_packet_init_with_buffer(&m_packet, enc_info->Packet_data);
// /* NOTE: It is important to clear output packet length!! */
// /*
// * 注意:清除输出数据包长度非常重要!
... ... @@ -437,7 +375,7 @@ T_JZsdkReturnCode RTK_mmp_enc_Init(void **index, MppCodingType Out_video_tpye, M
// mpp_packet_set_length(m_packet, 0);
// // 调用mpi的control函数,获取编码的头部信息(如SPS和PPS),并将其存储在packet中
// ret = EncCfg->mpi->control(EncCfg->ctx, MPP_ENC_GET_HDR_SYNC, m_packet);
// ret = enc_info->mpi->control(enc_info->ctx, MPP_ENC_GET_HDR_SYNC, m_packet);
// if (ret) {
// printf("获取h264 enc头信息失败\n");
// return ret;
... ... @@ -464,20 +402,17 @@ T_JZsdkReturnCode RTK_mmp_enc_Init(void **index, MppCodingType Out_video_tpye, M
// yuv420sp转h264
// 但是输入和输出都是mmpframe的地址
// 注意,输出的画面帧要记得释放内存
T_JZsdkReturnCode RTK_mmp_enc_yuv_to_h264_byFrame(void **index, MppFrame input_data_frame, MppPacket *out_put_frame)
T_JZsdkReturnCode RTK_mmp_enc_yuv_to_h264_byFrame(T_rtk_mmp_enc_info *enc_info, MppFrame input_data_frame, MppPacket *out_put_frame)
{
int ret; //返回值
//获取编码器参数
MPP_ENC_CONFIG *EncCfg = (MPP_ENC_CONFIG *)*index;
//获取输入的数据
MppFrame frame = input_data_frame;
//printf("mmp开始编码\n");
/* 将帧编码并放入编码上下文 */
ret = EncCfg->mpi->encode_put_frame(EncCfg->ctx, frame);
ret = enc_info->mpi->encode_put_frame(enc_info->ctx, frame);
if (ret) {
JZSDK_LOG_ERROR("mpp encode put frame failed");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ... @@ -486,7 +421,7 @@ T_JZsdkReturnCode RTK_mmp_enc_yuv_to_h264_byFrame(void **index, MppFrame input_d
do {
//获取编码后的帧
ret = EncCfg->mpi->encode_get_packet(EncCfg->ctx, out_put_frame);
ret = enc_info->mpi->encode_get_packet(enc_info->ctx, out_put_frame);
if (ret) {
JZSDK_LOG_ERROR("mpp encode get packet failed");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ... @@ -496,7 +431,7 @@ T_JZsdkReturnCode RTK_mmp_enc_yuv_to_h264_byFrame(void **index, MppFrame input_d
{
// write packet to file here
//ptr = mpp_packet_get_pos(packet);
//int packet_len = mpp_packet_get_length(EncCfg->Packet_data);
//int packet_len = mpp_packet_get_length(enc_info->Packet_data);
//EncConfigInput->Packet_eos = mpp_packet_get_eos(packet);
//printf("获取到编码内容 len:%d\n",packet_len);
... ... @@ -509,13 +444,10 @@ T_JZsdkReturnCode RTK_mmp_enc_yuv_to_h264_byFrame(void **index, MppFrame input_d
}
// yuv420个帧长度为 高*宽*3/2
T_JZsdkReturnCode RTK_mmp_enc_data_to_h264(void **index, char *in_data, int in_data_length, MppPacket *Packet)
T_JZsdkReturnCode RTK_mmp_enc_data_to_h264(T_rtk_mmp_enc_info *enc_info, char *in_data, int in_data_length, MppPacket *Packet)
{
int ret; //返回值
//获取编码器参数
MPP_ENC_CONFIG *EncCfg = (MPP_ENC_CONFIG *)*index;
MppFrame frame = NULL;
MppMeta meta = NULL; //元数据指针
... ... @@ -528,27 +460,27 @@ T_JZsdkReturnCode RTK_mmp_enc_data_to_h264(void **index, char *in_data, int in_d
//设置帧对象的参数
// 设置处理帧的宽度、高度、水平跨度、垂直跨度和格式
mpp_frame_set_width(frame, EncCfg->width);
mpp_frame_set_height(frame, EncCfg->height);
mpp_frame_set_hor_stride(frame, EncCfg->hor_stride);
mpp_frame_set_ver_stride(frame, EncCfg->ver_stride);
mpp_frame_set_fmt(frame, EncCfg->Input_fmt);
mpp_frame_set_eos(frame, EncCfg->Frame_eos); // 设置帧的结束标志
mpp_frame_set_width(frame, enc_info->width);
mpp_frame_set_height(frame, enc_info->height);
mpp_frame_set_hor_stride(frame, enc_info->hor_stride);
mpp_frame_set_ver_stride(frame, enc_info->ver_stride);
mpp_frame_set_fmt(frame, enc_info->Input_fmt);
mpp_frame_set_eos(frame, enc_info->Frame_eos); // 设置帧的结束标志
//获取帧缓冲区的指针
void *buf = mpp_buffer_get_ptr(EncCfg->FrameBuffer);
void *buf = mpp_buffer_get_ptr(enc_info->FrameBuffer);
//将yuv数据写入缓冲区
memcpy(buf, in_data, in_data_length);
// 使用默认的帧缓冲区
mpp_frame_set_buffer(frame, EncCfg->FrameBuffer);
mpp_frame_set_buffer(frame, enc_info->FrameBuffer);
// 获取帧的元数据对象
meta = mpp_frame_get_meta(frame);
// 初始化包对象,并使用指定的输出缓冲区
mpp_packet_init_with_buffer(Packet, EncCfg->PacketBuffer);
mpp_packet_init_with_buffer(Packet, enc_info->PacketBuffer);
// 注意:清除输出包的长度
// 设置包的长度为0
... ... @@ -563,7 +495,7 @@ T_JZsdkReturnCode RTK_mmp_enc_data_to_h264(void **index, char *in_data, int in_d
*/
/* 将frame数据放入编码器 */
ret = EncCfg->mpi->encode_put_frame(EncCfg->ctx, frame);
ret = enc_info->mpi->encode_put_frame(enc_info->ctx, frame);
if (ret) {
JZSDK_LOG_ERROR("mpp encode put frame failed");
mpp_frame_deinit(&frame);
... ... @@ -579,7 +511,7 @@ T_JZsdkReturnCode RTK_mmp_enc_data_to_h264(void **index, char *in_data, int in_d
do {
//获取解码后的帧
ret = EncCfg->mpi->encode_get_packet(EncCfg->ctx, Packet);
ret = enc_info->mpi->encode_get_packet(enc_info->ctx, Packet);
if (ret) {
JZSDK_LOG_ERROR("mpp encode get packet failed");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ... @@ -600,17 +532,15 @@ T_JZsdkReturnCode RTK_mmp_enc_data_to_h264(void **index, char *in_data, int in_d
* 设置下一帧为I帧
*
* *******************/
T_JZsdkReturnCode RTK_mmp_enc_SetNextFrame_IDR(void **index)
T_JZsdkReturnCode RTK_mmp_enc_SetNextFrame_IDR(T_rtk_mmp_enc_info *enc_info)
{
//获取编码器参数
MPP_ENC_CONFIG *EncCfg = (MPP_ENC_CONFIG *)*index;
//将配置参数输入
int ret = EncCfg->mpi->control(EncCfg->ctx, MPP_ENC_SET_IDR_FRAME, EncCfg->cfg);
int ret = enc_info->mpi->control(enc_info->ctx, MPP_ENC_SET_IDR_FRAME, enc_info->cfg);
if (ret)
{
printf("设置I帧失败%d\n", ret);
return ret;
}
}
#endif
... ...
#ifndef RTK_MMP_ENC_H
#define RTK_MMP_ENC_H
#include "version_choose.h"
#include "BaseConfig.h"
#include "../RTK_mmp_LibInclude.h"
#ifdef RTK_MPP_STATUS_ON
... ... @@ -9,10 +10,53 @@
#include "rockchip/mpp_frame.h"
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
T_JZsdkReturnCode RTK_mmp_enc_Init(void **index, MppCodingType Out_video_tpye, MppFrameFormat In_format, int width, int height, int FrameNum, int IDR_gop);
T_JZsdkReturnCode RTK_mmp_enc_yuv_to_h264_byFrame(void **index, MppFrame input_data_frame, MppPacket *out_put_frame);
T_JZsdkReturnCode RTK_mmp_enc_data_to_h264(void **index, char *in_data, int in_data_length, MppPacket *Packet);
T_JZsdkReturnCode RTK_mmp_enc_SetNextFrame_IDR(void **index);
typedef struct T_rtk_mmp_enc_info
{
//要求输入的参数
MppFrameFormat Input_fmt; //输入视频的格式
unsigned int width; //输入视频的宽度
unsigned int height; //输入视频的高度
unsigned int FrameNum; //帧数
MppCodingType encType; //编码的类型
unsigned int IDR_gop; //i帧间隔数
// 基础流上下文
MppCtx ctx;
MppApi *mpi;
// 输入/输出
MppBufferGroup BufferGop; //数据缓冲池
MppBuffer PacketBuffer; //输出数组缓冲区
unsigned int Packet_data_size; //packet包的长度
unsigned int Packet_eos; //packet包的结束标志
MppBuffer FrameBuffer; //输入数组缓冲区
unsigned int Frame_data_size; //Frame包的长度
unsigned int Frame_eos; //Frame包的结束标志
// 资源分配参数
unsigned int hor_stride;
unsigned int ver_stride;
// 运行时的配置
MppEncCfg cfg;
MppEncHeaderMode header_mode;
int header_size;
MppEncSeiMode sei_mode;
}T_rtk_mmp_enc_info ;
T_JZsdkReturnCode RTK_mmp_enc_Init(T_rtk_mmp_enc_info *enc_info);
T_JZsdkReturnCode RTK_mmp_enc_yuv_to_h264_byFrame(T_rtk_mmp_enc_info *enc_info, MppFrame input_data_frame, MppPacket *out_put_frame);
T_JZsdkReturnCode RTK_mmp_enc_data_to_h264(T_rtk_mmp_enc_info *enc_info, char *in_data, int in_data_length, MppPacket *Packet);
T_JZsdkReturnCode RTK_mmp_enc_SetNextFrame_IDR(T_rtk_mmp_enc_info *enc_info);
#endif
... ...
... ... @@ -7,75 +7,5 @@
#include "version_choose.h"
#include "MediaProc/VideoMgmt/VideoMgmt.h"
//c1 0是红外权柄 1是光学权柄 2为空权柄
static void *RtkMmpEncHandle[3] = { NULL }; // 所有元素都被初始化为NULL
static void *RtkMmpDecHandle[3] = { NULL }; // 所有元素都被初始化为NULL
#include "./RTK_mmp.h"
/*
rtk模块获取编码权柄
属于参数即可权柄
*/
void *JZsdk_RtkMmpGetEncHandle(int CameraIndex)
{
return RtkMmpEncHandle[CameraIndex];
}
/*
rtk模块获取解码权柄
属于参数即可权柄
*/
void *JZsdk_RtkMmpGetDecHandle(int CameraIndex)
{
return RtkMmpDecHandle[CameraIndex];
}
/*********
*
* 返回dec权柄地址
*
*
* ***/
void **JZsdk_RtkMmpGetDecHandleAddr(int CameraIndex)
{
return &(RtkMmpDecHandle[CameraIndex]);
}
/*********
*
* 返回enc权柄地址
*
*
* ***/
void **JZsdk_RtkMmpGetEncHandleAddr(int CameraIndex)
{
return &(RtkMmpEncHandle[CameraIndex]);
}
//昆腾相机设置下一帧为I帧
T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex)
{
#ifdef RTK_MPP_STATUS_ON
if (CameraIndex == 0)
{
RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(0));
}
else if(CameraIndex == 1)
{
RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(1));
}
else if(CameraIndex == 2)
{
RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(2));
}
else
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
\ No newline at end of file
... ...
... ... @@ -38,14 +38,6 @@ T_JZsdkReturnCode JZsdk_RTKMMP_RawData_to_h264(unsigned char *RawData, int data_
T_JZsdkReturnCode JZsdk_RTKMMP_RawData_to_h264_Return(void **index, unsigned char *RawData, int *data_len);
T_JZsdkReturnCode JZsdk_Kt_IrcMMP_Init(int Irc_width, int Irc_height, int Irc_frame, int Irc_gop, int Cam_width, int Cam_height, int Cam_frame,int Cam_gop);
T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex);
void *JZsdk_RtkMmpGetEncHandle(int CameraIndex);
void *JZsdk_RtkMmpGetDecHandle(int CameraIndex);
void **JZsdk_RtkMmpGetDecHandleAddr(int CameraIndex);
void **JZsdk_RtkMmpGetEncHandleAddr(int CameraIndex);
#ifdef __cplusplus
... ...
/**
********************************************************************
* @file RTK_mmp_LibInclude.h
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef RTK_MMP_LIBINCLUDE_H
#define RTK_MMP_LIBINCLUDE_H
/* Includes ------------------------------------------------------------------*/
#ifdef RTK_MPP_STATUS_ON
#include "rockchip/mpp_common.h" //这个.h能在mpp的源码中找到
#include "rockchip/mpp_packet.h"
#include "rockchip/rk_mpi.h"
#include "rockchip/mpp_env.h" //这个.h能在mpp的源码中找到
#include "rockchip/rk_venc_rc.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
#ifdef __cplusplus
}
#endif
#endif
\ No newline at end of file
... ...
... ... @@ -30,6 +30,8 @@
#include "../MultProc/RTK_mmp/RTK_mmp.h"
static T_JZsdkVideoMgmtHandler *g_VideoMgmtHandler = NULL;
JZ_VideoStreamUseStatus g_VideoStreamDealStatus = VIDEO_STREAM_IDLE; //视频流的处理状态
static int g_VideoFreezeFlag = JZ_FLAGCODE_OFF; //视频流冻结功能
static int g_VideoFreeze_PlayFlag = JZ_FLAGCODE_OFF; //视频流冻结功能的传输flag
... ... @@ -132,26 +134,15 @@ T_JZsdkReturnCode VideoMgmt_VideoStreamFlow_RecordPlay(int status)
* *********************************/
T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR()
{
#if DEVICE_VERSION == JZ_C1
switch (g_VideoStreamFlowIndexNum)
{
case VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST:
{
JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(0);
}
break;
case VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND:
T_JZsdkVideoMgmtHandler *VideoMgmtHandler = JZsdk_GetVideoMgmtHandler();
if (VideoMgmtHandler == NULL)
{
JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(1);
}
break;
default:
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
break;
}
#endif
VideoMgmtHandler->SetNextFrame_IDR(g_VideoStreamFlowIndexNum);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -404,6 +395,29 @@ T_JZsdkReturnCode VideoMgmt_Get_StreamWidthAndHeight(int *width, int *height)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
static T_JZsdkReturnCode JZsdk_RegVideoMgmtHandler(const T_JZsdkVideoMgmtHandler *VideoMgmtHandler)
{
g_VideoMgmtHandler = malloc(sizeof(T_JZsdkVideoMgmtHandler));
if (VideoMgmtHandler == NULL) {
return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED; // 处理内存分配失败的情况
}
memcpy(g_VideoMgmtHandler, VideoMgmtHandler, sizeof(T_JZsdkVideoMgmtHandler));
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkVideoMgmtHandler *JZsdk_GetVideoMgmtHandler(void)
{
return g_VideoMgmtHandler; // 返回已注册的处理器
}
/*******************
*
*
... ... @@ -412,10 +426,13 @@ T_JZsdkReturnCode VideoMgmt_Get_StreamWidthAndHeight(int *width, int *height)
*
*
* ***********************/
T_JZsdkReturnCode VideoMgmt_Init(void)
T_JZsdkReturnCode VideoMgmt_Init(T_JZsdkVideoMgmtHandler handler)
{
T_JZsdkReturnCode ret;
//注册视频流处理函数
ret = JZsdk_RegVideoMgmtHandler(&handler);
//初始化转码模块
VideoStreamTransCode_Init();
... ...
... ... @@ -21,11 +21,19 @@ extern "C" {
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
typedef struct T_JZsdkVideoMgmtHandler
{
T_JZsdkReturnCode (*SetNextFrame_IDR)(unsigned int Index);
}T_JZsdkVideoMgmtHandler;
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_JZsdkReturnCode VideoMgmt_Init(void);
T_JZsdkReturnCode VideoMgmt_Init(T_JZsdkVideoMgmtHandler handler);
T_JZsdkVideoMgmtHandler *JZsdk_GetVideoMgmtHandler(void);
T_JZsdkReturnCode VideoMgmt_init_buffer(void **index);
T_JZsdkReturnCode VideoMgmt_VideoBuffer_Deinit(void **index);
T_JZsdkReturnCode VideoMgmt_write_data(void **index, unsigned char *data, unsigned int data_len);
... ...
... ... @@ -467,7 +467,8 @@ T_JZsdkReturnCode UIcontrol_PausePlayAudio(int DeviceName)
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
{
JZsdk_Psdk_UI_io_Reply_PlayStatus(PlayStatus);
//停止固定显示关闭
JZsdk_Psdk_UI_io_Reply_PlayStatus(JZ_FLAGCODE_OFF);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ...
... ... @@ -168,6 +168,8 @@ T_JZsdkReturnCode JZSDK_WidgetMgMT_ControlInit()
JZSDK_LOG_ERROR("创建控件写入线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
JZSDK_LOG_INFO("控件控制初始化成功");
}
... ... @@ -179,7 +181,7 @@ T_JZsdkReturnCode JZSDK_WidgetMgMT_ControlInit()
* ******/
T_JZsdkReturnCode JZSDK_WidgetMgMT_ConrtrolInputTask(int task_inscode, int value)
{
//如果输入的任务是关闭音频,就取消所有的上下曲操作,并重置数据池
//如果输入的任务是关闭/继续音频,就取消所有的上下曲操作,并重置数据池
if (task_inscode == JZSDK_WIDGET_PLAYANDSTOP)
{
WidgetControl_WriteDataClear();
... ...
... ... @@ -469,11 +469,7 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
case 2: // 播放\暂停 value为1 是三角控件 暂停 所以要去取反
{
value = !value;
//如果为暂停
if (value == 0)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);
}
break;
}
... ...
# 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线程库,以支持多线程程序。
... ... @@ -12,7 +12,6 @@ project(JZ_U3S)
set(CMAKE_EXE_LINKER_FLAGS "-pthread")
# 设置设备类型以加载主要功能模块
set(DEVICE_TYPE MEGAPHONE)
#预留行
#预留行
#预留行
... ... @@ -21,7 +20,8 @@ set(DEVICE_TYPE MEGAPHONE)
#预留行
#预留行
#预留行
set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
#预留行
#预留行
#预留行
set(ROOT_DIRS "${CMAKE_CURRENT_LIST_DIR}/../../../../../../../")
... ...
... ... @@ -12,7 +12,7 @@ set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++")
set(CMAKE_EXE_LINKER_FLAGS "-pthread")
#预留行
set(DEVICE_TYPE MEGAPHONE)
#预留行
#预留行
#预留行
#预留行
... ...