diff --git a/subprojects/gst-plugins-base/gst-libs/gst/gl/gstglcolorconvert.c b/subprojects/gst-plugins-base/gst-libs/gst/gl/gstglcolorconvert.c index f3656cf403..65060596da 100644 --- a/subprojects/gst-plugins-base/gst-libs/gst/gl/gstglcolorconvert.c +++ b/subprojects/gst-plugins-base/gst-libs/gst/gl/gstglcolorconvert.c @@ -3055,6 +3055,18 @@ _do_convert (GstGLContext * context, GstGLColorConvert * convert) gst_gl_color_convert_reset_shader (convert); } + if (GST_VIDEO_FORMAT_INFO_IS_TILED (convert->in_info.finfo)) { + GstVideoMeta *vmeta = gst_buffer_get_video_meta (convert->inbuf); + gsize stride; + + stride = GST_VIDEO_INFO_PLANE_STRIDE (&convert->in_info, 0); + + if (vmeta && vmeta->stride[0] != stride) { + GST_VIDEO_INFO_PLANE_STRIDE (&convert->in_info, 0) = vmeta->stride[0]; + gst_gl_color_convert_reset_shader (convert); + } + } + if (!_init_convert (convert)) { convert->priv->result = FALSE; return; diff --git a/subprojects/gst-plugins-base/gst-libs/gst/gl/gstglupload.c b/subprojects/gst-plugins-base/gst-libs/gst/gl/gstglupload.c index eaae86e919..5d17ec1dfc 100644 --- a/subprojects/gst-plugins-base/gst-libs/gst/gl/gstglupload.c +++ b/subprojects/gst-plugins-base/gst-libs/gst/gl/gstglupload.c @@ -676,6 +676,21 @@ _dma_buf_upload_accept (gpointer impl, GstBuffer * buffer, GstCaps * in_caps, dmabuf->out_caps = out_caps; if (!gst_video_info_from_caps (out_info, out_caps)) return FALSE; + + /* + * When we zero-copy tiles, we need to propagate the strides, which contains + * the tile dimension. This is because the shader needs to know the padded + * size in order to correctly sample into these special buffer. + */ + if (meta && GST_VIDEO_FORMAT_INFO_IS_TILED (out_info->finfo)) { + out_info->width = meta->width; + out_info->height = meta->height; + + for (i = 0; i < meta->n_planes; i++) { + out_info->offset[i] = meta->offset[i]; + out_info->stride[i] = meta->stride[i]; + } + } } if (dmabuf->params)