diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c index 6d7885bb31..8f1015ab8e 100644 --- a/libavcodec/movtextdec.c +++ b/libavcodec/movtextdec.c @@ -36,6 +36,7 @@ #define STYL_BOX (1<<0) #define HLIT_BOX (1<<1) #define HCLR_BOX (1<<2) +#define TWRP_BOX (1<<3) #define BOTTOM_LEFT 1 #define BOTTOM_CENTER 2 @@ -80,6 +81,10 @@ typedef struct { uint8_t hlit_color[4]; } HilightcolorBox; +typedef struct { + uint8_t wrap_flag; +} TextWrapBox; + typedef struct { StyleBox **s; StyleBox *s_temp; @@ -87,6 +92,7 @@ typedef struct { HilightcolorBox c; FontRecord **ftab; FontRecord *ftab_temp; + TextWrapBox w; MovTextDefault d; uint8_t box_flags; uint16_t style_entries, ftab_entries; @@ -240,6 +246,13 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m) return 0; } +static int decode_twrp(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt) +{ + m->box_flags |= TWRP_BOX; + m->w.wrap_flag = *tsmb++; + return 0; +} + static int decode_hlit(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt) { m->box_flags |= HLIT_BOX; @@ -298,7 +311,8 @@ static int decode_styl(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt) static const Box box_types[] = { { MKBETAG('s','t','y','l'), 2, decode_styl }, { MKBETAG('h','l','i','t'), 4, decode_hlit }, - { MKBETAG('h','c','l','r'), 4, decode_hclr } + { MKBETAG('h','c','l','r'), 4, decode_hclr }, + { MKBETAG('t','w','r','p'), 1, decode_twrp } }; const static size_t box_count = FF_ARRAY_ELEMS(box_types); @@ -309,6 +323,15 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end, int i = 0; int j = 0; int text_pos = 0; + + if (text < text_end && m->box_flags & TWRP_BOX) { + if (m->w.wrap_flag == 1) { + av_bprintf(buf, "{\\q1}"); /* End of line wrap */ + } else { + av_bprintf(buf, "{\\q2}"); /* No wrap */ + } + } + while (text < text_end) { if (m->box_flags & STYL_BOX) { for (i = 0; i < m->style_entries; i++) {