Skip to content

Commit 20304e0

Browse files
committed
vo_pp/text: unify err handling
use common macro outputting the error (also instead of asserts) + avoid transparent_bg leak if error occurs
1 parent 46f686b commit 20304e0

File tree

1 file changed

+28
-39
lines changed

1 file changed

+28
-39
lines changed

src/vo_postprocess/text.c

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ set_font(DrawingWand *dw, const char *req_font)
219219
MSG(WARNING, "DraweSetFont failed!\n");
220220
continue;
221221
}
222-
MSG(INFO, "Using font: %s\n", *font_candidates);
222+
MSG(INFO, "using font %s\n", *font_candidates);
223223
return MagickTrue;
224224
}
225225
MSG(VERBOSE, "font %s not found\n", *font_candidates);
@@ -228,11 +228,19 @@ set_font(DrawingWand *dw, const char *req_font)
228228
if (req_font != NULL) {
229229
return MagickFalse;
230230
}
231-
MSG(ERROR,
232-
"Could not find useable font! Continue using system one...\n");
231+
MSG(WARNING,
232+
"Could not find usable font! Continue using system one...\n");
233233
return MagickTrue;
234234
}
235235

236+
#define HANDLE_WAND_ERROR(status, wand, msg) \
237+
do { \
238+
if ((status) != MagickTrue) { \
239+
MSG(ERROR, "%s: %s!\n", msg, get_magick_error(wand)); \
240+
return false; \
241+
} \
242+
} while (0)
243+
236244
static bool
237245
text_postprocess_reconfigure(void *state, struct video_desc desc)
238246
{
@@ -296,22 +304,15 @@ text_postprocess_reconfigure(void *state, struct video_desc desc)
296304

297305
s->wand_bg = NewMagickWand();
298306
status = MagickSetFormat(s->wand_bg, colorspace);
299-
if (status != MagickTrue) {
300-
MSG(WARNING, "MagickSetFormat bg failed: %s!\n",
301-
get_magick_error(s->wand_bg));
302-
return false;
303-
}
307+
HANDLE_WAND_ERROR(status, s->wand_bg, "MagickSetFormat bg failed");
304308
s->wand_text = NewMagickWand();
305309
status = MagickSetFormat(s->wand_text, colorspace);
306-
if(status != MagickTrue) {
307-
MSG(WARNING, "MagickSetFormat text failed: %s!\n",
308-
get_magick_error(s->wand_text));
309-
return false;
310-
}
310+
HANDLE_WAND_ERROR(status, s->wand_text, "MagickSetFormat text failed");
311311

312312
status = MagickSetDepth(s->wand_bg, 8);
313-
status &= MagickSetDepth(s->wand_text, 8);
314-
assert(status == MagickTrue && "[text vo_pp.] MagickSetDepth failed");
313+
HANDLE_WAND_ERROR(status, s->wand_bg, "MagickSetDepth bg failed");
314+
status = MagickSetDepth(s->wand_text, 8);
315+
HANDLE_WAND_ERROR(status, s->wand_text, "MagickSetDepth text failed");
315316

316317
PixelWand *transparent_bg = NewPixelWand();
317318
// PixelSetColor(transparent_bg, "#cccccc80"); // for debugging
@@ -325,6 +326,7 @@ text_postprocess_reconfigure(void *state, struct video_desc desc)
325326
if(!metrics) {
326327
MSG(WARNING, "MagickQueryFontMetrics failed: %s!\n",
327328
get_magick_error(s->wand_text));
329+
DestroyPixelWand(transparent_bg);
328330
return false;
329331
}
330332
double descender = metrics[3]; // has negative value
@@ -334,25 +336,16 @@ text_postprocess_reconfigure(void *state, struct video_desc desc)
334336

335337
MagickRemoveImage(s->wand_text);
336338
status = MagickNewImage(s->wand_text, s->text_width_px, s->text_height_px, transparent_bg);
337-
if (!status) {
338-
MSG(WARNING, "MagickNewImage failed: %s!\n",
339-
get_magick_error(s->wand_text));
340-
return false;
341-
}
339+
DestroyPixelWand(transparent_bg);
340+
HANDLE_WAND_ERROR(status, s->wand_text, "MagickNewImage failed");
342341

343342
double x_off = 0;
344343
double y_off_baseline = s->text_height_px - (-descender) + 1;
345344
double rot = 0;
346345
status = MagickAnnotateImage(s->wand_text, s->dw, x_off, y_off_baseline, rot, s->text);
347-
if (!status) {
348-
MSG(WARNING,
349-
"MagickAnnotateImage failed: %s!\n\n"
350-
"Perhaps the text contains invalid characters?\n",
351-
get_magick_error(s->wand_text));
352-
return false;
353-
}
354-
355-
DestroyPixelWand(transparent_bg);
346+
HANDLE_WAND_ERROR(status, s->wand_text,
347+
"MagickAnnotateImage failed (Perhaps the text "
348+
"contains invalid characters?)");
356349

357350
return true;
358351
}
@@ -398,30 +391,26 @@ static bool text_postprocess(void *state, struct video_frame *in, struct video_f
398391
MagickRemoveImage(s->wand_bg);
399392

400393
status = MagickSetSize(s->wand_bg, s->width, s->text_height_px);
401-
assert(status == MagickTrue && "[text vo_pp.] MagickSetSize failed -- ");
394+
HANDLE_WAND_ERROR(status, s->wand_bg, "MagickSetSize failed");
402395

403396
status = MagickReadImageBlob(s->wand_bg, stripe, s->text_height_px * dst_linesize);
404-
if (status != MagickTrue) {
405-
log_msg(LOG_LEVEL_WARNING, "[text vo_pp.] MagickReadImageBlob failed!\n");
406-
return false;
407-
}
397+
HANDLE_WAND_ERROR(status, s->wand_bg, "MagickReadImageBlob failed");
408398

409399
// compose it with text
410400
#ifdef WAND7
411401
status = MagickCompositeImage(s->wand_bg, s->wand_text, OverCompositeOp, true, s->margin_x, 0);
412402
#else
413403
status = MagickCompositeImage(s->wand_bg, s->wand_text, OverCompositeOp, s->margin_x, 0);
414404
#endif
415-
if (status != MagickTrue) {
416-
log_msg(LOG_LEVEL_WARNING, "[text vo_pp.] MagickCompositeImage failed!\n");
417-
return false;
418-
}
405+
HANDLE_WAND_ERROR(status, s->wand_bg, "MagickCompositeImage failed");
419406

420407
// extract the composed data
421408
unsigned char *data;
422409
size_t data_len;
423410
data = MagickGetImageBlob(s->wand_bg, &data_len);
424-
assert(data != NULL && "[text vo_pp.] MagickGetImageBlob failed!");
411+
if (data == NULL) {
412+
HANDLE_WAND_ERROR(MagickFalse, s->wand_bg, "MagickGetImageBlob failed");
413+
}
425414

426415
// send the input stream...
427416
memcpy(out->tiles[0].data, in->tiles[0].data, in->tiles[0].data_len);

0 commit comments

Comments
 (0)