|
|
|
@ -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, |
|
|
|
|