dn

本文深入探讨Hadoop分布式文件系统中的关键组件,包括DataTransferProtocol接口的readBlock和writeBlock方法,用于实现数据块的读写操作;Sender和Receiver类负责数据传输过程,而DataXceiver和BlockReceiver则在数据传输中扮演重要角色。文章详细介绍了这些组件的工作原理和技术细节。

在这里插入图片描述
在这里插入图片描述
1.接口

1.DataTransferProtocol

  • readBlock :从dn读块
  • writeBlock:将dn块写入管道pipeline
  • blockChekcum:获得指定块的校验值

2.Sender和Receiver

  • class DataXceiver extends Receiver implements Runnable
  • public abstract class Receiver implements DataTransferProtocol
  • public class Sender implements DataTransferProtocol

3.DataXceiver
4.BlockReceiver


LOCAL S32 dn_switch_new_data_cb() { DN_SWITCH_CONTEXT *context = &g_dn_switch_context; DN_PARAM *dn_switch_param =&g_dn_switch_context.dn_switch_param; DN_CONFIG *dn_config = &context->dn_config; DN_LOCK *dn_lock =&context->dn_lock; IMAGE_TYPE image_type = {0}; const char *lamp[2] = {“IR”, “WTL”}; const char *dnstatus[2] = {“NIGHT”, “DAY”}; const char *op[2] = {“<”, “>”}; const char *dn[2] = {“d2n”, “n2d”}; int thres[2] = {0}; DN_PARAM *dn_param = &g_dn_switch_context.dn_switch_param; IMAGE_MPP_CMD_MSG msg = {0}; DAY_NIGHT dn_params_day = {{0}}; msg.cmd_type = IMAGE_MPP_CMD_SWITCH_DN; if(INVALID_PARAM == dn_param->dn_switch_version) { CAP_ERROR(" Please set dn_switch_version"); return ERROR; } if (!(0 == pthread_mutex_trylock(&(context->mutex)))) { DN_SWITCH_ERROR("lock is used"); return ERROR; } thres[0] = dn_config->thres.day2night_thres; thres[1] = dn_config->thres.night2day_thres; #ifdef HDR_MODE_SUPPORT if(g_avts_hdr_status == 1) { thres[0] = dn_config->thres.hdr_day2night_thres; thres[1] = dn_config->thres.hdr_night2day_thres; } #endif if (DN_NO_NEW_INPUT == context->input_data.new_data) { /* 无新数据立刻退出 */ pthread_mutex_unlock(&(context->mutex)); return OK; } /* 补光灯不是auto时,锁定状态解除,process继续执行,避免影响恢复自动后的切换速度 */ if (USE_WL_METHOD == dn_switch_param->dn_switch_version || USE_IR_WL_METHOD == dn_switch_param->dn_switch_version) { if (!(LIGHT_AUTO == dn_config->common_inf_type && LIGHT_AUTO == dn_config->common_wtl_type)) { dn_lock->is_lock=0; dn_lock->ir_cut_switch_times=0; dn_lock->locker=0; } } else { if (!(LIGHT_AUTO == dn_config->common_inf_type)) { dn_lock->is_lock=0; dn_lock->ir_cut_switch_times=0; dn_lock->locker=0; } } DN_SWITCH_DEBUG("is_lock:%d,locker:%d,ir_cut_switch_times:%d\n",dn_lock->is_lock,dn_lock->locker,dn_lock->ir_cut_switch_times); if (USE_IR_METHOD == dn_switch_param->dn_switch_version) { if (ERROR == dn_switch_process_ir(context)) { pthread_mutex_unlock(&(context->mutex)); return ERROR; } } else if(USE_IR_WL_METHOD == dn_switch_param->dn_switch_version) { if (DN_LAMP_IR == context->dn_config.lamp_type) { dn_switch_process_wl(context); if (ERROR == dn_switch_process_ir(context)) { pthread_mutex_unlock(&(context->mutex)); return ERROR; } } else { if (ERROR == dn_switch_process_wl(context)) { pthread_mutex_unlock(&(context->mutex)); return ERROR; } } } else { if (ERROR == dn_switch_process_wl(context)) { pthread_mutex_unlock(&(context->mutex)); return ERROR; } } if (USE_IR_METHOD == dn_switch_param->dn_switch_version) { context->dn_result = context->dn_result_ir; } else if (USE_IR_WL_METHOD == dn_switch_param->dn_switch_version && DN_LAMP_IR == context->dn_config.lamp_type) { context->dn_result = context->dn_result_ir; } else { context->dn_result = context->dn_result_wl; } /* 只有在当前处于白天的情况下,且可进行日夜切换时才需要发送进入/退出日夜切换流程的信号 */ if (DN_STATUS_DAY == context->dn_attr.dn_status && ((SWITCH_MODE_AUTO_SWITCH == dn_config->switch_mode) || (SWITCH_MODE_COMMON == dn_config->switch_mode && LIGHT_AUTO == dn_config->common_inf_type))) { /* 开始进入日夜切换流程的判断条件:是否进入的标志位为0,且亮度低于日切夜阈值 */ if ((context->dn_result.illumin <= thres[0]) && (0 == context->dn_switch_param_result->start_flag)) { context->dn_switch_param_result->delaytime = context->dn_config.delay_time; context->dn_switch_param_result->start_flag = 1; CAP_SEND(AMS_VQI_DN_SWITCH_PARAM, (U8 *)context->dn_switch_param_result, sizeof(DN_SWITCH_PARAM_RESULT)); } /* 开始退出日夜切换流程的判断条件:是否进入的标志位为1,且亮度大于日切夜阈值 */ else if ((context->dn_result.illumin > thres[0]) && (1 == context->dn_switch_param_result->start_flag)) { context->dn_switch_param_result->delaytime = context->dn_config.delay_time; context->dn_switch_param_result->start_flag = 0; CAP_SEND(AMS_VQI_DN_SWITCH_PARAM, (U8 *)context->dn_switch_param_result, sizeof(DN_SWITCH_PARAM_RESULT)); } } else { context->dn_switch_param_result->start_flag = 0; } context->input_data.new_data = DN_NO_NEW_INPUT; /* 只有当灯都为auto时算法才可以进入切换逻辑 */ if (USE_WL_METHOD == dn_switch_param->dn_switch_version || USE_IR_WL_METHOD == dn_switch_param->dn_switch_version) { if (!(LIGHT_AUTO == dn_config->common_inf_type && LIGHT_AUTO == dn_config->common_wtl_type)) { pthread_mutex_unlock(&(context->mutex)); return OK; } } else { if (!(LIGHT_AUTO == dn_config->common_inf_type)) { pthread_mutex_unlock(&(context->mutex)); return OK; } } if (context->is_switch2day_recently != 0) { context->is_switch2day_recently--; } if (dn_lock->is_lock > 0) { (dn_lock->is_lock)--; pthread_mutex_unlock(&(context->mutex)); return OK; } if (SWITCH_MODE_AUTO_SWITCH == dn_config->switch_mode) { if(0 == ds_read(IMAGE_TYPE_STATUS_PATH, &image_type, sizeof(IMAGE_TYPE))) { DN_SWITCH_ERROR("read IMAGE_TYPE_STATUS_PATH failed"); pthread_mutex_unlock(&(context->mutex)); return ERROR; } DN_SWITCH_DEBUG("In new-data-cb,Auto-switch-mode,algorithm status:%d,image_type:%d",context->dn_result.dn_status,image_type); if (DN_STATUS_DAY == context->dn_result.dn_status) { switch(image_type) { case IMAGE_TYPE_NIGHT: case IMAGE_TYPE_AUTO_NIGHT: case IMAGE_TYPE_AUTO_NIGHT_BACK_LIGHT: case IMAGE_TYPE_AUTO_NIGHT_PORTRAIT: case IMAGE_TYPE_AUTO_NIGHT_CLEAR_LICENCE: case IMAGE_TYPE_AUTO_NIGHT_SQUARE: { msg.is_day = DN_STATUS_DAY; /* IMAGE_MPP_CMD_MSG_ID消息不会重载配置,而auto模式的配置需要切换,因此auto模式改用AMS_VQI_DNSWITCH_RELOAD消息 */ // CAP_SEND(IMAGE_MPP_CMD_MSG_ID, (U8*)&msg, sizeof(msg)); CAP_SEND(AMS_VQI_DNSWITCH_RELOAD, NULL, 0); CAP_DEBUG("Switch to %s %s (%d %s %s[%d]_ %d)", dnstatus[context->dn_result.dn_status], lamp[context->dn_config.lamp_type], context->dn_result.illumin, op[context->dn_result.dn_status], dn[context->dn_result.dn_status], context->dn_config.sensitivity, thres[context->dn_result.dn_status]); DN_SWITCH_DEBUG("Auto-switch-mode, day-night status is set to %d",context->dn_result.dn_status); if (DN_LAMP_IR == context->dn_config.lamp_type && context->dn_result.illumin < SMOOTH_SWITCH_THRE * thres[1]) { context->is_switch2day_recently = RECENT_SWITCH_COUNT + STEADY_PROCESS_DELAY + (dn_config->delay_time)*2; } dn_lock->locker += (dn_config->delay_time)*2 + IR_SWITCHING_DELAY;/* 切换一次,累计累加10秒,现500ms跑一次日夜切换 */ dn_lock->ir_cut_switch_times++; break; } default: break; } } else { switch(image_type) { case IMAGE_TYPE_DAY: case IMAGE_TYPE_AUTO_DAY: case IMAGE_TYPE_AUTO_DAY_BACK_LIGHT: { msg.is_day = DN_STATUS_NIGHT; /* IMAGE_MPP_CMD_MSG_ID消息不会重载配置,而auto模式的配置需要切换,因此auto模式改用AMS_VQI_DNSWITCH_RELOAD消息 */ // CAP_SEND(IMAGE_MPP_CMD_MSG_ID, (U8*)&msg, sizeof(msg)); CAP_SEND(AMS_VQI_DNSWITCH_RELOAD, NULL, 0); if (DN_LAMP_IR == context->dn_config.lamp_type && context->is_switch2day_recently) { g_inf_sens_lv_ext = g_inf_sens_lv_ext + 1 < INF_SENSITIVITY_MAX ? g_inf_sens_lv_ext + 1 : INF_SENSITIVITY_MAX; } CAP_DEBUG("Switch to %s %s (%d %s %s[%d]_ %d)", dnstatus[context->dn_result.dn_status], lamp[context->dn_config.lamp_type], context->dn_result.illumin, op[context->dn_result.dn_status], dn[context->dn_result.dn_status],context->dn_config.sensitivity, thres[context->dn_result.dn_status]); DN_SWITCH_DEBUG("Auto-switch-mode, day-night status is set to %d",context->dn_result.dn_status); dn_lock->locker += (dn_config->delay_time)*2 + IR_SWITCHING_DELAY;/* 切换一次,累计累加10秒,现500ms跑一次日夜切换 */ dn_lock->ir_cut_switch_times++; break; } default: break; } } } else if ((context->dn_result.dn_status != context->dn_attr.dn_status) && (PD_NO_PERSON == context->dn_attr.has_person)) { /* 当日夜状态发生变化,且时common,inf=auto模式,且不处于锁定状态, 且没有检测到人形/人脸时 */ msg.is_day = context->dn_result.dn_status; /* common模式只有一套配置,不需要重载,因从还是使用IMAGE_MPP_CMD_MSG_ID消息 */ CAP_SEND(IMAGE_MPP_CMD_MSG_ID, (U8*)&msg, sizeof(msg)); // CAP_SEND(AMS_VQI_DNSWITCH_RELOAD, NULL, 0); if (DN_LAMP_IR == context->dn_config.lamp_type && context->dn_result.dn_status == DN_STATUS_DAY && context->dn_result.illumin < SMOOTH_SWITCH_THRE * thres[1]) { context->is_switch2day_recently = RECENT_SWITCH_COUNT + STEADY_PROCESS_DELAY + (dn_config->delay_time)*2; } if (DN_LAMP_IR == context->dn_config.lamp_type && context->is_switch2day_recently && context->dn_result.dn_status == DN_STATUS_NIGHT) { g_inf_sens_lv_ext = g_inf_sens_lv_ext + 1 < INF_SENSITIVITY_MAX ? g_inf_sens_lv_ext + 1 : INF_SENSITIVITY_MAX; if (0 == ds_read(DAY_PATH, &dn_params_day, sizeof(DAY_NIGHT))) { DN_SWITCH_ERROR("read error when load ir thresh"); } int tmp_ir_lv = dn_config->sensitivity - g_inf_sens_lv_ext > INF_SENSITIVITY_0 ? dn_config->sensitivity - g_inf_sens_lv_ext : INF_SENSITIVITY_0; dn_config->thres.night2day_thres = dn_params_day.irt_comm[tmp_ir_lv]; #ifdef HDR_MODE_SUPPORT if(dn_params_day.hdr_irt_comm[0] != 0) { dn_config->thres.hdr_night2day_thres = dn_params_day.hdr_irt_comm[tmp_ir_lv]; } else { dn_config->thres.hdr_night2day_thres = dn_params_day.irt_comm[tmp_ir_lv]; } #endif } CAP_ERROR("Switch to %s %s (%d %s %s[%d]_ %d)", dnstatus[context->dn_result.dn_status], lamp[context->dn_config.lamp_type], context->dn_result.illumin, op[context->dn_result.dn_status], dn[context->dn_result.dn_status], context->dn_config.sensitivity, thres[context->dn_result.dn_status]); DN_SWITCH_DEBUG("In dn_switch_new_data_cb, dn_switch setting is OK. "); dn_lock->locker += (dn_config->delay_time)*2 + IR_SWITCHING_DELAY;/* 切换一次,累计累加10秒,现500ms跑一次日夜切换 */ dn_lock->ir_cut_switch_times++; } if (dn_lock->locker >= (dn_config->delay_time)*2 + IR_SWITCHING_TIMES * 2 * IR_SWITCHING_DELAY) //k = ceil(5 / (1 - average_gap_between_switch / 10)) { dn_lock->locker = 0; dn_lock->is_lock = AUTO_IR_UNLOCK_TIME; dn_lock->ir_cut_switch_times = 0; /* 当日夜切换满足条件进入死锁状态, 固定设置为夜晚模式即锁定为红外灯开启状态 */ if (SWITCH_MODE_AUTO_SWITCH == dn_config->switch_mode) { CAP_SEND(AMS_VQI_DNSWITCH_RELOAD, NULL, 0); } else { msg.is_day = DN_STATUS_NIGHT; context->dn_result.dn_status = DN_STATUS_NIGHT; CAP_SEND(IMAGE_MPP_CMD_MSG_ID, (U8*)&msg, sizeof(msg)); } DN_SWITCH_ERROR("In dn_switch_new_data_cb, locker is too large, force to night mode. "); } else if (dn_lock->locker > 0) { dn_lock->locker--; if (dn_lock->ir_cut_switch_times >= (IR_SWITCHING_TIMES * 2)) { dn_lock->locker = 0; dn_lock->is_lock = AUTO_IR_UNLOCK_TIME; dn_lock->ir_cut_switch_times = 0; msg.is_day = DN_STATUS_NIGHT; CAP_SEND(IMAGE_MPP_CMD_MSG_ID, (U8*)&msg, sizeof(msg)); DN_SWITCH_ERROR("In dn_switch_new_data_cb,too much ir_cut_time,force to night mode. "); } } else if (dn_lock->locker == 0) { dn_lock->ir_cut_switch_times = 0; } pthread_mutex_unlock(&(context->mutex)); return OK; } 一直输出dn_switch_new_data_cb():157 - [DN_SWITCH]lock is used 对应的代码在这儿 if (!(0 == pthread_mutex_trylock(&(context->mutex)))) { DN_SWITCH_ERROR("lock is used"); return ERROR; }
09-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值