Font sizes are relative to the subtitle frame dimensions. If the expected frame dimensions are not known, the font sizes will most likely be incorrect. Signed-off-by: Philip Langdale <philipl@overt.org>tags/n4.3
| @@ -26,11 +26,13 @@ | |||||
| #include "libavutil/bprint.h" | #include "libavutil/bprint.h" | ||||
| #include "libavutil/common.h" | #include "libavutil/common.h" | ||||
| int ff_ass_subtitle_header(AVCodecContext *avctx, | |||||
| const char *font, int font_size, | |||||
| int color, int back_color, | |||||
| int bold, int italic, int underline, | |||||
| int border_style, int alignment) | |||||
| int ff_ass_subtitle_header_full(AVCodecContext *avctx, | |||||
| int play_res_x, int play_res_y, | |||||
| const char *font, int font_size, | |||||
| int primary_color, int secondary_color, | |||||
| int outline_color, int back_color, | |||||
| int bold, int italic, int underline, | |||||
| int border_style, int alignment) | |||||
| { | { | ||||
| avctx->subtitle_header = av_asprintf( | avctx->subtitle_header = av_asprintf( | ||||
| "[Script Info]\r\n" | "[Script Info]\r\n" | ||||
| @@ -67,8 +69,8 @@ int ff_ass_subtitle_header(AVCodecContext *avctx, | |||||
| "[Events]\r\n" | "[Events]\r\n" | ||||
| "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n", | "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n", | ||||
| !(avctx->flags & AV_CODEC_FLAG_BITEXACT) ? AV_STRINGIFY(LIBAVCODEC_VERSION) : "", | !(avctx->flags & AV_CODEC_FLAG_BITEXACT) ? AV_STRINGIFY(LIBAVCODEC_VERSION) : "", | ||||
| ASS_DEFAULT_PLAYRESX, ASS_DEFAULT_PLAYRESY, | |||||
| font, font_size, color, color, back_color, back_color, | |||||
| play_res_x, play_res_y, font, font_size, | |||||
| primary_color, secondary_color, outline_color, back_color, | |||||
| -bold, -italic, -underline, border_style, alignment); | -bold, -italic, -underline, border_style, alignment); | ||||
| if (!avctx->subtitle_header) | if (!avctx->subtitle_header) | ||||
| @@ -77,6 +79,20 @@ int ff_ass_subtitle_header(AVCodecContext *avctx, | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int ff_ass_subtitle_header(AVCodecContext *avctx, | |||||
| const char *font, int font_size, | |||||
| int color, int back_color, | |||||
| int bold, int italic, int underline, | |||||
| int border_style, int alignment) | |||||
| { | |||||
| return ff_ass_subtitle_header_full(avctx, | |||||
| ASS_DEFAULT_PLAYRESX, ASS_DEFAULT_PLAYRESY, | |||||
| font, font_size, color, color, | |||||
| back_color, back_color, | |||||
| bold, italic, underline, | |||||
| border_style, alignment); | |||||
| } | |||||
| int ff_ass_subtitle_header_default(AVCodecContext *avctx) | int ff_ass_subtitle_header_default(AVCodecContext *avctx) | ||||
| { | { | ||||
| return ff_ass_subtitle_header(avctx, ASS_DEFAULT_FONT, | return ff_ass_subtitle_header(avctx, ASS_DEFAULT_FONT, | ||||
| @@ -47,6 +47,34 @@ typedef struct FFASSDecoderContext { | |||||
| int readorder; | int readorder; | ||||
| } FFASSDecoderContext; | } FFASSDecoderContext; | ||||
| /** | |||||
| * Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS. | |||||
| * Can specify all fields explicitly | |||||
| * | |||||
| * @param avctx pointer to the AVCodecContext | |||||
| * @param play_res_x subtitle frame width | |||||
| * @param play_res_y subtitle frame height | |||||
| * @param font name of the default font face to use | |||||
| * @param font_size default font size to use | |||||
| * @param primary_color default text color to use (ABGR) | |||||
| * @param secondary_color default secondary text color to use (ABGR) | |||||
| * @param outline_color default outline color to use (ABGR) | |||||
| * @param back_color default background color to use (ABGR) | |||||
| * @param bold 1 for bold text, 0 for normal text | |||||
| * @param italic 1 for italic text, 0 for normal text | |||||
| * @param underline 1 for underline text, 0 for normal text | |||||
| * @param border_style 1 for outline, 3 for opaque box | |||||
| * @param alignment position of the text (left, center, top...), defined after | |||||
| * the layout of the numpad (1-3 sub, 4-6 mid, 7-9 top) | |||||
| * @return >= 0 on success otherwise an error code <0 | |||||
| */ | |||||
| int ff_ass_subtitle_header_full(AVCodecContext *avctx, | |||||
| int play_res_x, int play_res_y, | |||||
| const char *font, int font_size, | |||||
| int primary_color, int secondary_color, | |||||
| int outline_color, int back_color, | |||||
| int bold, int italic, int underline, | |||||
| int border_style, int alignment); | |||||
| /** | /** | ||||
| * Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS. | * Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS. | ||||
| * | * | ||||
| @@ -21,6 +21,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "ass.h" | #include "ass.h" | ||||
| #include "libavutil/opt.h" | |||||
| #include "libavutil/avstring.h" | #include "libavutil/avstring.h" | ||||
| #include "libavutil/common.h" | #include "libavutil/common.h" | ||||
| #include "libavutil/bprint.h" | #include "libavutil/bprint.h" | ||||
| @@ -96,6 +97,7 @@ typedef struct { | |||||
| } TextWrapBox; | } TextWrapBox; | ||||
| typedef struct { | typedef struct { | ||||
| AVClass *class; | |||||
| StyleBox **s; | StyleBox **s; | ||||
| StyleBox *s_temp; | StyleBox *s_temp; | ||||
| HighlightBox h; | HighlightBox h; | ||||
| @@ -110,6 +112,8 @@ typedef struct { | |||||
| int size_var; | int size_var; | ||||
| int count_s, count_f; | int count_s, count_f; | ||||
| int readorder; | int readorder; | ||||
| int frame_width; | |||||
| int frame_height; | |||||
| } MovTextContext; | } MovTextContext; | ||||
| typedef struct { | typedef struct { | ||||
| @@ -481,9 +485,17 @@ static int mov_text_init(AVCodecContext *avctx) { | |||||
| MovTextContext *m = avctx->priv_data; | MovTextContext *m = avctx->priv_data; | ||||
| ret = mov_text_tx3g(avctx, m); | ret = mov_text_tx3g(avctx, m); | ||||
| if (ret == 0) { | if (ret == 0) { | ||||
| return ff_ass_subtitle_header(avctx, m->d.font, m->d.fontsize, | |||||
| if (!m->frame_width || !m->frame_height) { | |||||
| m->frame_width = ASS_DEFAULT_PLAYRESX; | |||||
| m->frame_height = ASS_DEFAULT_PLAYRESY; | |||||
| } | |||||
| return ff_ass_subtitle_header_full(avctx, | |||||
| m->frame_width, m->frame_height, | |||||
| m->d.font, m->d.fontsize, | |||||
| (255 - m->d.alpha) << 24 | RGB_TO_BGR(m->d.color), | |||||
| (255 - m->d.alpha) << 24 | RGB_TO_BGR(m->d.color), | (255 - m->d.alpha) << 24 | RGB_TO_BGR(m->d.color), | ||||
| (255 - m->d.back_alpha) << 24 | RGB_TO_BGR(m->d.back_color), | (255 - m->d.back_alpha) << 24 | RGB_TO_BGR(m->d.back_color), | ||||
| (255 - m->d.back_alpha) << 24 | RGB_TO_BGR(m->d.back_color), | |||||
| m->d.bold, m->d.italic, m->d.underline, | m->d.bold, m->d.italic, m->d.underline, | ||||
| ASS_DEFAULT_BORDERSTYLE, m->d.alignment); | ASS_DEFAULT_BORDERSTYLE, m->d.alignment); | ||||
| } else | } else | ||||
| @@ -601,12 +613,28 @@ static void mov_text_flush(AVCodecContext *avctx) | |||||
| m->readorder = 0; | m->readorder = 0; | ||||
| } | } | ||||
| #define OFFSET(x) offsetof(MovTextContext, x) | |||||
| #define FLAGS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_SUBTITLE_PARAM | |||||
| static const AVOption options[] = { | |||||
| { "width", "Frame width, usually video width", OFFSET(frame_width), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, | |||||
| { "height", "Frame height, usually video height", OFFSET(frame_height), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS }, | |||||
| { NULL }, | |||||
| }; | |||||
| static const AVClass mov_text_decoder_class = { | |||||
| .class_name = "MOV text decoder", | |||||
| .item_name = av_default_item_name, | |||||
| .option = options, | |||||
| .version = LIBAVUTIL_VERSION_INT, | |||||
| }; | |||||
| AVCodec ff_movtext_decoder = { | AVCodec ff_movtext_decoder = { | ||||
| .name = "mov_text", | .name = "mov_text", | ||||
| .long_name = NULL_IF_CONFIG_SMALL("3GPP Timed Text subtitle"), | .long_name = NULL_IF_CONFIG_SMALL("3GPP Timed Text subtitle"), | ||||
| .type = AVMEDIA_TYPE_SUBTITLE, | .type = AVMEDIA_TYPE_SUBTITLE, | ||||
| .id = AV_CODEC_ID_MOV_TEXT, | .id = AV_CODEC_ID_MOV_TEXT, | ||||
| .priv_data_size = sizeof(MovTextContext), | .priv_data_size = sizeof(MovTextContext), | ||||
| .priv_class = &mov_text_decoder_class, | |||||
| .init = mov_text_init, | .init = mov_text_init, | ||||
| .decode = mov_text_decode_frame, | .decode = mov_text_decode_frame, | ||||
| .close = mov_text_decode_close, | .close = mov_text_decode_close, | ||||