lavd/caca: create display *after* checking dither options

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.
This commit is contained in:
Stefano Sabatini 2012-07-21 17:16:01 +02:00
parent 9ce0e19ab6
commit c0b91348fe
1 changed files with 27 additions and 17 deletions

View 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);