1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-09-16 08:36:51 +02:00

avfilter/drawutils: add alpha mode support

This allows drawing colors onto images with premultiplied alpha, by first
premultiplying the specified RGBA values.
This commit is contained in:
Niklas Haas
2025-08-13 15:45:51 +02:00
parent a90e8f1c1d
commit 39631c99d4
3 changed files with 12 additions and 5 deletions

View File

@@ -94,7 +94,7 @@ int ff_fill_ayuv_map(uint8_t *ayuv_map, enum AVPixelFormat pix_fmt)
}
int ff_draw_init2(FFDrawContext *draw, enum AVPixelFormat format, enum AVColorSpace csp,
enum AVColorRange range, unsigned flags)
enum AVColorRange range, enum AVAlphaMode alpha, unsigned flags)
{
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(format);
const AVLumaCoefficients *luma = NULL;
@@ -155,6 +155,7 @@ int ff_draw_init2(FFDrawContext *draw, enum AVPixelFormat format, enum AVColorSp
draw->nb_planes = nb_planes;
draw->range = range;
draw->csp = csp;
draw->alpha = alpha;
draw->flags = flags;
if (luma)
ff_fill_rgb2yuv_table(luma, draw->rgb2yuv);
@@ -167,12 +168,12 @@ int ff_draw_init2(FFDrawContext *draw, enum AVPixelFormat format, enum AVColorSp
int ff_draw_init_from_link(FFDrawContext *draw, const AVFilterLink *link,
unsigned flags)
{
return ff_draw_init2(draw, link->format, link->colorspace, link->color_range, flags);
return ff_draw_init2(draw, link->format, link->colorspace, link->color_range, link->alpha_mode, flags);
}
int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags)
{
return ff_draw_init2(draw, format, AVCOL_SPC_UNSPECIFIED, AVCOL_RANGE_UNSPECIFIED, flags);
return ff_draw_init2(draw, format, AVCOL_SPC_UNSPECIFIED, AVCOL_RANGE_UNSPECIFIED, AVALPHA_MODE_UNSPECIFIED, flags);
}
void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4])
@@ -189,6 +190,11 @@ void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4
for (int i = 0; i < 4; i++)
rgbad[i] = color->rgba[i] / 255.;
if (draw->alpha == AVALPHA_MODE_PREMULTIPLIED) {
for (int i = 0; i < 3; i++)
rgbad[i] *= rgbad[3];
}
if (draw->desc->flags & AV_PIX_FMT_FLAG_RGB)
memcpy(yuvad, rgbad, sizeof(double) * 3);
else

View File

@@ -45,6 +45,7 @@ typedef struct FFDrawContext {
enum AVColorRange range;
unsigned flags;
enum AVColorSpace csp;
enum AVAlphaMode alpha;
double rgb2yuv[3][3];
} FFDrawContext;
@@ -78,7 +79,7 @@ typedef struct FFDrawColor {
* @return 0 for success, < 0 for error
*/
int ff_draw_init2(FFDrawContext *draw, enum AVPixelFormat format, enum AVColorSpace csp,
enum AVColorRange range, unsigned flags);
enum AVColorRange range, enum AVAlphaMode alpha, unsigned flags);
/**
* Init a draw context, taking the format, colorspace and range from the given

View File

@@ -189,7 +189,7 @@ static int config_input(AVFilterLink *inlink)
ret = ff_draw_init2(&ass->draw, inlink->format,
ass_get_color_space(ass->track->YCbCrMatrix, inlink->colorspace),
ass_get_color_range(ass->track->YCbCrMatrix, inlink->color_range),
ass->alpha ? FF_DRAW_PROCESS_ALPHA : 0);
inlink->alpha_mode, ass->alpha ? FF_DRAW_PROCESS_ALPHA : 0);
if (ret < 0) {
av_log(ctx, AV_LOG_ERROR, "Failed to initialize FFDrawContext\n");
return ret;