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.

[参考译文] TDA4AH-Q1:GStreamer 多个具有不同分辨率的 Appsrc 源 — 使用 tiovxmosaic 和 GST 包装器功能的 Mosaic

Guru**** 2535150 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1552463/tda4ah-q1-gstreamer-multiple-appsrc-sources-with-different-resolution--mosaic-using-tiovxmosaic-with-gst-wrapper-functions

器件型号:TDA4AH-Q1


工具/软件:

您好、

Gstremer 和 tiovxmosaic 支持不同的分辨率输入。

使用 GST_Wrapper 函数时、 它只有一个用于所有通道输入的输入分辨率参数。

在 gst_wrapper.c 文件中、 所有通道的平面大小按如下方式进行配置。

int32_t appGstSrcInit(void* data_ptr[CODEC_MAX_BUFFER_DEPTH][CODEC_MAX_NUM_CHANNELS][CODEC_MAX_NUM_PLANES])
{
    int32_t status = 0;
    GstCaps* caps = NULL;
    app_gst_wrapper_obj_t* p_gst_pipe_obj = &g_app_gst_wrapper_obj;
    uint32_t plane_size = p_gst_pipe_obj->params.in_width * p_gst_pipe_obj->params.in_height;

    /* Setup AppSrc Elements */
    for (uint8_t ch = 0; ch < p_gst_pipe_obj->params.in_num_channels; ch++)
    {
        p_gst_pipe_obj->m_srcElemArr[ch]  = findElementByName(p_gst_pipe_obj->m_pipeline, 
                                                    p_gst_pipe_obj->params.m_AppSrcNameArr[ch]);
        if (p_gst_pipe_obj->m_srcElemArr[ch] == NULL)
        {
            printf("gst_wrapper: findElementByName() FAILED! %s not found\n", p_gst_pipe_obj->params.m_AppSrcNameArr[ch]);
            status = -1;
        }
        else
        {
            p_gst_pipe_obj->isAppSrc = GST_IS_APP_SRC(p_gst_pipe_obj->m_srcElemArr[ch]);
            if (p_gst_pipe_obj->isAppSrc)
            {
                caps = gst_caps_new_simple("video/x-raw",
                                        "width", G_TYPE_INT, p_gst_pipe_obj->params.in_width,
                                        "height", G_TYPE_INT, p_gst_pipe_obj->params.in_height,
                                        "format", G_TYPE_STRING, p_gst_pipe_obj->params.in_format,
                                        NULL);
                if (caps == NULL)
                {
                    printf("gst_wrapper: gst_caps_new_simple() FAILED!\n");
                    status = -1;
                }
                gst_app_src_set_caps (GST_APP_SRC(p_gst_pipe_obj->m_srcElemArr[ch]), caps);
                gst_caps_unref (caps);
            }
            else 
            {
                printf("gst_wrapper: %s not an AppSrc element\n", p_gst_pipe_obj->params.m_AppSrcNameArr[ch]);
                status = -1;
            }
        }
    }

    /* Setup GstBuffers to push to AppSrc Elements using given data_ptrs */
    if (status==0)
    {
        for (uint8_t idx = 0; idx < p_gst_pipe_obj->params.in_buffer_depth && status==0; idx++)
        {
            for (uint8_t ch = 0; ch < p_gst_pipe_obj->params.in_num_channels && status==0; ch++)
            {
                p_gst_pipe_obj->buff[idx][ch] = gst_buffer_new();

                p_gst_pipe_obj->mem[idx][ch][0] = gst_memory_new_wrapped (0, data_ptr[idx][ch][0], plane_size, 0, plane_size, NULL, NULL);
                p_gst_pipe_obj->mem[idx][ch][1] = gst_memory_new_wrapped (0, data_ptr[idx][ch][1], plane_size/2, 0, plane_size/2, NULL, NULL);

                gst_buffer_append_memory (p_gst_pipe_obj->buff[idx][ch], p_gst_pipe_obj->mem[idx][ch][0]);
                gst_buffer_append_memory (p_gst_pipe_obj->buff[idx][ch], p_gst_pipe_obj->mem[idx][ch][1]);

                p_gst_pipe_obj->mem[idx][ch][0] = gst_buffer_get_memory (p_gst_pipe_obj->buff[idx][ch], 0);
                p_gst_pipe_obj->mem[idx][ch][1] = gst_buffer_get_memory (p_gst_pipe_obj->buff[idx][ch], 1);

                gst_memory_map(p_gst_pipe_obj->mem[idx][ch][0],&p_gst_pipe_obj->map_info[idx][ch][0], GST_MAP_WRITE);
                gst_memory_map(p_gst_pipe_obj->mem[idx][ch][1],&p_gst_pipe_obj->map_info[idx][ch][1], GST_MAP_WRITE);
            }
        }
    }

    if (status==0) p_gst_pipe_obj->push_count = 0;

    return status;
}

由于上述函数将支持 appsrc 的不同通道的单输入分辨率,请说明如果 appsrc 的每个通道的输入分辨率不同,如何继续进行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Suresh、  

    我将深入研究、并与团队讨论。 很快会提供更新。

    谢谢、
    Sarabesh S.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Suresh、  

    抱歉、这是我的带宽问题。 您能告诉我您使用的是哪个 SDK 版本吗?

    谢谢、
    Sarabesh S.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sarabesh:

    感谢您的答复。 我们使用的是 RTOS SDK 版本 11_00_00_06。

    此致、

    Suresh K

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Suresh、  

    我们不打算对演示应用程序进行任何补丁、因为它只是一个演示。 我可以咨询我们的 Vision Apps 专家,看看他是否已经有任何补丁 ,并告诉你。

    此致、
    Sarabesh S.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Suresh、  

    我们没有任何东西可支持此用例。  关闭此 TT。 只需回答需要重新打开的任何其他问题、

    谢谢、
    Sarabesh S.