summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 20fe08a)
raw | patch | inline | side by side (parent: 20fe08a)
author | Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> | |
Fri, 26 Oct 2012 16:05:55 +0000 (17:05 +0100) | ||
committer | Nikhil Devshatwar <a0132237@ti.com> | |
Wed, 15 May 2013 13:18:40 +0000 (18:48 +0530) |
Allowed are type, type-index, and typeindex (eg, DVI-A, DVI-A-1,
DVI-A1, etc). Indices are 1 based to match what xrandr says.
DVI-A1, etc). Indices are 1 based to match what xrandr says.
sys/kms/gstdrmutils.c | patch | blob | history | |
sys/kms/gstdrmutils.h | patch | blob | history | |
sys/kms/gstkmssink.c | patch | blob | history | |
sys/kms/gstkmssink.h | patch | blob | history |
diff --git a/sys/kms/gstdrmutils.c b/sys/kms/gstdrmutils.c
index 5704aff0c512152399a02385bea63e060c4fdc88..d7a8dd6d004f3224c5dc48f7b5e8a877c327199c 100644 (file)
--- a/sys/kms/gstdrmutils.c
+++ b/sys/kms/gstdrmutils.c
* Boston, MA 02111-1307, USA.
*/
+#include <gst/gst.h>
#include "gstdrmutils.h"
+GST_DEBUG_CATEGORY_EXTERN (gst_debug_kms_sink);
+#define GST_CAT_DEFAULT gst_debug_kms_sink
+
void
-gst_drm_connector_cleanup (int fd, struct connector * c)
+gst_drm_connector_cleanup (int fd, struct connector *c)
{
if (c->connector) {
drmModeFreeConnector (c->connector);
static gboolean
gst_drm_connector_find_mode_and_plane_helper (int fd,
- struct omap_device * dev, int width, int height,
+ struct omap_device *dev, int width, int height,
drmModeRes * resources, drmModePlaneRes * plane_resources,
struct connector *c, drmModePlane ** out_plane)
{
return found;
}
+
+/* table nicked off libdrm's modetest.c */
+/* *INDENT-OFF* */
+static const struct {
+ int type_id;
+ const char *type_name;
+} connector_type_names[] = {
+ { DRM_MODE_CONNECTOR_Unknown, "unknown" },
+ { DRM_MODE_CONNECTOR_VGA, "VGA" },
+ { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
+ { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
+ { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
+ { DRM_MODE_CONNECTOR_Composite, "composite" },
+ { DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
+ { DRM_MODE_CONNECTOR_LVDS, "LVDS" },
+ { DRM_MODE_CONNECTOR_Component, "component" },
+ { DRM_MODE_CONNECTOR_9PinDIN, "9-pin-DIN" },
+ { DRM_MODE_CONNECTOR_DisplayPort, "displayport" },
+ { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
+ { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
+ { DRM_MODE_CONNECTOR_TV, "TV" },
+ { DRM_MODE_CONNECTOR_eDP, "embedded-displayport" },
+};
+/* *INDENT-ON* */
+
+gboolean
+gst_drm_connector_find_mode_and_plane_by_name (int fd,
+ struct omap_device * dev, int width, int height,
+ drmModeRes * resources, drmModePlaneRes * plane_resources,
+ struct connector * c, const char *name, drmModePlane ** out_plane)
+{
+ int i, n;
+ char tmp[64];
+ const char *type_name;
+ int found[G_N_ELEMENTS (connector_type_names)] = { 0 };
+
+ /* Find connector from name */
+ for (i = 0; i < resources->count_connectors; i++) {
+ GST_DEBUG ("Trying connector %d: %d", i, resources->connectors[i]);
+ c->id = resources->connectors[i];
+ c->connector = drmModeGetConnector (fd, c->id);
+ if (!c->connector)
+ continue;
+
+ /* Find type name from this connector */
+ for (n = 0; n < G_N_ELEMENTS (connector_type_names); n++)
+ if (connector_type_names[n].type_id == c->connector->connector_type)
+ break;
+ if (n == G_N_ELEMENTS (connector_type_names))
+ continue;
+
+ type_name = connector_type_names[n].type_name;
+ GST_DEBUG ("Connector %d has type %s", i, type_name);
+ ++found[n];
+
+ drmModeFreeConnector (c->connector);
+ c->connector = NULL;
+
+ /* Try a few different matches, such as modetest and xrandr
+ output, and also a indexless one matching first found */
+ snprintf (tmp, sizeof (tmp), "%s-%u", type_name, found[n]);
+ if (!g_ascii_strcasecmp (tmp, name))
+ goto found;
+ snprintf (tmp, sizeof (tmp), "%s%u", type_name, found[n]);
+ if (!g_ascii_strcasecmp (tmp, name))
+ goto found;
+ if (!g_ascii_strcasecmp (name, type_name))
+ goto found;
+
+ continue;
+
+ found:
+ if (gst_drm_connector_find_mode_and_plane_helper (fd, dev, width, height,
+ resources, plane_resources, c, out_plane)) {
+ GST_DEBUG ("Found suitable connector");
+ return TRUE;
+ }
+ GST_DEBUG ("Connector not suitable");
+ }
+
+ return FALSE;
+}
diff --git a/sys/kms/gstdrmutils.h b/sys/kms/gstdrmutils.h
index 54439c6bca3da1134956ca226b9bf7b0ba72ad53..053a24585fa020437b32d22a6dd7fe3c91c9741b 100644 (file)
--- a/sys/kms/gstdrmutils.h
+++ b/sys/kms/gstdrmutils.h
struct omap_device * dev, int width, int height,
drmModeRes * resources, drmModePlaneRes * plane_resources,
struct connector *c, drmModePlane ** out_plane);
+gboolean gst_drm_connector_find_mode_and_plane_by_name (int fd,
+ struct omap_device *dev, int width, int height,
+ drmModeRes * resources, drmModePlaneRes * plane_resources,
+ struct connector *c, const char *name,
+ drmModePlane ** out_plane);
#endif /* __GST_DRMUTILS_H__ */
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index 492b96c814b0d68cf07fad2722a3f2d27f3642bd..3e7a24b05c3b8b691d59a82150ef4267923d98fb 100644 (file)
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
#include <omap_drmif.h>
#include <xf86drmMode.h>
-GST_DEBUG_CATEGORY_STATIC (gst_debug_kms_sink);
+GST_DEBUG_CATEGORY (gst_debug_kms_sink);
#define GST_CAT_DEFAULT gst_debug_kms_sink
G_DEFINE_TYPE (GstKMSSink, gst_kms_sink, GST_TYPE_VIDEO_SINK);
PROP_FORCE_ASPECT_RATIO,
PROP_SCALE,
PROP_CONNECTOR,
+ PROP_CONNECTOR_NAME,
};
static gboolean
if (sink->conn.crtc == -1) {
GstVideoRectangle dest = { 0 };
- sink->conn.id = sink->conn_id;
- if (!gst_drm_connector_find_mode_and_plane (sink->fd,
- sink->dev, sink->src_rect.w, sink->src_rect.h,
- sink->resources, sink->plane_resources, &sink->conn, &sink->plane))
- goto connector_not_found;
+ if (sink->conn_name) {
+ if (!gst_drm_connector_find_mode_and_plane_by_name (sink->fd,
+ sink->dev, sink->src_rect.w, sink->src_rect.h,
+ sink->resources, sink->plane_resources, &sink->conn,
+ sink->conn_name, &sink->plane))
+ goto connector_not_found;
+ } else {
+ sink->conn.id = sink->conn_id;
+ if (!gst_drm_connector_find_mode_and_plane (sink->fd,
+ sink->dev, sink->src_rect.w, sink->src_rect.h,
+ sink->resources, sink->plane_resources, &sink->conn,
+ &sink->plane))
+ goto connector_not_found;
+ }
dest.w = sink->conn.mode->hdisplay;
dest.h = sink->conn.mode->vdisplay;
case PROP_CONNECTOR:
sink->conn_id = g_value_get_uint (value);
break;
+ case PROP_CONNECTOR_NAME:
+ g_free (sink->conn_name);
+ sink->conn_name = g_strdup (g_value_get_string (value));
+ break;
case PROP_PIXEL_ASPECT_RATIO:
{
GValue *tmp;
sink = GST_KMS_SINK (object);
gst_kms_sink_reset (sink);
+ g_free (sink->conn_name);
G_OBJECT_CLASS (gst_kms_sink_parent_class)->finalize (object);
}
g_param_spec_uint ("connector", "Connector",
"DRM connector id (0 for automatic selection)", 0, G_MAXUINT32, 0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (gobject_class, PROP_CONNECTOR_NAME,
+ g_param_spec_string ("connector-name", "Connector name",
+ "DRM connector name (alternative to the connector property, "
+ "use $type$index, $type-$index, or $type)", "",
+ G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT));
gst_element_class_set_details_simple (gstelement_class,
"Video sink", "Sink/Video",
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
index ef19a76603fb75430e60d441e7c97e0fa1af7c38..a7c8135885ffb31dc82b0e5399b939f3986a3753 100644 (file)
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
drmModePlaneRes *plane_resources;
struct connector conn;
uint32_t conn_id;
+ char *conn_name;
drmModePlane *plane;
GstDRMBufferPool *pool;
/* current displayed buffer and last displayed buffer: */