diff --git a/src/gst/gstpipewireformat.c b/src/gst/gstpipewireformat.c index 5e1f86966..110226a05 100644 --- a/src/gst/gstpipewireformat.c +++ b/src/gst/gstpipewireformat.c @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -36,6 +37,14 @@ #include "gstpipewireformat.h" +#ifndef DRM_FORMAT_MOD_INVALID +#define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1) +#endif + +#ifndef DRM_FORMAT_MOD_LINEAR +#define DRM_FORMAT_MOD_LINEAR 0 +#endif + struct media_type { const char *name; uint32_t media_type; @@ -626,6 +635,18 @@ convert_1 (ConvertData *d) spa_pod_builder_prop (&d->b, SPA_FORMAT_mediaSubtype, 0); spa_pod_builder_id(&d->b, d->type->media_subtype); + if (d->cf && gst_caps_features_contains (d->cf, GST_CAPS_FEATURE_MEMORY_DMABUF)) { + struct spa_pod_frame f2; + + spa_pod_builder_prop (&d->b, SPA_FORMAT_VIDEO_modifier, + (SPA_POD_PROP_FLAG_MANDATORY | SPA_POD_PROP_FLAG_DONT_FIXATE)); + spa_pod_builder_push_choice (&d->b, &f2, SPA_CHOICE_Enum, 0); + spa_pod_builder_long (&d->b, DRM_FORMAT_MOD_INVALID); + spa_pod_builder_long (&d->b, DRM_FORMAT_MOD_INVALID); + spa_pod_builder_long (&d->b, DRM_FORMAT_MOD_LINEAR); + spa_pod_builder_pop (&d->b, &f2); + } + if (d->type->media_type == SPA_MEDIA_TYPE_video) handle_video_fields (d); else if (d->type->media_type == SPA_MEDIA_TYPE_audio) @@ -661,13 +682,19 @@ foreach_func (GstCapsFeatures *features, ConvertData *d) { struct spa_pod *fmt; + int idx; spa_zero(d->b); d->cf = features; d->cs = structure; + if (d->cf && gst_caps_features_contains (d->cf, GST_CAPS_FEATURE_MEMORY_DMABUF)) + idx = 0; + else + idx = -1; + if ((fmt = convert_1 (d))) - g_ptr_array_insert (d->array, -1, fmt); + g_ptr_array_insert (d->array, idx, fmt); return TRUE; } diff --git a/src/gst/gstpipewiresrc.c b/src/gst/gstpipewiresrc.c index 0b222aa0e..4e37846fc 100644 --- a/src/gst/gstpipewiresrc.c +++ b/src/gst/gstpipewiresrc.c @@ -43,6 +43,7 @@ #include #include +#include #include #include @@ -949,7 +950,6 @@ on_param_changed (void *data, uint32_t id, if (pwsrc->caps) gst_caps_unref(pwsrc->caps); pwsrc->caps = gst_caps_from_format (param); - GST_DEBUG_OBJECT (pwsrc, "we got format %" GST_PTR_FORMAT, pwsrc->caps); pwsrc->negotiated = pwsrc->caps != NULL; @@ -958,6 +958,19 @@ on_param_changed (void *data, uint32_t id, struct spa_pod_builder b = { NULL }; uint8_t buffer[512]; uint32_t buffers = CLAMP (16, pwsrc->min_buffers, pwsrc->max_buffers); + int buffertypes; + + if (spa_pod_find_prop (param, NULL, SPA_FORMAT_VIDEO_modifier)) { + buffertypes = (1<caps, 0), + GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY); + gst_caps_features_add (gst_caps_get_features (pwsrc->caps, 0), + GST_CAPS_FEATURE_MEMORY_DMABUF); + } else { + buffertypes = ((1<caps); spa_pod_builder_init (&b, buffer, sizeof (buffer)); params[0] = spa_pod_builder_add_object (&b, @@ -968,9 +981,7 @@ on_param_changed (void *data, uint32_t id, SPA_PARAM_BUFFERS_blocks, SPA_POD_CHOICE_RANGE_Int(0, 1, INT32_MAX), SPA_PARAM_BUFFERS_size, SPA_POD_CHOICE_RANGE_Int(0, 0, INT32_MAX), SPA_PARAM_BUFFERS_stride, SPA_POD_CHOICE_RANGE_Int(0, 0, INT32_MAX), - SPA_PARAM_BUFFERS_dataType, SPA_POD_CHOICE_FLAGS_Int( - (1<