mirror of
git://nv-tegra.nvidia.com/tegra/gst-src/libgstnvdrmvideosink.git
synced 2025-12-22 09:23:03 +03:00
c3f21bd4363243ad1bca5b1d434b5896402eec14 - nvbuf_utils.h 15e77cc11e0be2e813a2a51eaa4256b1026dd16b - gst-nvdrmvideosink/gstnvdrmvideosink.h 464f6823a2241ec38d94c786e23d13dd4b4e2a14 - gst-nvdrmvideosink/Makefile 9585158bb7964cd32f4567f2c0f3504b7c9cf0fd - gst-nvdrmvideosink/gstnvdrmvideosink.c 444ba0e5976368618bd65182f9618af35e0b7946 - gst-nvdrmvideosink/LICENSE.libgstnvdrmvideosink c318d575f2c7cd3e805b4283f48da5547b152fd6 - gst-nvdrmvideosink/util/vt_switch.c ffd00e6dfee167cbf1a33f34d4b2c94269bd21b3 - gst-nvdrmvideosink/util/drmutil.c ef0f0a9b3cfbf3d5f2359e9185a75d258201e20a - gst-nvdrmvideosink/util/drmutil.h 31762975c758c9a6c0a0f2a811d6850440f347b6 - gst-nvdrmvideosink/util/vt_switch.h Change-Id: Icf4946ad7c96ec1021a68feb2529b75e4e407afe
186 lines
5.1 KiB
C
186 lines
5.1 KiB
C
/*
|
|
* Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* * Neither the name of NVIDIA CORPORATION nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <sys/ioctl.h>
|
|
#include <linux/vt.h>
|
|
#include <linux/kd.h>
|
|
|
|
#include "vt_switch.h"
|
|
|
|
/*
|
|
* release_vt - Sets the tty back to TEXT mode.
|
|
*/
|
|
void release_vt(struct vt_info *info)
|
|
{
|
|
int ret;
|
|
int kd_mode;
|
|
|
|
if (info->console_fd < 0) {
|
|
return;
|
|
}
|
|
|
|
ret = ioctl(info->console_fd, KDSETMODE, KD_TEXT);
|
|
if (ret < 0) {
|
|
printf("KDSETMODE KD_TEXT failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
|
|
ret = ioctl(info->console_fd, KDGETMODE, &kd_mode);
|
|
if (ret < 0) {
|
|
printf("KDGETMODE failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
|
|
if (info->active_vt >= 0) {
|
|
ret = ioctl(info->console_fd, VT_ACTIVATE, info->active_vt);
|
|
if (ret < 0) {
|
|
printf("VT_ACTIVATE failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
|
|
ret = ioctl(info->console_fd, VT_WAITACTIVE, info->active_vt);
|
|
if (ret < 0) {
|
|
printf("VT_WAITACTIVE failed, err= %s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
fail:
|
|
close(info->console_fd);
|
|
|
|
info->console_fd = -1;
|
|
info->active_vt = -1;
|
|
}
|
|
|
|
/*
|
|
* acquire_vt - Sets the tty to GRAPHICAL mode.
|
|
*/
|
|
int acquire_vt(struct vt_info *info)
|
|
{
|
|
int i, ret, fd, vtno, kd_mode;
|
|
struct vt_stat vts;
|
|
const char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL };
|
|
static char vtname[11];
|
|
|
|
fd = open("/dev/tty0", O_WRONLY);
|
|
if (fd < 0) {
|
|
printf("Can't open /dev/tty0 err=%s\n", strerror(errno));
|
|
return 0;
|
|
}
|
|
|
|
ret = ioctl(fd, VT_OPENQRY, &vtno);
|
|
if (ret < 0) {
|
|
printf("VT_OPENQRY failed, err=%s\n", strerror(errno));
|
|
close(fd);
|
|
return 0;
|
|
}
|
|
|
|
if (vtno == -1) {
|
|
printf("Can't find free VT\n");
|
|
close(fd);
|
|
return 0;
|
|
}
|
|
|
|
printf("Using VT number %d\n", vtno);
|
|
close(fd);
|
|
|
|
i = 0;
|
|
while (vcs[i] != NULL) {
|
|
snprintf(vtname, sizeof(vtname), vcs[i], vtno);
|
|
info->console_fd = open(vtname, O_RDWR | O_NDELAY, 0);
|
|
if (info->console_fd >= 0) {
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
if (info->console_fd < 0) {
|
|
printf("Can't open virtual console %d\n", vtno);
|
|
return 0;
|
|
}
|
|
|
|
|
|
ret = ioctl(info->console_fd, KDGETMODE, &kd_mode);
|
|
if (ret < 0) {
|
|
printf("KDGETMODE failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
|
|
if (kd_mode != KD_TEXT) {
|
|
printf("%s is already in graphics mode, "
|
|
"seems like some display server running\n", vtname);
|
|
}
|
|
|
|
ret = ioctl(info->console_fd, VT_ACTIVATE, vtno);
|
|
if (ret < 0) {
|
|
printf("VT_ACTIVATE failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
|
|
ret = ioctl(info->console_fd, VT_WAITACTIVE, vtno);
|
|
if (ret < 0) {
|
|
printf("VT_WAITACTIVE failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
|
|
ret = ioctl(info->console_fd, VT_GETSTATE, &vts);
|
|
if (ret < 0) {
|
|
printf("VT_GETSTATE failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
} else {
|
|
info->active_vt = vts.v_active;
|
|
}
|
|
|
|
ret = ioctl(info->console_fd, KDSETMODE, KD_GRAPHICS);
|
|
if (ret < 0) {
|
|
printf("KDSETMODE KD_GRAPHICS failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
|
|
ret = ioctl(info->console_fd, KDGETMODE, &kd_mode);
|
|
if (ret < 0) {
|
|
printf("KDGETMODE failed, err=%s\n", strerror(errno));
|
|
goto fail;
|
|
}
|
|
|
|
if (kd_mode != KD_TEXT) {
|
|
printf("%s is in graphics mode\n", vtname);
|
|
}
|
|
|
|
return 1;
|
|
|
|
fail:
|
|
close (info->console_fd);
|
|
return 0;
|
|
}
|