Skip to content

Commit 161980b

Browse files
committed
Add: GStreamer expose DMA offload knob
- document the new enable-dma-offload property and flag usage in README.md - add the enable-dma-offload GObject property, store it in GeneralArgs, and pass parsed dma-dev lists through to mtl_init_params - make mtl_st20p_rx honor the flag by setting ST20P_RX_FLAG_DMA_OFFLOAD and fall back to GST_MTL_DEFAULT_FRAMEBUFF_CNT locally - drop the unused framebuff_cnt sharing in st20p/st30p/st40p RX elements so each plugin owns its own defaults
1 parent 6621a7f commit 161980b

File tree

6 files changed

+46
-27
lines changed

6 files changed

+46
-27
lines changed

ecosystem/gstreamer_plugin/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,16 @@ In MTL GStreamer plugins there are general arguments that apply to every plugin.
105105
| udp-port-red | uint | Receiving MTL node UDP port for redundant transmission. | 0 to G_MAXUINT |
106106
| tx-queues | uint | Number of TX queues to initialize in DPDK backend. | 0 to G_MAXUINT |
107107
| rx-queues | uint | Number of RX queues to initialize in DPDK backend. | 0 to G_MAXUINT |
108+
| enable-dma-offload | boolean | Request DMA offload for sessions that support it. | TRUE/FALSE |
108109
| payload-type | uint | SMPTE ST 2110 payload type. | 0 to G_MAXUINT |
109110
| port | string | Session DPDK device port. If not specified it will be taken from the dev-port argument. | N/A |
110111
| port-red | string | Redundant session DPDK device port if left open taken from dev-port-red argument if specified. | N/A |
111112

113+
When `enable-dma-offload` is set to `true`, every plugin that supports DMA will request
114+
`ST20P_RX_FLAG_DMA_OFFLOAD` during session creation (currently `mtl_st20p_rx`). Make sure
115+
the `dma-dev` port is bound and exported as described in `doc/dma.md` before enabling the
116+
flag.
117+
112118
These are also general parameters accepted by plugins, but the functionality they provide to the user is not yet supported in plugins.
113119

114120
| Property Name | Type | Description | Range |
@@ -270,6 +276,9 @@ The `mtl_st20p_rx` plugin supports the following pad capabilities:
270276
| rx-interlaced | boolean | Whether the video is interlaced. | TRUE/FALSE | FALSE |
271277
| rx-pixel-format | string | Pixel format of the video. | `v210`, `YUV444PLANAR10LE` | `v210` |
272278
279+
> **Tip:** Enable DMA offload for this plugin by passing the general property
280+
> `enable-dma-offload=true` alongside a configured `dma-dev`.
281+
273282
#### 3.2.2. Preparing output path
274283
275284
In our pipelines, we will use the `$OUTPUT` variable to hold the path to the video.

ecosystem/gstreamer_plugin/gst_mtl_common.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,12 @@ void gst_mtl_common_init_general_arguments(GObjectClass* gobject_class) {
287287
g_param_spec_boolean("enable-ptp", "Enable onboard PTP",
288288
"Enable onboard PTP client", FALSE,
289289
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
290+
291+
g_object_class_install_property(
292+
gobject_class, PROP_GENERAL_ENABLE_DMA_OFFLOAD,
293+
g_param_spec_boolean("enable-dma-offload", "Enable DMA offload",
294+
"Request DMA offload for compatible sessions.", FALSE,
295+
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
290296
}
291297

292298
void gst_mtl_common_set_general_arguments(GObject* object, guint prop_id,
@@ -350,6 +356,9 @@ void gst_mtl_common_set_general_arguments(GObject* object, guint prop_id,
350356
case PROP_GENERAL_ENABLE_ONBOARD_PTP:
351357
general_args->enable_onboard_ptp = g_value_get_boolean(value);
352358
break;
359+
case PROP_GENERAL_ENABLE_DMA_OFFLOAD:
360+
general_args->enable_dma_offload = g_value_get_boolean(value);
361+
break;
353362
default:
354363
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
355364
break;
@@ -409,6 +418,9 @@ void gst_mtl_common_get_general_arguments(GObject* object, guint prop_id,
409418
case PROP_GENERAL_ENABLE_ONBOARD_PTP:
410419
g_value_set_boolean(value, general_args->enable_onboard_ptp);
411420
break;
421+
case PROP_GENERAL_ENABLE_DMA_OFFLOAD:
422+
g_value_set_boolean(value, general_args->enable_dma_offload);
423+
break;
412424
default:
413425
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
414426
break;
@@ -596,11 +608,24 @@ gboolean gst_mtl_common_parse_general_arguments(struct mtl_init_params* mtl_init
596608

597609
mtl_init_params->num_ports++;
598610

599-
if (general_args->dma_dev && strlen(general_args->dma_dev)) {
600-
strncpy(mtl_init_params->dma_dev_port[0], general_args->dma_dev, MTL_PORT_MAX_LEN);
611+
mtl_port_idx++;
612+
}
613+
614+
if (general_args->dma_dev && strlen(general_args->dma_dev)) {
615+
gchar** dma_tokens = g_strsplit(general_args->dma_dev, ",", MTL_DMA_DEV_MAX + 1);
616+
gint idx = 0;
617+
618+
while (dma_tokens && dma_tokens[idx] && idx < MTL_DMA_DEV_MAX) {
619+
gchar* token = g_strstrip(dma_tokens[idx]);
620+
if (token && strlen(token)) {
621+
strncpy(mtl_init_params->dma_dev_port[mtl_init_params->num_dma_dev_port], token,
622+
MTL_PORT_MAX_LEN);
623+
mtl_init_params->num_dma_dev_port++;
624+
}
625+
idx++;
601626
}
602627

603-
mtl_port_idx++;
628+
if (dma_tokens) g_strfreev(dma_tokens);
604629
}
605630

606631
return ret;

ecosystem/gstreamer_plugin/gst_mtl_common.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ enum {
4949
PROP_GENERAL_PORT_RX_QUEUES,
5050
PROP_GENERAL_PORT_TX_QUEUES,
5151
PROP_GENERAL_ENABLE_ONBOARD_PTP,
52+
PROP_GENERAL_ENABLE_DMA_OFFLOAD,
5253
PROP_GENERAL_MAX
5354
};
5455

@@ -66,7 +67,7 @@ typedef struct GeneralArgs {
6667
gchar dma_dev[MTL_PORT_MAX_LEN];
6768
gint log_level;
6869
gboolean enable_onboard_ptp;
69-
guint framebuff_cnt;
70+
gboolean enable_dma_offload;
7071
} GeneralArgs;
7172

7273
typedef struct SessionPortArgs {

ecosystem/gstreamer_plugin/gst_mtl_st20p_rx.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ static gboolean gst_mtl_st20p_rx_start(GstBaseSrc* basesrc) {
252252
if (src->framebuffer_num) {
253253
ops_rx.framebuff_cnt = src->framebuffer_num;
254254
} else {
255-
ops_rx.framebuff_cnt = src->generalArgs.framebuff_cnt;
255+
ops_rx.framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
256256
}
257257

258258
if (!gst_mtl_common_parse_pixel_format(src->pixel_format, &ops_rx.output_fmt)) {
@@ -281,6 +281,10 @@ static gboolean gst_mtl_st20p_rx_start(GstBaseSrc* basesrc) {
281281
GST_WARNING("Using memcpy path");
282282
}
283283

284+
if (src->generalArgs.enable_dma_offload) {
285+
ops_rx.flags |= ST20P_RX_FLAG_DMA_OFFLOAD;
286+
}
287+
284288
gst_mtl_common_copy_general_to_session_args(&(src->generalArgs), &(src->portArgs));
285289

286290
ops_rx.port.num_port =
@@ -311,8 +315,6 @@ static void gst_mtl_st20p_rx_init(Gst_Mtl_St20p_Rx* src) {
311315

312316
src->fps_n = DEFAULT_FRAMERATE;
313317
src->fps_d = 1;
314-
src->generalArgs.framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
315-
316318
srcpad = gst_element_get_static_pad(element, "src");
317319
if (!srcpad) {
318320
GST_ERROR_OBJECT(src, "Failed to get src pad from child element");
@@ -340,11 +342,6 @@ static void gst_mtl_st20p_rx_set_property(GObject* object, guint prop_id,
340342
break;
341343
case PROP_ST20P_RX_FRAMEBUFF_NUM:
342344
self->framebuffer_num = g_value_get_uint(value);
343-
if (self->framebuffer_num) {
344-
self->generalArgs.framebuff_cnt = self->framebuffer_num;
345-
} else {
346-
self->generalArgs.framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
347-
}
348345
break;
349346
case PROP_ST20P_RX_WIDTH:
350347
self->width = g_value_get_uint(value);

ecosystem/gstreamer_plugin/gst_mtl_st30p_rx.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ static gboolean gst_mtl_st30p_rx_start(GstBaseSrc* basesrc) {
238238
if (src->framebuffer_num) {
239239
ops_rx->framebuff_cnt = src->framebuffer_num;
240240
} else {
241-
ops_rx->framebuff_cnt = src->generalArgs.framebuff_cnt;
241+
ops_rx->framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
242242
}
243243

244244
gst_mtl_common_copy_general_to_session_args(&(src->generalArgs), &(src->portArgs));
@@ -269,8 +269,6 @@ static void gst_mtl_st30p_rx_init(Gst_Mtl_St30p_Rx* src) {
269269
GstElement* element = GST_ELEMENT(src);
270270
GstPad* srcpad;
271271

272-
src->generalArgs.framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
273-
274272
srcpad = gst_element_get_static_pad(element, "src");
275273
if (!srcpad) {
276274
GST_ERROR_OBJECT(src, "Failed to get src pad from child element");
@@ -291,11 +289,6 @@ static void gst_mtl_st30p_rx_set_property(GObject* object, guint prop_id,
291289
switch (prop_id) {
292290
case PROP_ST30P_RX_FRAMEBUFF_NUM:
293291
self->framebuffer_num = g_value_get_uint(value);
294-
if (self->framebuffer_num) {
295-
self->generalArgs.framebuff_cnt = self->framebuffer_num;
296-
} else {
297-
self->generalArgs.framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
298-
}
299292
break;
300293
case PROP_ST30P_RX_CHANNEL:
301294
self->channel = g_value_get_uint(value);

ecosystem/gstreamer_plugin/gst_mtl_st40p_rx.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,6 @@ static void gst_mtl_st40p_rx_class_init(Gst_Mtl_St40p_RxClass* klass) {
346346
}
347347

348348
static void gst_mtl_st40p_rx_init(Gst_Mtl_St40p_Rx* src) {
349-
src->generalArgs.framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
350349
src->rx_framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
351350
src->max_udw_size = DEFAULT_MAX_UDW_SIZE;
352351
src->rtp_ring_size = DEFAULT_RTP_RING_SIZE;
@@ -375,11 +374,6 @@ static void gst_mtl_st40p_rx_set_property(GObject* object, guint prop_id,
375374
switch (prop_id) {
376375
case PROP_ST40P_RX_FRAMEBUFF_CNT:
377376
src->rx_framebuff_cnt = g_value_get_uint(value);
378-
if (src->rx_framebuff_cnt) {
379-
src->generalArgs.framebuff_cnt = src->rx_framebuff_cnt;
380-
} else {
381-
src->generalArgs.framebuff_cnt = GST_MTL_DEFAULT_FRAMEBUFF_CNT;
382-
}
383377
break;
384378
case PROP_ST40P_RX_MAX_UDW_SIZE:
385379
src->max_udw_size = g_value_get_uint(value);
@@ -453,7 +447,7 @@ static gboolean gst_mtl_st40p_rx_start(GstBaseSrc* basesrc) {
453447

454448
ops_rx.name = "st40p_rx";
455449
ops_rx.framebuff_cnt =
456-
src->rx_framebuff_cnt ? src->rx_framebuff_cnt : src->generalArgs.framebuff_cnt;
450+
src->rx_framebuff_cnt ? src->rx_framebuff_cnt : GST_MTL_DEFAULT_FRAMEBUFF_CNT;
457451
ops_rx.max_udw_buff_size = src->max_udw_size;
458452
ops_rx.flags = 0; /* Use non-blocking mode - blocking causes preroll timeout */
459453

0 commit comments

Comments
 (0)