summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.com>2020-02-07 11:18:24 +0530
committerOlivier CrĂȘte <olivier.crete@ocrete.ca>2020-02-26 16:16:55 +0000
commit545b817eaffbb8ff5ed6420a10d7485e8e53afc3 (patch)
treea2559d082a8c82a232c7840a01240d07865970f9
parent92d421e671cef6e9b130d5c8aae42e6387d2708e (diff)
downloadgstreamer-plugins-base-545b817eaffbb8ff5ed6420a10d7485e8e53afc3.tar.gz
video: fix GST_VIDEO_FRAME_IS_BOTTOM_FIELD()
GST_VIDEO_FRAME_FLAG_BOTTOM_FIELD is a subset of GST_VIDEO_FRAME_FLAG_TOP_FIELD so needs to be checked accordingly. Fix #726
-rw-r--r--gst-libs/gst/video/video-frame.h7
-rw-r--r--tests/check/libs/video.c37
2 files changed, 43 insertions, 1 deletions
diff --git a/gst-libs/gst/video/video-frame.h b/gst-libs/gst/video/video-frame.h
index dde4b9c5e..e78c71469 100644
--- a/gst-libs/gst/video/video-frame.h
+++ b/gst-libs/gst/video/video-frame.h
@@ -125,7 +125,12 @@ gboolean gst_video_frame_copy_plane (GstVideoFrame *dest, const GstVideoFr
#define GST_VIDEO_FRAME_IS_RFF(f) (GST_VIDEO_FRAME_FLAG_IS_SET(f, GST_VIDEO_FRAME_FLAG_RFF))
#define GST_VIDEO_FRAME_IS_ONEFIELD(f) (GST_VIDEO_FRAME_FLAG_IS_SET(f, GST_VIDEO_FRAME_FLAG_ONEFIELD))
#define GST_VIDEO_FRAME_IS_TOP_FIELD(f) (GST_VIDEO_FRAME_FLAG_IS_SET(f, GST_VIDEO_FRAME_FLAG_TOP_FIELD))
-#define GST_VIDEO_FRAME_IS_BOTTOM_FIELD(f) (GST_VIDEO_FRAME_FLAG_IS_SET(f, GST_VIDEO_FRAME_FLAG_BOTTOM_FIELD))
+
+/* GST_VIDEO_FRAME_FLAG_BOTTOM_FIELD is a subset of
+ * GST_VIDEO_FRAME_FLAG_TOP_FIELD so needs to be checked accordingly. */
+#define _GST_VIDEO_FRAME_FLAG_FIELD_MASK GST_VIDEO_FRAME_FLAG_TOP_FIELD
+
+#define GST_VIDEO_FRAME_IS_BOTTOM_FIELD(f) (((f)->flags & _GST_VIDEO_FRAME_FLAG_FIELD_MASK) == GST_VIDEO_FRAME_FLAG_BOTTOM_FIELD)
/* dealing with planes */
#define GST_VIDEO_FRAME_N_PLANES(f) (GST_VIDEO_INFO_N_PLANES(&(f)->info))
diff --git a/tests/check/libs/video.c b/tests/check/libs/video.c
index 77769b84e..ced4e76e9 100644
--- a/tests/check/libs/video.c
+++ b/tests/check/libs/video.c
@@ -3051,6 +3051,42 @@ GST_START_TEST (test_video_formats_pstrides)
GST_END_TEST;
+GST_START_TEST (test_video_flags)
+{
+ GstBuffer *buf;
+ GstVideoInfo info;
+ GstVideoFrame frame;
+
+ gst_video_info_init (&info);
+ fail_unless (gst_video_info_set_interlaced_format (&info,
+ GST_VIDEO_FORMAT_RGB, GST_VIDEO_INTERLACE_MODE_ALTERNATE, 4, 4));
+
+ buf = gst_buffer_new_and_alloc (GST_VIDEO_INFO_SIZE (&info));
+ fail_unless (gst_video_frame_map (&frame, &info, buf, GST_MAP_READ));
+ fail_unless (!GST_VIDEO_FRAME_IS_TOP_FIELD (&frame));
+ fail_unless (!GST_VIDEO_FRAME_IS_BOTTOM_FIELD (&frame));
+ gst_video_frame_unmap (&frame);
+ gst_buffer_unref (buf);
+
+ buf = gst_buffer_new_and_alloc (GST_VIDEO_INFO_SIZE (&info));
+ GST_BUFFER_FLAG_SET (buf, GST_VIDEO_BUFFER_FLAG_TOP_FIELD);
+ fail_unless (gst_video_frame_map (&frame, &info, buf, GST_MAP_READ));
+ fail_unless (GST_VIDEO_FRAME_IS_TOP_FIELD (&frame));
+ fail_unless (!GST_VIDEO_FRAME_IS_BOTTOM_FIELD (&frame));
+ gst_video_frame_unmap (&frame);
+ gst_buffer_unref (buf);
+
+ buf = gst_buffer_new_and_alloc (GST_VIDEO_INFO_SIZE (&info));
+ GST_BUFFER_FLAG_SET (buf, GST_VIDEO_BUFFER_FLAG_BOTTOM_FIELD);
+ fail_unless (gst_video_frame_map (&frame, &info, buf, GST_MAP_READ));
+ fail_unless (!GST_VIDEO_FRAME_IS_TOP_FIELD (&frame));
+ fail_unless (GST_VIDEO_FRAME_IS_BOTTOM_FIELD (&frame));
+ gst_video_frame_unmap (&frame);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
static Suite *
video_suite (void)
{
@@ -3096,6 +3132,7 @@ video_suite (void)
tcase_add_test (tc_chain, test_overlay_composition_over_transparency);
tcase_add_test (tc_chain, test_video_format_enum_stability);
tcase_add_test (tc_chain, test_video_formats_pstrides);
+ tcase_add_test (tc_chain, test_video_flags);
return s;
}