- ColorChannelMixerContext *s = ctx->priv;
- ThreadData *td = arg;
- AVFrame *in = td->in;
- AVFrame *out = td->out;
- const int slice_start = (out->height * jobnr) / nb_jobs;
- const int slice_end = (out->height * (jobnr+1)) / nb_jobs;
- const uint8_t roffset = s->rgba_map[R];
- const uint8_t goffset = s->rgba_map[G];
- const uint8_t boffset = s->rgba_map[B];
- const uint8_t aoffset = s->rgba_map[A];
- const uint8_t *srcrow = in->data[0] + slice_start * in->linesize[0];
- uint8_t *dstrow = out->data[0] + slice_start * out->linesize[0];
- int i, j;
-
- for (i = slice_start; i < slice_end; i++) {
- const uint8_t *src = srcrow;
- uint8_t *dst = dstrow;
-
- for (j = 0; j < out->width * 4; j += 4) {
- const uint8_t rin = src[j + roffset];
- const uint8_t gin = src[j + goffset];
- const uint8_t bin = src[j + boffset];
- const uint8_t ain = src[j + aoffset];
-
- dst[j + roffset] = av_clip_uint8(s->lut[R][R][rin] +
- s->lut[R][G][gin] +
- s->lut[R][B][bin] +
- s->lut[R][A][ain]);
- dst[j + goffset] = av_clip_uint8(s->lut[G][R][rin] +
- s->lut[G][G][gin] +
- s->lut[G][B][bin] +
- s->lut[G][A][ain]);
- dst[j + boffset] = av_clip_uint8(s->lut[B][R][rin] +
- s->lut[B][G][gin] +
- s->lut[B][B][bin] +
- s->lut[B][A][ain]);
- dst[j + aoffset] = av_clip_uint8(s->lut[A][R][rin] +
- s->lut[A][G][gin] +
- s->lut[A][B][bin] +
- s->lut[A][A][ain]);
- }
+ return filter_slice_rgba16_packed(ctx, arg, jobnr, nb_jobs, 1, 4);
+}