Added TI patches, generated from commit 04f9d72 of the following tree:
[ubuntu-omap:gst-plugins-bad1-0.git] / debian / patches / 0066-PATCH-06-33-kmssink-rework-the-mode-selection-code.patch
1 From 4d8ab8eb07e35df3710541b62f38492be7c15c6d Mon Sep 17 00:00:00 2001
2 From: Alessandro Decina <alessandro.decina@collabora.co.uk>
3 Date: Wed, 16 May 2012 12:07:20 +0000
4 Subject: [PATCH 066/100] [PATCH 06/33] kmssink: rework the mode selection
5  code
6
7 Simplify the mode selection code and take cropping into account.
8 ---
9  sys/kms/gstdrmutils.c |  119 ++++++++++++++++++++++++++++---------------------
10  sys/kms/gstdrmutils.h |    6 +--
11  sys/kms/gstkmssink.c  |   43 ++++++------------
12  3 files changed, 85 insertions(+), 83 deletions(-)
13
14 diff --git a/sys/kms/gstdrmutils.c b/sys/kms/gstdrmutils.c
15 index b701812..216f416 100644
16 --- a/sys/kms/gstdrmutils.c
17 +++ b/sys/kms/gstdrmutils.c
18 @@ -1,68 +1,43 @@
19  #include "gstdrmutils.h"
20  
21  gboolean
22 -gst_drm_connector_find_mode (int fd, drmModeRes * resources,
23 -    drmModePlaneRes * plane_resources, struct connector *c)
24 +gst_drm_connector_find_mode_and_plane (int fd, int width, int height,
25 +    drmModeRes * resources, drmModePlaneRes * plane_resources,
26 +    struct connector *c, drmModePlane ** out_plane)
27  {
28 -  drmModeConnector *connector;
29 -  int i, j;
30 +  drmModeConnector *connector = NULL;
31 +  int i;
32  
33    /* First, find the connector & mode */
34    c->mode = NULL;
35 -  for (i = 0; i < resources->count_connectors; i++) {
36 -    connector = drmModeGetConnector (fd, resources->connectors[i]);
37 -
38 -    if (!connector) {
39 -      GST_ERROR ("could not get connector %i: %s",
40 -          resources->connectors[i], strerror (errno));
41 -      drmModeFreeConnector (connector);
42 -      continue;
43 -    }
44 -
45 -    if (!connector->count_modes) {
46 -      drmModeFreeConnector (connector);
47 -      continue;
48 -    }
49 -
50 -    if (connector->connector_id != c->id) {
51 -      drmModeFreeConnector (connector);
52 -      continue;
53 -    }
54 +  c->encoder = NULL;
55 +  connector = drmModeGetConnector (fd, c->id);
56 +  if (!connector)
57 +    goto error_no_connector;
58  
59 -    for (j = 0; j < connector->count_modes; j++) {
60 -      c->mode = &connector->modes[j];
61 -      if (!strcmp (c->mode->name, c->mode_str))
62 -        break;
63 -    }
64 +  if (!connector->count_modes)
65 +    goto error_no_mode;
66  
67 -    /* Found it, break out */
68 -    if (c->mode)
69 +  for (i = 0; i < connector->count_modes; i++) {
70 +    c->mode = &connector->modes[i];
71 +    if (c->mode->hdisplay == width && c->mode->vdisplay == height)
72        break;
73 -
74 -    drmModeFreeConnector (connector);
75 +    else
76 +      c->mode = NULL;
77    }
78  
79 -  if (!c->mode) {
80 -    GST_ERROR ("failed to find mode \"%s\"", c->mode_str);
81 -    return FALSE;
82 +  if (c->mode == NULL) {
83 +    /* XXX: just pick the first available mode. Not sure this is correct... */
84 +    c->mode = &connector->modes[0];
85 +#if 0
86 +    goto error_no_mode;
87 +#endif
88    }
89  
90    /* Now get the encoder */
91 -  for (i = 0; i < resources->count_encoders; i++) {
92 -    c->encoder = drmModeGetEncoder (fd, resources->encoders[i]);
93 -
94 -    if (!c->encoder) {
95 -      GST_ERROR ("could not get encoder %i: %s",
96 -          resources->encoders[i], strerror (errno));
97 -      drmModeFreeEncoder (c->encoder);
98 -      continue;
99 -    }
100 -
101 -    if (c->encoder->encoder_id == connector->encoder_id)
102 -      break;
103 -
104 -    drmModeFreeEncoder (c->encoder);
105 -  }
106 +  c->encoder = drmModeGetEncoder (fd, connector->encoder_id);
107 +  if (!c->encoder)
108 +    goto error_no_encoder;
109  
110    if (c->crtc == -1)
111      c->crtc = c->encoder->crtc_id;
112 @@ -77,7 +52,49 @@ gst_drm_connector_find_mode (int fd, drmModeRes * resources,
113    }
114  
115    if (c->pipe == -1)
116 -    return FALSE;
117 +    goto error_no_crtc;
118 +
119 +  *out_plane = NULL;
120 +  for (i = 0; i < plane_resources->count_planes; i++) {
121 +    drmModePlane *plane = drmModeGetPlane (fd, plane_resources->planes[i]);
122 +    if (plane->possible_crtcs & (1 << c->pipe)) {
123 +      *out_plane = plane;
124 +      break;
125 +    }
126 +  }
127 +
128 +  if (*out_plane == NULL)
129 +    goto error_no_plane;
130  
131    return TRUE;
132 +
133 +fail:
134 +  if (c->encoder)
135 +    drmModeFreeEncoder (c->encoder);
136 +
137 +  if (connector)
138 +    drmModeFreeConnector (connector);
139 +
140 +  return FALSE;
141 +
142 +error_no_connector:
143 +  GST_ERROR ("could not get connector %s", strerror (errno));
144 +  goto fail;
145 +
146 +error_no_mode:
147 +  GST_ERROR ("could not find mode %dx%d (count_modes %d)",
148 +      width, height, connector->count_modes);
149 +  goto fail;
150 +
151 +error_no_encoder:
152 +  GST_ERROR ("could not get encoder: %s", strerror (errno));
153 +  goto fail;
154 +
155 +error_no_crtc:
156 +  GST_ERROR ("couldn't find a crtc");
157 +  goto fail;
158 +
159 +error_no_plane:
160 +  GST_ERROR ("couldn't find a plane");
161 +  goto fail;
162  }
163 diff --git a/sys/kms/gstdrmutils.h b/sys/kms/gstdrmutils.h
164 index 8d1feb1..c479dc0 100644
165 --- a/sys/kms/gstdrmutils.h
166 +++ b/sys/kms/gstdrmutils.h
167 @@ -20,8 +20,8 @@ struct connector {
168         int pipe;
169  };
170  
171 -gboolean gst_drm_connector_find_mode (int fd, drmModeRes *resources,
172 -    drmModePlaneRes *plane_resources,
173 -    struct connector *c);
174 +gboolean gst_drm_connector_find_mode_and_plane (int fd, int width, int height,
175 +    drmModeRes *resources, drmModePlaneRes *plane_resources,
176 +    struct connector *c, drmModePlane **out_plane);
177  
178  #endif /* __GST_DRMUTILS_H__ */
179 diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
180 index fced42d..35c19cf 100644
181 --- a/sys/kms/gstkmssink.c
182 +++ b/sys/kms/gstkmssink.c
183 @@ -107,7 +107,7 @@ gst_kms_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
184    gint par_n, par_d;
185    GstVideoFormat format;
186    GstDucatiBufferAllocator *allocator;
187 -  int size, i;
188 +  int size;
189  
190    sink = GST_KMS_SINK (bsink);
191  
192 @@ -123,9 +123,6 @@ gst_kms_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
193      return FALSE;
194    }
195  
196 -  if (!gst_kms_sink_calculate_aspect_ratio (sink, width, height, par_n, par_d))
197 -    return FALSE;
198 -
199    sink->format = format;
200    sink->par_n = par_n;
201    sink->par_d = par_d;
202 @@ -135,7 +132,6 @@ gst_kms_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
203    sink->input_width = width;
204    sink->input_height = height;
205  
206 -
207    if (!sink->pool || !gst_caps_is_equal (caps, sink->pool->caps)) {
208      if (sink->pool) {
209        gst_ducati_buffer_pool_destroy (sink->pool);
210 @@ -154,36 +150,13 @@ gst_kms_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
211    /* make connector-id a property? */
212    sink->conn.id = 7;
213    sink->conn.crtc = -1;
214 -  snprintf (sink->conn.mode_str, sizeof (sink->conn.mode_str),
215 -      "%dx%d", GST_VIDEO_SINK_WIDTH (sink), GST_VIDEO_SINK_HEIGHT (sink));
216 -
217 -  if (!gst_drm_connector_find_mode (sink->fd,
218 -          sink->resources, sink->plane_resources, &sink->conn))
219 -    goto connector_not_found;
220 -
221    sink->plane = NULL;
222 -  for (i = 0; i < sink->plane_resources->count_planes; i++) {
223 -    drmModePlane *plane = drmModeGetPlane (sink->fd,
224 -        sink->plane_resources->planes[i]);
225 -    if (plane->possible_crtcs & (1 << sink->conn.pipe)) {
226 -      sink->plane = plane;
227 -      break;
228 -    }
229 -  }
230 -
231 -  if (sink->plane == NULL)
232 -    goto plane_not_found;
233  
234    return TRUE;
235  
236  fail:
237    return FALSE;
238  
239 -connector_not_found:
240 -  GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
241 -      (NULL), ("connector not found", strerror (errno), errno));
242 -  goto fail;
243 -
244  plane_not_found:
245    GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, (NULL), ("plane not found"));
246    goto fail;
247 @@ -221,6 +194,13 @@ gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * inbuf)
248    GstFlowReturn flow_ret = GST_FLOW_OK;
249    int ret;
250  
251 +  if (sink->conn.crtc == -1) {
252 +    if (!gst_drm_connector_find_mode_and_plane (sink->fd,
253 +            sink->crop.w, sink->crop.h,
254 +            sink->resources, sink->plane_resources, &sink->conn, &sink->plane))
255 +      goto connector_not_found;
256 +  }
257 +
258    if (GST_IS_DUCATI_KMS_BUFFER (inbuf)) {
259      kms_buf = GST_DUCATI_KMS_BUFFER (gst_buffer_ref (inbuf));
260      buf = GST_BUFFER (kms_buf);
261 @@ -247,7 +227,7 @@ gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * inbuf)
262    ret = drmModeSetPlane (sink->fd, sink->plane->plane_id,
263        sink->conn.crtc, kms_buf->fb_id, 0,
264        /* make video fullscreen: */
265 -      0, 0, sink->conn.mode->hdisplay, sink->conn.mode->vdisplay,
266 +      0, 0, sink->crop.w, sink->crop.h,
267        /* source/cropping coordinates are given in Q16 */
268        sink->crop.x << 16, sink->crop.y << 16,
269        sink->crop.w << 16, sink->crop.h << 16);
270 @@ -269,6 +249,11 @@ set_plane_failed:
271        (NULL), ("drmModeSetPlane failed: %s (%d)", strerror (errno), errno));
272    flow_ret = GST_FLOW_ERROR;
273    goto out;
274 +
275 +connector_not_found:
276 +  GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
277 +      (NULL), ("connector not found", strerror (errno), errno));
278 +  goto out;
279  }
280  
281  
282 -- 
283 1.7.9.5
284