view TVout/con2fb/con2fb.c @ 4078:a8e7238bb7b4

Add spudec_new_scaled and spudec_draw_scaled for vobsub support. Change what is passed to spudec_new for vobsub support. Suppress conditional on USE_DVDREAD. Correct a bug where some subtitles with no Stop display control code would not display long enough. Be more strict with bogus packets. Transform everything that should into unsigned.
author kmkaplan
date Thu, 10 Jan 2002 17:17:37 +0000
parents 3b5f5d1c5041
children
line wrap: on
line source

/* this is userspace utility which allows you to redirect console to another fb device 
 * You can specify devices & consoles by both numbers and devices. Framebuffers numbers
 * are zero based (/dev/fb0 ... ), consoles begins with 1 (/dev/tty1 ... )
 */
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
	struct fb_con2fbmap c2m;
	char* fbPath;
	u_int32_t con, fb;
	char* e;
	char* progname = strrchr(argv[0], '/');
	int f;

	if (progname)
		progname++;
	else
		progname = argv[0];
	if (argc < 3) {
		fprintf(stderr, "usage: %s fbdev console\n", progname);
		return 1;
	}
	fb = strtoul(argv[1], &e, 10);
	if (*e) {
		struct stat sbf;

		if (stat(argv[1], &sbf)) {	
			fprintf(stderr, "%s: are you sure that %s can be used to describe fbdev?\n", progname, argv[1]);
			return 1;
		}
		if (!S_ISCHR(sbf.st_mode)) {
			fprintf(stderr, "%s: %s must be character device\n", progname, argv[1]);
			return 1;
		}
		fb = sbf.st_rdev & 0xFF;
		if (fb >= 32)
			fb >>= 5;
		fbPath = argv[1];
	} else 
		fbPath = "/dev/fb0";
	con = strtoul(argv[2], &e, 10);
	if (*e) {
		struct stat sbf;

		if (stat(argv[2], &sbf)) {
			fprintf(stderr, "%s: are you sure that %s can be used to describe vt?\n", progname, argv[2]);
			return 1;
		}
		if (!S_ISCHR(sbf.st_mode)) {
			fprintf(stderr, "%s: %s must be character device\n", progname, argv[2]);
			return 1;
		}
		con = sbf.st_rdev & 0xFF;
	}
	c2m.console = con;
	c2m.framebuffer = fb;
	f = open(fbPath, O_RDWR);
	if (f < 0) {
		fprintf(stderr, "%s: Cannot open %s\n", progname, fbPath);
		return 1;
	}
	if (ioctl(f, FBIOPUT_CON2FBMAP, &c2m)) {
		fprintf(stderr, "%s: Cannot set console mapping\n", progname);
		close(f);
		return 1;
	}
	close(f);
	return 0;
}