aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0005-convertframe-Support-video-crop-when-convert-frame.patch
blob: 096a6f4cba7732ef52f595f5b169358713413bbd (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
From 5be6ed00aad028d9cbb4e0c63af0be69d335c71e Mon Sep 17 00:00:00 2001
From: Song Bing <b06498@freescale.com>
Date: Fri, 11 Dec 2015 21:42:00 +0800
Subject: [PATCH] convertframe: Support video crop when convert frame

Get thumbnail will user convertframe to convert video frame to
desired video format and size. But haven't process crop meta on
the video buffer. Add support video crop.

https://bugzilla.gnome.org/show_bug.cgi?id=759329

Upstream-Status: Backport [1.7.1]

---
 gst-libs/gst/video/convertframe.c | 65 +++++++++++++++++++++++++++++++++------
 1 file changed, 56 insertions(+), 9 deletions(-)

diff --git a/gst-libs/gst/video/convertframe.c b/gst-libs/gst/video/convertframe.c
index aa9c3d3..942a51e 100644
--- a/gst-libs/gst/video/convertframe.c
+++ b/gst-libs/gst/video/convertframe.c
@@ -110,12 +110,23 @@ fail:
 static GstElement *
 build_convert_frame_pipeline (GstElement ** src_element,
     GstElement ** sink_element, const GstCaps * from_caps,
-    const GstCaps * to_caps, GError ** err)
+    GstVideoCropMeta * cmeta, const GstCaps * to_caps, GError ** err)
 {
-  GstElement *src = NULL, *csp = NULL, *vscale = NULL;
-  GstElement *sink = NULL, *encoder = NULL, *pipeline;
+  GstElement *vcrop = NULL, *csp = NULL, *csp2 = NULL, *vscale = NULL;
+  GstElement *src = NULL, *sink = NULL, *encoder = NULL, *pipeline;
+  GstVideoInfo info;
   GError *error = NULL;
 
+  if (cmeta) {
+    if (!create_element ("videocrop", &vcrop, &error)) {
+      g_warning
+          ("build_convert_frame_pipeline: Buffer has crop metadata but videocrop element is not found. Cropping will be disabled");
+    } else {
+      if (!create_element ("videoconvert", &csp2, &error))
+        goto no_elements;
+    }
+  }
+
   /* videoscale is here to correct for the pixel-aspect-ratio for us */
   GST_DEBUG ("creating elements");
   if (!create_element ("appsrc", &src, &error) ||
@@ -133,15 +144,42 @@ build_convert_frame_pipeline (GstElement ** src_element,
 
   GST_DEBUG ("adding elements");
   gst_bin_add_many (GST_BIN (pipeline), src, csp, vscale, sink, NULL);
+  if (vcrop)
+    gst_bin_add_many (GST_BIN (pipeline), vcrop, csp2, NULL);
 
   /* set caps */
   g_object_set (src, "caps", from_caps, NULL);
+  if (vcrop) {
+    gst_video_info_from_caps (&info, from_caps);
+    g_object_set (vcrop, "left", cmeta->x, NULL);
+    g_object_set (vcrop, "top", cmeta->y, NULL);
+    g_object_set (vcrop, "right", GST_VIDEO_INFO_WIDTH (&info) - cmeta->width,
+        NULL);
+    g_object_set (vcrop, "bottom",
+        GST_VIDEO_INFO_HEIGHT (&info) - cmeta->height, NULL);
+    GST_DEBUG ("crop meta [x,y,width,height]: %d %d %d %d", cmeta->x, cmeta->y,
+        cmeta->width, cmeta->height);
+  }
   g_object_set (sink, "caps", to_caps, NULL);
 
   /* FIXME: linking is still way too expensive, profile this properly */
-  GST_DEBUG ("linking src->csp");
-  if (!gst_element_link_pads (src, "src", csp, "sink"))
-    goto link_failed;
+  if (vcrop) {
+    GST_DEBUG ("linking src->csp2");
+    if (!gst_element_link_pads (src, "src", csp2, "sink"))
+      goto link_failed;
+
+    GST_DEBUG ("linking csp2->vcrop");
+    if (!gst_element_link_pads (csp2, "src", vcrop, "sink"))
+      goto link_failed;
+
+    GST_DEBUG ("linking vcrop->csp");
+    if (!gst_element_link_pads (vcrop, "src", csp, "sink"))
+      goto link_failed;
+  } else {
+    GST_DEBUG ("linking src->csp");
+    if (!gst_element_link_pads (src, "src", csp, "sink"))
+      goto link_failed;
+  }
 
   GST_DEBUG ("linking csp->vscale");
   if (!gst_element_link_pads_full (csp, "src", vscale, "sink",
@@ -193,8 +231,12 @@ no_elements:
   {
     if (src)
       gst_object_unref (src);
+    if (vcrop)
+      gst_object_unref (vcrop);
     if (csp)
       gst_object_unref (csp);
+    if (csp2)
+      gst_object_unref (csp2);
     if (vscale)
       gst_object_unref (vscale);
     if (sink)
@@ -209,7 +251,11 @@ no_elements:
 no_pipeline:
   {
     gst_object_unref (src);
+    if (vcrop)
+      gst_object_unref (vcrop);
     gst_object_unref (csp);
+    if (csp2)
+      gst_object_unref (csp2);
     gst_object_unref (vscale);
     gst_object_unref (sink);
 
@@ -282,7 +328,8 @@ gst_video_convert_sample (GstSample * sample, const GstCaps * to_caps,
   }
 
   pipeline =
-      build_convert_frame_pipeline (&src, &sink, from_caps, to_caps_copy, &err);
+      build_convert_frame_pipeline (&src, &sink, from_caps,
+      gst_buffer_get_video_crop_meta (buf), to_caps_copy, &err);
   if (!pipeline)
     goto no_pipeline;
 
@@ -646,8 +693,8 @@ gst_video_convert_sample_async (GstSample * sample,
   }
 
   pipeline =
-      build_convert_frame_pipeline (&src, &sink, from_caps, to_caps_copy,
-      &error);
+      build_convert_frame_pipeline (&src, &sink, from_caps,
+      gst_buffer_get_video_crop_meta (buf), to_caps_copy, &error);
   if (!pipeline)
     goto no_pipeline;
 
-- 
2.5.0