[FFmpeg-cvslog] lavc/movtextdec: allow setting subtitle frame dimensions

John Stebbins git at videolan.org
Fri Apr 10 19:33:08 EEST 2020


ffmpeg | branch: master | John Stebbins <jstebbins at jetheaddev.com> | Sat Apr  4 12:33:54 2020 -0600| [b8d4a66b29b1dc3f6f48ce85577bfb6b57bd338f] | committer: Philip Langdale

lavc/movtextdec: allow setting subtitle frame dimensions

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 at overt.org>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b8d4a66b29b1dc3f6f48ce85577bfb6b57bd338f
---

 libavcodec/ass.c        | 30 +++++++++++++++++++++++-------
 libavcodec/ass.h        | 28 ++++++++++++++++++++++++++++
 libavcodec/movtextdec.c | 30 +++++++++++++++++++++++++++++-
 3 files changed, 80 insertions(+), 8 deletions(-)

diff --git a/libavcodec/ass.c b/libavcodec/ass.c
index a51673fb4e..7c26e3fd6d 100644
--- a/libavcodec/ass.c
+++ b/libavcodec/ass.c
@@ -26,11 +26,13 @@
 #include "libavutil/bprint.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(
              "[Script Info]\r\n"
@@ -67,8 +69,8 @@ int ff_ass_subtitle_header(AVCodecContext *avctx,
              "[Events]\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) : "",
-             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);
 
     if (!avctx->subtitle_header)
@@ -77,6 +79,20 @@ int ff_ass_subtitle_header(AVCodecContext *avctx,
     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)
 {
     return ff_ass_subtitle_header(avctx, ASS_DEFAULT_FONT,
diff --git a/libavcodec/ass.h b/libavcodec/ass.h
index 314b43b686..2c260e4e78 100644
--- a/libavcodec/ass.h
+++ b/libavcodec/ass.h
@@ -47,6 +47,34 @@ typedef struct FFASSDecoderContext {
     int readorder;
 } 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.
  *
diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c
index f3a504b47b..4b4da5e0d9 100644
--- a/libavcodec/movtextdec.c
+++ b/libavcodec/movtextdec.c
@@ -21,6 +21,7 @@
 
 #include "avcodec.h"
 #include "ass.h"
+#include "libavutil/opt.h"
 #include "libavutil/avstring.h"
 #include "libavutil/common.h"
 #include "libavutil/bprint.h"
@@ -96,6 +97,7 @@ typedef struct {
 } TextWrapBox;
 
 typedef struct {
+    AVClass *class;
     StyleBox **s;
     StyleBox *s_temp;
     HighlightBox h;
@@ -110,6 +112,8 @@ typedef struct {
     int size_var;
     int count_s, count_f;
     int readorder;
+    int frame_width;
+    int frame_height;
 } MovTextContext;
 
 typedef struct {
@@ -481,9 +485,17 @@ static int mov_text_init(AVCodecContext *avctx) {
     MovTextContext *m = avctx->priv_data;
     ret = mov_text_tx3g(avctx, m);
     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.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,
                     ASS_DEFAULT_BORDERSTYLE, m->d.alignment);
     } else
@@ -601,12 +613,28 @@ static void mov_text_flush(AVCodecContext *avctx)
         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 = {
     .name         = "mov_text",
     .long_name    = NULL_IF_CONFIG_SMALL("3GPP Timed Text subtitle"),
     .type         = AVMEDIA_TYPE_SUBTITLE,
     .id           = AV_CODEC_ID_MOV_TEXT,
     .priv_data_size = sizeof(MovTextContext),
+    .priv_class   = &mov_text_decoder_class,
     .init         = mov_text_init,
     .decode       = mov_text_decode_frame,
     .close        = mov_text_decode_close,



More information about the ffmpeg-cvslog mailing list