summaryrefslogtreecommitdiffstats
path: root/libvo/vo_bl.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvo/vo_bl.c')
-rw-r--r--libvo/vo_bl.c479
1 files changed, 0 insertions, 479 deletions
diff --git a/libvo/vo_bl.c b/libvo/vo_bl.c
deleted file mode 100644
index 8a4c29edd7..0000000000
--- a/libvo/vo_bl.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * playback using the Blinkenlights UDP protocol (and to files)
- *
- * UDP socket handling copied from bsender.c part of blib-0.6:
- * http://sven.gimp.org/blinkenlights/
- * copyright (c) 2001-2001 The Blinkenlights Crew:
- * Sven Neumann <sven@gimp.org>
- * Michael Natterer <mitch@gimp.org>
- * Daniel Mack <daniel@yoobay.net>
- * copyright (C) 2004 Stefan Schuermans <1stein@schuermans.info>
- * other stuff: copyright (C) 2002 Rik Snel
- *
- * This file is part of MPlayer.
- *
- * MPlayer is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * MPlayer is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with MPlayer; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#ifdef HAVE_SYS_MMAN_H
-#include <sys/mman.h>
-#endif
-#include <sys/ioctl.h>
-
-#include "config.h"
-
-#include <netdb.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-#include "video_out.h"
-#include "video_out_internal.h"
-#include "mp_msg.h"
-#include "m_option.h"
-#include "fastmemcpy.h"
-
-static const vo_info_t info =
-{
- "Blinkenlights driver: http://www.blinkenlights.de",
- "bl",
- "Rik Snel <snel@phys.uu.nl>",
- ""
-};
-
-const LIBVO_EXTERN (bl)
-
-/* General variables */
-
-static unsigned char *image = NULL;
-static unsigned char *tmp = NULL;
-static int framenum;
-static char *bl_subdevice = NULL;
-static int prevpts = -1;
-
-typedef struct {
- char *name; /* filename */
- FILE *fp;
- int header_written; /* if header was written already */
-} bl_file_t;
-
-typedef struct {
- char *name; /* hostname */
- int port;
- int fd; /* file descriptor */
-} bl_host_t;
-
-typedef struct {
- char *name;
- int img_format;
-
- int channels;
- int width;
- int height;
- int bpc; /* bits per component: bpc = 3, channels = 3 => bpp = 24*/
-
- /* file output functions */
- int (*init_file)(bl_file_t *file);
- void (*write_frame)(bl_file_t *file, unsigned char *i, int duration);
- void (*close_file)(bl_file_t *file);
-
- /* network output functions */
- int (*init_connection)(bl_host_t *host);
- void (*send_frame)(bl_host_t *host);
- void (*close_connection)(bl_host_t *host);
-} bl_properties_t;
-
-static bl_properties_t *bl = NULL;
-
-/* arbitrary limit because I am too lazy to do proper memory management */
-#define BL_MAX_FILES 16
-#define BL_MAX_HOSTS 16
-static bl_file_t bl_files[BL_MAX_FILES];
-static bl_host_t bl_hosts[BL_MAX_HOSTS];
-static int no_bl_files = 0;
-static int no_bl_hosts = 0;
-
-typedef struct {
- uint32_t magic;
- uint16_t height;
- uint16_t width;
- uint16_t channels;
- uint16_t maxval;
- unsigned char data[0];
-} bl_packet_t;
-
-static bl_packet_t *bl_packet = NULL;
-static int bl_size;
-
-/* bml output functions */
-static int bml_init(bl_file_t *f) {
- f->fp = fopen(f->name, "w");
- if (!f->fp) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: error opening %s\n", f->name);
- return 1;
- }
- f->header_written = 0;
- return 0;
-}
-
-static void bml_write_frame(bl_file_t *f, unsigned char *i, int duration) {
- int j, k;
- if( ! f->header_written )
- {
- fprintf(f->fp,
-"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
-"<blm width=\"%d\" height=\"%d\" bits=\"%d\" channels=\"%d\">\n"
-" <header>\n"
-" <title>Movie autogenerated by MPlayer</title>\n"
-" <url>http://www.mplayerhq.hu</url>\n"
-" </header>\n", bl->width, bl->height, bl->bpc, bl->channels);
- f->header_written = 1;
- }
- fprintf(f->fp, " <frame duration=\"%d\">\n", duration);
- for (j = 0; j < bl->height; j++) {
- fprintf(f->fp, " <row>");
- for (k = 0; k < bl->width; k++)
- fprintf(f->fp, "%02x", *(i + j * bl->width + k));
- fprintf(f->fp, "</row>\n");
- }
- fprintf(f->fp, " </frame>\n");
-}
-
-static void bml_close(bl_file_t *f) {
- fprintf(f->fp, "</blm>\n");
- fclose(f->fp);
-}
-
-/* Blinkenlights UDP protocol */
-static int udp_init(bl_host_t *h) {
- struct sockaddr_in addr;
- struct hostent *dest;
-
- dest = gethostbyname(h->name);
- if (!dest) {
- mp_msg(MSGT_VO, MSGL_ERR,
- "unable to resolve host %s\n", h->name);
- return 1;
- }
-
- h->fd = -1;
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_port = htons(h->port);
-
- memcpy(&addr.sin_addr.s_addr, dest->h_addr_list[0], dest->h_length);
-
- h->fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- if (h->fd < 0) {
- mp_msg(MSGT_VO, MSGL_ERR,
- "couldn't create socket for %s\n", h->name);
- return 1;
- }
- if (connect(h->fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
- mp_msg(MSGT_VO, MSGL_ERR, "couldn't connect socket for %s\n",
- h->name);
- close(h->fd);
- return 1;
- }
- return 0;
-}
-
-static void udp_send(bl_host_t *h) {
- if (send(h->fd, bl_packet, bl_size, 0) != bl_size)
- mp_msg(MSGT_VO, MSGL_ERR, "unable to send to %s\n", h->name);
-}
-
-static void udp_close(bl_host_t *h) {
- close(h->fd);
-}
-
-#define NO_BLS 3
-
-static bl_properties_t bls[NO_BLS] = {
- { "hdl", IMGFMT_YV12, 1, 18, 8, 8,
- &bml_init, &bml_write_frame, &bml_close,
- &udp_init, &udp_send, &udp_close },
- { "arcade", IMGFMT_YV12, 1, 26, 20, 8,
- &bml_init, &bml_write_frame, &bml_close,
- &udp_init, &udp_send, &udp_close },
- { "grayscale", IMGFMT_YV12, 1, -1, -1, 8, /* use width and height of movie */
- &bml_init, &bml_write_frame, &bml_close,
- &udp_init, &udp_send, &udp_close } };
-
-static int config(uint32_t width, uint32_t height, uint32_t d_width,
- uint32_t d_height, uint32_t flags, char *title, uint32_t format)
-{
- void * ptr;
-
- /* adapt size of Blinkenlights UDP stream to size of movie */
- if (bl->width < 0 || bl->height < 0) {
- if (bl->width < 0) { /* use width of movie */
- bl->width = width;
- bl_packet->width = htons(bl->width);
- }
- if (bl->height < 0) { /* use height of movie */
- bl->height = height;
- bl_packet->height = htons(bl->height);
- }
- /* check for maximum size of UDP packet */
- if (12 + bl->width*bl->height*bl->channels > 65507) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: %dx%d-%d does not fit into an UDP packet\n",
- bl->width, bl->height, bl->channels);
- return 1;
- }
- /* resize frame and tmp buffers */
- bl_size = 12 + bl->width*bl->height*bl->channels;
- ptr = realloc(bl_packet, 12 + bl->width*bl->height*3); /* space for header and image data */
- if (ptr)
- bl_packet = (bl_packet_t*)ptr;
- else {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: out of memory error\n");
- return 1;
- }
- image = ((unsigned char*)bl_packet + 12); /* pointer to image data */
- ptr = realloc(tmp, bl->width*bl->height*3); /* space for image data only */
- if (ptr)
- tmp = (unsigned char*)ptr;
- else {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: out of memory error\n");
- return 1;
- }
- }
-
- framenum = 0;
- if (format != IMGFMT_YV12) {
- mp_msg(MSGT_VO, MSGL_ERR, "vo_bl called with wrong format");
- return 1;
- }
- if (width > bl->width) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: width of movie too large %d > %d\n", width, bl->width);
- return 1;
- }
- if (height > bl->height) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: height of movie too large %d > %d\n", height, bl->height);
- return 1;
- }
- if (!image) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: image should be initialized, internal error\n");
- return 1;
- }
- memset(image, 0, bl->width*bl->height*3); /* blank the image */
- mp_msg(MSGT_VO, MSGL_V, "vo_config bl called\n");
- return 0;
-}
-
-static void draw_osd(void) {
-}
-
-static void flip_page (void) {
- int i;
-
- if (prevpts >= 0) for (i = 0; i < no_bl_files; i++)
- bl->write_frame(&bl_files[i], tmp, (vo_pts - prevpts)/90);
- fast_memcpy(tmp, image, bl->width*bl->height*bl->channels);
- prevpts = vo_pts;
-
- for (i = 0; i < no_bl_hosts; i++) bl->send_frame(&bl_hosts[i]);
-
-
- framenum++;
- return;
-}
-
-static int draw_frame(uint8_t * src[]) {
- return 0;
-}
-
-static int query_format(uint32_t format) {
- if (format == bl->img_format)
- return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW;
- return 0;
-}
-
-static void uninit(void) {
- int i;
- mp_msg(MSGT_VO, MSGL_V, "bl: uninit called\n");
- free(bl_packet);
- bl_packet = NULL;
- free(bl_subdevice);
- bl_subdevice = NULL;
- for (i = 0; i < no_bl_files; i++) bl->close_file(&bl_files[i]);
- for (i = 0; i < no_bl_hosts; i++) bl->close_connection(&bl_hosts[i]);
- no_bl_files = 0;
- no_bl_hosts = 0;
- bl = NULL;
-}
-
-static void check_events(void) {
-}
-
-static int draw_slice(uint8_t *srcimg[], int stride[],
- int wf, int hf, int xf, int yf) {
- int i, w, h, x, y;
- uint8_t *dst;
- uint8_t *src=srcimg[0];
- w = wf; h = hf; x = xf; y = yf;
- dst=image; /* + zr->off_y + zr->image_width*(y/zr->vdec)+x;*/
- // copy Y:
- for (i = 0; i < h; i++) {
- fast_memcpy(dst,src,w);
- dst+=bl->width;
- src+=stride[0];
-
- }
- return 0;
-}
-
-static int preinit(const char *arg) {
- char *p, *q;
- int end = 0, i;
- char txt[256];
- if (!arg || strlen(arg) == 0) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: subdevice must be given, example: -vo bl:arcade:host=localhost:2323\n");
- return 1;
- }
-
- bl_subdevice = malloc(strlen(arg) + 1);
- if (!bl_subdevice) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: out of memory error\n");
- return 1;
- }
- p = bl_subdevice;
- strcpy(p, arg);
- mp_msg(MSGT_VO, MSGL_V, "bl: preinit called with %s\n", arg);
- for (i = 0; i < NO_BLS; i++) {
- if (!strncmp(p, bls[i].name, strlen(bls[i].name)))
- break;
- }
- if (i >= NO_BLS) {
- txt[0] = 0;
- for (i = 0; i < NO_BLS; i++)
- if (strlen( txt ) + 4 + strlen( bls[i].name ) + 1 < sizeof(txt))
- sprintf( txt + strlen( txt ), "%s%s",
- txt[0] == 0 ? "" : i == NO_BLS - 1 ? " or " : ", ", bls[i].name );
- mp_msg(MSGT_VO, MSGL_ERR, "bl: subdevice must start with %s\nbl: i.e. -vo bl:arcade:host=localhost:2323\n", txt);
- return 1;
- }
- bl = &bls[i];
- p += strlen(bls[i].name);
- if (*p == '\0') {
- no_bl_hosts = 1;
- bl_hosts[0].name = "localhost";
- bl_hosts[0].port = 2323;
- mp_msg(MSGT_VO, MSGL_V, "bl: no hosts/files specified, using localhost:2323\n");
- end = 1;
- } else if (*p != ':') {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: syntax error in subdevice\n");
- return 1;
- }
- p++;
-
- while (!end) {
- q = p + 5;
- if (!strncmp(p, "file=", 5)) {
- if (no_bl_files == BL_MAX_FILES) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: maximum number of files reached (%d)\n", BL_MAX_FILES);
- return 1;
- }
- p += 5;
- while (*q != ',' && *q != '\0') q++;
- if (*q == '\0') end = 1;
- *q = '\0';
- bl_files[no_bl_files].name = p;
- mp_msg(MSGT_VO, MSGL_V, "blfile[%d]: %s\n",
- no_bl_files, p);
- no_bl_files++;
- } else if (!strncmp(p, "host=", 5)) {
- if (no_bl_hosts == BL_MAX_HOSTS) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: maximum number of hosts reached (%d)\n", BL_MAX_HOSTS);
- return 1;
- }
- p += 5;
- while (*q != ',' && *q != '\0' && *q != ':') q++;
- if (*q == ':') {
- *q++ = '\0';
- bl_hosts[no_bl_hosts].name = p;
- bl_hosts[no_bl_hosts].port = atoi(q);
- while (*q != ',' && *q != '\0') q++;
- if (*q == '\0') end = 1;
- } else {
- /* use default port */
- if (*q == '\0') end = 1;
- *q = '\0';
- bl_hosts[no_bl_hosts].name = p;
- bl_hosts[no_bl_hosts].port = 2323;
- }
- mp_msg(MSGT_VO, MSGL_V,
- "blhost[%d]: %s:%d\n",
- no_bl_hosts, p,
- bl_hosts[no_bl_hosts].port);
- no_bl_hosts++;
- } else {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: syntax error in entry %d in subdevice %s, should be a comma separated\nlist of host=name:port and file=foo.bml\n", no_bl_hosts + no_bl_files, arg);
- return 1;
- }
- p = ++q;
- }
-
- if (bl->width >= 0 && bl->height >= 0) { /* size already known */
- bl_size = 12 + bl->width*bl->height*bl->channels;
- bl_packet = malloc(12 + bl->width*bl->height*3); /* space for header and image data */
- image = ((unsigned char*)bl_packet + 12); /* pointer to image data */
- tmp = malloc(bl->width*bl->height*3); /* space for image data only */
- }
- else { /* size unknown yet */
- bl_size = 12;
- bl_packet = malloc(12 + 3); /* space for header and a pixel */
- image = ((unsigned char*)bl_packet + 12); /* pointer to image data */
- tmp = malloc(3); /* space for a pixel only */
- }
-
- if (!bl_packet || !tmp) {
- mp_msg(MSGT_VO, MSGL_ERR, "bl: out of memory error\n");
- return 1;
- }
- bl_packet->magic = htonl(0x23542666);
- bl_packet->width = htons(bl->width);
- bl_packet->height = htons(bl->height);
- bl_packet->channels = htons(bl->channels);
- bl_packet->maxval = htons((1 << bl->bpc) - 1);
-
- /* open all files */
- for (i = 0; i < no_bl_files; i++)
- if (bl->init_file(&bl_files[i])) return 1;
-
- /* open all sockets */
- for (i = 0; i < no_bl_hosts; i++)
- if (bl->init_connection(&bl_hosts[i])) return 1;
-
-
- return 0;
-}
-
-static int control(uint32_t request, void *data) {
- switch (request) {
- case VOCTRL_QUERY_FORMAT:
- return query_format(*((uint32_t*)data));
- }
- return VO_NOTIMPL;
-}