@ -53,20 +53,6 @@
# define RGB_TO_BGR(c) (((c) & 0xff) << 16 | ((c) & 0xff00) | (((c) >> 16) & 0xff))
typedef struct {
uint16_t font_id ;
const char * font ;
uint8_t fontsize ;
int color ;
uint8_t alpha ;
int back_color ;
uint8_t back_alpha ;
uint8_t bold ;
uint8_t italic ;
uint8_t underline ;
int alignment ;
} MovTextDefault ;
typedef struct {
uint16_t font_id ;
char * font ;
@ -85,6 +71,14 @@ typedef struct {
uint16_t font_id ;
} StyleBox ;
typedef struct {
StyleBox style ;
const char * font ;
int back_color ;
uint8_t back_alpha ;
int alignment ;
} MovTextDefault ;
typedef struct {
uint16_t hlit_start ;
uint16_t hlit_end ;
@ -137,13 +131,28 @@ static void mov_text_cleanup_ftab(MovTextContext *m)
m - > ftab_entries = 0 ;
}
static void mov_text_parse_style_record ( StyleBox * style , const uint8_t * * ptr )
{
// fontID
style - > font_id = bytestream_get_be16 ( ptr ) ;
// face-style-flags
style - > flags = bytestream_get_byte ( ptr ) ;
style - > bold = ! ! ( style - > flags & STYLE_FLAG_BOLD ) ;
style - > italic = ! ! ( style - > flags & STYLE_FLAG_ITALIC ) ;
style - > underline = ! ! ( style - > flags & STYLE_FLAG_UNDERLINE ) ;
// fontsize
style - > fontsize = bytestream_get_byte ( ptr ) ;
// Primary color
style - > color = bytestream_get_be24 ( ptr ) ;
style - > alpha = bytestream_get_byte ( ptr ) ;
}
static int mov_text_tx3g ( AVCodecContext * avctx , MovTextContext * m )
{
const uint8_t * tx3g_ptr = avctx - > extradata ;
int i , j = - 1 , font_length , remaining = avctx - > extradata_size - BOX_SIZE_INITIAL ;
int8_t v_align , h_align ;
unsigned ftab_entries ;
StyleBox s_default ;
m - > ftab_entries = 0 ;
if ( remaining < 0 )
@ -185,18 +194,7 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
tx3g_ptr + = 8 ;
// StyleRecord
tx3g_ptr + = 4 ;
// fontID
m - > d . font_id = bytestream_get_be16 ( & tx3g_ptr ) ;
// face-style-flags
s_default . flags = bytestream_get_byte ( & tx3g_ptr ) ;
m - > d . bold = ! ! ( s_default . flags & STYLE_FLAG_BOLD ) ;
m - > d . italic = ! ! ( s_default . flags & STYLE_FLAG_ITALIC ) ;
m - > d . underline = ! ! ( s_default . flags & STYLE_FLAG_UNDERLINE ) ;
// fontsize
m - > d . fontsize = bytestream_get_byte ( & tx3g_ptr ) ;
// Primary color
m - > d . color = bytestream_get_be24 ( & tx3g_ptr ) ;
m - > d . alpha = bytestream_get_byte ( & tx3g_ptr ) ;
mov_text_parse_style_record ( & m - > d . style , & tx3g_ptr ) ;
// FontRecord
// FontRecord Size
tx3g_ptr + = 4 ;
@ -219,7 +217,7 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
for ( i = 0 ; i < m - > ftab_entries ; i + + ) {
m - > ftab [ i ] . font_id = bytestream_get_be16 ( & tx3g_ptr ) ;
if ( m - > ftab [ i ] . font_id = = m - > d . font_id )
if ( m - > ftab [ i ] . font_id = = m - > d . style . font_id )
j = i ;
font_length = bytestream_get_byte ( & tx3g_ptr ) ;
@ -298,14 +296,7 @@ static int decode_styl(const uint8_t *tsmb, MovTextContext *m, const AVPacket *a
continue ;
}
style - > font_id = bytestream_get_be16 ( & tsmb ) ;
style - > flags = bytestream_get_byte ( & tsmb ) ;
style - > bold = ! ! ( style - > flags & STYLE_FLAG_BOLD ) ;
style - > italic = ! ! ( style - > flags & STYLE_FLAG_ITALIC ) ;
style - > underline = ! ! ( style - > flags & STYLE_FLAG_UNDERLINE ) ;
style - > fontsize = bytestream_get_byte ( & tsmb ) ;
style - > color = bytestream_get_be24 ( & tsmb ) ;
style - > alpha = bytestream_get_byte ( & tsmb ) ;
mov_text_parse_style_record ( style , & tsmb ) ;
}
return 0 ;
}
@ -337,10 +328,11 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end,
AVCodecContext * avctx )
{
MovTextContext * m = avctx - > priv_data ;
const StyleBox * const default_style = & m - > d . style ;
int i = 0 ;
int text_pos = 0 ;
int entry = 0 ;
int color = m - > d . color ;
int color = default_style - > color ;
if ( text < text_end & & m - > box_flags & TWRP_BOX ) {
if ( m - > w . wrap_flag = = 1 ) {
@ -357,29 +349,29 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end,
const StyleBox * style = & m - > s [ entry ] ;
if ( text_pos = = style - > end ) {
av_bprintf ( buf , " { \\ r} " ) ;
color = m - > d . color ;
color = default_style - > color ;
entry + + ;
style + + ;
}
if ( entry < m - > style_entries & & text_pos = = style - > start ) {
if ( style - > bold ^ m - > d . bold )
if ( style - > bold ^ default_style - > bold )
av_bprintf ( buf , " { \\ b%d} " , style - > bold ) ;
if ( style - > italic ^ m - > d . italic )
if ( style - > italic ^ default_style - > italic )
av_bprintf ( buf , " { \\ i%d} " , style - > italic ) ;
if ( style - > underline ^ m - > d . underline )
if ( style - > underline ^ default_style - > underline )
av_bprintf ( buf , " { \\ u%d} " , style - > underline ) ;
if ( style - > fontsize ! = m - > d . fontsize )
if ( style - > fontsize ! = default_style - > fontsize )
av_bprintf ( buf , " { \\ fs%d} " , style - > fontsize ) ;
if ( style - > font_id ! = m - > d . font_id )
if ( style - > font_id ! = default_style - > font_id )
for ( i = 0 ; i < m - > ftab_entries ; i + + ) {
if ( style - > font_id = = m - > ftab [ i ] . font_id )
av_bprintf ( buf , " { \\ fn%s} " , m - > ftab [ i ] . font ) ;
}
if ( m - > d . color ! = style - > color ) {
if ( default_style - > color ! = style - > color ) {
color = style - > color ;
av_bprintf ( buf , " { \\ 1c&H%X&} " , RGB_TO_BGR ( color ) ) ;
}
if ( m - > d . alpha ! = style - > alpha )
if ( default_style - > alpha ! = style - > alpha )
av_bprintf ( buf , " { \\ 1a&H%02X&} " , 255 - style - > alpha ) ;
}
}
@ -400,10 +392,10 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end,
}
if ( text_pos = = m - > h . hlit_end ) {
if ( m - > box_flags & HCLR_BOX ) {
av_bprintf ( buf , " { \\ 2c&H%X&} " , RGB_TO_BGR ( m - > d . color ) ) ;
av_bprintf ( buf , " { \\ 2c&H%X&} " , RGB_TO_BGR ( default_style - > color ) ) ;
} else {
av_bprintf ( buf , " { \\ 1c&H%X&}{ \\ 2c&H%X&} " ,
RGB_TO_BGR ( color ) , RGB_TO_BGR ( m - > d . color ) ) ;
RGB_TO_BGR ( color ) , RGB_TO_BGR ( default_style - > color ) ) ;
}
}
}
@ -441,18 +433,19 @@ static int mov_text_init(AVCodecContext *avctx) {
MovTextContext * m = avctx - > priv_data ;
ret = mov_text_tx3g ( avctx , m ) ;
if ( ret = = 0 ) {
const StyleBox * const default_style = & m - > d . style ;
if ( ! m - > frame_width | | ! m - > frame_height ) {
m - > frame_width = ASS_DEFAULT_PLAYRESX ;
m - > frame_height = ASS_DEFAULT_PLAYRESY ;
}
return ff_ass_subtitle_header_full ( avctx ,
m - > frame_width , m - > frame_height ,
m - > d . font , m - > d . fontsize ,
( 255U - m - > d . alpha ) < < 24 | RGB_TO_BGR ( m - > d . color ) ,
( 255U - m - > d . alpha ) < < 24 | RGB_TO_BGR ( m - > d . color ) ,
m - > d . font , default_style - > fontsize ,
( 255U - default_style - > alpha ) < < 24 | RGB_TO_BGR ( default_style - > color ) ,
( 255U - default_style - > alpha ) < < 24 | RGB_TO_BGR ( default_style - > color ) ,
( 255U - m - > d . back_alpha ) < < 24 | RGB_TO_BGR ( m - > d . back_color ) ,
( 255U - m - > d . back_alpha ) < < 24 | RGB_TO_BGR ( m - > d . back_color ) ,
m - > d . bold , m - > d . italic , m - > d . underline ,
default_style - > bold , default_style - > italic , default_style - > underline ,
ASS_DEFAULT_BORDERSTYLE , m - > d . alignment ) ;
} else
return ff_ass_subtitle_header_default ( avctx ) ;