v4l2: pool: fix assert when mapping video frame with DMA_DRM caps
Make sure the pool recognizes DMA_DRM caps and parses them into GstVideoInfo that has GstVideoFormat corresponding to "drm-format" in the caps. Fixes gst_video_frame_map_id: assertion 'info->finfo->format == meta->format' failed Where the left side of the assertion was GST_VIDEO_FORMAT_DMA_DRM and the right side was some GstVideoFormat converted from DRM fourcc. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8913>
This commit is contained in:
parent
4fa01d5e4c
commit
e8e1430a5b
@ -148,7 +148,7 @@ static GstFlowReturn
|
|||||||
gst_v4l2_buffer_pool_copy_buffer (GstV4l2BufferPool * pool, GstBuffer * dest,
|
gst_v4l2_buffer_pool_copy_buffer (GstV4l2BufferPool * pool, GstBuffer * dest,
|
||||||
GstBuffer * src)
|
GstBuffer * src)
|
||||||
{
|
{
|
||||||
const GstVideoFormatInfo *finfo = pool->caps_info.finfo;
|
const GstVideoFormatInfo *finfo = pool->caps_info.vinfo.finfo;
|
||||||
|
|
||||||
GST_LOG_OBJECT (pool, "copying buffer");
|
GST_LOG_OBJECT (pool, "copying buffer");
|
||||||
|
|
||||||
@ -159,10 +159,11 @@ gst_v4l2_buffer_pool_copy_buffer (GstV4l2BufferPool * pool, GstBuffer * dest,
|
|||||||
GST_DEBUG_OBJECT (pool, "copy video frame");
|
GST_DEBUG_OBJECT (pool, "copy video frame");
|
||||||
|
|
||||||
/* we have raw video, use videoframe copy to get strides right */
|
/* we have raw video, use videoframe copy to get strides right */
|
||||||
if (!gst_video_frame_map (&src_frame, &pool->caps_info, src, GST_MAP_READ))
|
if (!gst_video_frame_map (&src_frame, &pool->caps_info.vinfo, src,
|
||||||
|
GST_MAP_READ))
|
||||||
goto invalid_buffer;
|
goto invalid_buffer;
|
||||||
|
|
||||||
if (!gst_video_frame_map (&dest_frame, &pool->caps_info, dest,
|
if (!gst_video_frame_map (&dest_frame, &pool->caps_info.vinfo, dest,
|
||||||
GST_MAP_WRITE)) {
|
GST_MAP_WRITE)) {
|
||||||
gst_video_frame_unmap (&src_frame);
|
gst_video_frame_unmap (&src_frame);
|
||||||
goto invalid_buffer;
|
goto invalid_buffer;
|
||||||
@ -242,7 +243,7 @@ gst_v4l2_buffer_pool_import_userptr (GstV4l2BufferPool * pool,
|
|||||||
GstFlowReturn ret = GST_FLOW_OK;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
GstV4l2MemoryGroup *group = NULL;
|
GstV4l2MemoryGroup *group = NULL;
|
||||||
GstMapFlags flags;
|
GstMapFlags flags;
|
||||||
const GstVideoFormatInfo *finfo = pool->caps_info.finfo;
|
const GstVideoFormatInfo *finfo = pool->caps_info.vinfo.finfo;
|
||||||
struct UserPtrData *data = NULL;
|
struct UserPtrData *data = NULL;
|
||||||
|
|
||||||
GST_LOG_OBJECT (pool, "importing userptr");
|
GST_LOG_OBJECT (pool, "importing userptr");
|
||||||
@ -265,7 +266,7 @@ gst_v4l2_buffer_pool_import_userptr (GstV4l2BufferPool * pool,
|
|||||||
|
|
||||||
data->is_frame = TRUE;
|
data->is_frame = TRUE;
|
||||||
|
|
||||||
if (!gst_video_frame_map (&data->frame, &pool->caps_info, src, flags))
|
if (!gst_video_frame_map (&data->frame, &pool->caps_info.vinfo, src, flags))
|
||||||
goto invalid_buffer;
|
goto invalid_buffer;
|
||||||
|
|
||||||
for (i = 0; i < GST_VIDEO_FORMAT_INFO_N_PLANES (finfo); i++) {
|
for (i = 0; i < GST_VIDEO_FORMAT_INFO_N_PLANES (finfo); i++) {
|
||||||
@ -639,7 +640,11 @@ gst_v4l2_buffer_pool_set_config (GstBufferPool * bpool, GstStructure * config)
|
|||||||
min_buffers, max_buffers);
|
min_buffers, max_buffers);
|
||||||
|
|
||||||
/* keep a GstVideoInfo with defaults for the when we need to copy */
|
/* keep a GstVideoInfo with defaults for the when we need to copy */
|
||||||
gst_video_info_from_caps (&pool->caps_info, caps);
|
gst_video_info_dma_drm_init (&pool->caps_info);
|
||||||
|
if (!gst_video_info_dma_drm_from_caps (&pool->caps_info, caps) &&
|
||||||
|
!gst_video_info_from_caps (&pool->caps_info.vinfo, caps)) {
|
||||||
|
goto wrong_config;
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
ret = GST_BUFFER_POOL_CLASS (parent_class)->set_config (bpool, config);
|
ret = GST_BUFFER_POOL_CLASS (parent_class)->set_config (bpool, config);
|
||||||
@ -1347,7 +1352,8 @@ gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool, GstBuffer ** buffer,
|
|||||||
group->planes[i].bytesused, i, group->buffer.flags,
|
group->planes[i].bytesused, i, group->buffer.flags,
|
||||||
GST_TIME_ARGS (timestamp), pool->num_queued, outbuf, old_buffer_state);
|
GST_TIME_ARGS (timestamp), pool->num_queued, outbuf, old_buffer_state);
|
||||||
|
|
||||||
if (GST_VIDEO_INFO_FORMAT (&pool->caps_info) == GST_VIDEO_FORMAT_ENCODED)
|
if (GST_VIDEO_INFO_FORMAT (&pool->caps_info.vinfo) ==
|
||||||
|
GST_VIDEO_FORMAT_ENCODED)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
|
if (obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
|
||||||
@ -1975,7 +1981,7 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer ** buf,
|
|||||||
goto eos;
|
goto eos;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GST_VIDEO_INFO_FORMAT (&pool->caps_info) !=
|
if (GST_VIDEO_INFO_FORMAT (&pool->caps_info.vinfo) !=
|
||||||
GST_VIDEO_FORMAT_ENCODED && size < pool->size)
|
GST_VIDEO_FORMAT_ENCODED && size < pool->size)
|
||||||
goto buffer_truncated;
|
goto buffer_truncated;
|
||||||
|
|
||||||
@ -2185,7 +2191,7 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer ** buf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Save the amount of data that has been submitted for encoded data */
|
/* Save the amount of data that has been submitted for encoded data */
|
||||||
if (GST_VIDEO_INFO_FORMAT (&pool->caps_info) ==
|
if (GST_VIDEO_INFO_FORMAT (&pool->caps_info.vinfo) ==
|
||||||
GST_VIDEO_FORMAT_ENCODED) {
|
GST_VIDEO_FORMAT_ENCODED) {
|
||||||
queued_size = gst_buffer_get_size (to_queue);
|
queued_size = gst_buffer_get_size (to_queue);
|
||||||
remaining_size = gst_buffer_get_size (*buf) - queued_size;
|
remaining_size = gst_buffer_get_size (*buf) - queued_size;
|
||||||
|
@ -75,7 +75,7 @@ struct _GstV4l2BufferPool
|
|||||||
GstAllocationParams params;
|
GstAllocationParams params;
|
||||||
GstBufferPool *other_pool;
|
GstBufferPool *other_pool;
|
||||||
guint size;
|
guint size;
|
||||||
GstVideoInfo caps_info; /* Default video information */
|
GstVideoInfoDmaDrm caps_info; /* Default video information */
|
||||||
gboolean have_dma_drm_caps; /* If the configured caps have memory:DMABuf */
|
gboolean have_dma_drm_caps; /* If the configured caps have memory:DMABuf */
|
||||||
|
|
||||||
gboolean add_videometa; /* set if video meta should be added */
|
gboolean add_videometa; /* set if video meta should be added */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user