diff options
author | Niklesh <niklesh.lalwani@iitb.ac.in> | 2015-08-10 01:13:43 +0530 |
---|---|---|
committer | Philip Langdale <philipl@overt.org> | 2015-08-09 15:12:15 -0700 |
commit | d670848d4c2757068ff43a68c05d01b28c809fb4 (patch) | |
tree | 537d6ff8079179b8df9bdec222a101f4c5b90675 | |
parent | 8628b06b317ee53c09a062c5357343f73a5ea08e (diff) | |
download | ffmpeg-d670848d4c2757068ff43a68c05d01b28c809fb4.tar.gz |
movtextdec: Use default style information from movtext header
Signed-off-by: Niklesh <niklesh.lalwani@iitb.ac.in>
-rw-r--r-- | libavcodec/movtextdec.c | 82 |
1 files changed, 78 insertions, 4 deletions
diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c index fc6993e723..e92b04bdf8 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 + memcpy(&m->d.back_color, tx3g_ptr, 3); 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 + memcpy(&m->d.color, tx3g_ptr, 3); + 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, |