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.

[参考译文] TDA4VH-Q1:GStreamer 组合器硬件加速器

Guru**** 2457760 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1544801/tda4vh-q1-gstreamer-compositor-hardware-accelerator

器件型号:TDA4VH-Q1


工具/软件:

您好、

我尝试使用 gstreamer 合成器混合多个视频、当我使用 gstreamer 组合 FullHD 视频时、CPU 利用率增加。 请建议、TDA4AH 具有任何用于 gstreamer 视频混合的硬件加速器。 O

我正在将“GST-launch-1.0"命令“命令与“compositor"结合“结合使用、以混合多个“appsrc"元素“元素。

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

    您好 Suresh、

    您可以使用 tiovxmosaic 插件将多个视频合并到一个流中。

    https://github.com/TexasInstruments/edgeai-gst-plugins/wiki/tiovxmosaic 

    此致、
    Jared

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

    您好 Jared McArthur、

    感谢您的答复。  

    我想组合多个 appsrc 视频、我按照 vision_apps/apps/basic_demos/app_multi_cam_codec 中提供的示例代码来保存使用 h264 编码器的视频。  

    此示例使用 gstreamer 包装器函数 appCodecInit ()、appCodecSrcInit ()、appCodecStart ()、appCodecDeqAppSrc ()、appCodecEnqAppSrc () 和 appCodecEnqEosAppSrc () 从 appsrc 源创建 h264 编码视频输出。

    我想在 gstreamer 流水线中使用 gstreamer 合成器/tiovxmosaic 与 GStreamer 包装器功能、创建多个视频源的组合视频输出。

    我用于将一个 appsrc 和 videotest 模式与  appCodecInit() 混合的命令如下所示。

    appsrc name=myAppSrc0 format=3 is-live=true do-timestamp=true ! 视频转换! 视频/x-RAW、宽度=1920、高度=1080! 排队! mix.sink_0 videotestsrc pattern=SMPTE! 视频/x-RAW、宽度=640、高度=640! mix.sink_1 tiovxmosaic name=mix sink_0::xpos=0 sink_1::xpos=1920! 视频转换! v4l2h264enc extra-controls=“controls, frame_level_rate_control_enable=1、video_bitrate=10000000\“ !  h264parse! mp4mux! filesink location=output_video.mp4

    此命令正在创建一个带有 0 字节的 mp4 文件。

    当我以相同的流程使用以下命令时、我将获得一个包含 appsrc 相机图像的 mp4 文件。

    appsrc name=myAppSrc0 format=3 is-live=true do-timestamp=true ! 视频转换! 视频/x-RAW、宽度=1920、高度=1080! 排队!  视频转换! v4l2h264enc extra-controls=“controls, frame_level_rate_control_enable=1、video_bitrate=10000000\“ !  h264parse! mp4mux! filesink location=output_video.mp4

    您是否支持获取将 tiovxmosaic 与 appsrc 源元素结合使用的命令?

    此致、

    Suresh K

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

    您好 Suresh、

    我之前已将 tiovxmosaic 与 appsrc 搭配使用、没有问题。 该工具当前受支持。

    您正在输出的分辨率是多少?

    您是否可以测试输出到 kmssink 现在进行测试?

    此致、
    Jared

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

    您好 Jared McArthur、

    我正在尝试创建一个 宽度为 3840 和高度为 2160 的文件。  这是组合图像的分辨率。

    单个文件分辨率为 1920 x 1080。

    此致、

    Suresh K

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

    您好 Suresh、

    video/x-raw、width=640、height=640

    看起来您的 videotestsrc 的大小不正确。

    您能否在 tiovxmosaic 之后添加 CAP 滤波器?

    video/x-raw, format=NV12, width=3840, height=2160

    [报价 userid=“574088" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1544801/tda4vh-q1-gstreamer-compositor-hardware-accelerator/5947073

    您是否可以测试输出到 kmssink 现在进行测试?

    [/报价]

    您可以尝试一下吗? 如果您可以看到正在输出/显示的内容、它可能有助于调试。

    此致、
    Jared

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

    谢谢 Jared McArthur,

    我能够使用 tiovxmosaic 对视频流进行马赛克。

    具体命令如下。

     

    appsrc name=myAppSrc0 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_0 appsrc name=myAppSrc1 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_1 appsrc name=myAppSrc2 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_2 appsrc name=myAppSrc3 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_3 appsrc name=myAppSrc4 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_4 appsrc name=myAppSrc5 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! comp.sink_5 appsrc name=myAppSrc6 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! video/x-raw、宽度=1280、高度=720! COMP.SINK_6 tiovxmosaic name=comp SINK_0::startx=“<0>" SINK_0“ SINK_0:::starty=“<0>" SINK_1“ SINK_1::startx=“<1280>" SINK_1“ SINK_1::starty=“<0>" SINK_2“ SINK_2::startx=“<starty>" SINK_2“ SINK_2:::::starty=“<starty="Sink:“:<starty=“720">:“:<starty=“4">:“:<starty_SINK_4>“ Sink:<starty>:<starty>:<starty>:<starty>:<starty>:<starty>:<starty> 视频转换! v4l2h264enc extra-controls=“controls, frame_level_rate_control_enable=1、video_bitrate=10000000“! h264parse! mp4mux! filesink location=output_file_1.mp4

    所有 appsrc 输入都具有相同的分辨率 1280x720。 我想合并不同分辨率的视频,我在用不同的分辨率更改大写字母后尝试了,但它不会生成输出文件。

    请建议、我是否可以使用 tiovxmosaic 组合具有不同分辨率的视频?

    Regads、

    Suresh K

     

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

    您好 Suresh、

    你可以使用不同的分辨率,但它不能高档. 它只能缩小规模。

    此致、
    Jared

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

    您好 Jared McArthur、

    感谢您的答复。 我想针对 appsrc 输入合并多个具有不同分辨率的视频、 并遵循 RTOS SDK 11_00_00_06 中提供的 gst_wrapper.c 文件。  在此中、仅为一个通道配置输入宽度和高度。 对于 appsrc 各个通道的不同分辨率、我更新了函数  appGstSrcInit  指定  gst_wrapper c   如下所示。  将 IN_HEIGHT 和 IN_WIDTH 更新为数组元素、以便为每个通道保存不同的值。

    使用 GST 命令更新应用程序代码、如下所示。

    appsrc name=myAppSrc0 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! comp.sink_0 appsrc name=myAppSrc1 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=640、高度=720 ! comp.sink_1 appsrc name=myAppSrc2 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! comp.sink_2 appsrc name=myAppSrc3 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=640、高度=720 ! comp.sink_3 appsrc name=myAppSrc4 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! comp.sink_4 appsrc name=myAppSrc5 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! comp.sink_5 appsrc name=myAppSrc6 format=gst_format_time is-live=true do-timestamp=true block=true ! 排队! 视频转换! 视频/x-RAW、 宽度=1280、高度=720 ! COMP.SINK_6 tiovxmosaic name=comp SINK_0::startx=“<0>" SINK_0“ SINK_0:::starty=“<0>" SINK_1“ SINK_1::startx=“<1280>" SINK_1“ SINK_1::starty=“<0>" SINK_2“ SINK_2::startx=“<2560>" SINK_2“ SINK_2:::starty=“<0>" SINK_3“ SINK_3::startx=“<starty="Sink:“:<720“>:<starty>“Sink:<starty=“720":“:<starty_SINK_4>“ 视频转换! v4l2h264enc extra-controls=“controls, frame_level_rate_control_enable=1、video_bitrate=10000000“! h264parse! mp4mux! filesink location=output_file.mp4

     

    当我将所有宽度和高度分别配置为 1280 和 720 时、上述命令在使数据 tr idx 值排队的第二次迭代中停止、但相同的命令可以正常工作并生成输出文件。

    我是否需要更新 gst-wrapper.c 文件中的包装器函数以获取不同的分辨率输入?

    此外、请建议如何检查 TDA4 中的 h264 编码器硬件负载。

    此致、

    Suresh K

    e2e.ti.com/.../gst_5F00_wrapper.c

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

    您好 Suresh、

    感谢您的回复。 我想针对 appsrc 输入合并多个具有不同分辨率的视频、 并遵循 RTOS SDK 11_00_00_06 中提供的 gst_wrapper.c 文件。  在此中、仅为一个通道配置输入宽度和高度。 对于 appsrc 各个通道的不同分辨率、我更新了函数  appGstSrcInit  指定  gst_wrapper c   如下所示。  将 IN_HEIGHT 和 IN_WIDTH 更新为数组元素、以便为每个通道保存不同的值。

    您不必更改任何源代码即可使用具有不同分辨率输入的 tiovxmosaic。

    当我将所有宽度和高度分别配置为 1280 和 720 时、上述命令在第二次数据导入 idx 值队列时停止、但相同的命令可以正常工作并生成输出文件。

    您能否在马赛克后添加 GST 上限?

    [报价 userid=“656787" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1544801/tda4vh-q1-gstreamer-compositor-hardware-accelerator/5967525

    此外、请建议如何检查 TDA4 中的 h264 编码器硬件负载。

    [/报价]

    请为此问题打开其他主题。

    此致、
    Jared

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

    您好 Jared McArthur、

    感谢您的意见。 更新 tiovxmosaic 接收器的 GST CAP 后、我能够根据需要生成输出文件。  

    此致、

    Suresh K

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

    您好 Suresh、

    闭合螺纹。

    此致、
    Jared

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

    您好 Jared McArthur、

    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 的每个通道的输入分辨率不同,如何继续进行。

    我想 使用 GST_Wrapper 函数组合具有不同分辨率的 appsrc 输入。

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

    您好 Suresh、

    此问题已偏离主题的原始主题。 请打开新主题。

    此致、
    Jared