summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorAvi Halachmi (:avih) <avihpit@yahoo.com>2020-12-02 12:39:57 +0200
committeravih <avih@users.noreply.github.com>2020-12-02 17:06:11 +0200
commit84d0930fa1489868ef3034b5ae18ba760b1a2db9 (patch)
treedbc4b6c61fd8a9574cc604a9501cbd65a68c7900 /video
parentda48bb6709b83b2cc7ba4aa370fb4ef0daf24ae7 (diff)
downloadmpv-84d0930fa1489868ef3034b5ae18ba760b1a2db9.tar.bz2
mpv-84d0930fa1489868ef3034b5ae18ba760b1a2db9.tar.xz
vo_sixel: don't divide by zero on small terminal
Our canvas size calculation is affected by few factors, and rounded down more than once - which can result in 0 width or (more typically) height - e.g. when terminal height is one row. If the width or height are 0 then all bets are off, so simply skip the setups and rendering on this case. We can still recover automatically if the terminal is resized to become bigger.
Diffstat (limited to 'video')
-rw-r--r--video/out/vo_sixel.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/video/out/vo_sixel.c b/video/out/vo_sixel.c
index 627e69f81a..c9cc1573cb 100644
--- a/video/out/vo_sixel.c
+++ b/video/out/vo_sixel.c
@@ -72,14 +72,10 @@ struct priv {
uint8_t *buffer;
bool skip_frame_draw;
- // The dimensions that will be actually
- // be used after processing user inputs
- int top;
- int left;
- int width;
- int height;
- int num_rows;
- int num_cols;
+ int left, top; // image origin cell (1 based)
+ int width, height; // actual image px size - always reflects dst_rect.
+ int num_cols, num_rows; // terminal size in cells
+ int canvas_ok; // whether canvas vo->dwidth and vo->dheight are positive
int previous_histgram_colors;
@@ -262,6 +258,8 @@ static void update_canvas_dimensions(struct vo *vo)
priv->num_rows = num_rows;
priv->num_cols = num_cols;
+
+ priv->canvas_ok = vo->dwidth > 0 && vo->dheight > 0;
}
static void set_sixel_output_parameters(struct vo *vo)
@@ -330,9 +328,13 @@ static int update_sixel_swscaler(struct vo *vo, struct mp_image_params *params)
static int reconfig(struct vo *vo, struct mp_image_params *params)
{
+ struct priv *priv = vo->priv;
+ int ret = 0;
update_canvas_dimensions(vo);
- set_sixel_output_parameters(vo);
- int ret = update_sixel_swscaler(vo, params);
+ if (priv->canvas_ok) { // if too small - succeed but skip the rendering
+ set_sixel_output_parameters(vo);
+ ret = update_sixel_swscaler(vo, params);
+ }
printf(ESC_CLEAR_SCREEN);
vo->want_redraw = true;
@@ -352,6 +354,8 @@ static void draw_frame(struct vo *vo, struct vo_frame *frame)
int prev_width = vo->dwidth;
bool resized = false;
update_canvas_dimensions(vo);
+ if (!priv->canvas_ok)
+ return;
if (prev_rows != priv->num_rows || prev_cols != priv->num_cols ||
prev_width != vo->dwidth || prev_height != vo->dheight)
@@ -426,6 +430,8 @@ static int sixel_write(char *data, int size, void *priv)
static void flip_page(struct vo *vo)
{
struct priv* priv = vo->priv;
+ if (!priv->canvas_ok)
+ return;
// If frame is repeated and no update required, then we skip encoding
if (priv->skip_frame_draw)