summaryrefslogtreecommitdiff
path: root/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0035-videoaggregator-passthrough-interlace-mo.patch
blob: 3084ba57d3ca473ad98be3e9d9e086b62892ba06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
From ed7ce121daa3c5fdfa8d32eeff30c4fb7332017b Mon Sep 17 00:00:00 2001
From: Haihua Hu <jared.hu@nxp.com>
Date: Mon, 18 Sep 2017 15:11:41 +0800
Subject: [PATCH 1/2] [MMFMWK-7736] videoaggregator: passthrough interlace mode
 when update src caps

Upstream-Status: Pending
https://bugzilla.gnome.org/show_bug.cgi?id=787819
---
 gst-libs/gst/video/gstvideoaggregator.c | 59 ++++++++++++++++++++++-----------
 1 file changed, 39 insertions(+), 20 deletions(-)

diff --git a/gst-libs/gst/video/gstvideoaggregator.c b/gst-libs/gst/video/gstvideoaggregator.c
index a987c15..246ff8b 100644
--- a/gst-libs/gst/video/gstvideoaggregator.c
+++ b/gst-libs/gst/video/gstvideoaggregator.c
@@ -691,6 +691,26 @@ gst_video_aggregator_default_update_caps (GstVideoAggregator * vagg,
   return ret;
 }
 
+static gboolean
+gst_video_aggregator_get_sinkpads_interlace_mode (GstVideoAggregator * vagg,
+    GstVideoAggregatorPad * skip_pad, GstVideoInterlaceMode * mode)
+{
+  GList *walk;
+
+  for (walk = GST_ELEMENT (vagg)->sinkpads; walk; walk = g_list_next (walk)) {
+    GstVideoAggregatorPad *vaggpad = walk->data;
+
+    if (skip_pad && vaggpad == skip_pad)
+      continue;
+    if (vaggpad->info.finfo
+        && GST_VIDEO_INFO_FORMAT (&vaggpad->info) != GST_VIDEO_FORMAT_UNKNOWN) {
+      *mode = GST_VIDEO_INFO_INTERLACE_MODE (&vaggpad->info);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
 /* WITH GST_VIDEO_AGGREGATOR_LOCK TAKEN */
 static gboolean
 gst_video_aggregator_update_src_caps (GstVideoAggregator * vagg)
@@ -787,6 +807,25 @@ gst_video_aggregator_update_src_caps (GstVideoAggregator * vagg)
       }
     }
 
+    /* configure for interlace mode, we can only pass through interlace mode */
+    {
+      GstVideoInterlaceMode interlace_mode = GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
+      gboolean has_mode = FALSE;
+      GstStructure *s;
+      guint i, n;
+      has_mode =
+          gst_video_aggregator_get_sinkpads_interlace_mode (vagg, NULL,
+          &interlace_mode);
+
+      n = gst_caps_get_size (caps);
+      for (i = 0; i < n; i++) {
+        s = gst_caps_get_structure (caps, i);
+        if (has_mode)
+          gst_structure_set (s, "interlace-mode", G_TYPE_STRING,
+              gst_video_interlace_mode_to_string (interlace_mode), NULL);
+      }
+    }
+
     gst_video_info_from_caps (&vagg->info, caps);
 
     if (vaggpad_klass->set_info) {
@@ -820,26 +859,6 @@ done:
 }
 
 static gboolean
-gst_video_aggregator_get_sinkpads_interlace_mode (GstVideoAggregator * vagg,
-    GstVideoAggregatorPad * skip_pad, GstVideoInterlaceMode * mode)
-{
-  GList *walk;
-
-  for (walk = GST_ELEMENT (vagg)->sinkpads; walk; walk = g_list_next (walk)) {
-    GstVideoAggregatorPad *vaggpad = walk->data;
-
-    if (skip_pad && vaggpad == skip_pad)
-      continue;
-    if (vaggpad->info.finfo
-        && GST_VIDEO_INFO_FORMAT (&vaggpad->info) != GST_VIDEO_FORMAT_UNKNOWN) {
-      *mode = GST_VIDEO_INFO_INTERLACE_MODE (&vaggpad->info);
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-static gboolean
 gst_video_aggregator_pad_sink_setcaps (GstPad * pad, GstObject * parent,
     GstCaps * caps)
 {
-- 
1.9.1