Signed-off-by: Eric Ruei <[email protected]> --- ...mera-demo-Enhance-to-support-both-AM4-AM5.patch | 469 --------------------- .../dual-camera-demo/dual_camera_qt5.sh | 2 +- .../dual-camera-demo/dual_camera_qt5_omap-a15.sh | 13 - .../dual-camera-demo/dual-camera-demo_1.0.bb | 7 +- 4 files changed, 3 insertions(+), 488 deletions(-) delete mode 100644 meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch delete mode 100644 meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh
diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch deleted file mode 100644 index a8e0063..0000000 --- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch +++ /dev/null @@ -1,469 +0,0 @@ -From 86ed5c9c3f9b8e71cd9980f847623af0caf4c187 Mon Sep 17 00:00:00 2001 -From: Eric Ruei <[email protected]> -Date: Mon, 21 Mar 2016 16:27:58 -0400 -Subject: [PATCH] dual camera demo: Enhance to support both AM4/AM5 - -- Initialize and restore DRM plane zorders -- Add input parameter trans_key_mode (AM4:1;AM5:2) -- Cleanup the exit sequence to avoid unnecessary operations and warnings - - -Signed-off-by: Eric Ruei <[email protected]> ---- - loopback.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- - loopback.h | 1 + - main.cpp | 36 ++++++++-- - 3 files changed, 228 insertions(+), 36 deletions(-) - -diff --git a/loopback.c b/loopback.c -index dda0390..66052b3 100644 ---- a/loopback.c -+++ b/loopback.c -@@ -34,7 +34,9 @@ - #define FOURCC_STR(str) FOURCC(str[0], str[1], str[2], str[3]) - - #define PAGE_SHIFT 12 --#define NBUF (3) -+#define NBUF (3) -+#define MAX_DRM_PLANES 5 -+ - - struct control status; - -@@ -64,14 +66,22 @@ struct drm_device_info - { - int fd; - int width; -- int height; -+ int height; -+ unsigned int num_planes; - char dev_name[9]; - char name[4]; - unsigned int bo_flags; - struct dmabuf_buffer **buf[2]; - struct omap_device *dev; - unsigned int crtc_id; -- unsigned plane_id[2]; -+ unsigned int plane_id[2]; -+ unsigned int prop_id_trans_key_mode; -+ unsigned int prop_id_alpha_blender; -+ unsigned int prop_id_zorder; -+ uint64_t prop_value_trans_key_mode; -+ uint64_t prop_value_alpha_blender; -+ uint32_t prop_value_zorder[MAX_DRM_PLANES]; -+ uint32_t drm_plane_id[MAX_DRM_PLANES]; - bool multiplanar; /* True when Y and U/V are in separate buffers. */ - } drm_device; - -@@ -500,6 +510,121 @@ struct dmabuf_buffer *v4l2_dequeue_buffer(struct v4l2_device_info *device) - } - - return buf; -+} -+ -+/* -+ * Reorder the zorder of DRM planes to the desired order for demo -+ * VID1: 1 -+ * VID2: 2 -+ * CRTC: 3 -+ */ -+ -+int drm_init_plane_zorder(struct drm_device_info *device) -+{ -+ int i,j; -+ drmModePlaneRes *res; -+ drmModePlane *plane; -+ drmModeObjectProperties *props; -+ drmModePropertyRes *props_info; -+ uint32_t zorder=1; -+ int ret = 0; -+ -+ // This will explain the planes to include CRTC, but setPlane is not applicable to -+ // the CRTC plane -+ drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); -+ -+ res = drmModeGetPlaneResources(device->fd); -+ -+ if(res == NULL){ -+ ERROR("plane resources not found\n"); -+ ret = -1; -+ goto drm_init_plane_zorder_error; -+ } -+ -+ //DBG("drm_init_plane_zorder:no. of planes = %d\n", res->count_planes); -+ -+ if (res->count_planes > MAX_DRM_PLANES) -+ { -+ -+ ERROR("There are two many DRM planes (%d > %d)\n", res->count_planes, MAX_DRM_PLANES); -+ ret = -1; -+ goto drm_init_plane_zorder_error; -+ } -+ -+ device->num_planes = res->count_planes; -+ for (i = 0; i < res->count_planes; i++) { -+ uint32_t plane_id = res->planes[i]; -+ bool fCRTC = 0; -+ uint32_t zorder_value = 3; -+ -+ drmModePlane *plane = drmModeGetPlane(device->fd, plane_id); -+ if(plane == NULL){ -+ ERROR("plane (%d) not found\n", plane_id); -+ continue; -+ } -+ -+ // TBD: check for required plane attributes -+ device->drm_plane_id[i] = plane->plane_id; -+ -+ props = drmModeObjectGetProperties(device->fd, plane->plane_id, DRM_MODE_OBJECT_PLANE); -+ -+ if(props == NULL){ -+ ERROR("plane (%d) properties not found\n", plane->plane_id); -+ continue; -+ } -+ -+ for (j = 0; j < props->count_props; j++) -+ { -+ props_info = drmModeGetProperty(device->fd, props->props[j]); -+ -+ if(props_info == NULL){ -+ ERROR("plane(%d) props[%d] not found\n", plane->plane_id, j); -+ continue; -+ } -+ -+ if (strcmp("type", props_info->name) == 0) -+ { -+ fCRTC = (props->prop_values[j] == 1)?1:0; -+ } -+ else if ((strcmp("zorder", props_info->name) == 0)) -+ { -+ if (!device->prop_id_zorder) -+ { -+ device->prop_id_zorder = props_info->prop_id; -+ } -+ device->prop_value_zorder[i] = (uint32_t)props->prop_values[j]; -+ } -+ -+ drmModeFreeProperty(props_info); -+ } -+ -+ /* Re-arrange zorder */ -+ if (!fCRTC) -+ { -+ zorder_value = zorder++; -+ } -+ -+ j = drmModeObjectSetProperty(device->fd, plane->plane_id, -+ DRM_MODE_OBJECT_PLANE, device->prop_id_zorder, -+ (uint64_t)zorder_value); -+ -+ if (j < 0) { -+ ERROR("set z-order for plane id %d failed\n", plane->plane_id); -+ } -+ -+ drmModeFreeObjectProperties(props); -+ drmModeFreePlane(plane); -+ -+ } -+ -+ drmModeFreePlaneResources(res); -+ -+drm_init_plane_zorder_error: -+ -+ drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0); -+ -+ return(ret); -+ - } - - uint32_t drm_reserve_plane(int fd) -@@ -508,7 +633,7 @@ uint32_t drm_reserve_plane(int fd) - drmModePlaneRes *res = drmModeGetPlaneResources(fd); - if(res == NULL){ - ERROR("plane resources not found\n"); -- } -+ } - - for (i = 0; i < res->count_planes; i++) { - uint32_t plane_id = res->planes[i]; -@@ -520,7 +645,7 @@ uint32_t drm_reserve_plane(int fd) - continue; - - drmModePlane *plane = drmModeGetPlane(fd, plane_id); -- if(res == NULL){ -+ if(plane == NULL){ - ERROR("plane not found\n"); - } - -@@ -577,9 +702,45 @@ void drm_crtc_resolution(struct drm_device_info *device) - device->height = crtc->height; - - drmModeFreeCrtc(crtc); -- drmModeFreeResources(res); -+ } -+ -+ drmModeFreeResources(res); -+ -+} -+ -+/* -+ * DRM restore properties -+ */ -+static void drm_restore_props(struct drm_device_info *device) -+{ -+ unsigned int i; -+ -+ /* restore the original zorder of DRM planes */ -+ -+ drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); -+ -+ for (i = 0; i < device->num_planes; i++) { -+ if (device->drm_plane_id[i]) -+ { -+ drmModeObjectSetProperty(device->fd, device->drm_plane_id[i], -+ DRM_MODE_OBJECT_PLANE, device->prop_id_zorder, -+ (uint64_t)device->prop_value_zorder[i]); -+ } - } --} -+ -+ drmSetClientCap(device->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0); -+ -+ if(device->prop_id_trans_key_mode){ -+ drmModeObjectSetProperty(device->fd, device->crtc_id, -+ DRM_MODE_OBJECT_CRTC, device->prop_id_trans_key_mode, device->prop_value_trans_key_mode); -+ } -+ -+ if(device->prop_id_alpha_blender){ -+ drmModeObjectSetProperty(device->fd, device->crtc_id, -+ DRM_MODE_OBJECT_CRTC, device->prop_id_alpha_blender, device->prop_value_alpha_blender); -+ } -+} -+ - /* - * drm device init - */ -@@ -587,12 +748,14 @@ static int drm_init_device(struct drm_device_info *device) - { - unsigned char j; - -- if (!device->fd) { -+ if (!device->fd) { - device->fd = drmOpen("omapdrm", NULL); - if (device->fd < 0) { - ERROR("could not open drm device: %s (%d)", strerror(errno), errno); - return -1; -- } -+ } -+ if (drm_init_plane_zorder(device)) -+ return -1; - } - - device->dev = omap_device_new(device->fd); -@@ -600,16 +763,15 @@ static int drm_init_device(struct drm_device_info *device) - /* Get CRTC id and resolution. As well set the global display width and height */ - drm_crtc_resolution(device); - -- - /* Store display resolution so GUI can be configured */ - status.display_xres = device->width; -- status.display_yres = device->height; -+ status.display_yres = device->height; - - /* AM437x has two video planes and one graphics plane. */ - /* Get one video plane for each camera */ - for (j = 0; j < status.num_cams; j++) { - -- device->plane_id[j] = drm_reserve_plane(device->fd); -+ device->plane_id[j] = drm_reserve_plane(device->fd); - } - - return 0; -@@ -619,7 +781,9 @@ static int drm_init_device(struct drm_device_info *device) - *Clean resources while exiting drm device - */ - static void drm_exit_device(struct drm_device_info *device) --{ -+{ -+ -+ drm_restore_props(device); - omap_device_del(device->dev); - device->dev = NULL; - -@@ -637,8 +801,6 @@ static int drm_init_dss(void) - { - drmModeObjectProperties *props; - drmModePropertyRes *propRes; -- unsigned int prop_trans_key_mode = 0; -- unsigned int prop_alpha_blender = 0; - unsigned int j; - - props = drmModeObjectGetProperties(drm_device.fd, drm_device.crtc_id, -@@ -651,41 +813,43 @@ static int drm_init_dss(void) - continue; - - if (strcmp(propRes->name, "trans-key-mode") == 0) { -- prop_trans_key_mode = props->props[j]; -+ drm_device.prop_id_trans_key_mode = props->props[j]; -+ drm_device.prop_value_trans_key_mode = props->prop_values[j]; - } - - if (strcmp(propRes->name, "alpha_blender") == 0) { -- prop_alpha_blender = props->props[j]; -+ drm_device.prop_id_alpha_blender = props->props[j]; -+ drm_device.prop_value_alpha_blender = props->prop_values[j]; - } - -- if(prop_alpha_blender & prop_trans_key_mode){ -+ if(drm_device.prop_id_trans_key_mode & drm_device.prop_id_alpha_blender){ - break; - } - } - -- if(prop_trans_key_mode == 0){ -- ERROR("TRANSPARENCY PROPERTY NOT FOUND\n"); -+ if(drm_device.prop_id_trans_key_mode == 0){ -+ ERROR("TRANSPARENCY PROPERTY NOT FOUND\n"); - return -1; - } - -- if(prop_alpha_blender == 0){ -+ if(drm_device.prop_id_alpha_blender == 0){ - ERROR("ALPHA BLENDER PROPERTY NOT FOUND\n"); - return -1; - } - - /* Enable the transparency color key */ - if (drmModeObjectSetProperty(drm_device.fd, drm_device.crtc_id, -- DRM_MODE_OBJECT_CRTC, prop_trans_key_mode, 1) < 0) { -+ DRM_MODE_OBJECT_CRTC, drm_device.prop_id_trans_key_mode, status.trans_key_mode) < 0) { - ERROR("error setting drm property for transparency key mode\n"); - return -1; - } - -- /* Enable the LCD alpha blender */ -+ /* Enable the LCD alpha blender */ - if (drmModeObjectSetProperty(drm_device.fd, drm_device.crtc_id, -- DRM_MODE_OBJECT_CRTC, prop_alpha_blender, 1) < 0){ -+ DRM_MODE_OBJECT_CRTC, drm_device.prop_id_alpha_blender, 1) < 0){ - ERROR("error setting drm property for Alpha Blender\n"); - return -1; -- } -+ } - return 0; - } - -@@ -785,7 +949,8 @@ static int capture_frame(struct v4l2_device_info *v4l2_device) - */ - void default_parameters(void) - { -- /* Main camera display */ -+ /* Main camera display */ -+ memset(&drm_device, 0, sizeof(drm_device)); - strcpy(drm_device.dev_name,"/dev/drm"); - strcpy(drm_device.name,"drm"); - drm_device.width=0; -@@ -852,8 +1017,10 @@ void exit_devices(void) - */ - void end_streaming(void) - { -- v4l2_stream_off(&cap0_device); -- v4l2_stream_off(&cap1_device); -+ v4l2_stream_off(&cap0_device); -+ if (status.num_cams==2) { -+ v4l2_stream_off(&cap1_device); -+ } - } - - /* -@@ -967,7 +1134,7 @@ Error: - * whether a jpeg image needs to be captured. - */ - void process_frame(void) { -- -+ - /* Display the main camera */ - if (status.main_cam==0) - display_frame(&cap0_device, &drm_device, 0); -@@ -980,7 +1147,7 @@ void process_frame(void) { - display_frame(&cap1_device, &drm_device, 1); - else - display_frame(&cap0_device, &drm_device, 1); -- } -+ } - - /* Save jpeg image if triggered */ - if (status.jpeg==true) { -diff --git a/loopback.h b/loopback.h -index b20b996..4f468f4 100644 ---- a/loopback.h -+++ b/loopback.h -@@ -10,6 +10,7 @@ struct control { - int num_cams; - int num_jpeg; - int display_xres, display_yres; -+ int trans_key_mode; - bool pip; - bool jpeg; - bool exit; -diff --git a/main.cpp b/main.cpp -index e73b061..c5c6900 100644 ---- a/main.cpp -+++ b/main.cpp -@@ -1,23 +1,47 @@ - #include <qglobal.h> - #include <QApplication> --#include <QLabel> -+#include <QLabel> -+#include <QStringList> - - #if QT_VERSION < 0x050000 - #include <QWSServer> - #endif -- -- -+ - #include <QPushButton> --#include "mainwindow.h" -+#include "mainwindow.h" -+#include "loopback.h" -+ - - int main(int argc, char *argv[]) - { - QApplication a(argc, argv); -- MainWindow w; -+ QStringList args = a.arguments(); -+ -+ /* -+ * Extract the trans key mode which is SoC specific and can be -+ * found at the corresponding TRM, for example, -+ * For AM437x: trans_key_mode = 1 GFX Dest Trans -+ * TransKey applies to GFX overlay, marking which pixels come from VID overlays) -+ * For AM57xx: trans_key_mode = 2 Source Key. -+ * Match on Layer4 makes Layer4 transparent (zorder 3) -+ * -+ * The deault mode is 1 for backward compatibility -+ */ -+ -+ if((args.count() >= 2)) -+ { -+ status.trans_key_mode = (args[1].toInt() == 2)?2:1; -+ } -+ else -+ { -+ status.trans_key_mode = 1; -+ } - - #if QT_VERSION < 0x050000 - QWSServer::setBackground(QBrush(QColor(0, 0, 0, 0))); --#endif -+#endif -+ -+ MainWindow w; - - w.show(); - return a.exec(); --- -1.9.1 - diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh index 5774a06..4802337 100644 --- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5.sh @@ -5,7 +5,7 @@ sleep 1 echo 0 > /sys/class/graphics/fbcon/cursor_blink -dual_camera 1 -platform linuxfb +dual_camera -platform linuxfb echo 1 > /sys/class/graphics/fbcon/cursor_blink diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh deleted file mode 100644 index 3d96cde..0000000 --- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo/dual_camera_qt5_omap-a15.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -/etc/init.d/weston stop -sleep 1 - -echo 0 > /sys/class/graphics/fbcon/cursor_blink - -dual_camera 2 -platform linuxfb - -echo 1 > /sys/class/graphics/fbcon/cursor_blink - -/etc/init.d/weston start -sleep 1 diff --git a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb index 47d8ff3..1b1cbfe 100644 --- a/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb +++ b/meta-arago-extras/recipes-multimedia/dual-camera-demo/dual-camera-demo_1.0.bb @@ -7,24 +7,21 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c7ca707704d3354a64feeb4f19f52eb5" DEPENDS += "libdrm" require recipes-core/matrix/matrix-gui-paths.inc -PR = "r14" +PR = "r15" BRANCH = "drm" -SRCREV = "3be10676149c5f6e0ef1660d6b1ee4b9165dd993" +SRCREV = "9acc9b17da17ae84e3d4d25fb83d4a8e4cf53fd2" SRC_URI = "git://git.ti.com/sitara-linux/dual-camera-demo.git;protocol=git;branch=${BRANCH} \ file://desc_dual-camera.html \ file://dual_camera_qt5.sh \ - file://dual_camera_qt5_omap-a15.sh \ file://dual_camera_qt4.sh \ file://dual-camera.desktop \ - file://0001-dual-camera-demo-Enhance-to-support-both-AM4-AM5.patch \ " S = "${WORKDIR}/git" DEMO_SCRIPT = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5.sh', 'dual_camera_qt4.sh', d)}" -DEMO_SCRIPT_omap-a15 = "${@base_conditional('QT_PROVIDER', 'qt5', 'dual_camera_qt5_omap-a15.sh', 'dual_camera_qt4.sh', d)}" inherit qt-provider -- 1.9.1 _______________________________________________ meta-arago mailing list [email protected] http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago
