Compare commits

...

4 Commits

Author SHA1 Message Date
Michael Niedermayer 894da5ca7d
Changelog: include last 3 fixes
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2025-11-20 02:43:51 +01:00
Zhao Zhili 4c788cb200
avutil/common: cast GET_BYTE/GET_16BIT returned value
In case of GET_BYTE/GET_16BIT return signed value.

(cherry picked from commit 0ae8df5f2c)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2025-11-20 02:32:05 +01:00
Zhao Zhili 9c4d3a7add
avfilter/vf_drawtext: fix call GET_UTF8 with invalid argument
For GET_UTF8(val, GET_BYTE, ERROR), val has type of uint32_t,
GET_BYTE must return an unsigned integer, otherwise signed
extension happened due to val= (GET_BYTE), and GET_UTF8 went to
the error path.

This bug incidentally cancelled the bug where hb_buffer_add_utf8
was being called with incorrect argument, allowing drawtext to
function correctly on x86 and macOS ARM, which defined char as
signed. However, on Linux and Android ARM environments, because
char is unsigned by default, GET_UTF8 now returns the correct
return, which unexpectedly revealed issue #20906.

(cherry picked from commit a5cc0e5c9e)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2025-11-20 02:31:47 +01:00
Zhao Zhili b5fb8749b9
avfilter/vf_drawtext: fix incorrect text length
From the doc of HarfBuzz, what hb_buffer_add_utf8 needs is the
number of bytes, not Unicode character:
hb_buffer_add_utf8(buf, text, strlen(text), 0, strlen(text));

Fix issue #20906.

(cherry picked from commit 9bc3c572ea)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2025-11-20 02:30:46 +01:00
3 changed files with 11 additions and 10 deletions

View File

@ -3,6 +3,10 @@ releases are sorted from youngest to oldest.
version 8.0.1: version 8.0.1:
avutil/common: cast GET_BYTE/GET_16BIT returned value
avfilter/vf_drawtext: fix call GET_UTF8 with invalid argument
avfilter/vf_drawtext: fix incorrect text length
Update for 8.0.1
avfilter/vf_drawtext: Account for bbox text seperator avfilter/vf_drawtext: Account for bbox text seperator
avcodec/mediacodecdec_common: Check that the input to mediacodec_wrap_sw_audio_buffer() contains channel * sample_size avcodec/mediacodecdec_common: Check that the input to mediacodec_wrap_sw_audio_buffer() contains channel * sample_size
avcodec/rv60dec: Clear blk_info avcodec/rv60dec: Clear blk_info

View File

@ -1394,8 +1394,7 @@ static int measure_text(AVFilterContext *ctx, TextMetrics *metrics)
{ {
DrawTextContext *s = ctx->priv; DrawTextContext *s = ctx->priv;
char *text = s->expanded_text.str; char *text = s->expanded_text.str;
char *textdup = NULL, *start = NULL; char *textdup = NULL;
int num_chars = 0;
int width64 = 0, w64 = 0; int width64 = 0, w64 = 0;
int cur_min_y64 = 0, first_max_y64 = -32000; int cur_min_y64 = 0, first_max_y64 = -32000;
int first_min_x64 = 32000, last_max_x64 = -32000; int first_min_x64 = 32000, last_max_x64 = -32000;
@ -1405,7 +1404,7 @@ static int measure_text(AVFilterContext *ctx, TextMetrics *metrics)
Glyph *glyph = NULL; Glyph *glyph = NULL;
int i, tab_idx = 0, last_tab_idx = 0, line_offset = 0; int i, tab_idx = 0, last_tab_idx = 0, line_offset = 0;
char* p; uint8_t *start, *p;
int ret = 0; int ret = 0;
// Count the lines and the tab characters // Count the lines and the tab characters
@ -1458,7 +1457,7 @@ continue_on_failed2:
TextLine *cur_line = &s->lines[line_count]; TextLine *cur_line = &s->lines[line_count];
HarfbuzzData *hb = &cur_line->hb_data; HarfbuzzData *hb = &cur_line->hb_data;
cur_line->cluster_offset = line_offset; cur_line->cluster_offset = line_offset;
ret = shape_text_hb(s, hb, start, num_chars); ret = shape_text_hb(s, hb, start, p - start);
if (ret != 0) { if (ret != 0) {
goto done; goto done;
} }
@ -1516,14 +1515,12 @@ continue_on_failed2:
if (w64 > width64) { if (w64 > width64) {
width64 = w64; width64 = w64;
} }
num_chars = -1;
start = p; start = p;
++line_count; ++line_count;
line_offset = i + 1; line_offset = i + 1;
} }
if (code == 0) break; if (code == 0) break;
++num_chars;
} }
metrics->line_height64 = s->face->size->metrics.height; metrics->line_height64 = s->face->size->metrics.height;

View File

@ -486,13 +486,13 @@ static av_always_inline av_const int av_parity_c(uint32_t v)
* to prevent undefined results. * to prevent undefined results.
*/ */
#define GET_UTF8(val, GET_BYTE, ERROR)\ #define GET_UTF8(val, GET_BYTE, ERROR)\
val= (GET_BYTE);\ val= (uint8_t)(GET_BYTE);\
{\ {\
uint32_t top = (val & 128) >> 1;\ uint32_t top = (val & 128) >> 1;\
if ((val & 0xc0) == 0x80 || val >= 0xFE)\ if ((val & 0xc0) == 0x80 || val >= 0xFE)\
{ERROR}\ {ERROR}\
while (val & top) {\ while (val & top) {\
unsigned int tmp = (GET_BYTE) - 128;\ unsigned int tmp = (uint8_t)(GET_BYTE) - 128;\
if(tmp>>6)\ if(tmp>>6)\
{ERROR}\ {ERROR}\
val= (val<<6) + tmp;\ val= (val<<6) + tmp;\
@ -511,11 +511,11 @@ static av_always_inline av_const int av_parity_c(uint32_t v)
* typically a goto statement. * typically a goto statement.
*/ */
#define GET_UTF16(val, GET_16BIT, ERROR)\ #define GET_UTF16(val, GET_16BIT, ERROR)\
val = (GET_16BIT);\ val = (uint16_t)(GET_16BIT);\
{\ {\
unsigned int hi = val - 0xD800;\ unsigned int hi = val - 0xD800;\
if (hi < 0x800) {\ if (hi < 0x800) {\
val = (GET_16BIT) - 0xDC00;\ val = (uint16_t)(GET_16BIT) - 0xDC00;\
if (val > 0x3FFU || hi > 0x3FFU)\ if (val > 0x3FFU || hi > 0x3FFU)\
{ERROR}\ {ERROR}\
val += (hi<<10) + 0x10000;\ val += (hi<<10) + 0x10000;\