aboutsummaryrefslogtreecommitdiffhomepage
path: root/video/out
diff options
context:
space:
mode:
Diffstat (limited to 'video/out')
-rw-r--r--video/out/vo_caca.c152
1 files changed, 84 insertions, 68 deletions
diff --git a/video/out/vo_caca.c b/video/out/vo_caca.c
index 9cc6835c9a..6cd0187ef4 100644
--- a/video/out/vo_caca.c
+++ b/video/out/vo_caca.c
@@ -45,77 +45,82 @@
#include "common/msg.h"
#include "input/input.h"
-/* caca stuff */
-static caca_canvas_t *canvas;
-static caca_display_t *display;
-static caca_dither_t *dither = NULL;
-static uint8_t *dither_buffer = NULL;
-static const char *dither_antialias = "default";
-static const char *dither_charset = "default";
-static const char *dither_color = "default";
-static const char *dither_algo = "none";
-
-/* image infos */
-static int image_format;
-static int image_width;
-static int image_height;
-
-static int screen_w, screen_h;
+struct priv {
+ caca_canvas_t *canvas;
+ caca_display_t *display;
+ caca_dither_t *dither;
+ uint8_t *dither_buffer;
+ const char *dither_antialias;
+ const char *dither_charset;
+ const char *dither_color;
+ const char *dither_algo;
+
+ /* image infos */
+ int image_format;
+ int image_width;
+ int image_height;
+
+ int screen_w, screen_h;
+};
/* We want 24bpp always for now */
-static unsigned int bpp = 24;
-static unsigned int depth = 3;
-static unsigned int rmask = 0xff0000;
-static unsigned int gmask = 0x00ff00;
-static unsigned int bmask = 0x0000ff;
-static unsigned int amask = 0;
+static const unsigned int bpp = 24;
+static const unsigned int depth = 3;
+static const unsigned int rmask = 0xff0000;
+static const unsigned int gmask = 0x00ff00;
+static const unsigned int bmask = 0x0000ff;
+static const unsigned int amask = 0;
static int resize(struct vo *vo)
{
- screen_w = caca_get_canvas_width(canvas);
- screen_h = caca_get_canvas_height(canvas);
+ struct priv *priv = vo->priv;
+ priv->screen_w = caca_get_canvas_width(priv->canvas);
+ priv->screen_h = caca_get_canvas_height(priv->canvas);
- caca_free_dither(dither);
- talloc_free(dither_buffer);
+ caca_free_dither(priv->dither);
+ talloc_free(priv->dither_buffer);
- dither = caca_create_dither(bpp, image_width, image_height,
- depth * image_width,
+ priv->dither = caca_create_dither(bpp, priv->image_width, priv->image_height,
+ depth * priv->image_width,
rmask, gmask, bmask, amask);
- if (dither == NULL) {
+ if (priv->dither == NULL) {
MP_FATAL(vo, "caca_create_dither failed!\n");
return -1;
}
- dither_buffer =
- talloc_array(NULL, uint8_t, depth * image_width * image_height);
+ priv->dither_buffer =
+ talloc_array(NULL, uint8_t, depth * priv->image_width * priv->image_height);
/* Default libcaca features */
- caca_set_dither_antialias(dither, dither_antialias);
- caca_set_dither_charset(dither, dither_charset);
- caca_set_dither_color(dither, dither_color);
- caca_set_dither_algorithm(dither, dither_algo);
+ caca_set_dither_antialias(priv->dither, priv->dither_antialias);
+ caca_set_dither_charset(priv->dither, priv->dither_charset);
+ caca_set_dither_color(priv->dither, priv->dither_color);
+ caca_set_dither_algorithm(priv->dither, priv->dither_algo);
return 0;
}
static int reconfig(struct vo *vo, struct mp_image_params *params, int flags)
{
- image_height = params->h;
- image_width = params->w;
- image_format = params->imgfmt;
+ struct priv *priv = vo->priv;
+ priv->image_height = params->h;
+ priv->image_width = params->w;
+ priv->image_format = params->imgfmt;
return resize(vo);
}
static void draw_image(struct vo *vo, mp_image_t *mpi)
{
- memcpy_pic(dither_buffer, mpi->planes[0], image_width * depth, image_height,
- image_width * depth, mpi->stride[0]);
- caca_dither_bitmap(canvas, 0, 0, screen_w, screen_h, dither, dither_buffer);
+ struct priv *priv = vo->priv;
+ memcpy_pic(priv->dither_buffer, mpi->planes[0], priv->image_width * depth, priv->image_height,
+ priv->image_width * depth, mpi->stride[0]);
+ caca_dither_bitmap(priv->canvas, 0, 0, priv->screen_w, priv->screen_h, priv->dither, priv->dither_buffer);
}
static void flip_page(struct vo *vo)
{
- caca_refresh_display(display);
+ struct priv *priv = vo->priv;
+ caca_refresh_display(priv->display);
}
static void set_next_str(const char * const *list, const char **str,
@@ -158,12 +163,14 @@ static const struct mp_keymap keysym_map[] = {
static void check_events(struct vo *vo)
{
+ struct priv *priv = vo->priv;
+
caca_event_t cev;
- while (caca_get_event(display, CACA_EVENT_ANY, &cev, 0)) {
+ while (caca_get_event(priv->display, CACA_EVENT_ANY, &cev, 0)) {
switch (cev.type) {
case CACA_EVENT_RESIZE:
- caca_refresh_display(display);
+ caca_refresh_display(priv->display);
resize(vo);
break;
case CACA_EVENT_QUIT:
@@ -195,33 +202,33 @@ static void check_events(struct vo *vo)
case 'd':
case 'D':
/* Toggle dithering algorithm */
- set_next_str(caca_get_dither_algorithm_list(dither),
- &dither_algo, &msg_name);
- caca_set_dither_algorithm(dither, dither_algo);
+ set_next_str(caca_get_dither_algorithm_list(priv->dither),
+ &priv->dither_algo, &msg_name);
+ caca_set_dither_algorithm(priv->dither, priv->dither_algo);
break;
case 'a':
case 'A':
/* Toggle antialiasing method */
- set_next_str(caca_get_dither_antialias_list(dither),
- &dither_antialias, &msg_name);
- caca_set_dither_antialias(dither, dither_antialias);
+ set_next_str(caca_get_dither_antialias_list(priv->dither),
+ &priv->dither_antialias, &msg_name);
+ caca_set_dither_antialias(priv->dither, priv->dither_antialias);
break;
case 'h':
case 'H':
/* Toggle charset method */
- set_next_str(caca_get_dither_charset_list(dither),
- &dither_charset, &msg_name);
- caca_set_dither_charset(dither, dither_charset);
+ set_next_str(caca_get_dither_charset_list(priv->dither),
+ &priv->dither_charset, &msg_name);
+ caca_set_dither_charset(priv->dither, priv->dither_charset);
break;
case 'c':
case 'C':
/* Toggle color method */
- set_next_str(caca_get_dither_color_list(dither),
- &dither_color, &msg_name);
- caca_set_dither_color(dither, dither_color);
+ set_next_str(caca_get_dither_color_list(priv->dither),
+ &priv->dither_color, &msg_name);
+ caca_set_dither_color(priv->dither, priv->dither_color);
break;
default:
@@ -236,31 +243,39 @@ static void check_events(struct vo *vo)
static void uninit(struct vo *vo)
{
- caca_free_dither(dither);
- dither = NULL;
- talloc_free(dither_buffer);
- dither_buffer = NULL;
- caca_free_display(display);
- caca_free_canvas(canvas);
+ struct priv *priv = vo->priv;
+ caca_free_dither(priv->dither);
+ priv->dither = NULL;
+ talloc_free(priv->dither_buffer);
+ priv->dither_buffer = NULL;
+ caca_free_display(priv->display);
+ caca_free_canvas(priv->canvas);
}
static int preinit(struct vo *vo)
{
- canvas = caca_create_canvas(0, 0);
- if (canvas == NULL) {
+ struct priv *priv = vo->priv;
+
+ priv->dither_antialias = "default";
+ priv->dither_charset = "default";
+ priv->dither_color = "default";
+ priv->dither_algo = "none";
+
+ priv->canvas = caca_create_canvas(0, 0);
+ if (priv->canvas == NULL) {
MP_ERR(vo, "failed to create canvas\n");
return ENOSYS;
}
- display = caca_create_display(canvas);
+ priv->display = caca_create_display(priv->canvas);
- if (display == NULL) {
+ if (priv->display == NULL) {
MP_ERR(vo, "failed to create display\n");
- caca_free_canvas(canvas);
+ caca_free_canvas(priv->canvas);
return ENOSYS;
}
- caca_set_display_title(display, "mpv");
+ caca_set_display_title(priv->display, "mpv");
return 0;
}
@@ -293,4 +308,5 @@ const struct vo_driver video_out_caca = {
.draw_image = draw_image,
.flip_page = flip_page,
.uninit = uninit,
+ .priv_size = sizeof(struct priv),
};