From: Niklesh <niklesh.lalw...@iitb.ac.in> This is the updated patch to set the default style in ASS from the default style information present in the movtext header.
Signed-off-by: Niklesh <niklesh.lalw...@iitb.ac.in> --- libavcodec/movtextdec.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 4 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, -- 1.9.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel