工具/软件:
SDK 版本:10_00_00_08
我们想询问 GStreamer tiovxmultiscaler 插件是否支持在流水线播放时动态调整 ROI 参数、例如 ROI-startx 和 ROI-starty。
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.
工具/软件:
SDK 版本:10_00_00_08
我们想询问 GStreamer tiovxmultiscaler 插件是否支持在流水线播放时动态调整 ROI 参数、例如 ROI-startx 和 ROI-starty。
尊敬的 Jason:
您能否尝试使用 gst-validate 并创建一个场景来更改 tiovxmultis标 量的参数(我们已在编码器元素上尝试过)来更改比特率和密钥帧请求。
SK-AM62A-LP:H264 编码器 — I 帧按需和动态比特率控制
此致、
Suren
您好、Suren
我编写了一个测试演示、可以使用 videotestsrc 重现此问题。 程序流将创建一个简单的流水线videotestsrc->multiscaler->kmssink。 在流水线开始播放后、它会尝试在 3 秒后修改 ROI 参数、同时打印“No Stop Pipeline(无法停止流水线)“。 在机器上、我们可以观察到 ROI 更改不会立即生效。 等待另外 3 秒钟后、当管道停止并重新启动时、ROI 修改将立即生效。
//也许由于我的网络问题、我无法将我的代码放在代码块中、只能直接粘贴到这里
#include
#include
int gstTestRoi (int argc、char *argv[])
{
G_setenv(“gst_debug_dump_dot_DIR",“,"/tmp/"、"/tmp/",“,true“true)、);
GstElement *管道;
GstElement *videoSrc,*capsSrc;
GstElement *msc、*capsFilterMsc0;
GstElement *kmssink;
GstPad *mscSrcPad0;
GstPad *capsFilterMsc0Sink;
/*初始化 GStreamer */
gst_init (&argc、&argv);
/*创建主循环*/
GMainLoop * loop = g_MAIN_LOOP_NEW (NULL、FALSE);
/*创建元素*/
videoSrc = gst_element_FACTORY_make(“videotestsrc",“,"videotestsrc"、"videotestsrc")“);“;
capsSrc = gst_Element_FACTORY_make(“capsfilter",“,"capsSrc"、"capsSrc")“);“;
MSC = gst_element_FACTORY_make(“tiovxmultiscaler",“,"msc"、"msc")“);“;
capsFilterMsc0 = gst_Element_FACTORY_make(“capsfilter",“,"capsFilterMsc0"、"capsFilterMsc0")“);“;
kmssink = gst_element_FACTORY_make(“kmssink",“,"kmssink"、"kmssink")“);“;
/*创建空流水线*/
pipeline = gst_pipeline_new(“test-pipeline “);
if(!pipeline ||!videoSrc ||!capsSrc ||!msc ||!capsFilterMsc0 ||!kmssink)
{
g_printerr(“不能创建所有元素。\n“);
返回–1;
}
//设置属性
//================= 进行讨论
G_object_set (videoSrc、“pattern",“,0、0、NULL);
g_object_set (videoSrc、“is-live",“,true、true、NULL);
GstCaps *capsCam0;
// config v4l2 src
capsCam0 = gst_caps_new_simple(“video/x-raw",“,</s>、
“WIDTH",“,G_TYPE_INT、G_TYPE_INT、1920、
“高度“、G_TYPE_INT、1080、
“帧速率“、gst_type_faction、60、1、
“format",“,G_type_string、G_type_string、“NV12",“,</s>、
“比色法“、G_TYPE_STRING、“bt709",“,</s>、
“interlace-mode",“,G_type_string、G_type_string、“progressive",“,</s>、
空);
G_object_set (G_object (capsSrc)、“caps",“,capsCam0、capsCam0、NULL);
GST_CAPS_UNREF (capsCam0);
//================= MSC
G_object_set (msc、“target",“,0、0、NULL);
GstCaps *capsMsc0;
capsMsc0 = gst_caps_new_simple(“video/x-raw",“,</s>、
“WIDTH",“,G_TYPE_INT、G_TYPE_INT、1280、
“HEIGHT",“,G_TYPE_INT、G_TYPE_INT、720、
“format",“,G_type_string、G_type_string、“NV12",“,</s>、
空);
G_object_set (G_object (capsFilterMsc0)、“caps",“,capsMsc0、capsMsc0、NULL);
GST_CAPS_UNREF (capsMsc0);
//================= KMSSINK
G_object_set (G_object (kmssink)、“driver-name",“,"tidss"、"tidss",“,NULL“NULL)、);
G_object_set (G_object (kmssink)、“sync",“,false、false、NULL);
G_object_set (G_object (kmssink)、“async",“,true、true、NULL);
G_object_set (G_object (kmssink)、“skip-vsync",“,true、true、NULL);
/*链接所有可以自动链接的元素,因为它们具有“始终“的填充*/
gst_bin_add_multiple (gst_bin (pipeline)、videoSrc、capsSrc、msc、capsFilterMsc0、 kmssink、NULL);
if (gst_element_link_many (videoSrc、capsSrc、msc、NULL)!= true ||
gst_element_link_many (capsFilterMsc0、kmssink、NULL)!= true)
{
g_printerr(“无法链接元素。\n“);
gst_object_unREF (pipeline);
返回–1;
}
/*手动链接“请求“标签*/
// GstPad *mscSrcPad0;
// GstPad *capsFilterMsc0Sink;
mscSrcPad0 = gst_element_request_pad_simple(msc、“src_%u");“;
capsFilterMsc0Sink = gst_element_get_static_pad (capsFilterMsc0、“sink")“);
if(!mscSrcPad0 ||!capsFilterMsc0Sink)
{
g_printerr(“不能创建所有 PAD。\n“);
返回–1;
}
G_object_set (mscSrcPad0、“roi-startx",“,0、0、NULL);
G_object_set (mscSrcPad0、“roi-starty",“,0、0、NULL);
G_object_set (mscSrcPad0、“roi-width",“,1280、1280、NULL);
G_object_set (mscSrcPad0、“roi-height",“,720、720、NULL);
IF (gst_pad_link (mscSrcPad0、capsFilterMsc0Sink)!= gst_pad_link_OK)
{
g_printerr(“无法链接。\n“);
gst_object_unREF (pipeline);
返回–1;
}
// gst_object_unREF (mscSrcPad0);
gst_object_unREF (capsFilterMsc0Sink);
/*开始播放流水线*/
GST_Element_set_state (pipeline、GST_State_playing);
G_uSleep (3 * 1000 * 1000);
//不起作用
G_message (“无停止流水线“);
G_object_set (mscSrcPad0、“roi-startx",“,500、500、NULL);
G_object_set (mscSrcPad0、“roi-starty",“,300、300、NULL);
G_object_set (mscSrcPad0、“roi-width",“,1280、1280、NULL);
G_object_set (mscSrcPad0、“roi-height",“,720、720、NULL);
// gst_debug_bin_to_dot_file (gst_bin (pipeline)、gst_debug_grap_show_all、“pipeline “);
//停止和播放、ROI 更改工作
G_uSleep (3 * 1000 * 1000);
G_message (“停止流水线“);
GST_ELEMENT_SET_STATE (pipeline、GST_STATE_NULL);
G_usleep (1 * 1000 * 1000);
GST_Element_set_state (pipeline、GST_State_playing);
G_MAIN_LOOP_RUN (LOOP);
gst_object_unREF (pipeline);
返回 0;
}
int main (int argc、char *argv[])
{
gstTestRoi (argc、argv);
返回 0;
}
BR、
Jason
尊敬的 Jason:
AM62A7:GStreamer 输入选择器在多次切换后冻结
在上面的线程中添加了有关动态更改合成器灌电流焊盘的一些示例应用。 请检查并查看这些线路上是否有帮助您继续。
此致、
Suren
你好
当我们需要更改 ROI 时、通过手动调用 tiovx_multi_scalibrator_module_update_input_params (&self->obj) 来修复此问题。
需要像 edgeai-tiovx-apps 中使用的另一个 tiovx_multi_caler_module_update_input_params 一样对 edgeai-tiovx-modiler_module_update_input_params 中的 tiovx_multi_caler_module_update_input_params 进行修改。 否则会存在缓存一致性问题、即更新的裁剪参数未更新到共享存储器中、而 msc 目标无法获取正确的参数。
vx_status status = VX_FAILURE;
vx_reference refs[1];
tivx_vpac_msc_input_params_t input_prm;
vx_user_data_object input_prm_obj;
tivx_vpac_msc_input_params_init(&input_prm);
#if !defined(SOC_J721E) //This feature is supported only on VPAC3 and VPAC3L
if (node->num_outputs <= 2) {
input_prm.is_enable_simul_processing = 1;
}
#endif
input_prm_obj = vxCreateUserDataObject(node->graph->tiovx_context,
"tivx_vpac_msc_input_params_t",
sizeof(tivx_vpac_msc_input_params_t),
&input_prm);
refs[0] = (vx_reference)input_prm_obj;
status = tivxNodeSendCommand(node->tiovx_node, 0u,
TIVX_VPAC_MSC_CMD_SET_INPUT_PARAMS,
refs, 1u);
if((vx_status)VX_SUCCESS != status)
{
TIOVX_MODULE_ERROR(
"[MULTI-SCALER-MODULE] Node send command "
"TIVX_VPAC_MSC_CMD_SET_INPUT_PARAMS, failed!\n");
}
vxReleaseUserDataObject(&input_prm_obj);
return status;
徐建中 请帮助说明是否将其添加到 SDK 中以支持未来版本中的动态 ROI。
此致、
Adam