mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 04:36:20 +00:00
video-format: add gst_video_format_info_component()
New API to find out which components are packed in a given plane. Will prevent us from assuming a 1-1 mapping between planes and components.
This commit is contained in:
parent
c854c270be
commit
509d4c31f0
3 changed files with 123 additions and 0 deletions
|
@ -6101,3 +6101,33 @@ gst_video_format_get_palette (GstVideoFormat format, gsize * size)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_video_format_info_component:
|
||||||
|
* @info: #GstVideoFormatInfo
|
||||||
|
* @plane: a plane number
|
||||||
|
* @components: (out): array used to store component numbers
|
||||||
|
*
|
||||||
|
* Fill @components with the number of all the components packed in plane @p
|
||||||
|
* for the format @info. A value of -1 in @components indicates that no more
|
||||||
|
* components are packed in the plane.
|
||||||
|
*
|
||||||
|
* Since: 1.18
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_video_format_info_component (const GstVideoFormatInfo * info, guint plane,
|
||||||
|
gint components[GST_VIDEO_MAX_COMPONENTS])
|
||||||
|
{
|
||||||
|
guint c, i = 0;
|
||||||
|
|
||||||
|
/* Reverse mapping of info->plane */
|
||||||
|
for (c = 0; c < GST_VIDEO_FORMAT_INFO_N_COMPONENTS (info); c++) {
|
||||||
|
if (GST_VIDEO_FORMAT_INFO_PLANE (info, c) == plane) {
|
||||||
|
components[i] = c;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (c = i; c < GST_VIDEO_MAX_COMPONENTS; c++)
|
||||||
|
components[c] = -1;
|
||||||
|
}
|
||||||
|
|
|
@ -518,6 +518,9 @@ struct _GstVideoFormatInfo {
|
||||||
#define GST_VIDEO_FORMAT_INFO_TILE_WS(info) ((info)->tile_ws)
|
#define GST_VIDEO_FORMAT_INFO_TILE_WS(info) ((info)->tile_ws)
|
||||||
#define GST_VIDEO_FORMAT_INFO_TILE_HS(info) ((info)->tile_hs)
|
#define GST_VIDEO_FORMAT_INFO_TILE_HS(info) ((info)->tile_hs)
|
||||||
|
|
||||||
|
GST_VIDEO_API
|
||||||
|
void gst_video_format_info_component (const GstVideoFormatInfo *info, guint plane, gint components[GST_VIDEO_MAX_COMPONENTS]);
|
||||||
|
|
||||||
/* format properties */
|
/* format properties */
|
||||||
|
|
||||||
GST_VIDEO_API
|
GST_VIDEO_API
|
||||||
|
|
|
@ -3214,6 +3214,95 @@ GST_START_TEST (test_video_color_from_to_iso)
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
|
GST_START_TEST (test_video_format_info_plane_to_components)
|
||||||
|
{
|
||||||
|
const GstVideoFormatInfo *info;
|
||||||
|
gint comps[GST_VIDEO_MAX_COMPONENTS];
|
||||||
|
|
||||||
|
/* RGB: 1 plane, 3 components */
|
||||||
|
info = gst_video_format_get_info (GST_VIDEO_FORMAT_RGB);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 0, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, 0);
|
||||||
|
g_assert_cmpint (comps[1], ==, 1);
|
||||||
|
g_assert_cmpint (comps[2], ==, 2);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 1, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, -1);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 2, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, -1);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 3, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, -1);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
/* I420: 3 planes, 3 components */
|
||||||
|
info = gst_video_format_get_info (GST_VIDEO_FORMAT_I420);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 0, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, 0);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 1, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, 1);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 2, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, 2);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 3, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, -1);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
/* NV12: 2 planes, 3 components */
|
||||||
|
info = gst_video_format_get_info (GST_VIDEO_FORMAT_NV12);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 0, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, 0);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 1, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, 1);
|
||||||
|
g_assert_cmpint (comps[1], ==, 2);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 2, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, -1);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
|
||||||
|
gst_video_format_info_component (info, 3, comps);
|
||||||
|
g_assert_cmpint (comps[0], ==, -1);
|
||||||
|
g_assert_cmpint (comps[1], ==, -1);
|
||||||
|
g_assert_cmpint (comps[2], ==, -1);
|
||||||
|
g_assert_cmpint (comps[3], ==, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
|
||||||
static Suite *
|
static Suite *
|
||||||
video_suite (void)
|
video_suite (void)
|
||||||
{
|
{
|
||||||
|
@ -3261,6 +3350,7 @@ video_suite (void)
|
||||||
tcase_add_test (tc_chain, test_video_formats_pstrides);
|
tcase_add_test (tc_chain, test_video_formats_pstrides);
|
||||||
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);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue