You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
7.0 KiB

/*
* Copyright (c) Technologies Co., Ltd. 2013-2019. All rights reserved.
* Description: vi test
* Author: sdk
* Create: 2020-11-02
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <linux/fb.h>
#include <assert.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include "soc_errno.h"
#include "securec.h"
#include "vi_st_common.h"
static const st_vi_setting g_vi_default_setting = {
.picture_mode = UAPI_VI_PICTURE_MODE_VIDEO,
.display_field = UAPI_VI_DISPLAY_FIELD_ALL,
.quantify_range = UAPI_VI_QUANTIZATION_RANGE_AUTO,
.nonstd_info.is_non_std = TD_FALSE,
.crop_rect = {0x0},
};
static const st_vi_timing g_vi_default_hdmi_timing = {
.hdr_type = UAPI_HDR_TYPE_SDR,
.video_3d_type = UAPI_FRAME_PACKING_TYPE_2D,
.pixel_format = UAPI_FORMAT_YUV_SEMIPLANAR_444_VU,
.color_description = {
.color_primary = UAPI_COLOR_PRIMARY_BT709,
.color_space = UAPI_COLOR_CS_YUV,
.quantify_range = UAPI_COLOR_LIMITED_RANGE,
.transfer_type = UAPI_COLOR_TRANSFER_TYPE_GAMMA_SDR,
.matrix_coef = UAPI_COLOR_MATRIX_COEFFS_BT709,
},
.color_sys = UAPI_COLOR_SYS_AUTO,
.bit_depth = UAPI_PIXEL_BIT_DEPTH_8BIT,
.over_sample = UAPI_OVERSAMPLE_1X,
.width = 1920,
.height = 1080,
.interlace = TD_FALSE,
.frame_rate = 60000,
.vblank = 0,
};
static const st_vi_frontend_param g_vi_default_hdmi_frontend_param = {
.source_type = UAPI_VIDEO_SOURCE_HDMI,
.port = VI_FRONTEND_PORT,
.frontend_bypass = TD_TRUE,
};
static const st_vi_backend_param g_vi_default_backend_param = {
.x = 0x0,
.y = 0x0,
.width = VI_BACKEND_WIDTH,
.height = VI_BACKEND_HEIGHT,
.abs_zorder = 0x0,
.low_latency = TD_FALSE,
.pq_bypass = TD_FALSE,
.vo_bypass = TD_FALSE,
};
td_s32 sample_vi_get_hdmirx_port(td_char *str, td_u32 hdmirx_port_num_max, td_u32 *hdmirx_port)
{
td_char tmp_str[0x10];
td_u32 count;
td_s32 ret;
for (count = 0x0; count < hdmirx_port_num_max; count++) {
ret = snprintf_s(tmp_str, sizeof(tmp_str), sizeof(tmp_str) - 1, "hdmirx%u", count);
if (ret <= 0) {
printf("snprintf_s return err 0x%x\n", ret);
return TD_FAILURE;
}
if (strcasecmp(str, tmp_str) == 0) {
*hdmirx_port = count;
break;
}
}
if (count >= hdmirx_port_num_max) {
printf("not support %s\n", str);
return TD_FAILURE;
}
return TD_SUCCESS;
}
td_void st_vi_manual_case_hdmirx_001(td_u32 *hdmirx_prot, td_u32 vi_path_num)
{
st_vi_test_info test_info[0x2];
td_u32 count;
td_bool is_forward_destroy;
td_bool vo_bypass;
vo_bypass = st_vi_comm_wait_input_select("Do you want to bypass vo and acquire/release frame from vi directly?");
for (count = 0x0; count < vi_path_num; count++) {
test_info[count].vi_setting = g_vi_default_setting;
test_info[count].vi_timing = g_vi_default_hdmi_timing;
test_info[count].frontend_param = g_vi_default_hdmi_frontend_param;
test_info[count].backend_param = g_vi_default_backend_param;
test_info[count].frontend_param.frontend_bypass = TD_FALSE;
test_info[count].frontend_param.port = hdmirx_prot[count];
test_info[count].backend_param.abs_zorder = count;
if (count == 0x0) {
test_info[count].backend_param.width = g_vi_default_backend_param.width;
test_info[count].backend_param.height = g_vi_default_backend_param.height;
test_info[count].backend_param.x += 0;
test_info[count].backend_param.y += 0;
} else {
test_info[count].backend_param.width = g_vi_default_backend_param.width / vi_path_num;
test_info[count].backend_param.height = g_vi_default_backend_param.height / vi_path_num;
test_info[count].backend_param.x += test_info[count].backend_param.width * count;
test_info[count].backend_param.y += test_info[count].backend_param.height * count;
}
test_info[count].backend_param.vo_bypass = vo_bypass;
st_vi_comm_create_monitor(&test_info[count]);
sleep(0x3);
st_vi_comm_wait_quit_test();
}
if (vi_path_num > 0x1) {
is_forward_destroy = st_vi_comm_wait_input_select("select forward destroy");
} else {
is_forward_destroy = TD_TRUE;
}
for (count = 0x0; count < vi_path_num; count++) {
if (is_forward_destroy == TD_TRUE) {
vi_st_green_print("destroy hdmirx %u path!\n", test_info[count].frontend_param.port);
st_vi_comm_destroy_monitor(&test_info[count]);
} else {
vi_st_green_print("destroy hdmirx %u path!\n", test_info[vi_path_num - count - 0x1].frontend_param.port);
st_vi_comm_destroy_monitor(&test_info[vi_path_num - count - 0x1]);
}
if (count < (vi_path_num - 0x1)) {
st_vi_comm_wait_quit_test();
}
}
}
td_s32 main(td_s32 argc, td_char *argv[])
{
td_u32 hdmirx_port_num_max;
td_u32 vi_num_max;
td_u32 vi_path_num;
td_u32 hdmirx_port[0x2];
st_vi_comm_init_monitor();
if (argc == 0x1) {
st_vi_self_running();
return TD_SUCCESS;
}
hdmirx_port_num_max = st_vi_comm_get_hdmirx_port_num();
vi_num_max = st_vi_comm_get_vi_num();
if (vi_num_max <= 0x1) {
if (argc < 0x2 || argv == TD_NULL) {
st_vi_comm_deinit_monitor();
printf("Usage: sample_vi [hdmirx0~%d]\n", hdmirx_port_num_max - 0x1);
return TD_SUCCESS;
}
} else {
if (argc < 0x2 || argv == TD_NULL) {
st_vi_comm_deinit_monitor();
printf("Usage: sample_vi [hdmirx0~%d]\n", hdmirx_port_num_max - 0x1);
printf("Usage: sample_vi [hdmirx0~%d] [hdmirx%d]\n", hdmirx_port_num_max - 0x2, hdmirx_port_num_max - 0x1);
printf("Usage: sample_vi [hdmirx%d] [hdmirx0~%d]\n", hdmirx_port_num_max - 0x1, hdmirx_port_num_max - 0x2);
return TD_SUCCESS;
}
}
if (argc == 0x2) {
vi_path_num = 0x1;
if (sample_vi_get_hdmirx_port(argv[1], hdmirx_port_num_max, &hdmirx_port[0x0]) != TD_SUCCESS) {
return TD_SUCCESS;
}
vi_st_green_print("hmirx vi path num is 1, hdmirx%u!\n", hdmirx_port[0x0]);
} else {
vi_path_num = 0x2;
if (sample_vi_get_hdmirx_port(argv[1], hdmirx_port_num_max, &hdmirx_port[0x0]) != TD_SUCCESS) {
st_vi_comm_deinit_monitor();
return TD_SUCCESS;
}
if (sample_vi_get_hdmirx_port(argv[2], hdmirx_port_num_max, &hdmirx_port[0x1]) != TD_SUCCESS) {
st_vi_comm_deinit_monitor();
return TD_SUCCESS;
}
vi_st_green_print("hmirx vi path num is 2, hdmirx%u, hdmirx%u!\n", hdmirx_port[0x0], hdmirx_port[0x1]);
}
st_vi_manual_case_hdmirx_001(hdmirx_port, vi_path_num);
st_vi_comm_deinit_monitor();
return TD_SUCCESS;
}