avcodec/movtextdec: Deduplicate parsing of StyleRecords

Both TextSampleEntry and TextSample can contain StyleRecords;
yet both the code as well as the structures for them were duplicated.
This commit changes this.

Reviewed-by: Philip Langdale <philipl@overt.org>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
pull/375/head
Andreas Rheinhardt 3 years ago
parent 683bbb75db
commit 4b2bc0b8fe
  1. 95
      libavcodec/movtextdec.c

@ -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);

Loading…
Cancel
Save