mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-16 11:15:31 +00:00
kmssink: Handle the DMA buffer importing correctly
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5174>
This commit is contained in:
parent
a925630d87
commit
e4d7ac5989
2 changed files with 41 additions and 4 deletions
|
@ -1616,11 +1616,41 @@ gst_kms_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstKMSSink *self;
|
GstKMSSink *self;
|
||||||
GstVideoInfo vinfo;
|
GstVideoInfo vinfo;
|
||||||
|
GstVideoInfoDmaDrm vinfo_drm;
|
||||||
|
|
||||||
self = GST_KMS_SINK (bsink);
|
self = GST_KMS_SINK (bsink);
|
||||||
|
|
||||||
if (!gst_video_info_from_caps (&vinfo, caps))
|
if (gst_video_is_dma_drm_caps (caps)) {
|
||||||
goto invalid_format;
|
GstVideoFormat video_format;
|
||||||
|
GstVideoInfo tmp_info;
|
||||||
|
guint i;
|
||||||
|
|
||||||
|
if (!gst_video_info_dma_drm_from_caps (&vinfo_drm, caps))
|
||||||
|
goto invalid_format;
|
||||||
|
|
||||||
|
self->vinfo_drm = vinfo_drm;
|
||||||
|
|
||||||
|
/* Convert the dma to traditional video info */
|
||||||
|
video_format = gst_video_format_from_drm (vinfo_drm.drm_fourcc);
|
||||||
|
if (video_format == GST_VIDEO_FORMAT_UNKNOWN)
|
||||||
|
goto invalid_format;
|
||||||
|
|
||||||
|
if (!gst_video_info_set_format (&tmp_info, video_format,
|
||||||
|
GST_VIDEO_INFO_WIDTH (&vinfo_drm.vinfo),
|
||||||
|
GST_VIDEO_INFO_HEIGHT (&vinfo_drm.vinfo)))
|
||||||
|
goto invalid_format;
|
||||||
|
|
||||||
|
vinfo = vinfo_drm.vinfo;
|
||||||
|
vinfo.finfo = tmp_info.finfo;
|
||||||
|
for (i = 0; i < GST_VIDEO_MAX_PLANES; i++)
|
||||||
|
vinfo.stride[i] = tmp_info.stride[i];
|
||||||
|
for (i = 0; i < GST_VIDEO_MAX_PLANES; i++)
|
||||||
|
vinfo.offset[i] = tmp_info.offset[i];
|
||||||
|
vinfo.size = tmp_info.size;
|
||||||
|
} else {
|
||||||
|
if (!gst_video_info_from_caps (&vinfo, caps))
|
||||||
|
goto invalid_format;
|
||||||
|
}
|
||||||
self->vinfo = vinfo;
|
self->vinfo = vinfo;
|
||||||
|
|
||||||
if (!gst_kms_sink_calculate_display_ratio (self, &vinfo,
|
if (!gst_kms_sink_calculate_display_ratio (self, &vinfo,
|
||||||
|
@ -1842,6 +1872,11 @@ gst_kms_sink_import_dmabuf (GstKMSSink * self, GstBuffer * inbuf,
|
||||||
if (!self->has_prime_import)
|
if (!self->has_prime_import)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
/* Not a DMA format. */
|
||||||
|
if (GST_VIDEO_INFO_FORMAT (&self->vinfo_drm.vinfo) !=
|
||||||
|
GST_VIDEO_FORMAT_DMA_DRM)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
/* This will eliminate most non-dmabuf out there */
|
/* This will eliminate most non-dmabuf out there */
|
||||||
if (!gst_is_dmabuf_memory (gst_buffer_peek_memory (inbuf, 0)))
|
if (!gst_is_dmabuf_memory (gst_buffer_peek_memory (inbuf, 0)))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1904,8 +1939,8 @@ gst_kms_sink_import_dmabuf (GstKMSSink * self, GstBuffer * inbuf,
|
||||||
GST_LOG_OBJECT (self, "found these prime ids: %d, %d, %d, %d", prime_fds[0],
|
GST_LOG_OBJECT (self, "found these prime ids: %d, %d, %d, %d", prime_fds[0],
|
||||||
prime_fds[1], prime_fds[2], prime_fds[3]);
|
prime_fds[1], prime_fds[2], prime_fds[3]);
|
||||||
|
|
||||||
kmsmem = gst_kms_allocator_dmabuf_import (self->allocator,
|
kmsmem = gst_kms_allocator_dmabuf_import (self->allocator, prime_fds,
|
||||||
prime_fds, n_planes, mems_skip, &self->vinfo, 0);
|
n_planes, mems_skip, &self->vinfo, self->vinfo_drm.drm_modifier);
|
||||||
if (!kmsmem)
|
if (!kmsmem)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -2470,6 +2505,7 @@ gst_kms_sink_init (GstKMSSink * sink)
|
||||||
gst_poll_fd_init (&sink->pollfd);
|
gst_poll_fd_init (&sink->pollfd);
|
||||||
sink->poll = gst_poll_new (TRUE);
|
sink->poll = gst_poll_new (TRUE);
|
||||||
gst_video_info_init (&sink->vinfo);
|
gst_video_info_init (&sink->vinfo);
|
||||||
|
gst_video_info_dma_drm_init (&sink->vinfo_drm);
|
||||||
sink->skip_vsync = FALSE;
|
sink->skip_vsync = FALSE;
|
||||||
|
|
||||||
#ifdef HAVE_DRM_HDR
|
#ifdef HAVE_DRM_HDR
|
||||||
|
|
|
@ -71,6 +71,7 @@ struct _GstKMSSink {
|
||||||
GstStructure *plane_props;
|
GstStructure *plane_props;
|
||||||
|
|
||||||
GstVideoInfo vinfo;
|
GstVideoInfo vinfo;
|
||||||
|
GstVideoInfoDmaDrm vinfo_drm;
|
||||||
GstCaps *allowed_caps;
|
GstCaps *allowed_caps;
|
||||||
GstBufferPool *pool;
|
GstBufferPool *pool;
|
||||||
GstAllocator *allocator;
|
GstAllocator *allocator;
|
||||||
|
|
Loading…
Reference in a new issue