在DVR中增加系统模式CGI接口
来源:互联网 发布:电脑解压软件 编辑:程序博客网 时间:2024/05/17 07:16
1,协议定义并实现
需要增加的接口:
1)获取设备当前模式:
D1, 960H
AHD, TVI
HVR3IN1-AHD-720P, HVR3IN1-AHD-1080P-H, HVR-3IN1-AHD-1080P
HVR4IN1-720P, HVR4IN1-1080P-H, HVR-4IN1-1080P
2)获取当前通道模式,
960H,AHD, AHD1.0,AHD2.0,TV, TVI1.0, TVI2.0, AUTO, IPC
3)获取输入摄像头类型,包括类型和分辨率,帧率
类型vinType:960H,AHD, TVI
分辨率vinResolution:d1, 960H, 720P, 1080P(扩充:3M, 4M, 5M, 8M)
帧率vinFramerate:25,30,50,60
4) 获取通道编码能力集
所有支持的分辨率
当前分辨率的帧率取值范围
当前分辨率的码率取值范围
编码格式取值范围
一、获取设备当前模式
1、判断是否定义了_HVR这个宏(在配置文件clnf.h中可以查看),已经定义这个宏说明设备模式是HVR3IN1(三合一)或者是HVR4IN1(四合一),具体是几合一就得判断decode芯片是AHD(三合一)还是TVI(四合一)。接着判断支持的最高视频格式,调用JDK_vin_get_max_support()函数即可,最后判断是否定义了_EXT_HDDVR_LITE这个宏(在配置文件clnf.h中可以查看),定义了为half类型,没定义则不是half。如果_HVR这个宏没定义的话则是其他模式了,比如D1、960H、TVI、AHD等等。
2、在app2cgi_communication.c中添加命令类型CMD_GET_DEV_MODEL:
case CMD_GET_DEV_MODEL:cmd.dev_info.info.hvr = NULL;cmd.dev_info.info.half = NULL;cmd.dev_info.info.format = NULL;#if defined(_HVR)if(strcmp(HDDVR_AD_AHD_TYPE, HDDVR_GetMODELType()) == 0){cmd.dev_info.info.hvr = "HVR3IN1-AHD"; }else if(strcmp(HDDVR_AD_TVI_TYPE, HDDVR_GetMODELType()) == 0){cmd.dev_info.info.hvr = "HVR4IN1"; } #ifdef _EXT_HDDVR_LITEcmd.dev_info.info.half = "H"; #endif MaxSupport = JDK_vin_get_max_support();switch(MaxSupport){case 0:cmd.dev_info.info.format = "960H";break;case 1:cmd.dev_info.info.format = "720P";break;case 2:cmd.dev_info.info.format = "1080P";break;default:break;}#else #ifdef _EXT_HDDVR cmd.dev_info.info.hvr = HDDVR_GetMODELType(); #endif#endifcmd.type = CMD_GET_DEV_MODEL_ACK; //CMD_GET_DEV_MODEL_ACK说明这个命令已经被处理了SEND_DVRCMD_ACK(cmd, _socket_index); //把处理结果发回cgi_gw.cbreak;
3、在cgi_gw.c中获取网页发过来的xml信息(通道号、命令、参数等等),然后用TCP协议发给APP并接受app2cgi_communication.c发回来的处理结果,最后反馈给网页:
static void proc_juan_getdevmodel(UniStructNode* root_in, UniStructNode* root_out){UniStructNodesList* tmp_nodes_in;UniStructNode* tmp_node_in;UniStructNode* tmp_node_out;UniStructAttr* tmp_attr_in;//UniStructAttr* tmp_attr_out;tmp_nodes_in = UniStruct_find_children(root_in, "devmodel");if(tmp_nodes_in != NULL){int i;for(i = 0; i < tmp_nodes_in->count; i++){tmp_node_in = tmp_nodes_in->nodes[i];tmp_node_out = UniStruct_append_child(root_out, "devmodel", "");UniStruct_append_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_NO_ERROR));char* usr = NULL;char* pwd = NULL;CHK_USR_PWD(JUAN_ERRNO_USR_OR_PWD_ERROR);#define PTZCTRL_PROC_START(key) \{ \tmp_attr_in = UniStruct_find_attr(tmp_node_in, key); \if(tmp_attr_in != NULL) \{ \#define PTZCTRL_PROC_END(key) \UniStruct_append_attr(tmp_node_out, key, tmp_attr_in->value); \} \}int chn = -1;int param = -1;PTZCTRL_PROC_START("chn");chn = _convert_from_string(tmp_attr_in->value);PTZCTRL_PROC_END("chn");PTZCTRL_PROC_START("param");param = _convert_from_string(tmp_attr_in->value);PTZCTRL_PROC_END("param");if(chn == -1 || param == -1){UniStruct_modify_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_PARAM_ERROR));continue;}///////////////////////DVRCommand_t dvr_cmd;memset(&dvr_cmd, 0, sizeof(DVRCommand_t));dvr_cmd.flag = DVR_CMD_FLAG;dvr_cmd.type = CMD_GET_DEV_MODEL;dvr_cmd.dev_info.nChn = chn;dvr_cmd.dev_info.u8Val = param;SEND_CMD_TO_APP(dvr_cmd, SEND_CMD_TO_APP_TIMEOUT); //把收到的xml信息填充好dvr_cmd结构体,然后发给APPif(dvr_cmd.type != CMD_GET_DEV_MODEL_ACK) //判断APP那边是否已经处理了这条命令{UniStruct_modify_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_APP_RESPONSE_ERROR));continue;}else{char devmodel_content[128];if(dvr_cmd.dev_info.info.hvr && dvr_cmd.dev_info.info.format){if(dvr_cmd.dev_info.info.half){sprintf(devmodel_content, "%s-%s-%s",dvr_cmd.dev_info.info.hvr,dvr_cmd.dev_info.info.format,dvr_cmd.dev_info.info.half);}else{sprintf(devmodel_content, "%s-%s",dvr_cmd.dev_info.info.hvr,dvr_cmd.dev_info.info.format);}}else{sprintf(devmodel_content, "%s", dvr_cmd.dev_info.info.hvr);}UniStruct_append_child(tmp_node_out, "devmodel", devmodel_content); //把要反馈给网页的信息放到等待发送的队列中}}UniStruct_free_nodes_list(tmp_nodes_in);tmp_nodes_in = NULL;}}
二、获取当前通道模式
1、首先判断通道模式是否为JDK_INPUT_FORMAT_AUTO(四合一都会是这个):
如果是的话再判断是否为IPC(数字通道),VIDEO_TYPE_960H_TVI(对应显示器界面上的自动选项),VIDEO_TYPE_AHD(对应界面上的AHD选项)。
如果不是的话(一般是三合一)再判断是否为IPC(数字通道),VIDEO_MODE_960H(界面上的960H选项)、VIDEO_MODE_720P(界面上的AHD1.0选项)、VIDEO_MODE_HALF1080P或者VIDEO_MODE_1080P(界面上的AHD2.0选项)。
判断是否为IPC(数字通道)的方法:从环境变量中获取BNC的通道数(即模拟通道数),如果比通道数(MAX_CAM_CH)小的话则有通道为IPC(数字通道),因为设置IPC通道只能从最大通道开始,所以如果当前通道号等于或大于BNC的通道数的话则该通道为IPC(数字通道)。
2、在app2cgi_communication.c中添加命令类型CMD_GET_CHN_MODEL:
case CMD_GET_CHN_MODEL:bAuto = g_pstSysEnv->GetChannelModeAuto(g_pstSysEnv);model = g_pstSysEnv->GetChannelModelType(g_pstSysEnv, cmd.chn_info.nChn);channel_mode = g_pstSysEnv->GetChannelModes(g_pstSysEnv, cmd.chn_info.nChn);inmode = bAuto ? JDK_INPUT_FORMAT_AUTO : JDK_INPUT_BNC_720P_25;//nBNC = g_pstSysEnv->stAttr.stContent.stHvr.nBnc;#if defined(_HVR)if( JCONF_IS_NET_CAM(cmd.chn_info.nChn) ){//(nBNC < MAX_CAM_CH) && (cmd.chn_info.nChn >= nBNC) ){cmd.chn_info.chnnel_model = "IPC";}else if(strcmp(HDDVR_AD_TVI_TYPE, HDDVR_GetMODELType()) == 0){if( VIDEO_TYPE_960H_TVI == model){cmd.chn_info.chnnel_model = "AUTO";}else if(VIDEO_TYPE_AHD == model){cmd.chn_info.chnnel_model = "AHD";} }else if (strcmp(HDDVR_AD_AHD_TYPE, HDDVR_GetMODELType()) == 0) { if(inmode == JDK_INPUT_FORMAT_AUTO){cmd.chn_info.chnnel_model = "AUTO";}else{switch(channel_mode){case VIDEO_MODE_960H:cmd.chn_info.chnnel_model = "960H";break;case VIDEO_MODE_720P:cmd.chn_info.chnnel_model = "AHD1.0";break;case VIDEO_MODE_HALF1080P:case VIDEO_MODE_1080P:cmd.chn_info.chnnel_model = "AHD2.0";break;case VIDEO_MODE_IPCAM:cmd.chn_info.chnnel_model = "IPC";default:break;}}}#endifcmd.type = CMD_GET_CHN_MODEL_ACK;SEND_DVRCMD_ACK(cmd, _socket_index);break;
3、在cgi_gw.c中获取网页发过来的xml信息(通道号、命令、参数等等),然后用TCP协议发给APP并接受app2cgi_communication.c发回来的处理结果,最后反馈给网页:
static void proc_juan_getchnmodel(UniStructNode* root_in, UniStructNode* root_out){UniStructNodesList* tmp_nodes_in;UniStructNode* tmp_node_in;UniStructNode* tmp_node_out;UniStructAttr* tmp_attr_in;//UniStructAttr* tmp_attr_out;tmp_nodes_in = UniStruct_find_children(root_in, "chnmodel");if(tmp_nodes_in != NULL){int i;for(i = 0; i < tmp_nodes_in->count; i++){tmp_node_in = tmp_nodes_in->nodes[i];tmp_node_out = UniStruct_append_child(root_out, "chnmodel", "");UniStruct_append_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_NO_ERROR));char* usr = NULL;char* pwd = NULL;CHK_USR_PWD(JUAN_ERRNO_USR_OR_PWD_ERROR);#define PTZCTRL_PROC_START(key) \{ \tmp_attr_in = UniStruct_find_attr(tmp_node_in, key); \if(tmp_attr_in != NULL) \{ \#define PTZCTRL_PROC_END(key) \UniStruct_append_attr(tmp_node_out, key, tmp_attr_in->value); \} \}int chn = -1;int param = -1;PTZCTRL_PROC_START("chn");chn = _convert_from_string(tmp_attr_in->value);PTZCTRL_PROC_END("chn");PTZCTRL_PROC_START("param");param = _convert_from_string(tmp_attr_in->value);PTZCTRL_PROC_END("param");if(chn == -1 || param == -1){UniStruct_modify_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_PARAM_ERROR));continue;}///////////////////////DVRCommand_t dvr_cmd;memset(&dvr_cmd, 0, sizeof(DVRCommand_t));dvr_cmd.flag = DVR_CMD_FLAG;dvr_cmd.type = CMD_GET_CHN_MODEL;dvr_cmd.chn_info.nChn = chn;dvr_cmd.chn_info.u8Val = param;SEND_CMD_TO_APP(dvr_cmd, SEND_CMD_TO_APP_TIMEOUT);if(dvr_cmd.type != CMD_GET_CHN_MODEL_ACK){UniStruct_modify_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_APP_RESPONSE_ERROR));continue;}else{char chnmodel_content[128];sprintf(chnmodel_content, "%s",dvr_cmd.chn_info.chnnel_model);UniStruct_append_child(tmp_node_out, "chnmodel", chnmodel_content);}}UniStruct_free_nodes_list(tmp_nodes_in);tmp_nodes_in = NULL;}}
三、获取输入摄像头类型,包括类型和分辨率,帧率
case CMD_GET_CAMERA_TYPE:#if defined(_EXT_HDDVR)cam_model = JDK_vin_get_video_type(cmd.camera_info.nChn);while(*cam_model && !(*cam_model == '-') && !(*cam_model == '\0') && i<10){cmd.camera_info.info.vinType[i++] = *cam_model;cam_model++;}cmd.camera_info.info.vinType[i] = '\0';cam_model++;i = 0;if(strcmp("SD", cmd.camera_info.info.vinType) == 0){while(*cam_model && (*cam_model != '\0') && i<10){cmd.camera_info.info.vinFramerate[i++] = *cam_model;cam_model++;}cmd.camera_info.info.vinFramerate[i] = '\0';if(strcmp("PAL", cmd.camera_info.info.vinFramerate) == 0){strcpy(cmd.camera_info.info.vinResolution, "704x576");strcpy(cmd.camera_info.info.vinFramerate, "25FPS");}else if(strcmp("NTSC", cmd.camera_info.info.vinFramerate) == 0){strcpy(cmd.camera_info.info.vinResolution, "704x480");strcpy(cmd.camera_info.info.vinFramerate, "30FPS");}}else if((strcmp("TVI", cmd.camera_info.info.vinType) == 0) || (strcmp("AHD", cmd.camera_info.info.vinType) == 0)){while(*cam_model && (*cam_model != '@') && (*cam_model != '\0') && i<10){cmd.camera_info.info.vinResolution[i++] = *cam_model;cam_model++;}cmd.camera_info.info.vinResolution[i] = '\0';cam_model++;i = 0;while(*cam_model && (*cam_model != '\0') && i<10){cmd.camera_info.info.vinFramerate[i++] = *cam_model;cam_model++;}cmd.camera_info.info.vinFramerate[i] = '\0';}else if((strcmp("UNKNOWN", cmd.camera_info.info.vinType) == 0)) {<span style="white-space:pre"></span>strcpy( cmd.camera_info.info.vinResolution, "UNKNOWN");<span style="white-space:pre"></span>strcpy( cmd.camera_info.info.vinFramerate, "UNKNOWN");<span style="white-space:pre"></span>}#else#endifcmd.type = CMD_GET_CAMERA_TYPE_ACK;SEND_DVRCMD_ACK(cmd, _socket_index);break;
static void proc_juan_getcameratype(UniStructNode* root_in, UniStructNode* root_out){UniStructNodesList* tmp_nodes_in;UniStructNode* tmp_node_in;UniStructNode* tmp_node_out;UniStructAttr* tmp_attr_in;//UniStructAttr* tmp_attr_out;tmp_nodes_in = UniStruct_find_children(root_in, "cameratype");if(tmp_nodes_in != NULL){int i;for(i = 0; i < tmp_nodes_in->count; i++){tmp_node_in = tmp_nodes_in->nodes[i];tmp_node_out = UniStruct_append_child(root_out, "cameratype", "");UniStruct_append_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_NO_ERROR));char* usr = NULL;char* pwd = NULL;CHK_USR_PWD(JUAN_ERRNO_USR_OR_PWD_ERROR);#define PTZCTRL_PROC_START(key) \{ \tmp_attr_in = UniStruct_find_attr(tmp_node_in, key); \if(tmp_attr_in != NULL) \{ \#define PTZCTRL_PROC_END(key) \UniStruct_append_attr(tmp_node_out, key, tmp_attr_in->value); \} \}int chn = -1;int param = -1;PTZCTRL_PROC_START("chn");chn = _convert_from_string(tmp_attr_in->value);PTZCTRL_PROC_END("chn");PTZCTRL_PROC_START("param");param = _convert_from_string(tmp_attr_in->value);PTZCTRL_PROC_END("param");if(chn == -1 || param == -1){UniStruct_modify_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_PARAM_ERROR));continue;}///////////////////////DVRCommand_t dvr_cmd;memset(&dvr_cmd, 0, sizeof(DVRCommand_t));dvr_cmd.flag = DVR_CMD_FLAG;dvr_cmd.type = CMD_GET_CAMERA_TYPE;dvr_cmd.camera_info.nChn = chn;dvr_cmd.camera_info.u8Val = param;SEND_CMD_TO_APP(dvr_cmd, SEND_CMD_TO_APP_TIMEOUT);if(dvr_cmd.type != CMD_GET_CAMERA_TYPE_ACK){UniStruct_modify_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_APP_RESPONSE_ERROR));continue;}else{char camera_content[128];sprintf(camera_content, "%s", dvr_cmd.camera_info.info.vinType);UniStruct_append_child(tmp_node_out, "vinType", camera_content);sprintf(camera_content, "%s", dvr_cmd.camera_info.info.vinResolution);UniStruct_append_child(tmp_node_out, "vinResolution", camera_content);sprintf(camera_content, "%s", dvr_cmd.camera_info.info.vinFramerate);UniStruct_append_child(tmp_node_out, "vinFramerate", camera_content);}}UniStruct_free_nodes_list(tmp_nodes_in);tmp_nodes_in = NULL;}}
四、获取通道编码能力集
static unsigned int _enc_format_to_pixel(unsigned int format){unsigned int ret = 0;switch (format) {case ENC_FMT_QCIF:ret = 176*144;break;case ENC_FMT_CIF:ret = 352*288;break;case ENC_FMT_HD1:ret = 352 * 576;break;case ENC_FMT_D1:ret = 704*576;break;case ENC_FMT_WCIF:ret = 480*288;break;case ENC_FMT_960H:ret = 960*576;break;case ENC_FMT_HD720P:ret = 1280*720;break;case ENC_FMT_HD1080P_HALF:ret = 960*1080;break;case ENC_FMT_HD1080P:ret = 1920*1080;break;default:ret = 0;break;}//printf("format %u -> pixels:%u\n", format, ret);return ret;}static unsigned int _enc_fps_from_enc_format(unsigned int fmt, int streamIndex){int ret = 0;unsigned int pixels = _enc_format_to_pixel(fmt);if (pixels == 0) {return 0;}if (streamIndex == 0) {ret = (MAX_BNC_1ST_RESOL*MAX_BNC_1ST_FPS) /pixels;}else{ret = MAX_BNC_2ST_FPS;}return ret;}static unsigned int _enc_bps_from_enc_format(unsigned int fmt){unsigned int ret = 0;switch (fmt) {case ENC_FMT_QCIF:ret = ENC_BR_64KPS;break;case ENC_FMT_CIF:ret = ENC_BR_256KPS;break;case ENC_FMT_HD1:ret = ENC_BR_512KPS;break;case ENC_FMT_D1:ret = ENC_BR_512KPS;break;case ENC_FMT_WCIF:ret = ENC_BR_384KPS;break;case ENC_FMT_960H:ret = ENC_BR_768KPS;break;case ENC_FMT_HD720P:ret = ENC_BR_2MPS;break;case ENC_FMT_HD1080P_HALF:ret = ENC_BR_2MPS;break;case ENC_FMT_HD1080P:ret = ENC_BR_3MPS;break;default:ret = 0;break;}//printf("format %u -> bps:%u\n", format, ret);return ret;}
2、在app2cgi_communication.c中添加命令类型CMD_GET_CHN_ENCODE:
case CMD_GET_CHN_ENCODE:cmd.chn_encode.Bit_rate[encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_QCIF)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_QCIF, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_QCIF, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_CIF)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_CIF, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_CIF, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_HD1)];cmd.chn_encode.Frame_rate[encode_index] =_enc_fps_from_enc_format(ENC_FMT_HD1, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_HD1, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_D1)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_D1, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_D1, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_WCIF)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_WCIF, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_WCIF, 0):25;MaxSupport = JDK_vin_get_max_support();switch(MaxSupport){case 0:cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_960H)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_960H, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_960H, 0):25;break;case 1:cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_960H)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_960H, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_960H, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_HD720P)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_HD720P, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_HD720P, 0):25;break;case 2:#ifdef _EXT_HDDVR_LITEcmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_960H)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_960H, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_960H, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_HD720P)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_HD720P, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_HD720P, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_HD1080P_HALF)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_HD1080P_HALF, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_HD1080P_HALF, 0):25;#elsecmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_960H)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_960H, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_960H, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_HD720P)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_HD720P, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_HD720P, 0):25;cmd.chn_encode.Bit_rate[++encode_index] = ENC_BR_VALUE_STRING1[_enc_bps_from_enc_format(ENC_FMT_HD1080P)];cmd.chn_encode.Frame_rate[encode_index] = _enc_fps_from_enc_format(ENC_FMT_HD1080P, 0) < 25? _enc_fps_from_enc_format(ENC_FMT_HD1080P, 0):25;#endifbreak;default:break;}cmd.type = CMD_GET_CHN_ENCODE_ACK;SEND_DVRCMD_ACK(cmd, _socket_index);break;
static void proc_juan_getchnencode(UniStructNode* root_in, UniStructNode* root_out){UniStructNodesList* tmp_nodes_in;UniStructNode* tmp_node_in;UniStructNode* tmp_node_out;UniStructAttr* tmp_attr_in;//UniStructAttr* tmp_attr_out;int i;tmp_nodes_in = UniStruct_find_children(root_in, "chnencode");if(tmp_nodes_in != NULL){for(i = 0; i < tmp_nodes_in->count; i++){tmp_node_in = tmp_nodes_in->nodes[i];tmp_node_out = UniStruct_append_child(root_out, "chnencode", "");UniStruct_append_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_NO_ERROR));char* usr = NULL;char* pwd = NULL;CHK_USR_PWD(JUAN_ERRNO_USR_OR_PWD_ERROR);#define PTZCTRL_PROC_START(key) \{ \tmp_attr_in = UniStruct_find_attr(tmp_node_in, key); \if(tmp_attr_in != NULL) \{ \#define PTZCTRL_PROC_END(key) \UniStruct_append_attr(tmp_node_out, key, tmp_attr_in->value); \} \}int chn = -1;int param = -1;PTZCTRL_PROC_START("chn");chn = _convert_from_string(tmp_attr_in->value);PTZCTRL_PROC_END("chn");PTZCTRL_PROC_START("param");param = _convert_from_string(tmp_attr_in->value);PTZCTRL_PROC_END("param");if(chn == -1 || param == -1){UniStruct_modify_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_PARAM_ERROR));continue;}///////////////////////DVRCommand_t dvr_cmd;memset(&dvr_cmd, 0, sizeof(DVRCommand_t));dvr_cmd.flag = DVR_CMD_FLAG;dvr_cmd.type = CMD_GET_CHN_ENCODE;dvr_cmd.chn_encode.nChn = chn;dvr_cmd.chn_encode.u8Val = param;SEND_CMD_TO_APP(dvr_cmd, SEND_CMD_TO_APP_TIMEOUT);char *encode_format[10] = {"QCIF", "CIF", "HD1", "D1", "WCIF", "960H" ,"720P", "1080P-H", "1080P"};if(dvr_cmd.type != CMD_GET_CHN_ENCODE_ACK){UniStruct_modify_attr(tmp_node_out, "errno", _convert_from_enum(JUAN_ERRNO_APP_RESPONSE_ERROR));continue;}else{char encode_content[128];i = 0;while(dvr_cmd.chn_encode.Bit_rate[i] != NULL){sprintf(encode_content, "<BitRate>%s<BitRate><FrameRate>%d<FrameRate>\n", dvr_cmd.chn_encode.Bit_rate[i], dvr_cmd.chn_encode.Frame_rate[i]);UniStruct_append_child(tmp_node_out, encode_format[i], encode_content);i++;} }}UniStruct_free_nodes_list(tmp_nodes_in);tmp_nodes_in = NULL;}}
- 在DVR中增加系统模式CGI接口
- 在DVR中增加UTC-CGI接口
- Linux系统在嵌入式DVR中的应用
- 关于Linux系统在嵌入式DVR中的应用
- 如何在QNX系统中增加字体
- 龙芯 DVR系统解决方案
- 在apache中部署cgi
- php在apache中一共有三种工作方式:CGI模式、FastCGI模式、Apache 模块DLL
- php在apache中一共有三种工作方式:CGI模式、FastCGI模式、Apache 模块DLL
- 从头认识设计模式-策略模式-03-思考过程二:在每一个类里面单独增加方法或者增加接口
- 在驱动中添加syfs系统接口
- phpweb 怎样在系统中增加自定义功能页
- vmwarefedora:在VMware中FedoraLinux8系统增加硬盘
- 在系统中增加一个可唤醒中断--简单实例
- 在Linux系统中增加IP地址网段
- 如何在android系统中增加编译自定义模块
- 在linux 4.x内核中增加系统调用
- 在系统中增加一个可唤醒中断--简单实例
- 01相等的字串。
- MessageFormat用法
- Java并发和多线程4:使用通用同步工具CountDownLatch实现线程等待
- LR的web_url、web_custom_request、web_submit_data、web_submit_form应用实例
- NSArray 读写文件
- 在DVR中增加系统模式CGI接口
- 网络获取数据如何显示到cell上
- 裸辞太久,要这样谈出满意的薪水!
- Eclipse启动遇到Error when loading the SDK
- Linux配置
- mybatis 调用存储过程 返回游标 实例
- MyEclipse10.0 采用插件方式安装 SVN
- 4412 裸板程序led2
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)