diff --git a/libavcodec/microdvddec.c b/libavcodec/microdvddec.c index fe70ea45dd..27645cccb1 100644 --- a/libavcodec/microdvddec.c +++ b/libavcodec/microdvddec.c @@ -311,11 +311,59 @@ end: return avpkt->size; } +static int microdvd_init(AVCodecContext *avctx) +{ + int i, sidx; + AVBPrint font_buf; + int font_size = ASS_DEFAULT_FONT_SIZE; + int color = ASS_DEFAULT_COLOR; + int bold = ASS_DEFAULT_BOLD; + int italic = ASS_DEFAULT_ITALIC; + int underline = ASS_DEFAULT_UNDERLINE; + int alignment = ASS_DEFAULT_ALIGNMENT; + struct microdvd_tag tags[sizeof(MICRODVD_TAGS) - 1] = {{0}}; + + av_bprint_init(&font_buf, 0, AV_BPRINT_SIZE_AUTOMATIC); + av_bprintf(&font_buf, "%s", ASS_DEFAULT_FONT); + + if (avctx->extradata) { + microdvd_load_tags(tags, avctx->extradata); + for (i = 0; i < sizeof(MICRODVD_TAGS) - 1; i++) { + switch (av_tolower(tags[i].key)) { + case 'y': + for (sidx = 0; sidx < sizeof(MICRODVD_STYLES) - 1; sidx++) { + if (tags[i].data1 & (1 << sidx)) { + switch (MICRODVD_STYLES[sidx]) { + case 'i': italic = 1; break; + case 'b': bold = 1; break; + case 'u': underline = 1; break; + } + } + } + break; + + case 'c': color = tags[i].data1; break; + case 's': font_size = tags[i].data1; break; + case 'p': alignment = 8; break; + + case 'f': + av_bprint_clear(&font_buf); + av_bprintf(&font_buf, "%.*s", + tags[i].data_string_len, tags[i].data_string); + break; + } + } + } + return ff_ass_subtitle_header(avctx, font_buf.str, font_size, color, + ASS_DEFAULT_BACK_COLOR, bold, italic, + underline, alignment); +} + AVCodec ff_microdvd_decoder = { .name = "microdvd", .long_name = NULL_IF_CONFIG_SMALL("MicroDVD subtitle"), .type = AVMEDIA_TYPE_SUBTITLE, .id = CODEC_ID_MICRODVD, - .init = ff_ass_subtitle_header_default, + .init = microdvd_init, .decode = microdvd_decode_frame, };