You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
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>
This commit is contained in:
@@ -53,20 +53,6 @@
|
|||||||
|
|
||||||
#define RGB_TO_BGR(c) (((c) & 0xff) << 16 | ((c) & 0xff00) | (((c) >> 16) & 0xff))
|
#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 {
|
typedef struct {
|
||||||
uint16_t font_id;
|
uint16_t font_id;
|
||||||
char *font;
|
char *font;
|
||||||
@@ -85,6 +71,14 @@ typedef struct {
|
|||||||
uint16_t font_id;
|
uint16_t font_id;
|
||||||
} StyleBox;
|
} StyleBox;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
StyleBox style;
|
||||||
|
const char *font;
|
||||||
|
int back_color;
|
||||||
|
uint8_t back_alpha;
|
||||||
|
int alignment;
|
||||||
|
} MovTextDefault;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t hlit_start;
|
uint16_t hlit_start;
|
||||||
uint16_t hlit_end;
|
uint16_t hlit_end;
|
||||||
@@ -137,13 +131,28 @@ static void mov_text_cleanup_ftab(MovTextContext *m)
|
|||||||
m->ftab_entries = 0;
|
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)
|
static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
|
||||||
{
|
{
|
||||||
const uint8_t *tx3g_ptr = avctx->extradata;
|
const uint8_t *tx3g_ptr = avctx->extradata;
|
||||||
int i, j = -1, font_length, remaining = avctx->extradata_size - BOX_SIZE_INITIAL;
|
int i, j = -1, font_length, remaining = avctx->extradata_size - BOX_SIZE_INITIAL;
|
||||||
int8_t v_align, h_align;
|
int8_t v_align, h_align;
|
||||||
unsigned ftab_entries;
|
unsigned ftab_entries;
|
||||||
StyleBox s_default;
|
|
||||||
|
|
||||||
m->ftab_entries = 0;
|
m->ftab_entries = 0;
|
||||||
if (remaining < 0)
|
if (remaining < 0)
|
||||||
@@ -185,18 +194,7 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
|
|||||||
tx3g_ptr += 8;
|
tx3g_ptr += 8;
|
||||||
// StyleRecord
|
// StyleRecord
|
||||||
tx3g_ptr += 4;
|
tx3g_ptr += 4;
|
||||||
// fontID
|
mov_text_parse_style_record(&m->d.style, &tx3g_ptr);
|
||||||
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);
|
|
||||||
// FontRecord
|
// FontRecord
|
||||||
// FontRecord Size
|
// FontRecord Size
|
||||||
tx3g_ptr += 4;
|
tx3g_ptr += 4;
|
||||||
@@ -219,7 +217,7 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m)
|
|||||||
|
|
||||||
for (i = 0; i < m->ftab_entries; i++) {
|
for (i = 0; i < m->ftab_entries; i++) {
|
||||||
m->ftab[i].font_id = bytestream_get_be16(&tx3g_ptr);
|
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;
|
j = i;
|
||||||
font_length = bytestream_get_byte(&tx3g_ptr);
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
style->font_id = bytestream_get_be16(&tsmb);
|
mov_text_parse_style_record(style, &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);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -337,10 +328,11 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end,
|
|||||||
AVCodecContext *avctx)
|
AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
MovTextContext *m = avctx->priv_data;
|
MovTextContext *m = avctx->priv_data;
|
||||||
|
const StyleBox *const default_style = &m->d.style;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int text_pos = 0;
|
int text_pos = 0;
|
||||||
int entry = 0;
|
int entry = 0;
|
||||||
int color = m->d.color;
|
int color = default_style->color;
|
||||||
|
|
||||||
if (text < text_end && m->box_flags & TWRP_BOX) {
|
if (text < text_end && m->box_flags & TWRP_BOX) {
|
||||||
if (m->w.wrap_flag == 1) {
|
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];
|
const StyleBox *style = &m->s[entry];
|
||||||
if (text_pos == style->end) {
|
if (text_pos == style->end) {
|
||||||
av_bprintf(buf, "{\\r}");
|
av_bprintf(buf, "{\\r}");
|
||||||
color = m->d.color;
|
color = default_style->color;
|
||||||
entry++;
|
entry++;
|
||||||
style++;
|
style++;
|
||||||
}
|
}
|
||||||
if (entry < m->style_entries && text_pos == style->start) {
|
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);
|
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);
|
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);
|
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);
|
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++) {
|
for (i = 0; i < m->ftab_entries; i++) {
|
||||||
if (style->font_id == m->ftab[i].font_id)
|
if (style->font_id == m->ftab[i].font_id)
|
||||||
av_bprintf(buf, "{\\fn%s}", m->ftab[i].font);
|
av_bprintf(buf, "{\\fn%s}", m->ftab[i].font);
|
||||||
}
|
}
|
||||||
if (m->d.color != style->color) {
|
if (default_style->color != style->color) {
|
||||||
color = style->color;
|
color = style->color;
|
||||||
av_bprintf(buf, "{\\1c&H%X&}", RGB_TO_BGR(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);
|
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 (text_pos == m->h.hlit_end) {
|
||||||
if (m->box_flags & HCLR_BOX) {
|
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 {
|
} else {
|
||||||
av_bprintf(buf, "{\\1c&H%X&}{\\2c&H%X&}",
|
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;
|
MovTextContext *m = avctx->priv_data;
|
||||||
ret = mov_text_tx3g(avctx, m);
|
ret = mov_text_tx3g(avctx, m);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
|
const StyleBox *const default_style = &m->d.style;
|
||||||
if (!m->frame_width || !m->frame_height) {
|
if (!m->frame_width || !m->frame_height) {
|
||||||
m->frame_width = ASS_DEFAULT_PLAYRESX;
|
m->frame_width = ASS_DEFAULT_PLAYRESX;
|
||||||
m->frame_height = ASS_DEFAULT_PLAYRESY;
|
m->frame_height = ASS_DEFAULT_PLAYRESY;
|
||||||
}
|
}
|
||||||
return ff_ass_subtitle_header_full(avctx,
|
return ff_ass_subtitle_header_full(avctx,
|
||||||
m->frame_width, m->frame_height,
|
m->frame_width, m->frame_height,
|
||||||
m->d.font, m->d.fontsize,
|
m->d.font, default_style->fontsize,
|
||||||
(255U - m->d.alpha) << 24 | RGB_TO_BGR(m->d.color),
|
(255U - default_style->alpha) << 24 | RGB_TO_BGR(default_style->color),
|
||||||
(255U - m->d.alpha) << 24 | RGB_TO_BGR(m->d.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),
|
||||||
(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);
|
ASS_DEFAULT_BORDERSTYLE, m->d.alignment);
|
||||||
} else
|
} else
|
||||||
return ff_ass_subtitle_header_default(avctx);
|
return ff_ass_subtitle_header_default(avctx);
|
||||||
|
Reference in New Issue
Block a user