mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
video-info: add gst_video_info_align_full()
When using gst_video_info_align() user had no easy way to retrieve the padded size and height of each plane. This can easily be implemented in fill_planes() as it's already called in align() with the padded height. Ideally we'd add a plane_size field to GstVideoInfo but the remaining padding is too small so that would be an ABI break. Fix #618
This commit is contained in:
parent
73a628923e
commit
36ce08826e
3 changed files with 400 additions and 13 deletions
|
@ -112,7 +112,8 @@ gst_video_info_new (void)
|
||||||
return info;
|
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:
|
* 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))
|
if (!gst_video_info_set_format_common (info, format, width, height))
|
||||||
return FALSE;
|
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;
|
return FALSE;
|
||||||
|
|
||||||
GST_VIDEO_INFO_INTERLACE_MODE (info) = mode;
|
GST_VIDEO_INFO_INTERLACE_MODE (info) = mode;
|
||||||
return fill_planes (info);
|
return fill_planes (info, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const gchar *interlace_mode[] = {
|
static const gchar *interlace_mode[] = {
|
||||||
|
@ -532,7 +533,7 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps)
|
||||||
set_default_colorimetry (info);
|
set_default_colorimetry (info);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fill_planes (info))
|
if (!fill_planes (info, NULL))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -756,7 +757,7 @@ gst_video_info_to_caps (GstVideoInfo * info)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
fill_planes (GstVideoInfo * info)
|
fill_planes (GstVideoInfo * info, gsize plane_size[GST_VIDEO_MAX_PLANES])
|
||||||
{
|
{
|
||||||
gsize width, height, cr_h;
|
gsize width, height, cr_h;
|
||||||
gint bpp = 0, i;
|
gint bpp = 0, i;
|
||||||
|
@ -1135,6 +1136,25 @@ fill_planes (GstVideoInfo * info)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1265,21 +1285,26 @@ done:
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_video_info_align:
|
* gst_video_info_align_full:
|
||||||
* @info: a #GstVideoInfo
|
* @info: a #GstVideoInfo
|
||||||
* @align: alignment parameters
|
* @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
|
* This variant of gst_video_info_align() provides the updated size, in bytes,
|
||||||
* stride alignment in @align is respected.
|
* 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
|
* In case of GST_VIDEO_INTERLACE_MODE_ALTERNATE info, the returned sizes are the
|
||||||
* is required and @align will be updated with the new padding values.
|
* ones used to hold a single field, not the full frame.
|
||||||
*
|
*
|
||||||
* Returns: %FALSE if alignment could not be applied, e.g. because the
|
* 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
|
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;
|
const GstVideoFormatInfo *vinfo = info->finfo;
|
||||||
gint width, height;
|
gint width, height;
|
||||||
|
@ -1331,7 +1356,7 @@ gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align)
|
||||||
info->width = padded_width;
|
info->width = padded_width;
|
||||||
info->height = padded_height;
|
info->height = padded_height;
|
||||||
|
|
||||||
if (!fill_planes (info))
|
if (!fill_planes (info, plane_size))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* check alignment */
|
/* check alignment */
|
||||||
|
@ -1378,3 +1403,23 @@ gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align)
|
||||||
|
|
||||||
return TRUE;
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -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_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_OFFSET(i,p) ((i)->offset[p])
|
||||||
#define GST_VIDEO_INFO_PLANE_STRIDE(i,p) ((i)->stride[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 */
|
/* dealing with components */
|
||||||
#define GST_VIDEO_INFO_N_COMPONENTS(i) GST_VIDEO_FORMAT_INFO_N_COMPONENTS((i)->finfo)
|
#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
|
GST_VIDEO_API
|
||||||
gboolean gst_video_info_align (GstVideoInfo * info, GstVideoAlignment * align);
|
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)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstVideoInfo, gst_video_info_free)
|
||||||
|
|
||||||
|
|
|
@ -3303,6 +3303,329 @@ GST_START_TEST (test_video_format_info_plane_to_components)
|
||||||
|
|
||||||
GST_END_TEST;
|
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 *
|
static Suite *
|
||||||
video_suite (void)
|
video_suite (void)
|
||||||
{
|
{
|
||||||
|
@ -3351,6 +3674,7 @@ video_suite (void)
|
||||||
tcase_add_test (tc_chain, test_hdr);
|
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_color_from_to_iso);
|
||||||
tcase_add_test (tc_chain, test_video_format_info_plane_to_components);
|
tcase_add_test (tc_chain, test_video_format_info_plane_to_components);
|
||||||
|
tcase_add_test (tc_chain, test_video_info_align);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue