From 8daac1c09a7a79c0d9f5b7a5c44ee78852174585 Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Thu, 1 Aug 2019 13:48:54 +0800 Subject: [PATCH] msdk: adjust the stride align GstAllocationParams::align is set to 31 in msdkdec/msdken/msdkvpp, hence the stride align should be greater than or equal to 31, otherwise it will result in issue https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/861 (msdk: "GStreamer-CRITICAL: gst_buffer_resize_range failed" SPAM), In addition, the stride should match the pitch alignment in the media driver, otherwise it will result in some issues when a buffer is shared between different elements, e.g. the NV12 issue mentioned in commit 3f2314a, which can be reproduced by `gst-launch-1.0 vidoetestsrc ! msdkvpp ! video/x-raw\(memory:DMABuf\),format=NV12 ! glimagesink` Fixed https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/861 --- sys/msdk/msdk.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sys/msdk/msdk.c b/sys/msdk/msdk.c index bbab8d9301..2f4903950a 100644 --- a/sys/msdk/msdk.c +++ b/sys/msdk/msdk.c @@ -219,6 +219,7 @@ gst_msdk_set_video_alignment (GstVideoInfo * info, guint alloc_w, guint alloc_h, GstVideoAlignment * alignment) { guint i, width, height; + guint stride_align = 127; /* 128-byte alignment */ width = GST_VIDEO_INFO_WIDTH (info); height = GST_VIDEO_INFO_HEIGHT (info); @@ -232,9 +233,16 @@ gst_msdk_set_video_alignment (GstVideoInfo * info, guint alloc_w, guint alloc_h, if (alloc_h == 0) alloc_h = height; + /* PitchAlignment is set to 64 bytes in the media driver for the following formats */ + if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_BGRA || + GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_BGRx || + GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_BGR10A2_LE || + GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_RGB16) + stride_align = 63; /* 64-byte alignment */ + gst_video_alignment_reset (alignment); for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) - alignment->stride_align[i] = 15; /* 16-byte alignment */ + alignment->stride_align[i] = stride_align; alignment->padding_right = GST_ROUND_UP_16 (alloc_w) - width; alignment->padding_bottom = GST_ROUND_UP_32 (alloc_h) - height;