lavd/caca: create display *after* checking dither options
authorStefano Sabatini <stefasab@gmail.com>
Sat, 21 Jul 2012 15:16:01 +0000 (17:16 +0200)
committerStefano Sabatini <stefasab@gmail.com>
Sun, 22 Jul 2012 08:32:21 +0000 (10:32 +0200)
Avoid fastidious creation and immediate destroy of the display in case
one of the dither options fails to be set.

Also add NULL checks in write_trailer(), which are now necessary since
the function can be called when not all the components have been
initialized.

libavdevice/caca.c

index cfbb371..173a28b 100644 (file)
@@ -47,9 +47,18 @@ static int caca_write_trailer(AVFormatContext *s)
 
     av_freep(&c->window_title);
 
-    caca_free_dither(c->dither);
-    caca_free_display(c->display);
-    caca_free_canvas(c->canvas);
+    if (c->display) {
+        caca_free_display(c->display);
+        c->display = NULL;
+    }
+    if (c->dither) {
+        caca_free_dither(c->dither);
+        c->dither = NULL;
+    }
+    if (c->canvas) {
+        caca_free_canvas(c->canvas);
+        c->canvas = NULL;
+    }
     return 0;
 }
 
@@ -127,20 +136,8 @@ static int caca_write_header(AVFormatContext *s)
     c->canvas = caca_create_canvas(c->window_width, c->window_height);
     if (!c->canvas) {
         av_log(s, AV_LOG_ERROR, "Failed to create canvas\n");
-        return AVERROR(errno);
-    }
-
-    c->display = caca_create_display_with_driver(c->canvas, c->driver);
-    if (!c->display) {
-        av_log(s, AV_LOG_ERROR, "Failed to create display\n");
-        list_drivers(c);
-        caca_free_canvas(c->canvas);
-        return AVERROR(errno);
-    }
-
-    if (!c->window_width || !c->window_height) {
-        c->window_width  = caca_get_canvas_width(c->canvas);
-        c->window_height = caca_get_canvas_height(c->canvas);
+        ret = AVERROR(errno);
+        goto fail;
     }
 
     bpp = av_get_bits_per_pixel(&av_pix_fmt_descriptors[encctx->pix_fmt]);
@@ -165,6 +162,19 @@ static int caca_write_header(AVFormatContext *s)
     CHECK_DITHER_OPT(charset);
     CHECK_DITHER_OPT(color);
 
+    c->display = caca_create_display_with_driver(c->canvas, c->driver);
+    if (!c->display) {
+        av_log(s, AV_LOG_ERROR, "Failed to create display\n");
+        list_drivers(c);
+        ret = AVERROR(errno);
+        goto fail;
+    }
+
+    if (!c->window_width || !c->window_height) {
+        c->window_width  = caca_get_canvas_width(c->canvas);
+        c->window_height = caca_get_canvas_height(c->canvas);
+    }
+
     if (!c->window_title)
         c->window_title = av_strdup(s->filename);
     caca_set_display_title(c->display, c->window_title);