summaryrefslogtreecommitdiffstats
path: root/TOOLS/vf_dlopen/rectangle.c
diff options
context:
space:
mode:
Diffstat (limited to 'TOOLS/vf_dlopen/rectangle.c')
-rw-r--r--TOOLS/vf_dlopen/rectangle.c367
1 files changed, 0 insertions, 367 deletions
diff --git a/TOOLS/vf_dlopen/rectangle.c b/TOOLS/vf_dlopen/rectangle.c
deleted file mode 100644
index f0827c974b..0000000000
--- a/TOOLS/vf_dlopen/rectangle.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- * Copyright (c) 2012 Rudolf Polzer <divVerent@xonotic.org>
- *
- * This file is part of mpv's vf_dlopen examples.
- *
- * mpv's vf_dlopen examples are free software; you can redistribute them and/or
- * modify them under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of the
- * License, or (at your option) any later version.
- *
- * mpv's vf_dlopen examples are distributed in the hope that they will be
- * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
- * General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with mpv's vf_dlopen examples; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-
-#include "vf_dlopen.h"
-#include "filterutils.h"
-
-/*
- * rectangle
- *
- * usage: --vf=dlopen=/path/to/rectangle.so
- *
- * provides an editable rectangle
- * NOTE: unix only, and requires xterm to be installed. Don't ask.
- */
-
-typedef struct
-{
- int x, y, w, h;
- int step;
- int inpid;
- int infd;
- int ansimode;
- int rectmode;
-} privdata;
-
-enum {
- RECTMODE_LINES = 0,
- RECTMODE_BOX,
- RECTMODE_COUNT
-};
-
-static int put_image(struct vf_dlopen_context *ctx)
-{
- privdata *priv = ctx->priv;
- unsigned int p;
-
- assert(ctx->inpic.planes == ctx->outpic->planes);
-
- for (p = 0; p < ctx->outpic->planes; ++p) {
- assert(ctx->inpic.planewidth[p] == ctx->outpic->planewidth[p]);
- assert(ctx->inpic.planeheight[p] == ctx->outpic->planeheight[p]);
- }
-
- char data;
- while(read(priv->infd, &data, sizeof(data)) > 0) {
- // printf("\nMODE: %d, CHAR: %d (%c)\n", priv->ansimode, data, data);
- switch(priv->ansimode) {
- case 0: // initial
- switch(data) {
- case 27: priv->ansimode = 1; break;
- default: priv->ansimode = 0; break;
- }
- break;
- case 1: // seen ESC
- switch(data) {
- case '[': priv->ansimode = 2; break;
- default: priv->ansimode = 0; break;
- }
- break;
- case 2: // seen ESC [
- switch(data) {
- case 'D': priv->ansimode = 0; data = 'h'; break; // arrow
- case 'B': priv->ansimode = 0; data = 'j'; break; // arrow
- case 'A': priv->ansimode = 0; data = 'k'; break; // arrow
- case 'C': priv->ansimode = 0; data = 'l'; break; // arrow
- case 'd': priv->ansimode = 0; data = 'H'; break; // rxvt shift-arrow
- case 'b': priv->ansimode = 0; data = 'J'; break; // rxvt shift-arrow
- case 'a': priv->ansimode = 0; data = 'K'; break; // rxvt shift-arrow
- case 'c': priv->ansimode = 0; data = 'L'; break; // rxvt shift-arrow
- case '1': priv->ansimode = 3; break;
- default: priv->ansimode = -1; break;
- }
- break;
- case 3: // seen ESC [ 1
- switch(data) {
- case ';': priv->ansimode = 4; break;
- default: priv->ansimode = -1; break;
- }
- break;
- case 4: // seen ESC [ 1 ;
- switch(data) {
- case '2': priv->ansimode = 5; break;
- default: priv->ansimode = -1; break;
- }
- break;
- case 5: // seen ESC [ 1 ; 2
- switch(data) {
- case 'D': priv->ansimode = 0; data = 'H'; break; // xterm shift-arrow
- case 'B': priv->ansimode = 0; data = 'J'; break; // xterm shift-arrow
- case 'A': priv->ansimode = 0; data = 'K'; break; // xterm shift-arrow
- case 'C': priv->ansimode = 0; data = 'L'; break; // xterm shift-arrow
- default: priv->ansimode = -1; break;
- }
- break;
- case -1: // wait for end of ESC [ sequence
- if((data > '9' || data < '0') && (data != ';')) {
- priv->ansimode = 0;
- data = 0; // do not process
- }
- break;
- }
-
- if(priv->ansimode == 0) {
- switch(data) {
- case 'h': case 'D': priv->x -= priv->step; priv->w += priv->step; break;
- case 'j': case 'B': priv->y += priv->step; priv->h -= priv->step; break;
- case 'k': case 'A': priv->y -= priv->step; priv->h += priv->step; break;
- case 'l': case 'C': priv->x += priv->step; priv->w -= priv->step; break;
- case 'H': case 'd': priv->w -= priv->step; break;
- case 'J': case 'b': priv->h += priv->step; break;
- case 'K': case 'a': priv->h -= priv->step; break;
- case 'L': case 'c': priv->w += priv->step; break;
- case ' ': priv->step ^= 9; break;
- case 9: ++priv->rectmode; priv->rectmode %= RECTMODE_COUNT; break;
- }
- }
- }
-
- // apply limits
- if(priv->x < 0) {
- priv->w += priv->x;
- priv->x = 0;
- }
- if(priv->y < 0) {
- priv->h += priv->y;
- priv->y = 0;
- }
- if(priv->w < 0) {
- priv->w = 0;
- }
- if(priv->h < 0) {
- priv->h = 0;
- }
- if(priv->x >= (int) ctx->inpic.planewidth[0]) {
- priv->x = ctx->inpic.planewidth[0] - 1;
- }
- if(priv->y >= (int) ctx->inpic.planeheight[0]) {
- priv->y = ctx->inpic.planeheight[0] - 1;
- }
- if(priv->x + priv->w > (int) ctx->inpic.planewidth[0]) {
- priv->w = ctx->inpic.planewidth[0] - priv->x;
- }
- if(priv->y + priv->h > (int) ctx->inpic.planeheight[0]) {
- priv->h = ctx->inpic.planeheight[0] - priv->y;
- }
-
- // apply step
- priv->x = ((priv->x + priv->step - 1) / priv->step) * priv->step;
- priv->y = ((priv->y + priv->step - 1) / priv->step) * priv->step;
- priv->w = (priv->w / priv->step) * priv->step;
- priv->h = (priv->h / priv->step) * priv->step;
-
- // print
- printf("\nRECTANGLE: -vf crop=%d:%d:%d:%d\n", priv->w, priv->h, priv->x, priv->y);
-
- // copy picture
- for (p = 0; p < ctx->outpic->planes; ++p) {
- copy_plane(
- ctx->outpic->plane[p], ctx->outpic->planestride[p],
- ctx->inpic.plane[p], ctx->inpic.planestride[p],
- ctx->inpic.planewidth[p], ctx->inpic.planeheight[p]
- );
- }
- ctx->outpic->pts = ctx->inpic.pts;
-
- // draw rectangle
-#define PUT_PIXEL(x,y) \
- do { \
- int x_ = (x); \
- int y_ = (y); \
- if(x_ >= 0 && y_ >= 0 && x_ < (int) ctx->outpic->planewidth[0] && y_ < (int) ctx->outpic->planeheight[0]) { \
- ctx->outpic->plane[0][y_ * ctx->outpic->planestride[0] + x_] ^= 0x80; \
- } \
- } while(0)
- switch(priv->rectmode) {
- case RECTMODE_LINES:
- {
- unsigned int i;
- unsigned int n;
- if(priv->w > priv->h)
- n = priv->h / 3;
- else
- n = priv->w / 3;
- if(n > 64)
- n = 64;
- for (i = 0; i < n; ++i) {
- // topleft
- PUT_PIXEL(priv->x + i, priv->y);
- if(i)
- PUT_PIXEL(priv->x, priv->y + i);
- // topright
- PUT_PIXEL(priv->x + priv->w - 1 - i, priv->y);
- if(i)
- PUT_PIXEL(priv->x + priv->w - 1, priv->y + i);
- // bottomright
- PUT_PIXEL(priv->x + priv->w - 1 - i, priv->y + priv->h - 1);
- if(i)
- PUT_PIXEL(priv->x + priv->w - 1, priv->y + priv->h - 1 - i);
- // bottomleft
- PUT_PIXEL(priv->x + i, priv->y + priv->h - 1);
- if(i)
- PUT_PIXEL(priv->x, priv->y + priv->h - 1 - i);
- }
- }
- break;
- case RECTMODE_BOX:
- {
- int x, y;
- for(y = 0; y < priv->y; ++y) {
- for(x = 0; x < (int) ctx->outpic->planewidth[0]; ++x) {
- PUT_PIXEL(x, y);
- }
- }
- for(y = priv->y; y < priv->y + priv->h; ++y) {
- for(x = 0; x < priv->x; ++x) {
- PUT_PIXEL(x, y);
- }
- for(x = priv->x + priv->w; x < (int) ctx->outpic->planewidth[0]; ++x) {
- PUT_PIXEL(x, y);
- }
- }
- for(y = priv->y + priv->h; y < (int) ctx->outpic->planeheight[0]; ++y) {
- for(x = 0; x < (int) ctx->outpic->planewidth[0]; ++x) {
- PUT_PIXEL(x, y);
- }
- }
- }
- break;
- }
-
- return 1;
-}
-
-int config(struct vf_dlopen_context *ctx)
-{
- privdata *priv = ctx->priv;
- if(priv->w == 0 || priv->h == 0) {
- priv->x = 0;
- priv->y = 0;
- priv->w = ctx->in_width;
- priv->h = ctx->in_height;
- }
- printf("\nRECTANGLE: reconfigured\n");
-
- if(priv->inpid == 0) {
- int fd[2];
- if(pipe(fd)) {
- perror("pipe");
- return -1;
- }
- priv->inpid = fork();
- if(priv->inpid < 0) {
- perror("fork");
- return -1;
- }
- if(priv->inpid == 0) {
- close(fd[0]);
- if(fd[1] != 3) {
- dup2(fd[1], 3);
- close(fd[1]);
- }
- execlp("xterm", "xterm",
- "-geometry", "40x10",
- "-e",
- "echo \"rectangle.so control window\";"
- "echo \"\";"
- "echo \"Arrow or hjkl: top left corner\";"
- "echo \"Shift-Arrow or HJKL: bottom right corner\";"
- "echo \"SPACE: toggle 8-px alignment\";"
- "echo \"TAB: toggle rectangle display\";"
- "echo \"\";"
- "stty raw -echo;"
- "cat >&3",
- NULL
- );
- _exit(1);
- }
- close(fd[1]);
- priv->infd = fd[0];
- int flags;
- if(fcntl(priv->infd, F_GETFL, &flags)) {
- perror("fcntl F_GETFL");
- close(priv->infd);
- kill(priv->inpid, SIGTERM);
- waitpid(priv->inpid, NULL, 0);
- priv->inpid = 0;
- }
- flags |= O_NONBLOCK;
- if(fcntl(priv->infd, F_SETFL, flags)) {
- perror("fcntl F_SETFL");
- close(priv->infd);
- kill(priv->inpid, SIGTERM);
- waitpid(priv->inpid, NULL, 0);
- priv->inpid = 0;
- }
- }
-
- return 1;
-}
-
-void uninit(struct vf_dlopen_context *ctx)
-{
- privdata *priv = ctx->priv;
- if(priv->inpid) {
- close(priv->infd);
- kill(priv->inpid, SIGTERM);
- waitpid(priv->inpid, NULL, 0);
- priv->inpid = 0;
- }
- printf("\nRECTANGLE: finished\n");
- free(priv);
-}
-
-int vf_dlopen_getcontext(struct vf_dlopen_context *ctx, int argc, const char **argv)
-{
- VF_DLOPEN_CHECK_VERSION(ctx);
- (void) argc;
- (void) argv;
- static struct vf_dlopen_formatpair map[] = {
- { "yuv420p", "yuv420p" },
- { NULL, NULL }
- };
- privdata *priv = calloc(1,sizeof(privdata));
- priv->step = 8;
- if(argc >= 1)
- priv->w = atoi(argv[0]);
- if(argc >= 2)
- priv->h = atoi(argv[1]);
- if(argc >= 3)
- priv->x = atoi(argv[2]);
- if(argc >= 4)
- priv->y = atoi(argv[3]);
- ctx->priv = priv;
- ctx->format_mapping = map;
- ctx->config = config;
- ctx->put_image = put_image;
- ctx->uninit = uninit;
- return 1;
-}