video-info: handle 'field-order' in alternate mode
authorGuillaume Desmottes <guillaume.desmottes@collabora.com>
Thu, 22 Nov 2018 11:13:06 +0000 (12:13 +0100)
committerGuillaume Desmottes <guillaume.desmottes@collabora.com>
Mon, 25 Mar 2019 14:35:46 +0000 (15:35 +0100)
The alternate interlace mode may also use the 'field-order' field in caps.

gst-libs/gst/video/video-info.c
tests/check/libs/video.c

index 2abbc74..1acac24 100644 (file)
@@ -455,7 +455,8 @@ gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps)
   else
     info->interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
 
-  if (info->interlace_mode == GST_VIDEO_INTERLACE_MODE_INTERLEAVED &&
+  if ((info->interlace_mode == GST_VIDEO_INTERLACE_MODE_INTERLEAVED ||
+          info->interlace_mode == GST_VIDEO_INTERLACE_MODE_ALTERNATE) &&
       (s = gst_structure_get_string (structure, "field-order"))) {
     GST_VIDEO_INFO_FIELD_ORDER (info) = gst_video_field_order_from_string (s);
   } else {
@@ -636,7 +637,8 @@ gst_video_info_to_caps (GstVideoInfo * info)
   gst_caps_set_simple (caps, "interlace-mode", G_TYPE_STRING,
       gst_video_interlace_mode_to_string (info->interlace_mode), NULL);
 
-  if (info->interlace_mode == GST_VIDEO_INTERLACE_MODE_INTERLEAVED &&
+  if ((info->interlace_mode == GST_VIDEO_INTERLACE_MODE_INTERLEAVED ||
+          info->interlace_mode == GST_VIDEO_INTERLACE_MODE_ALTERNATE) &&
       GST_VIDEO_INFO_FIELD_ORDER (info) != GST_VIDEO_FIELD_ORDER_UNKNOWN) {
     gst_caps_set_simple (caps, "field-order", G_TYPE_STRING,
         gst_video_field_order_to_string (GST_VIDEO_INFO_FIELD_ORDER (info)),
index 0054949..0959318 100644 (file)
@@ -1253,8 +1253,9 @@ GST_START_TEST (test_interlace_mode)
   GstCaps *caps;
   GstStructure *structure;
   GstCapsFeatures *features;
-  const char *mode_str;
+  const char *mode_str, *order_str;
   int mode;
+  GstVideoFieldOrder order;
 
   gst_video_info_init (&vinfo);
 
@@ -1283,6 +1284,7 @@ GST_START_TEST (test_interlace_mode)
   fail_unless (gst_video_info_set_interlaced_format (&vinfo,
           GST_VIDEO_FORMAT_YV12, GST_VIDEO_INTERLACE_MODE_ALTERNATE, 320, 240));
   fail_unless (GST_VIDEO_INFO_SIZE (&vinfo) == 57600);
+  GST_VIDEO_INFO_FIELD_ORDER (&vinfo) = GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST;
 
   caps = gst_video_info_to_caps (&vinfo);
   fail_unless (caps != NULL);
@@ -1291,6 +1293,9 @@ GST_START_TEST (test_interlace_mode)
   mode_str = gst_structure_get_string (structure, "interlace-mode");
   mode = gst_video_interlace_mode_from_string (mode_str);
   fail_unless (mode == GST_VIDEO_INTERLACE_MODE_ALTERNATE);
+  order_str = gst_structure_get_string (structure, "field-order");
+  order = gst_video_field_order_from_string (order_str);
+  fail_unless (order == GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST);
   /* 'alternate' mode must always be accompanied by interlaced caps feature. */
   features = gst_caps_get_features (caps, 0);
   fail_unless (gst_caps_features_contains (features,
@@ -1300,6 +1305,8 @@ GST_START_TEST (test_interlace_mode)
   fail_unless (gst_video_info_from_caps (&vinfo, caps));
   fail_unless (GST_VIDEO_INFO_INTERLACE_MODE (&vinfo) ==
       GST_VIDEO_INTERLACE_MODE_ALTERNATE);
+  fail_unless (GST_VIDEO_INFO_FIELD_ORDER (&vinfo) ==
+      GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST);
 
   gst_caps_unref (caps);
 }