hi ti:
如题,如何将m2m转换后的数据保存下来。
我的流水线:capture->viss->ldc->msc->m2m->csitx。其中m2m可以将msc缩放后的NV12格式数据转化成UYVY然后通过csitx输出。这样是没有问题的。但是我还需要将m2m转化后的数据保存下来,另做他用。
我遇到的问题是,csitx输出的数据是正常的,但是,将m2m输出节点的数据保存下来,却出现了画面撕裂的情况。我在使用m2m的时候,如果使用m2m输出数据,就会出现这种情况,困扰我很久,我软件版本是8.1.麻烦帮忙指导下,多谢!
m2m代码配置如下
/*DSS Start*/ obj->m2m_enable = 0; #if 1 obj->m2m_enable = 1; #define DSS_M2M_WB_PIPE_INST_ID (0U) #define DSS_M2M_PIPE_NUM (1U) #define DSS_M2M_PIPE_INST_ID (3U) #define DSS_M2M_OVERLAY_ID (3U) if (vx_true_e == tivxIsTargetEnabled(TIVX_TARGET_DISPLAY_M2M3)) { // vx_image in_image = vxCreateImage(obj->context,image_width, image_height,VX_DF_IMAGE_UYVY); // obj->in_image_arr = vxCreateObjectArray(obj->context, (vx_reference)in_image, num_capture_frames); // status = vxReleaseImage(&in_image); // obj->m2m_in_image = (vx_image)vxGetObjectArrayItem(obj->in_image_arr, 0); vx_image out_image = vxCreateImage(obj->context, obj->scaler_out_w, /*image_height*/ obj->scaler_out_h, VX_DF_IMAGE_UYVY); obj->out_dss_rgb_arr = vxCreateObjectArray(obj->context, (vx_reference)out_image, num_capture_frames); status = vxReleaseImage(&out_image); obj->out_dss_rgb = (vx_image)vxGetObjectArrayItem(obj->out_dss_rgb_arr, 0); /* DSS M2M initialization */ tivx_display_m2m_params_init(&obj->local_m2m_config); obj->local_m2m_config.instId = DSS_M2M_WB_PIPE_INST_ID; /* Only one pipeline is supported */ obj->local_m2m_config.numPipe = DSS_M2M_PIPE_NUM; obj->local_m2m_config.pipeId[0U] = DSS_M2M_PIPE_INST_ID; obj->local_m2m_config.overlayId = DSS_M2M_OVERLAY_ID; obj->m2m_config = vxCreateUserDataObject(obj->context, "tivx_display_m2m_params_t", sizeof(tivx_display_m2m_params_t), &obj->local_m2m_config); obj->m2m_node = tivxDisplayM2MNode(obj->graph, obj->m2m_config, obj->scaler_out_img, obj->out_dss_rgb); vx_bool replicate_m2m[] = { vx_false_e, vx_true_e, vx_true_e}; vxReplicateNode(obj->graph, obj->m2m_node, replicate_m2m, 3); status = tivxSetNodeParameterNumBufByIndex(obj->m2m_node, 2u, obj->num_cap_buf); vxSetNodeTarget(obj->m2m_node, VX_TARGET_STRING, TIVX_TARGET_DISPLAY_M2M3); } #endif /*DSS end*/
m2m输出保存代码如下:方式是在每个pipe周期保存m2m输出的image到文件。尺寸已经被我缩放到360p了,也不会是flash写入速度问题
for (i = 0; i < frm_loop_cnt; i++) { vx_image test_image; appPerfPointBegin(&obj->total_perf); graph_parameter_num = 0; if(status == VX_SUCCESS) { status = vxGraphParameterDequeueDoneRef(obj->graph, graph_parameter_num, (vx_reference*)&out_capture_frames, 1, &num_refs_capture); } graph_parameter_num++; if((status == VX_SUCCESS) && (obj->test_mode == 1)) { status = vxGraphParameterDequeueDoneRef(obj->graph, 1, (vx_reference*)&test_image, 1, &num_refs_capture); } if((obj->test_mode == 1) && (frm_loop_cnt > BUFFER) && (status == VX_SUCCESS)) { vx_uint32 actual_checksum = 0; if (app_test_check_image(test_image, checksums_expected[0][0], &actual_checksum) == vx_false_e) { test_result = vx_false_e; } populate_gatherer(0, 0, actual_checksum); } if (fp) { write_output_image_fp(fp, obj->out_dss_rgb); } graph_parameter_num = 0; if ((status == VX_SUCCESS) && (obj->test_mode == 1)) { status = vxGraphParameterEnqueueReadyRef(obj->graph, 1, (vx_reference *)&test_image, 1); } if (status == VX_SUCCESS) { status = vxGraphParameterEnqueueReadyRef(obj->graph, graph_parameter_num, (vx_reference *)&out_capture_frames, 1); } graph_parameter_num++; appPerfPointEnd(&obj->total_perf); if ((obj->stop_task) || (status != VX_SUCCESS)) { break; } }