[FFmpeg-devel] [PATCH] Fix for paletteuse to support transparency

Bjorn Roche bjorn at giphy.com
Tue Oct 10 23:12:43 EEST 2017


On Sat, Oct 7, 2017 at 7:48 AM, Clément Bœsch <u at pkh.me> wrote:

> > Subject: Re: [FFmpeg-devel] [PATCH] Fix for paletteuse to support
> transparency
>
> "lavf/paletteuse: add support for transparency"
>
> On Fri, Oct 06, 2017 at 04:59:55PM -0400, Bjorn Roche wrote:
> > ---
>

<snip>


> > +        { "none",            "no dither",
>                                 0, AV_OPT_TYPE_CONST,
> {.i64=DITHERING_NONE},            INT_MIN, INT_MAX, FLAGS, "dithering_mode"
> },
>
> I think none is already supported as builtin in AVOption, isn't it? In any
> case, this should probably be in a separated patch if deemed useful.
>

I'm not sure how that works, but apparently so.



> <snip>
> > +    if (c1[0] == 0 && c2[0] == 0) {
> > +        return 0;
> > +    } else if (c1[0] == c2[0]) {
> > +        return dr*dr + dg*dg + db*db;
> > +    } else {
> > +        return max_diff;
> > +    }
>
> So if both alpha are 0, you consider the color identical, and otherwise if
> both alpha are different, you consider the color completely different?
>

I don't see another clear solution.

<snip>

> >          if ((c & 0xff000000) == 0xff000000) { // ignore transparent
> entry
> > -            const uint8_t palrgb[] = {
> > +            const uint8_t palargb[] = {
> > +                palette[i]>>24 & 0xff,
>
> according to the condition just above, this is always 0xff. Is this what
> you want?
>

There is some ambiguity about dealing with transparency from the incoming
image, and I will have to change that condition anyway (more later).


<snip>

>
> >      return pal_id;
> >  }
> >
> > @@ -325,14 +338,15 @@ end:
> >   * Note: r, g, and b are the component of c but are passed as well to
> avoid
> >   * recomputing them (they are generally computed by the caller for
> other uses).
> >   */
>
> This comment probably needs adjustment for `a` (and yes, it refers to `c`
> instead of `color`, this needs to be adjusted too).
>
> > -static av_always_inline int color_get(struct cache_node *cache,
> uint32_t color,
> > -                                      uint8_t r, uint8_t g, uint8_t b,
>
> > +static av_always_inline int color_get(struct cache_node *cache,
> uint32_t argb,
>
> I'd prefer if you'd keep "color" instead of "argb", it would reduce the
> diff.
>

Changing the variable name was not accidental. "c" and "color" are
ambiguous when converting from rgb to indexed, and this patch no longer
works with rgb, but argb, so I believe being explicit is better. I was very
confused trying to follow which c/color variables where what when diving
into this code.


>
> > +                                      uint8_t a, uint8_t r, uint8_t g,
> uint8_t b,
> > +                                      int transparency_index,
> >                                        const struct color_node *map,
> >                                        const uint32_t *palette,
> >                                        const enum color_search_method
> search_method)
> >  {
> >      int i;
> > -    const uint8_t rgb[] = {r, g, b};
>
> > +    const uint8_t argb_elts[] = {a, r, g, b};
>
> elts?
>

this variable is the argb color, with elements (elts) separated into an
array. It is necessary for the diff function. Is there another variable
name you would prefer?


>
> > +        }
> >          p += p_linesize;
> >      }
> >
> > -    load_colormap(s);
>
> > +    load_colormap(s, pal_index);
>
> Why do you need to pass that `pal_index` as `nb_colors`; in what situation
> do you end up with nb_colors ≠ AVPALETTE_COUNT?
>

Sorry, that's an artifact of a prior version.


>
> [...]
>
> Overall this looks pretty fine, but I didn't test yet.
>
> I have a few concerns that may or may not be justified:
>
> - I hope RGB32 pix fmt always set the alpha to 0xff in the rest of the
>   framework, otherwise this is going to break pretty hard. We may need to
>   add some extra check at some point if we find "too much" transparency
>   colors.
>

I can't speak to this except for the testing I've done, and FATE.


> - I don't remember if diff should be linear somehow in the kdtree
>   algorithm (I think that was originally the reason I didn't  use L*a*b
>   instead of RGB, but I might be wrong).
>

I don't see anything to this effect, but that's part of the reason I kept
transparent colors out of the tree.

- I'll have to check all the debug options to make sure something didn't
>   go wrong.
>

-- 


Bjorn Roche

Sr. Video Pipeline Engineer

bjorn at giphy.com


More information about the ffmpeg-devel mailing list