This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA4VM: 怎么将m2m节点输出数据保存下来

Part Number: TDA4VM

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;
        }
    }