diff --git a/gst-libs/gst/video/video-info.c b/gst-libs/gst/video/video-info.c index 6efb35bc75..e7fddf0264 100644 --- a/gst-libs/gst/video/video-info.c +++ b/gst-libs/gst/video/video-info.c @@ -112,7 +112,8 @@ gst_video_info_new (void) return info; } -static gboolean fill_planes (GstVideoInfo * info); +static gboolean fill_planes (GstVideoInfo * info, + gsize plane_size[GST_VIDEO_MAX_PLANES]); /** * gst_video_info_init: @@ -253,7 +254,7 @@ gst_video_info_set_format (GstVideoInfo * info, GstVideoFormat format, if (!gst_video_info_set_format_common (info, format, width, height)) return FALSE; - return fill_planes (info); + return fill_planes (info, NULL); } /** @@ -281,7 +282,7 @@ gst_video_info_set_interlaced_format (GstVideoInfo * info, return FALSE; GST_VIDEO_INFO_INTERLACE_MODE (info) = mode; - return fill_planes (info); + return fill_planes (info, NULL); } static const gchar *interlace_mode[] = { @@ -532,7 +533,7 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps) set_default_colorimetry (info); } - if (!fill_planes (info)) + if (!fill_planes (info, NULL)) return FALSE; return TRUE; @@ -756,7 +757,7 @@ gst_video_info_to_caps (GstVideoInfo * info) } static gboolean -fill_planes (GstVideoInfo * info) +fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES]) { gsize width, height, cr_h; gint bpp = 0, i; @@ -1135,6 +1136,25 @@ fill_planes (GstVideoInfo * info) return FALSE; break; } + + if (plane_size) { + for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) { + if (i < GST_VIDEO_INFO_N_PLANES (info)) { + gint comps[GST_VIDEO_MAX_COMPONENTS]; + guint plane_height; + + /* Convert plane index to component index */ + gst_video_format_info_component (info->finfo, i, comps); + plane_height = + GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (info->finfo, comps[0], + GST_VIDEO_INFO_FIELD_HEIGHT (info)); + plane_size[i] = plane_height * GST_VIDEO_INFO_PLANE_STRIDE (info, i); + } else { + plane_size[i] = 0; + } + } + } + return TRUE; } @@ -1265,21 +1285,26 @@ done: } /** - * gst_video_info_align: + * gst_video_info_align_full: * @info: a #GstVideoInfo * @align: alignment parameters + * @plane_size: (out) (allow-none): array used to store the plane sizes * - * Adjust the offset and stride fields in @info so that the padding and - * stride alignment in @align is respected. + * This variant of gst_video_info_align() provides the updated size, in bytes, + * of each video plane after the alignment, including all horizontal and vertical + * paddings. * - * Extra padding will be added to the right side when stride alignment padding - * is required and @align will be updated with the new padding values. + * In case of GST_VIDEO_INTERLACE_MODE_ALTERNATE info, the returned sizes are the + * ones used to hold a single field, not the full frame. * * Returns: %FALSE if alignment could not be applied, e.g. because the - * size of a frame can't be represented as a 32 bit integer (Since: 1.12) + * size of a frame can't be represented as a 32 bit integer + * + * Since: 1.18 */ gboolean -gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align) +gst_video_info_align_full (GstVideoInfo * info, GstVideoAlignment * align, + gsize plane_size[GST_VIDEO_MAX_PLANES]) { const GstVideoFormatInfo *vinfo = info->finfo; gint width, height; @@ -1331,7 +1356,7 @@ gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align) info->width = padded_width; info->height = padded_height; - if (!fill_planes (info)) + if (!fill_planes (info, plane_size)) return FALSE; /* check alignment */ @@ -1378,3 +1403,23 @@ gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align) return TRUE; } + +/** + * gst_video_info_align: + * @info: a #GstVideoInfo + * @align: alignment parameters + * + * Adjust the offset and stride fields in @info so that the padding and + * stride alignment in @align is respected. + * + * Extra padding will be added to the right side when stride alignment padding + * is required and @align will be updated with the new padding values. + * + * Returns: %FALSE if alignment could not be applied, e.g. because the + * size of a frame can't be represented as a 32 bit integer (Since: 1.12) + */ +gboolean +gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align) +{ + return gst_video_info_align_full (info, align, NULL); +} diff --git a/gst-libs/gst/video/video-info.h b/gst-libs/gst/video/video-info.h index 6adf03c2f1..e6a175edf5 100644 --- a/gst-libs/gst/video/video-info.h +++ b/gst-libs/gst/video/video-info.h @@ -385,6 +385,21 @@ GType gst_video_info_get_type (void); #define GST_VIDEO_INFO_N_PLANES(i) (GST_VIDEO_FORMAT_INFO_N_PLANES((i)->finfo)) #define GST_VIDEO_INFO_PLANE_OFFSET(i,p) ((i)->offset[p]) #define GST_VIDEO_INFO_PLANE_STRIDE(i,p) ((i)->stride[p]) +/** + * GST_VIDEO_INFO_PLANE_HEIGHT: + * + * The padded height in pixels of a plane (padded size divided by the plane stride). + * In case of GST_VIDEO_INTERLACE_MODE_ALTERNATE info, this macro returns the + * plane heights used to hold a single field, not the full frame. + * + * The size passed as third argument is the size of the pixel data and should + * not contain any extra metadata padding. + * + * It is not valid to use this macro with a TILED format. + * + * Since: 1.18 + */ +#define GST_VIDEO_INFO_PLANE_HEIGHT(i,p,sizes) ((i)->stride[p] == 0 ? 0 : sizes[p] / (i)->stride[p]) /* dealing with components */ #define GST_VIDEO_INFO_N_COMPONENTS(i) GST_VIDEO_FORMAT_INFO_N_COMPONENTS((i)->finfo) @@ -444,6 +459,9 @@ gboolean gst_video_info_is_equal (const GstVideoInfo *info, GST_VIDEO_API gboolean gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align); +GST_VIDEO_API +gboolean gst_video_info_align_full (GstVideoInfo * info, GstVideoAlignment * align, gsize plane_size[GST_VIDEO_MAX_PLANES]); + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVideoInfo, gst_video_info_free) diff --git a/tests/check/libs/video.c b/tests/check/libs/video.c index 7b901a6600..4190067272 100644 --- a/tests/check/libs/video.c +++ b/tests/check/libs/video.c @@ -3303,6 +3303,329 @@ GST_START_TEST (test_video_format_info_plane_to_components) GST_END_TEST; +GST_START_TEST (test_video_info_align) +{ + GstVideoInfo info; + GstVideoAlignment align; + gsize plane_size[GST_VIDEO_MAX_PLANES]; + + /* NV12 */ + gst_video_info_init (&info); + gst_video_info_set_format (&info, GST_VIDEO_FORMAT_NV12, 1920, 1080); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 1080 * 1.5); + + gst_video_alignment_reset (&align); + /* Align with no padding to retrieve the plane heights */ + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 1080); + g_assert_cmpuint (plane_size[1], ==, 1920 * 1080 / 2); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 1080); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 540); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + gst_video_alignment_reset (&align); + align.padding_bottom = 8; + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 1088); + g_assert_cmpuint (plane_size[1], ==, 1920 * 1088 / 2); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 1088 * 1.5); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 1088); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 544); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + /* NV16 */ + gst_video_info_init (&info); + gst_video_info_set_format (&info, GST_VIDEO_FORMAT_NV16, 1920, 1080); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 1080 * 2); + + gst_video_alignment_reset (&align); + /* Align with no padding to retrieve the plane heights */ + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 1080); + g_assert_cmpuint (plane_size[1], ==, 1920 * 1080); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 1080); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 1080); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + gst_video_alignment_reset (&align); + align.padding_bottom = 8; + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 1088 * 2); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 1088); + g_assert_cmpuint (plane_size[1], ==, 1920 * 1088); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 1088); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 1088); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + /* RGB */ + gst_video_info_init (&info); + gst_video_info_set_format (&info, GST_VIDEO_FORMAT_RGB, 1920, 1080); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 1080 * 3); + + gst_video_alignment_reset (&align); + /* Align with no padding to retrieve the plane heights */ + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 1080 * 3); + g_assert_cmpuint (plane_size[1], ==, 0); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 5760); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 1080); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + gst_video_alignment_reset (&align); + align.padding_bottom = 8; + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 1088 * 3); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 1088 * 3); + g_assert_cmpuint (plane_size[1], ==, 0); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 5760); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 1088); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + /* I420 */ + gst_video_info_init (&info); + gst_video_info_set_format (&info, GST_VIDEO_FORMAT_I420, 1920, 1080); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 1080 * 1.5); + + gst_video_alignment_reset (&align); + /* Align with no padding to retrieve the plane heights */ + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 1080); + g_assert_cmpuint (plane_size[1], ==, 1920 * 1080 / 4); + g_assert_cmpuint (plane_size[2], ==, 1920 * 1080 / 4); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 960); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 960); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 1080); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 540); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, + 540); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + gst_video_alignment_reset (&align); + align.padding_bottom = 8; + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 1088 * 1.5); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 1088); + g_assert_cmpuint (plane_size[1], ==, 1920 * 1088 / 4); + g_assert_cmpuint (plane_size[2], ==, 1920 * 1088 / 4); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 960); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 960); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 1088); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 544); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, + 544); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + /* NV16 alternate */ + gst_video_info_init (&info); + gst_video_info_set_interlaced_format (&info, GST_VIDEO_FORMAT_NV16, + GST_VIDEO_INTERLACE_MODE_ALTERNATE, 1920, 1080); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 540); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 540 * 2); + + gst_video_alignment_reset (&align); + /* Align with no padding to retrieve the plane heights */ + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 540); + g_assert_cmpuint (plane_size[1], ==, 1920 * 540); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 540); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 540); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + gst_video_alignment_reset (&align); + align.padding_bottom = 8; + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1080); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 540); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 544 * 2); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 544); + g_assert_cmpuint (plane_size[1], ==, 1920 * 544); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 544); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 544); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + /* NV16 alternate with an odd height */ + gst_video_info_init (&info); + gst_video_info_set_interlaced_format (&info, GST_VIDEO_FORMAT_NV16, + GST_VIDEO_INTERLACE_MODE_ALTERNATE, 1920, 1081); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1081); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 541); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 541 * 2); + + gst_video_alignment_reset (&align); + /* Align with no padding to retrieve the plane heights */ + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 541); + g_assert_cmpuint (plane_size[1], ==, 1920 * 541); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 541); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 541); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); + + gst_video_alignment_reset (&align); + align.padding_bottom = 2; + g_assert (gst_video_info_align_full (&info, &align, plane_size)); + + g_assert_cmpuint (GST_VIDEO_INFO_HEIGHT (&info), ==, 1081); + g_assert_cmpuint (GST_VIDEO_INFO_FIELD_HEIGHT (&info), ==, 541); + g_assert_cmpuint (GST_VIDEO_INFO_SIZE (&info), ==, 1920 * 542 * 2); + + g_assert_cmpuint (plane_size[0], ==, 1920 * 542); + g_assert_cmpuint (plane_size[1], ==, 1920 * 542); + g_assert_cmpuint (plane_size[2], ==, 0); + g_assert_cmpuint (plane_size[3], ==, 0); + + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 0), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 1), ==, 1920); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 2), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_STRIDE (&info, 3), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 0, plane_size), ==, + 542); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 1, plane_size), ==, + 542); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 2, plane_size), ==, 0); + g_assert_cmpuint (GST_VIDEO_INFO_PLANE_HEIGHT (&info, 3, plane_size), ==, 0); +} + +GST_END_TEST; + static Suite * video_suite (void) { @@ -3351,6 +3674,7 @@ video_suite (void) tcase_add_test (tc_chain, test_hdr); tcase_add_test (tc_chain, test_video_color_from_to_iso); tcase_add_test (tc_chain, test_video_format_info_plane_to_components); + tcase_add_test (tc_chain, test_video_info_align); return s; }