|
|
|
@@ -72,6 +72,7 @@ typedef struct { |
|
|
|
uint8_t style_fontsize; |
|
|
|
uint32_t style_color; |
|
|
|
uint16_t text_pos; |
|
|
|
uint16_t byte_count; |
|
|
|
} MovTextContext; |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
@@ -304,11 +305,34 @@ static void mov_text_color_cb(void *priv, unsigned int color, unsigned int color |
|
|
|
*/ |
|
|
|
} |
|
|
|
|
|
|
|
static uint16_t utf8_strlen(const char *text, int len) |
|
|
|
{ |
|
|
|
uint16_t i = 0, ret = 0; |
|
|
|
while (i < len) { |
|
|
|
char c = text[i]; |
|
|
|
if ((c & 0x80) == 0) |
|
|
|
i += 1; |
|
|
|
else if ((c & 0xE0) == 0xC0) |
|
|
|
i += 2; |
|
|
|
else if ((c & 0xF0) == 0xE0) |
|
|
|
i += 3; |
|
|
|
else if ((c & 0xF8) == 0xF0) |
|
|
|
i += 4; |
|
|
|
else |
|
|
|
return 0; |
|
|
|
ret++; |
|
|
|
} |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
static void mov_text_text_cb(void *priv, const char *text, int len) |
|
|
|
{ |
|
|
|
uint16_t utf8_len = utf8_strlen(text, len); |
|
|
|
MovTextContext *s = priv; |
|
|
|
av_bprint_append_data(&s->buffer, text, len); |
|
|
|
s->text_pos += len; |
|
|
|
// If it's not utf-8, just use the byte length |
|
|
|
s->text_pos += utf8_len ? utf8_len : len; |
|
|
|
s->byte_count += len; |
|
|
|
} |
|
|
|
|
|
|
|
static void mov_text_new_line_cb(void *priv, int forced) |
|
|
|
@@ -316,6 +340,7 @@ static void mov_text_new_line_cb(void *priv, int forced) |
|
|
|
MovTextContext *s = priv; |
|
|
|
av_bprint_append_data(&s->buffer, "\n", 1); |
|
|
|
s->text_pos += 1; |
|
|
|
s->byte_count += 1; |
|
|
|
} |
|
|
|
|
|
|
|
static const ASSCodesCallbacks mov_text_callbacks = { |
|
|
|
@@ -333,6 +358,7 @@ static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf, |
|
|
|
int i, length; |
|
|
|
size_t j; |
|
|
|
|
|
|
|
s->byte_count = 0; |
|
|
|
s->text_pos = 0; |
|
|
|
s->count = 0; |
|
|
|
s->box_flags = 0; |
|
|
|
@@ -368,7 +394,7 @@ static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
AV_WB16(buf, s->text_pos); |
|
|
|
AV_WB16(buf, s->byte_count); |
|
|
|
buf += 2; |
|
|
|
|
|
|
|
if (!av_bprint_is_complete(&s->buffer)) { |
|
|
|
|