/* * Copyright (c) XMEDIA. All rights reserved. */ #include #include #include #include #include #include #include #include #include #include "xmedia_sys.h" #include "xmedia_mmz.h" #include "xmedia_vb.h" #include "xmedia_vpss.h" #include "xmedia_vgs.h" #define VALUE_BETWEEN(x,min,max) (((x) >= (min)) && ((x) <= (max))) #define VPSS_MAX_FRAME_CNT 50 static xmedia_u32 g_vpss_depth_flag = 0; static volatile sig_atomic_t g_vpss_signal_flag = 0; static xmedia_u32 g_vpss_continuous_dump = 0; static xmedia_s32 g_vpss_pipe_id = 0; static xmedia_s32 g_vpss_ochn_id = 0; static xmedia_u32 g_vpss_ori_depth = 0; static xmedia_video_frame_info g_vpss_frame_info; static xmedia_video_frame_info g_vpss_multi_frame_info[VPSS_MAX_FRAME_CNT]; static FILE* g_vpss_fd = XMEDIA_NULL; static void vpss_ochn_dump_8bit_yuv(xmedia_video_frame *video_frame, FILE *fd) { unsigned int w, h; char* virt_addr_y; char* virt_addr_c; char* mem_content; unsigned char tmp_buff[8192]; xmedia_u64 phy_addr; xmedia_u32 c_height; xmedia_u32 size; xmedia_char* page_addr[2]; xmedia_bool uv_invert; xmedia_video_pixel_format pixel_fmt = video_frame->pixel_fmt; uv_invert = (pixel_fmt == XMEDIA_VIDEO_PIXEL_FMT_YUV_SEMIPLANAR_420) ? XMEDIA_TRUE : XMEDIA_FALSE; if (video_frame->compress_mode != XMEDIA_VIDEO_COMPRESS_MODE_NONE) { video_frame->stride.y_stride = video_frame->width; video_frame->stride.c_stride = video_frame->width; } if ((pixel_fmt == XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_420) || (pixel_fmt == XMEDIA_VIDEO_PIXEL_FMT_YUV_SEMIPLANAR_420)) { size = video_frame->stride.y_stride * video_frame->height * 3 / 2; c_height = video_frame->height / 2; } else if (pixel_fmt == XMEDIA_VIDEO_PIXEL_FMT_YUV_400) { size = video_frame->stride.y_stride * video_frame->height; c_height = video_frame->height; } else { size = video_frame->stride.y_stride * video_frame->height * 3 / 2; c_height = video_frame->height / 2; } phy_addr = video_frame->addr.y_phy_addr; page_addr[0] = (xmedia_char*)xmedia_mmz_map(phy_addr, size, XMEDIA_FALSE); if (XMEDIA_NULL == page_addr[0]) { return; } virt_addr_y = page_addr[0]; virt_addr_c = virt_addr_y + (video_frame->stride.y_stride) * (video_frame->height); fprintf(stderr, "saving......Y......"); fflush(stderr); for (h = 0; h < video_frame->height; h++) { mem_content = virt_addr_y + h * video_frame->stride.y_stride; fwrite(mem_content, video_frame->width, 1, fd); } if (pixel_fmt != XMEDIA_VIDEO_PIXEL_FMT_YUV_400) { fflush(fd); fprintf(stderr, "U......"); fflush(stderr); for (h = 0; h < c_height; h++) { mem_content = virt_addr_c + h * video_frame->stride.c_stride; if (!uv_invert) { mem_content += 1; } for (w = 0; w < video_frame->width / 2; w++) { tmp_buff[w] = *mem_content; mem_content += 2; } fwrite(tmp_buff, video_frame->width / 2, 1, fd); } fflush(fd); fprintf(stderr, "V......"); fflush(stderr); for (h = 0; h < c_height; h++) { mem_content = virt_addr_c + h * video_frame->stride.c_stride; if (uv_invert) { mem_content += 1; } for (w = 0; w < video_frame->width / 2; w++) { tmp_buff[w] = *mem_content; mem_content += 2; } fwrite(tmp_buff, video_frame->width / 2, 1, fd); } } fflush(fd); fprintf(stderr, "done!\n"); fflush(stderr); xmedia_mmz_unmap(page_addr[0]); page_addr[0] = XMEDIA_NULL; } static xmedia_s32 vpss_ochn_restore(xmedia_s32 pipe_id, xmedia_s32 ochn_id) { xmedia_s32 ret = XMEDIA_FAILURE; xmedia_u32 i; if (g_vpss_continuous_dump == 0) { if (g_vpss_frame_info.pool_id != VB_INVALID_POOLID) { ret = xmedia_vpss_release_ochn_frame(pipe_id, ochn_id, &g_vpss_frame_info); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) release frame failed!\n", pipe_id, ochn_id); } g_vpss_frame_info.pool_id = VB_INVALID_POOLID; } } else { for (i = 0; i < VPSS_MAX_FRAME_CNT; i++) { if (g_vpss_multi_frame_info[i].pool_id != VB_INVALID_POOLID) { ret = xmedia_vpss_release_ochn_frame(pipe_id, ochn_id, &g_vpss_multi_frame_info[i]); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) release frame failed!\n", pipe_id, ochn_id); } g_vpss_multi_frame_info[i].pool_id = VB_INVALID_POOLID; } } } if (g_vpss_fd != XMEDIA_NULL) { fclose(g_vpss_fd); g_vpss_fd = XMEDIA_NULL; } if (g_vpss_depth_flag != 0) { if (ochn_id < VPSS_MAX_PHY_OCHN_NUM) { xmedia_vpss_ochn_attr ochn_attr = {0}; ret = xmedia_vpss_get_ochn_attr(pipe_id, ochn_id, &ochn_attr) ; if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) get ochn attr failed!\n", pipe_id, ochn_id); } ochn_attr.depth = g_vpss_ori_depth; ret = xmedia_vpss_set_ochn_attr(pipe_id, ochn_id, &ochn_attr) ; if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) set ochn attr failed!\n", pipe_id, ochn_id); } } else { xmedia_vpss_ext_ochn_attr ext_ochn_attr = {0}; ret = xmedia_vpss_get_ext_ochn_attr(pipe_id, ochn_id, &ext_ochn_attr) ; if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) get ext ochn attr failed!\n", pipe_id, ochn_id); } ext_ochn_attr.depth = g_vpss_ori_depth; ret = xmedia_vpss_set_ext_ochn_attr(pipe_id, ochn_id, &ext_ochn_attr) ; if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) set ext ochn attr failed!\n", pipe_id, ochn_id); } } g_vpss_depth_flag = 0; } ret = xmedia_vpss_exit(); if (ret != XMEDIA_SUCCESS) { printf("vpss exit failed!\n"); } return XMEDIA_SUCCESS; } void vpss_ochn_dump_handle_signal(xmedia_s32 signal) { if (g_vpss_signal_flag != 0) { exit(-1); } if (signal == SIGINT || signal == SIGTERM) { g_vpss_signal_flag++; vpss_ochn_restore(g_vpss_pipe_id, g_vpss_ochn_id); g_vpss_signal_flag--; printf("\033[0;31mprogram termination abnormally!\033[0;39m\n"); } exit(-1); } static xmedia_s32 vpss_ochn_dump_transform_format(xmedia_video_frame_info *frame_in, xmedia_video_frame_info *tmp_frame, xmedia_video_frame_info *frame_out) { xmedia_s32 ret; xmedia_vgs_frame_info task_info; xmedia_s32 job_handle; ret = xmedia_vgs_init(); if (ret != XMEDIA_SUCCESS) { printf("vgs init failed\n"); return ret; } ret = xmedia_vgs_create_job(&job_handle); if (ret != XMEDIA_SUCCESS) { printf("create vgs job failed\n"); xmedia_vgs_exit(); goto EXIT1; } memcpy(&task_info.img_in, tmp_frame, sizeof(xmedia_video_frame_info)); memcpy(&task_info.img_out, frame_out, sizeof(xmedia_video_frame_info)); ret = xmedia_vgs_add_task_rotation(job_handle, &task_info, XMEDIA_VIDEO_ROTATION_0); if (ret != XMEDIA_SUCCESS) { printf("add vgs task failed\n"); goto EXIT2; } ret = xmedia_vgs_submit_job(job_handle); if (ret != XMEDIA_SUCCESS) { printf("submit vgs job failed\n"); goto EXIT2; } ret = xmedia_vgs_wait_job(job_handle, 2000); if (ret != XMEDIA_SUCCESS) { printf("wait vgs job failed\n"); goto EXIT1; } xmedia_vgs_exit(); return XMEDIA_SUCCESS; EXIT2: xmedia_vgs_cancel_job(job_handle); EXIT1: xmedia_vgs_exit(); return XMEDIA_FAILURE; } static xmedia_void vpss_ochn_uncontinuous_dump(xmedia_s32 pipe_id, xmedia_s32 ochn_id, xmedia_u32 frame_cnt, xmedia_char *yuv_name) { xmedia_s32 ret; xmedia_u32 cnt = frame_cnt; xmedia_s32 millisec = -1; xmedia_handle vb_handle = VB_INVALID_HANDLE; xmedia_handle tmp_handle = VB_INVALID_HANDLE; xmedia_vb_base_info base_info; xmedia_vb_cal_cfg cal_cfg; xmedia_video_frame_info tmp_frame = {0}; xmedia_video_frame_info frame_out = {0}; xmedia_vb_config vb_config = {0}; xmedia_u32 pool_num = 0; xmedia_s32 vb_pool_init = 0; while (cnt--) { if (xmedia_vpss_acquire_ochn_frame(pipe_id, ochn_id, &g_vpss_frame_info, millisec) != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) get frame failed!\n", pipe_id, ochn_id); usleep(1000); continue; } printf("pipe(%d) ochn(%d) video_fmt(%d) save frame %d!\n", pipe_id, ochn_id, g_vpss_frame_info.frame.video_fmt, cnt); if (g_vpss_frame_info.frame.video_fmt != XMEDIA_VIDEO_FMT_LINEAR) { base_info.align = 0; base_info.bit_width = g_vpss_frame_info.frame.bit_width; base_info.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE; base_info.width = g_vpss_frame_info.frame.width; base_info.height = g_vpss_frame_info.frame.height; base_info.pixel_fmt = g_vpss_frame_info.frame.pixel_fmt; if(vb_pool_init == 0) { base_info.video_fmt = XMEDIA_VIDEO_FMT_LINEAR; ret = xmedia_vb_get_buffer_config(&base_info, &cal_cfg); if (ret != XMEDIA_SUCCESS) { printf("get buffer config failed with 0x%x\n", ret); goto RELEASE; } vb_config.common_pool[pool_num].block_size = cal_cfg.vb_size; vb_config.common_pool[pool_num].block_cnt = 1; vb_config.common_pool[pool_num].map_mode = XMEDIA_VB_MAP_MODE_NONE; pool_num++; vb_config.max_pool_cnt = pool_num; ret = xmedia_vb_init(&vb_config); if (ret != XMEDIA_SUCCESS) { printf("vb init failed\n"); goto RELEASE; } vb_pool_init = 1; } memcpy(&tmp_frame, &g_vpss_frame_info, sizeof(xmedia_video_frame_info)); base_info.video_fmt = XMEDIA_VIDEO_FMT_LINEAR; ret = xmedia_vb_get_buffer_config(&base_info, &cal_cfg); if (ret != XMEDIA_SUCCESS) { printf("get buffer config failed with 0x%x\n", ret); goto FREEVB; } vb_handle = xmedia_vb_get_block(-1, cal_cfg.vb_size, XMEDIA_NULL); if (vb_handle == VB_INVALID_HANDLE) { printf("get block failed\n"); goto FREEVB; } memcpy(&frame_out, &tmp_frame, sizeof(xmedia_video_frame_info)); frame_out.pool_id = xmedia_vb_handle_to_pool_id(vb_handle); frame_out.frame.addr.y_phy_addr = xmedia_vb_handle_to_phy_addr(vb_handle); frame_out.frame.addr.y_head_phy_addr = frame_out.frame.addr.y_phy_addr; frame_out.frame.addr.c_phy_addr = frame_out.frame.addr.y_phy_addr + cal_cfg.main_y_size; frame_out.frame.stride.y_stride = cal_cfg.main_stride; frame_out.frame.stride.c_stride = cal_cfg.main_stride; frame_out.frame.compress_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE; frame_out.frame.video_fmt = XMEDIA_VIDEO_FMT_LINEAR; ret = vpss_ochn_dump_transform_format(&g_vpss_frame_info, &tmp_frame, &frame_out); if (ret != XMEDIA_SUCCESS) { printf("pipe %d ochn %d vpss_ochn_dump_transform_format failed\n", pipe_id, ochn_id); goto FREEVB; } } else { memcpy(&frame_out, &g_vpss_frame_info, sizeof(xmedia_video_frame_info)); } vpss_ochn_dump_8bit_yuv(&frame_out.frame, g_vpss_fd); FREEVB: if (tmp_handle != VB_INVALID_HANDLE) { xmedia_vb_release_block(tmp_handle); tmp_handle = VB_INVALID_HANDLE; } if (vb_handle != VB_INVALID_HANDLE) { xmedia_vb_release_block(vb_handle); vb_handle = VB_INVALID_HANDLE; } RELEASE: ret = xmedia_vpss_release_ochn_frame(pipe_id, ochn_id, &g_vpss_frame_info); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) release frame failed!\n", pipe_id, ochn_id); break; } g_vpss_frame_info.pool_id = VB_INVALID_POOLID; } if(vb_pool_init == 1) { ret = xmedia_vb_exit(); if (ret != XMEDIA_SUCCESS) { printf("vb exit fail!\n"); return; } } return; } static xmedia_void vpss_ochn_continuous_dump(xmedia_s32 pipe_id, xmedia_s32 ochn_id, xmedia_u32 frame_cnt, xmedia_char *yuv_name) { xmedia_s32 ret; xmedia_u32 cnt = frame_cnt; xmedia_s32 millisec = -1; xmedia_u32 get_frame_cnt = 0; xmedia_handle vb_handle = VB_INVALID_HANDLE; xmedia_handle tmp_handle = VB_INVALID_HANDLE; xmedia_vb_base_info base_info; xmedia_vb_cal_cfg cal_cfg; xmedia_video_frame_info tmp_frame = {0}; xmedia_video_frame_info frame_out = {0}; xmedia_vb_config vb_config = {0}; xmedia_u32 pool_num = 0; xmedia_s32 vb_pool_init = 0; while (cnt--) { if (xmedia_vpss_acquire_ochn_frame(pipe_id, ochn_id, &g_vpss_multi_frame_info[get_frame_cnt], millisec) != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) get frame failed!\n", pipe_id, ochn_id); usleep(1000); continue; } get_frame_cnt++; if (get_frame_cnt >= VPSS_MAX_FRAME_CNT) { printf("pipe(%d) ochn(%d) get frame cnt err!\n", pipe_id, ochn_id); return; } } cnt = 0; while (cnt < get_frame_cnt) { printf("pipe(%d) ochn(%d) save frame %d!\n", pipe_id, ochn_id, (get_frame_cnt - cnt - 1)); if (g_vpss_multi_frame_info[cnt].frame.video_fmt != XMEDIA_VIDEO_FMT_LINEAR) { base_info.align = 0; base_info.bit_width = g_vpss_multi_frame_info[cnt].frame.bit_width; base_info.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE; base_info.width = g_vpss_multi_frame_info[cnt].frame.width; base_info.height = g_vpss_multi_frame_info[cnt].frame.height; base_info.pixel_fmt = g_vpss_multi_frame_info[cnt].frame.pixel_fmt; if(vb_pool_init == 0) { if (g_vpss_frame_info.frame.video_fmt == XMEDIA_VIDEO_FMT_TILE_16x4) { base_info.video_fmt = XMEDIA_VIDEO_FMT_TILE_64x4; ret = xmedia_vb_get_buffer_config(&base_info, &cal_cfg); if (ret != XMEDIA_SUCCESS) { printf("get buffer config failed with 0x%x\n", ret); goto RELEASE; } vb_config.common_pool[pool_num].block_size = cal_cfg.vb_size; vb_config.common_pool[pool_num].block_cnt = 1; vb_config.common_pool[pool_num].map_mode = XMEDIA_VB_MAP_MODE_NONE; pool_num++; } base_info.video_fmt = XMEDIA_VIDEO_FMT_LINEAR; ret = xmedia_vb_get_buffer_config(&base_info, &cal_cfg); if (ret != XMEDIA_SUCCESS) { printf("get buffer config failed with 0x%x\n", ret); goto RELEASE; } vb_config.common_pool[pool_num].block_size = cal_cfg.vb_size; vb_config.common_pool[pool_num].block_cnt = 1; vb_config.common_pool[pool_num].map_mode = XMEDIA_VB_MAP_MODE_NONE; pool_num++; vb_config.max_pool_cnt = pool_num; ret = xmedia_vb_init(&vb_config); if (ret != XMEDIA_SUCCESS) { printf("vb init failed\n"); goto RELEASE; } vb_pool_init = 1; } if (g_vpss_multi_frame_info[cnt].frame.video_fmt == XMEDIA_VIDEO_FMT_TILE_16x4) { base_info.video_fmt = XMEDIA_VIDEO_FMT_TILE_64x4; ret = xmedia_vb_get_buffer_config(&base_info, &cal_cfg); if (ret != XMEDIA_SUCCESS) { printf("get buffer config failed with 0x%x\n", ret); goto RELEASE; } tmp_handle = xmedia_vb_get_block(-1, cal_cfg.vb_size, XMEDIA_NULL); if (tmp_handle == VB_INVALID_HANDLE) { printf("get block failed\n"); goto RELEASE; } memcpy(&tmp_frame, &g_vpss_multi_frame_info[cnt], sizeof(xmedia_video_frame_info)); tmp_frame.pool_id = xmedia_vb_handle_to_pool_id(tmp_handle); tmp_frame.frame.addr.y_phy_addr = xmedia_vb_handle_to_phy_addr(tmp_handle); tmp_frame.frame.addr.y_head_phy_addr = tmp_frame.frame.addr.y_phy_addr; tmp_frame.frame.addr.c_phy_addr = tmp_frame.frame.addr.y_phy_addr + cal_cfg.main_y_size; tmp_frame.frame.stride.y_stride = cal_cfg.main_stride; tmp_frame.frame.stride.c_stride = cal_cfg.main_stride; tmp_frame.frame.compress_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE; tmp_frame.frame.video_fmt = XMEDIA_VIDEO_FMT_TILE_64x4; } else { memcpy(&tmp_frame, &g_vpss_multi_frame_info[cnt], sizeof(xmedia_video_frame_info)); } base_info.video_fmt = XMEDIA_VIDEO_FMT_LINEAR; ret = xmedia_vb_get_buffer_config(&base_info, &cal_cfg); if (ret != XMEDIA_SUCCESS) { printf("get buffer config failed with 0x%x\n", ret); goto FREEVB; } vb_handle = xmedia_vb_get_block(-1, cal_cfg.vb_size, XMEDIA_NULL); if (vb_handle == VB_INVALID_HANDLE) { printf("get block failed\n"); goto FREEVB; } memcpy(&frame_out, &tmp_frame, sizeof(xmedia_video_frame_info)); frame_out.pool_id = xmedia_vb_handle_to_pool_id(vb_handle); frame_out.frame.addr.y_phy_addr = xmedia_vb_handle_to_phy_addr(vb_handle); frame_out.frame.addr.y_head_phy_addr = frame_out.frame.addr.y_phy_addr; frame_out.frame.addr.c_phy_addr = frame_out.frame.addr.y_phy_addr + cal_cfg.main_y_size; frame_out.frame.stride.y_stride = cal_cfg.main_stride; frame_out.frame.stride.c_stride = cal_cfg.main_stride; frame_out.frame.compress_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE; frame_out.frame.video_fmt = XMEDIA_VIDEO_FMT_LINEAR; ret = vpss_ochn_dump_transform_format(&g_vpss_multi_frame_info[cnt], &tmp_frame, &frame_out); if (ret != XMEDIA_SUCCESS) { printf("pipe %d ochn %d vpss_ochn_dump_transform_format failed\n", pipe_id, ochn_id); goto FREEVB; } } else { memcpy(&frame_out, &g_vpss_multi_frame_info[cnt], sizeof(xmedia_video_frame_info)); } vpss_ochn_dump_8bit_yuv(&frame_out.frame, g_vpss_fd); FREEVB: if (tmp_handle != VB_INVALID_HANDLE) { xmedia_vb_release_block(tmp_handle); tmp_handle = VB_INVALID_HANDLE; } if (vb_handle != VB_INVALID_HANDLE) { xmedia_vb_release_block(vb_handle); vb_handle = VB_INVALID_HANDLE; } RELEASE: ret = xmedia_vpss_release_ochn_frame(pipe_id, ochn_id, &g_vpss_multi_frame_info[cnt]); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) release frame failed!\n", pipe_id, ochn_id); cnt++; continue; } g_vpss_multi_frame_info[cnt].pool_id = VB_INVALID_POOLID; cnt++; } if(vb_pool_init == 1) { ret = xmedia_vb_exit(); if (ret != XMEDIA_SUCCESS) { printf("vb exit fail!\n"); return; } } return; } xmedia_void vpss_ochn_misc_dump(xmedia_s32 pipe_id, xmedia_s32 ochn_id, xmedia_u32 frame_cnt) { xmedia_s32 ret; xmedia_char yuv_name[128]; xmedia_char pixel_format[10]; xmedia_char sys_chmod[140]; xmedia_u32 cnt = frame_cnt; xmedia_u32 depth = 1; xmedia_s32 millisec = -1; ret = xmedia_vpss_init(); if (ret != XMEDIA_SUCCESS) { printf("vpss init failed!\n"); return; } if (ochn_id < VPSS_MAX_PHY_OCHN_NUM) { xmedia_vpss_ochn_attr ochn_attr = {0}; ret = xmedia_vpss_get_ochn_attr(pipe_id, ochn_id, &ochn_attr); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) get ochn attr failed!\n", pipe_id, ochn_id); return; } g_vpss_ori_depth = ochn_attr.depth; ochn_attr.depth = depth; ret = xmedia_vpss_set_ochn_attr(pipe_id, ochn_id, &ochn_attr); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) set ochn attr failed!\n", pipe_id, ochn_id); vpss_ochn_restore(pipe_id, ochn_id); return; } } else { xmedia_vpss_ext_ochn_attr ext_ochn_attr = {0}; ret = xmedia_vpss_get_ext_ochn_attr(pipe_id, ochn_id, &ext_ochn_attr); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) get ext ochn attr failed!\n", pipe_id, ochn_id); return; } g_vpss_ori_depth = ext_ochn_attr.depth; ext_ochn_attr.depth = depth; ret = xmedia_vpss_set_ext_ochn_attr(pipe_id, ochn_id, &ext_ochn_attr); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) set ext ochn attr failed!\n", pipe_id, ochn_id); vpss_ochn_restore(pipe_id, ochn_id); return; } } g_vpss_depth_flag = 1; memset(&g_vpss_frame_info, 0, sizeof(xmedia_video_frame_info)); g_vpss_frame_info.pool_id = VB_INVALID_POOLID; if (xmedia_vpss_acquire_ochn_frame(pipe_id, ochn_id, &g_vpss_frame_info, millisec) != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) get frame error, now exit!\n", pipe_id, ochn_id); goto EXIT; } switch (g_vpss_frame_info.frame.pixel_fmt) { case XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_420: case XMEDIA_VIDEO_PIXEL_FMT_YUV_SEMIPLANAR_420: snprintf(pixel_format, 10, "P420"); break; case XMEDIA_VIDEO_PIXEL_FMT_YUV_400: snprintf(pixel_format, 10, "YUV400"); break; default: snprintf(pixel_format, 10, "P420"); break; } snprintf(yuv_name, 128, "./pipe%d_ochn%d_%dx%d_%s_%d.yuv", pipe_id, ochn_id, g_vpss_frame_info.frame.width, g_vpss_frame_info.frame.height, pixel_format, cnt); printf("pipe(%d) ochn(%d) dump frame to file: \"%s\"\n", pipe_id, ochn_id, yuv_name); fflush(stdout); ret = xmedia_vpss_release_ochn_frame(pipe_id, ochn_id, &g_vpss_frame_info); if (ret != XMEDIA_SUCCESS) { printf("pipe(%d) ochn(%d) release frame failed!\n", pipe_id, ochn_id); goto EXIT; } g_vpss_frame_info.pool_id = VB_INVALID_POOLID; g_vpss_fd = fopen(yuv_name, "wb"); if (g_vpss_fd == XMEDIA_NULL) { printf("open file failed:%s!\n", strerror(errno)); goto EXIT; } if (g_vpss_continuous_dump == 0) { vpss_ochn_uncontinuous_dump(pipe_id, ochn_id, frame_cnt, yuv_name); } else { vpss_ochn_continuous_dump(pipe_id, ochn_id, frame_cnt, yuv_name); } sprintf(sys_chmod, "chmod 666 %s", yuv_name); system(sys_chmod); EXIT: vpss_ochn_restore(pipe_id, ochn_id); return; } static void usage(void) { printf( "\n" "*************************************************\n" "Usage: ./vpss_ochn_dump [pipe_id] [ochn_id] [frame_cnt] [mode]\n" "1)pipe_id: \n" " vpss pipe id\n" "2)ochn_id: \n" " vpss ochn id\n" "3)frame_cnt: \n" " the count of frame to be dumped\n" "4)mode: \n" " 0: uncontinuous dump\n" " 1: continuous dump\n" "*)Example:\n" " e.g : ./vpss_ochn_dump 0 0 1 0\n" " e.g : ./vpss_ochn_dump 1 0 2 1\n" "*************************************************\n" "\n"); } xmedia_s32 main(int argc, char* argv[]) { xmedia_u32 frame_cnt; xmedia_u32 i; printf("\nNOTICE: This tool only can be used for TESTING !!!\n"); printf("\tTo see more usage, please enter: ./vpss_ochn_dump -h\n\n"); if (argc > 1) { if (!strncmp(argv[1], "-h", 2)) { usage(); exit(XMEDIA_SUCCESS); } } if (argc < 5) { usage(); exit(XMEDIA_SUCCESS); } g_vpss_pipe_id = atoi(argv[1]); if (!VALUE_BETWEEN(g_vpss_pipe_id, 0, VPSS_MAX_PIPE_NUM - 1)) { printf("vpss pipe id must be [0,%d]!\n\n", VPSS_MAX_PIPE_NUM - 1); return -1; } g_vpss_ochn_id = atoi(argv[2]); if (!VALUE_BETWEEN(g_vpss_ochn_id, 0, VPSS_MAX_OCHN_NUM - 1)) { printf("vpss ochn id must be [0,%d]!\n\n", VPSS_MAX_OCHN_NUM - 1); return -1; } frame_cnt = atoi(argv[3]); if (frame_cnt < 1) { printf("frame_cnt can't be small than 1!\n\n"); return -1; } g_vpss_continuous_dump = atoi(argv[4]); if (!VALUE_BETWEEN(g_vpss_continuous_dump, 0, 1)) { printf("vpss dump mode must be [0,1]!\n\n"); return -1; } if ((g_vpss_continuous_dump == 1) && (frame_cnt > VPSS_MAX_FRAME_CNT)) { printf("frame_cnt must be [1,%d] in continuous mode!\n\n", VPSS_MAX_FRAME_CNT); return -1; } g_vpss_depth_flag = 0; g_vpss_signal_flag = 0; g_vpss_ori_depth = 0; g_vpss_fd = XMEDIA_NULL; g_vpss_frame_info.pool_id = VB_INVALID_POOLID; for (i = 0; i < VPSS_MAX_FRAME_CNT; i++) { g_vpss_multi_frame_info[i].pool_id = VB_INVALID_POOLID; } signal(SIGINT, vpss_ochn_dump_handle_signal); signal(SIGTERM, vpss_ochn_dump_handle_signal); vpss_ochn_misc_dump(g_vpss_pipe_id, g_vpss_ochn_id, frame_cnt); return XMEDIA_SUCCESS; }