@ -37,6 +37,27 @@
# define HLIT_BOX (1<<1)
# define HLIT_BOX (1<<1)
# define HCLR_BOX (1<<2)
# 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 {
typedef struct {
uint16_t fontID ;
uint16_t fontID ;
char * font ;
char * font ;
@ -66,6 +87,7 @@ typedef struct {
HilightcolorBox c ;
HilightcolorBox c ;
FontRecord * * ftab ;
FontRecord * * ftab ;
FontRecord * ftab_temp ;
FontRecord * ftab_temp ;
MovTextDefault d ;
uint8_t box_flags ;
uint8_t box_flags ;
uint16_t style_entries , ftab_entries ;
uint16_t style_entries , ftab_entries ;
uint64_t tracksize ;
uint64_t tracksize ;
@ -106,6 +128,9 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
{
{
char * tx3g_ptr = avctx - > extradata ;
char * tx3g_ptr = avctx - > extradata ;
int i , box_size , font_length ;
int i , box_size , font_length ;
int8_t v_align , h_align ;
int style_fontID ;
StyleBox s_default ;
m - > count_f = 0 ;
m - > count_f = 0 ;
m - > ftab_entries = 0 ;
m - > ftab_entries = 0 ;
@ -116,13 +141,52 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
// Display Flags
// Display Flags
tx3g_ptr + = 4 ;
tx3g_ptr + = 4 ;
// Alignment
// 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
// Background Color
m - > d . back_color = AV_RB24 ( tx3g_ptr ) ;
tx3g_ptr + = 4 ;
tx3g_ptr + = 4 ;
// BoxRecord
// BoxRecord
tx3g_ptr + = 8 ;
tx3g_ptr + = 8 ;
// StyleRecord
// 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
// FontRecord Size
// FontRecord Size
tx3g_ptr + = 4 ;
tx3g_ptr + = 4 ;
@ -169,6 +233,10 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
}
}
tx3g_ptr = tx3g_ptr + font_length ;
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 ;
return 0 ;
}
}
@ -312,8 +380,14 @@ static int mov_text_init(AVCodecContext *avctx) {
* it ' s very common to find files where the default style is broken
* it ' s very common to find files where the default style is broken
* and respecting it results in a worse experience than ignoring it .
* and respecting it results in a worse experience than ignoring it .
*/
*/
int ret ;
MovTextContext * m = avctx - > priv_data ;
MovTextContext * m = avctx - > priv_data ;
mov_text_tx3g ( avctx , m ) ;
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 ) ;
return ff_ass_subtitle_header_default ( avctx ) ;
}
}