td_s32 ret; ot_vpss_grp_attr grp_attr = { 0 }; ot_vpss_chn_attr chn_attr[OT_VPSS_MAX_PHYS_CHN_NUM] = { 0 }; td_bool chn_enable[OT_VPSS_MAX_PHYS_CHN_NUM] = { 0 }; if (vpss_chn >= OT_VPSS_MAX_PHYS_CHN_NUM) { sample_print("vpss_chn:%d invalid!\n", vpss_chn); return TD_FAILURE; } grp_attr.nr_en = TD_TRUE; grp_attr.ie_en = TD_TRUE; grp_attr.dci_en = TD_TRUE; grp_attr.nr_attr.compress_mode = OT_COMPRESS_MODE_FRAME; grp_attr.dei_mode = OT_VPSS_DEI_MODE_OFF; grp_attr.pixel_format = SAMPLE_PIXEL_FORMAT; grp_attr.frame_rate.src_frame_rate = -1; grp_attr.frame_rate.dst_frame_rate = -1; grp_attr.max_width = size->width; grp_attr.max_height = size->height; chn_enable[vpss_chn] = TD_TRUE; chn_attr[vpss_chn].chn_mode = OT_VPSS_CHN_MODE_AUTO; chn_attr[vpss_chn].width = size->width; chn_attr[vpss_chn].height = size->height; chn_attr[vpss_chn].pixel_format = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420; chn_attr[vpss_chn].frame_rate.src_frame_rate = -1; chn_attr[vpss_chn].frame_rate.dst_frame_rate = -1; chn_attr[vpss_chn].border_en = TD_TRUE; chn_attr[vpss_chn].border_attr.color = COLOR_RGB_BLUE; chn_attr[vpss_chn].border_attr.top_width = 2; /* 2 : border top width */ chn_attr[vpss_chn].border_attr.bottom_width = 2; /* 2 : border bottom width */ chn_attr[vpss_chn].border_attr.left_width = 2; /* 2 : border left width */ chn_attr[vpss_chn].border_attr.right_width = 2; /* 2 : border right width */ ret = sample_common_vpss_start(vpss_grp, chn_enable, &grp_attr, chn_attr, OT_VPSS_MAX_PHYS_CHN_NUM); if (ret != TD_SUCCESS) { sample_print("failed with %#x!\n", ret); return TD_FAILURE; } return TD_SUCCESS;
时间: 2023-06-20 22:08:49 浏览: 160
这段代码是关于视频处理的,主要是配置了一个 VPSS 组和一个 VPSS 通道。VPSS(Video Processing Subsystem)是专门用于视频处理的子系统,可以对视频进行降噪、锐化、缩放、颜色调整等操作。这里的代码中,首先判断了要配置的 VPSS 通道是否有效,然后设置了 VPSS 组和通道的属性,包括使能 NR(Noise Reduction)和 IE(Image Enhancement)等功能,压缩模式为帧压缩,DEI(Dynamic Edge Interpolation)模式为关闭,像素格式为 SAMPLE_PIXEL_FORMAT,帧率为 -1 不限制帧率,宽高为传入参数 size 的宽高,最后设置了边框的颜色和宽度,并启动了 VPSS 组和通道。
相关问题
td_s32 sample_audio_ai_hdmi_ao(td_void) { td_s32 ret; td_u32 ai_chn_cnt; td_u32 ao_chn_cnt; ot_audio_dev ai_dev; ot_audio_dev ao_dev = SAMPLE_AUDIO_INNER_HDMI_AO_DEV; ot_aio_attr aio_attr = {0}; ot_aio_attr hdmi_ao_attr = {0}; sample_comm_ai_vqe_param ai_vqe_param = {0}; sample_audio_ai_hdmi_ao_init_param(&aio_attr, &ai_dev, &hdmi_ao_attr); /* enable AI channel */ ai_chn_cnt = aio_attr.chn_cnt; aio_attr.work_mode = OT_AIO_MODE_I2S_MASTER; sample_audio_set_ai_vqe_param(&ai_vqe_param, OT_AUDIO_SAMPLE_RATE_BUTT, TD_FALSE, TD_NULL, 0); ret = sample_comm_audio_start_ai(ai_dev, ai_chn_cnt, &aio_attr, &ai_vqe_param, -1); if (ret != TD_SUCCESS) { sample_dbg(ret); goto hdmi_err2; } /* enable AO channel */ ao_chn_cnt = hdmi_ao_attr.chn_cnt; ret = sample_comm_audio_start_ao(ao_dev, ao_chn_cnt, &hdmi_ao_attr, g_in_sample_rate, g_aio_resample); if (ret != TD_SUCCESS) { sample_dbg(ret); goto hdmi_err1; } /* config audio codec */ ret =sample_es8388_cfg_audio(aio_attr.work_mode, aio_attr.sample_rate, aio_attr.chn_cnt); if (ret != TD_SUCCESS) { sample_dbg(ret); goto hdmi_err0; } /* AI to AO channel */ ret = sample_audio_ao_bind_ai_multi_chn(ai_dev, ai_chn_cnt, ao_dev); if (ret != TD_SUCCESS) { goto hdmi_err0; } printf("\nplease press twice ENTER to exit this sample\n"); smaple_audio_getchar(); smaple_audio_getchar(); sample_audio_ao_unbind_ai_multi_chn(ai_dev, ai_chn_cnt); hdmi_err0: ret = sample_comm_audio_stop_ao(ao_dev, hdmi_ao_attr.chn_cnt, TD_FALSE); if (ret != TD_SUCCESS) { sample_dbg(ret); } hdmi_err1: ret = sample_comm_audio_stop_ai(ai_dev, ai_chn_cnt, TD_FALSE, TD_FALSE); if (ret != TD_SUCCESS) { sample_dbg(ret); } hdmi_err2: return ret;详细解析
这段代码是一个音频采集和播放的示例程序,主要功能是将音频数据从HDMI输入通道采集,并经过ES8388音频编解码器后输出到HDMI输出通道。
具体解析如下:
1. 初始化音频设备的参数,包括音频输入通道(ai_dev)、音频输出通道(ao_dev)、音频输入通道的属性(aio_attr)和音频输出通道的属性(hdmi_ao_attr)等。
2. 启动音频输入通道(AI通道)和音频输出通道(AO通道),其中,启动AI通道时设置了音频前处理算法的参数(ai_vqe_param),启动AO通道时设置了输出采样率(g_in_sample_rate)和重采样(g_aio_resample)等参数。
3. 配置ES8388音频编解码器的参数,包括工作模式、采样率和通道数等,以使其能够正确地编解码音频数据。
4. 绑定AI通道和AO通道,使得从AI通道采集到的音频数据可以经过ES8388编解码器后输出到AO通道。
5. 等待用户输入,当用户按下两次回车键时,解除AI通道和AO通道的绑定,停止音频输入通道和音频输出通道的采集和播放,并退出程序。
总之,这段代码通过调用音频采集和播放相关的API函数,实现了音频的采集和播放功能,并通过ES8388音频编解码器对音频数据进行编解码,使得输出的音频数据具有更好的音质和兼容性。
ACIGA_S32 aciga_module_uart_recv_pro( ACIGA_VOID *_parg ) { ACIGA_RETURN( NULL == _parg, -1, "NULL == _parg" ); ACIGA_S32 _s32ret = 0; T_IO_MSG *_pstuart_msg = (T_IO_MSG *)_parg; if( IO_MSG_TYPE_UART == _pstuart_msg->type) { app_uart_parse(); } // if( IO_MSG_TYPE_UART == _pstuart_msg->type && NULL != _pstuart_msg->u.buf ) // { // uart0_msg_t *_pstuart0_msg = (uart0_msg_t *)_pstuart_msg->u.buf; // if( UART0_PROTOCOL_VERSION == _pstuart0_msg->u16version ) // { // _s32ret = aciga_device_msg_dispatcher( _pstuart0_msg->u16action_id, _pstuart0_msg->au8payload, _pstuart0_msg->u16length ); // } // else // { // ACIGA_LOGE( "u16version=%04x error", _pstuart0_msg->u16version ); // } // free( _pstuart_msg->u.buf ); // } return _s32ret; }
这段代码定义了一个名为 `aciga_module_uart_recv_pro` 的函数,它的返回值是 `ACIGA_S32` 类型。函数的参数 `_parg` 是一个指向 `T_IO_MSG` 结构体的指针。函数内部首先判断 `_parg` 是否为 `NULL`,如果是则返回错误码 `-1`。然后,函数将 `_parg` 强制转换为指向 `T_IO_MSG` 结构体的指针 `_pstuart_msg`。接着,函数检查 `_pstuart_msg` 中的消息类型是否为 `IO_MSG_TYPE_UART`,如果是,则调用 `app_uart_parse()` 函数进行解析。最后,函数返回变量 `_s32ret` 的值,表示函数执行是否成功。
需要注意的是,代码中有一段被注释掉的代码块。这段代码可能是用于解析 UART0 协议消息并调用 `aciga_device_msg_dispatcher` 函数进行消息处理的,但由于被注释掉了,所以无法确定其具体实现。
阅读全文
相关推荐











