// 复现代码续楼上...
static void deinit_venc(int chn_id)
{
if (chn_id < 0 || chn_id > 2)
return;
int* channel_state = NULL;
if (chn_id == 0)
channel_state = &g_device_state.venc_ch0_inited;
else if (chn_id == 1)
channel_state = &g_device_state.venc_ch1_inited;
else
channel_state = &g_device_state.venc_ch2_inited;
if (*channel_state) {
kd_mpi_venc_stop_chn(chn_id);
kd_mpi_venc_destroy_chn(chn_id);
*channel_state = 0;
}
}
static int bind_vi_venc(int src_chn_id, int dst_chn_id)
{
if (src_chn_id != 0 || dst_chn_id < 0 || dst_chn_id > 2)
return -1;
k_mpp_chn src_chn = { .mod_id = K_ID_VI, .dev_id = 0, .chn_id = src_chn_id };
k_mpp_chn dst_chn = { .mod_id = K_ID_VENC, .dev_id = 0, .chn_id = dst_chn_id };
return kd_mpi_sys_bind(&src_chn, &dst_chn);
}
static int unbind_vi_venc(int src_chn_id, int dst_chn_id)
{
if (src_chn_id != 0 || dst_chn_id < 0 || dst_chn_id > 2)
return -1;
k_mpp_chn src_chn = { .mod_id = K_ID_VI, .dev_id = 0, .chn_id = src_chn_id };
k_mpp_chn dst_chn = { .mod_id = K_ID_VENC, .dev_id = 0, .chn_id = dst_chn_id };
return kd_mpi_sys_unbind(&src_chn, &dst_chn);
}
static void* venc_consumer_thread(void* arg)
{
venc_channel_t* ctrl = (venc_channel_t*)arg;
k_venc_chn_status status = { 0 };
k_venc_stream stream = { 0 };
k_venc_pack packs[12] = { 0 };
stream.pack = packs;
while (ctrl->running) {
if (pthread_mutex_trylock(&ctrl->lock) != 0) {
usleep(30000);
continue;
}
memset(&status, 0, sizeof(status));
if (kd_mpi_venc_query_status(ctrl->chn_id, &status) == 0) {
stream.pack_cnt = status.cur_packs > 0 ? status.cur_packs : 1;
memset(packs, 0, sizeof(packs));
if (kd_mpi_venc_get_stream(ctrl->chn_id, &stream, -1) == 0)
kd_mpi_venc_release_stream(ctrl->chn_id, &stream);
}
pthread_mutex_unlock(&ctrl->lock);
usleep(30000);
}
return NULL;
}
static int init_venc_channel_control()
{
for (int i = 0; i < 3; i++) {
g_venc_channels[i].chn_id = i;
g_venc_channels[i].running = 0;
if (pthread_mutex_init(&g_venc_channels[i].lock, NULL) != 0) {
for (int j = 0; j < i; j++)
pthread_mutex_destroy(&g_venc_channels[j].lock);
return -1;
}
}
return 0;
}
static void deinit_venc_channel_control()
{
for (int i = 0; i < 3; i++)
pthread_mutex_destroy(&g_venc_channels[i].lock);
}
static int start_venc_consumers()
{
for (int i = 0; i < 3; i++) {
g_venc_channels[i].running = 1;
if (pthread_create(&g_venc_channels[i].thread, NULL, venc_consumer_thread, &g_venc_channels[i]) != 0) {
for (int j = 0; j < i; j++) {
g_venc_channels[j].running = 0;
pthread_join(g_venc_channels[j].thread, NULL);
}
return -1;
}
}
return 0;
}
static void stop_venc_consumers()
{
for (int i = 0; i < 3; i++) {
if (g_venc_channels[i].running) {
g_venc_channels[i].running = 0;
pthread_join(g_venc_channels[i].thread, NULL);
}
}
}
int main(int argc, char* argv[])
{
if (init_vb() != 0 || init_ao() != 0 || init_vi() != 0) {
deinit_vi();
deinit_ao();
deinit_vb();
return -1;
}
for (int i = 0; i < 3; i++) {
if (init_venc(i) != 0) {
for (int j = 0; j < i; j++)
deinit_venc(j);
deinit_vi();
deinit_ao();
deinit_vb();
return -1;
}
}
for (int i = 0; i < 3; i++) {
if (bind_vi_venc(0, i) != 0) {
for (int j = 0; j < i; j++)
unbind_vi_venc(0, j);
for (int j = 0; j < 3; j++)
deinit_venc(j);
deinit_vi();
deinit_ao();
deinit_vb();
return -1;
}
}
if (init_venc_channel_control() != 0 || start_venc_consumers() != 0) {
deinit_venc_channel_control();
for (int i = 0; i < 3; i++) {
unbind_vi_venc(0, i);
deinit_venc(i);
}
deinit_vi();
deinit_ao();
deinit_vb();
return -1;
}
printf("系统已启动,AO噪音问题开始复现\n按回车键停止测试...\n");
getchar();
stop_venc_consumers();
deinit_venc_channel_control();
for (int i = 0; i < 3; i++) {
unbind_vi_venc(0, i);
deinit_venc(i);
}
deinit_vi();
deinit_ao();
deinit_vb();
return 0;
}