diff options
-rw-r--r-- | libavcodec/movtextdec.c | 82 | ||||
-rw-r--r-- | tests/ref/fate/sub-movtext | 2 | ||||
-rw-r--r-- | tests/ref/fate/sub-subripenc | 10 |
3 files changed, 84 insertions, 10 deletions
diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c index fc6993e..6d7885b 100644 --- a/libavcodec/movtextdec.c +++ b/libavcodec/movtextdec.c @@ -37,6 +37,27 @@ #define HLIT_BOX (1<<1) #define HCLR_BOX (1<<2) +#define BOTTOM_LEFT 1 +#define BOTTOM_CENTER 2 +#define BOTTOM_RIGHT 3 +#define MIDDLE_LEFT 4 +#define MIDDLE_CENTER 5 +#define MIDDLE_RIGHT 6 +#define TOP_LEFT 7 +#define TOP_CENTER 8 +#define TOP_RIGHT 9 + +typedef struct { + char *font; + int fontsize; + int color; + int back_color; + int bold; + int italic; + int underline; + int alignment; +} MovTextDefault; + typedef struct { uint16_t fontID; char *font; @@ -66,6 +87,7 @@ typedef struct { HilightcolorBox c; FontRecord **ftab; FontRecord *ftab_temp; + MovTextDefault d; uint8_t box_flags; uint16_t style_entries, ftab_entries; uint64_t tracksize; @@ -106,6 +128,9 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m) { char *tx3g_ptr = avctx->extradata; int i, box_size, font_length; + int8_t v_align, h_align; + int style_fontID; + StyleBox s_default; m->count_f = 0; m->ftab_entries = 0; @@ -116,13 +141,52 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m) // Display Flags tx3g_ptr += 4; // Alignment - tx3g_ptr += 2; + h_align = *tx3g_ptr++; + v_align = *tx3g_ptr++; + if (h_align == 0) { + if (v_align == 0) + m->d.alignment = TOP_LEFT; + if (v_align == 1) + m->d.alignment = MIDDLE_LEFT; + if (v_align == -1) + m->d.alignment = BOTTOM_LEFT; + } + if (h_align == 1) { + if (v_align == 0) + m->d.alignment = TOP_CENTER; + if (v_align == 1) + m->d.alignment = MIDDLE_CENTER; + if (v_align == -1) + m->d.alignment = BOTTOM_CENTER; + } + if (h_align == -1) { + if (v_align == 0) + m->d.alignment = TOP_RIGHT; + if (v_align == 1) + m->d.alignment = MIDDLE_RIGHT; + if (v_align == -1) + m->d.alignment = BOTTOM_RIGHT; + } // Background Color + m->d.back_color = AV_RB24(tx3g_ptr); tx3g_ptr += 4; // BoxRecord tx3g_ptr += 8; // StyleRecord - tx3g_ptr += 12; + tx3g_ptr += 4; + // fontID + style_fontID = AV_RB16(tx3g_ptr); + tx3g_ptr += 2; + // face-style-flags + s_default.style_flag = *tx3g_ptr++; + m->d.bold = s_default.style_flag & STYLE_FLAG_BOLD; + m->d.italic = s_default.style_flag & STYLE_FLAG_ITALIC; + m->d.underline = s_default.style_flag & STYLE_FLAG_UNDERLINE; + // fontsize + m->d.fontsize = *tx3g_ptr++; + // Primary color + m->d.color = AV_RB24(tx3g_ptr); + tx3g_ptr += 4; // FontRecord // FontRecord Size tx3g_ptr += 4; @@ -169,6 +233,10 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m) } tx3g_ptr = tx3g_ptr + font_length; } + for (i = 0; i < m->ftab_entries; i++) { + if (style_fontID == m->ftab[i]->fontID) + m->d.font = m->ftab[i]->font; + } return 0; } @@ -312,9 +380,15 @@ static int mov_text_init(AVCodecContext *avctx) { * it's very common to find files where the default style is broken * and respecting it results in a worse experience than ignoring it. */ + int ret; MovTextContext *m = avctx->priv_data; - mov_text_tx3g(avctx, m); - return ff_ass_subtitle_header_default(avctx); + ret = mov_text_tx3g(avctx, m); + if (ret == 0) { + return ff_ass_subtitle_header(avctx, m->d.font, m->d.fontsize, m->d.color, + m->d.back_color, m->d.bold, m->d.italic, + m->d.underline, m->d.alignment); + } else + return ff_ass_subtitle_header_default(avctx); } static int mov_text_decode_frame(AVCodecContext *avctx, diff --git a/tests/ref/fate/sub-movtext b/tests/ref/fate/sub-movtext index 6a90e96..94ed22d 100644 --- a/tests/ref/fate/sub-movtext +++ b/tests/ref/fate/sub-movtext @@ -6,7 +6,7 @@ PlayResY: 288 [V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
-Style: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
+Style: Default,Serif,18,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
diff --git a/tests/ref/fate/sub-subripenc b/tests/ref/fate/sub-subripenc index 1f1e031..7f35ae9 100644 --- a/tests/ref/fate/sub-subripenc +++ b/tests/ref/fate/sub-subripenc @@ -1,14 +1,14 @@ 1 00:00:00,970 --> 00:00:02,540 -- Test 1.
-- Test 2. +<font face="Serif" size="18">- Test 1.
+- Test 2.</font> 2 00:00:03,050 --> 00:00:04,740 -Test 3. +<font face="Serif" size="18">Test 3.</font> 3 00:00:05,850 --> 00:00:08,140 -- Test 4.
-- Test 5. +<font face="Serif" size="18">- Test 4.
+- Test 5.</font> |