/*
 * AltiVec acceleration for colorspace conversion
 *
 * copyright (C) 2004 Marc Hoffman <marc.hoffman@analog.com>
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/*
 * Convert I420 YV12 to RGB in various formats,
 * it rejects images that are not in 420 formats,
 * it rejects images that don't have widths of multiples of 16,
 * it rejects images that don't have heights of multiples of 2.
 * Reject defers to C simulation code.
 *
 * Lots of optimizations to be done here.
 *
 * 1. Need to fix saturation code. I just couldn't get it to fly with packs
 * and adds, so we currently use max/min to clip.
 *
 * 2. The inefficient use of chroma loading needs a bit of brushing up.
 *
 * 3. Analysis of pipeline stalls needs to be done. Use shark to identify
 * pipeline stalls.
 *
 *
 * MODIFIED to calculate coeffs from currently selected color space.
 * MODIFIED core to be a macro where you specify the output format.
 * ADDED UYVY conversion which is never called due to some thing in swscale.
 * CORRECTED algorithim selection to be strict on input formats.
 * ADDED runtime detection of AltiVec.
 *
 * ADDED altivec_yuv2packedX vertical scl + RGB converter
 *
 * March 27,2004
 * PERFORMANCE ANALYSIS
 *
 * The C version uses 25% of the processor or ~250Mips for D1 video rawvideo
 * used as test.
 * The AltiVec version uses 10% of the processor or ~100Mips for D1 video
 * same sequence.
 *
 * 720 * 480 * 30  ~10MPS
 *
 * so we have roughly 10 clocks per pixel. This is too high, something has
 * to be wrong.
 *
 * OPTIMIZED clip codes to utilize vec_max and vec_packs removing the
 * need for vec_min.
 *
 * OPTIMIZED DST OUTPUT cache/DMA controls. We are pretty much guaranteed to
 * have the input video frame, it was just decompressed so it probably resides
 * in L1 caches. However, we are creating the output video stream. This needs
 * to use the DSTST instruction to optimize for the cache. We couple this with
 * the fact that we are not going to be visiting the input buffer again so we
 * mark it Least Recently Used. This shaves 25% of the processor cycles off.
 *
 * Now memcpy is the largest mips consumer in the system, probably due
 * to the inefficient X11 stuff.
 *
 * GL libraries seem to be very slow on this machine 1.33Ghz PB running
 * Jaguar, this is not the case for my 1Ghz PB.  I thought it might be
 * a versioning issue, however I have libGL.1.2.dylib for both
 * machines. (We need to figure this out now.)
 *
 * GL2 libraries work now with patch for RGB32.
 *
 * NOTE: quartz vo driver ARGB32_to_RGB24 consumes 30% of the processor.
 *
 * Integrated luma prescaling adjustment for saturation/contrast/brightness
 * adjustment.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>

#include "config.h"
#include "libswscale/rgb2rgb.h"
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
#include "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/pixdesc.h"
#include "yuv2rgb_altivec.h"

#if HAVE_ALTIVEC

#undef PROFILE_THE_BEAST
#undef INC_SCALING

typedef unsigned char ubyte;
typedef signed char   sbyte;

/* RGB interleaver, 16 planar pels 8-bit samples per channel in
 * homogeneous vector registers x0,x1,x2 are interleaved with the
 * following technique:
 *
 *    o0 = vec_mergeh(x0, x1);
 *    o1 = vec_perm(o0, x2, perm_rgb_0);
 *    o2 = vec_perm(o0, x2, perm_rgb_1);
 *    o3 = vec_mergel(x0, x1);
 *    o4 = vec_perm(o3, o2, perm_rgb_2);
 *    o5 = vec_perm(o3, o2, perm_rgb_3);
 *
 * perm_rgb_0:   o0(RG).h v1(B) --> o1*
 *            0   1  2   3   4
 *           rgbr|gbrg|brgb|rgbr
 *           0010 0100 1001 0010
 *           0102 3145 2673 894A
 *
 * perm_rgb_1:   o0(RG).h v1(B) --> o2
 *            0   1  2   3   4
 *           gbrg|brgb|bbbb|bbbb
 *           0100 1001 1111 1111
 *           B5CD 6EF7 89AB CDEF
 *
 * perm_rgb_2:   o3(RG).l o2(rgbB.l) --> o4*
 *            0   1  2   3   4
 *           gbrg|brgb|rgbr|gbrg
 *           1111 1111 0010 0100
 *           89AB CDEF 0182 3945
 *
 * perm_rgb_2:   o3(RG).l o2(rgbB.l) ---> o5*
 *            0   1  2   3   4
 *           brgb|rgbr|gbrg|brgb
 *           1001 0010 0100 1001
 *           a67b 89cA BdCD eEFf
 */
static const vector unsigned char
    perm_rgb_0 = { 0x00, 0x01, 0x10, 0x02, 0x03, 0x11, 0x04, 0x05,
                   0x12, 0x06, 0x07, 0x13, 0x08, 0x09, 0x14, 0x0a },
    perm_rgb_1 = { 0x0b, 0x15, 0x0c, 0x0d, 0x16, 0x0e, 0x0f, 0x17,
                   0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
    perm_rgb_2 = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
                   0x00, 0x01, 0x18, 0x02, 0x03, 0x19, 0x04, 0x05 },
    perm_rgb_3 = { 0x1a, 0x06, 0x07, 0x1b, 0x08, 0x09, 0x1c, 0x0a,
                   0x0b, 0x1d, 0x0c, 0x0d, 0x1e, 0x0e, 0x0f, 0x1f };

#define vec_merge3(x2, x1, x0, y0, y1, y2)     \
    do {                                       \
        __typeof__(x0) o0, o2, o3;             \
        o0 = vec_mergeh(x0, x1);               \
        y0 = vec_perm(o0, x2, perm_rgb_0);     \
        o2 = vec_perm(o0, x2, perm_rgb_1);     \
        o3 = vec_mergel(x0, x1);               \
        y1 = vec_perm(o3, o2, perm_rgb_2);     \
        y2 = vec_perm(o3, o2, perm_rgb_3);     \
    } while (0)

#define vec_mstbgr24(x0, x1, x2, ptr)          \
    do {                                       \
        __typeof__(x0) _0, _1, _2;             \
        vec_merge3(x0, x1, x2, _0, _1, _2);    \
        vec_st(_0, 0, ptr++);                  \
        vec_st(_1, 0, ptr++);                  \
        vec_st(_2, 0, ptr++);                  \
    } while (0)

#define vec_mstrgb24(x0, x1, x2, ptr)          \
    do {                                       \
        __typeof__(x0) _0, _1, _2;             \
        vec_merge3(x2, x1, x0, _0, _1, _2);    \
        vec_st(_0, 0, ptr++);                  \
        vec_st(_1, 0, ptr++);                  \
        vec_st(_2, 0, ptr++);                  \
    } while (0)

/* pack the pixels in rgb0 format
 * msb R
 * lsb 0
 */
#define vec_mstrgb32(T, x0, x1, x2, x3, ptr)                            \
    do {                                                                \
        T _0, _1, _2, _3;                                               \
        _0 = vec_mergeh(x0, x1);                                        \
        _1 = vec_mergeh(x2, x3);                                        \
        _2 = (T) vec_mergeh((vector unsigned short) _0,                 \
                            (vector unsigned short) _1);                \
        _3 = (T) vec_mergel((vector unsigned short) _0,                 \
                            (vector unsigned short) _1);                \
        vec_st(_2, 0 * 16, (T *) ptr);                                  \
        vec_st(_3, 1 * 16, (T *) ptr);                                  \
        _0 = vec_mergel(x0, x1);                                        \
        _1 = vec_mergel(x2, x3);                                        \
        _2 = (T) vec_mergeh((vector unsigned short) _0,                 \
                            (vector unsigned short) _1);                \
        _3 = (T) vec_mergel((vector unsigned short) _0,                 \
                            (vector unsigned short) _1);                \
        vec_st(_2, 2 * 16, (T *) ptr);                                  \
        vec_st(_3, 3 * 16, (T *) ptr);                                  \
        ptr += 4;                                                       \
    } while (0)

/*
 * 1     0       1.4021   | | Y |
 * 1    -0.3441 -0.7142   |x| Cb|
 * 1     1.7718  0        | | Cr|
 *
 *
 * Y:      [-128 127]
 * Cb/Cr : [-128 127]
 *
 * typical YUV conversion works on Y: 0-255 this version has been
 * optimized for JPEG decoding.
 */

#if HAVE_BIGENDIAN
#define vec_unh(x)                                                      \
    (vector signed short)                                               \
        vec_perm(x, (__typeof__(x)) { 0 },                              \
                 ((vector unsigned char) {                              \
                     0x10, 0x00, 0x10, 0x01, 0x10, 0x02, 0x10, 0x03,    \
                     0x10, 0x04, 0x10, 0x05, 0x10, 0x06, 0x10, 0x07 }))

#define vec_unl(x)                                                      \
    (vector signed short)                                               \
        vec_perm(x, (__typeof__(x)) { 0 },                              \
                 ((vector unsigned char) {                              \
                     0x10, 0x08, 0x10, 0x09, 0x10, 0x0A, 0x10, 0x0B,    \
                     0x10, 0x0C, 0x10, 0x0D, 0x10, 0x0E, 0x10, 0x0F }))
#else
#define vec_unh(x)(vector signed short) vec_mergeh(x,(__typeof__(x)) { 0 })
#define vec_unl(x)(vector signed short) vec_mergel(x,(__typeof__(x)) { 0 })
#endif

#define vec_clip_s16(x)                                                 \
    vec_max(vec_min(x, ((vector signed short) {                         \
                    235, 235, 235, 235, 235, 235, 235, 235 })),         \
            ((vector signed short) { 16, 16, 16, 16, 16, 16, 16, 16 }))

#define vec_packclp(x, y)                                               \
    (vector unsigned char)                                              \
        vec_packs((vector unsigned short)                               \
                      vec_max(x, ((vector signed short) { 0 })),        \
                  (vector unsigned short)                               \
                      vec_max(y, ((vector signed short) { 0 })))

static inline void cvtyuvtoRGB(SwsContext *c, vector signed short Y,
                               vector signed short U, vector signed short V,
                               vector signed short *R, vector signed short *G,
                               vector signed short *B)
{
    vector signed short vx, ux, uvx;

    Y = vec_mradds(Y, c->CY, c->OY);
    U = vec_sub(U, (vector signed short)
                       vec_splat((vector signed short) { 128 }, 0));
    V = vec_sub(V, (vector signed short)
                       vec_splat((vector signed short) { 128 }, 0));

    // ux  = (CBU * (u << c->CSHIFT) + 0x4000) >> 15;
    ux = vec_sl(U, c->CSHIFT);
    *B = vec_mradds(ux, c->CBU, Y);

    // vx  = (CRV * (v << c->CSHIFT) + 0x4000) >> 15;
    vx = vec_sl(V, c->CSHIFT);
    *R = vec_mradds(vx, c->CRV, Y);

    // uvx = ((CGU * u) + (CGV * v)) >> 15;
    uvx = vec_mradds(U, c->CGU, Y);
    *G  = vec_mradds(V, c->CGV, uvx);
}

/*
 * ------------------------------------------------------------------------------
 * CS converters
 * ------------------------------------------------------------------------------
 */

#define DEFCSP420_CVT(name, out_pixels)                                       \
static int altivec_ ## name(SwsContext *c, const unsigned char **in,          \
                            int *instrides, int srcSliceY, int srcSliceH,     \
                            unsigned char **oplanes, int *outstrides)         \
{                                                                             \
    int w = c->srcW;                                                          \
    int h = srcSliceH;                                                        \
    int i, j;                                                                 \
    int instrides_scl[3];                                                     \
    vector unsigned char y0, y1;                                              \
                                                                              \
    vector signed char u, v;                                                  \
                                                                              \
    vector signed short Y0, Y1, Y2, Y3;                                       \
    vector signed short U, V;                                                 \
    vector signed short vx, ux, uvx;                                          \
    vector signed short vx0, ux0, uvx0;                                       \
    vector signed short vx1, ux1, uvx1;                                       \
    vector signed short R0, G0, B0;                                           \
    vector signed short R1, G1, B1;                                           \
    vector unsigned char R, G, B;                                             \
                                                                              \
    vector signed short lCY       = c->CY;                                    \
    vector signed short lOY       = c->OY;                                    \
    vector signed short lCRV      = c->CRV;                                   \
    vector signed short lCBU      = c->CBU;                                   \
    vector signed short lCGU      = c->CGU;                                   \
    vector signed short lCGV      = c->CGV;                                   \
    vector unsigned short lCSHIFT = c->CSHIFT;                                \
                                                                              \
    const ubyte *y1i = in[0];                                                 \
    const ubyte *y2i = in[0] + instrides[0];                                  \
    const ubyte *ui  = in[1];                                                 \
    const ubyte *vi  = in[2];                                                 \
                                                                              \
    vector unsigned char *oute, *outo;                                        \
                                                                              \
    /* loop moves y{1, 2}i by w */                                            \
    instrides_scl[0] = instrides[0] * 2 - w;                                  \
    /* loop moves ui by w / 2 */                                              \
    instrides_scl[1] = instrides[1] - w / 2;                                  \
    /* loop moves vi by w / 2 */                                              \
    instrides_scl[2] = instrides[2] - w / 2;                                  \
                                                                              \
    for (i = 0; i < h / 2; i++) {                                             \
        oute = (vector unsigned char *)(oplanes[0] + outstrides[0] *          \
                                        (srcSliceY + i * 2));                 \
        outo = oute + (outstrides[0] >> 4);                                   \
        vec_dstst(outo, (0x02000002 | (((w * 3 + 32) / 32) << 16)), 0);       \
        vec_dstst(oute, (0x02000002 | (((w * 3 + 32) / 32) << 16)), 1);       \
                                                                              \
        for (j = 0; j < w / 16; j++) {                                        \
            y0 = vec_xl(0, y1i);                                              \
                                                                              \
            y1 = vec_xl(0, y2i);                                              \
                                                                              \
            u = (vector signed char) vec_xl(0, ui);                           \
                                                                              \
            v = (vector signed char) vec_xl(0, vi);                           \
                                                                              \
            u = (vector signed char)                                          \
                    vec_sub(u,                                                \
                            (vector signed char)                              \
                                vec_splat((vector signed char) { 128 }, 0));  \
            v = (vector signed char)                                          \
                    vec_sub(v,                                                \
                            (vector signed char)                              \
                                vec_splat((vector signed char) { 128 }, 0));  \
                                                                              \
            U = vec_unpackh(u);                                               \
            V = vec_unpackh(v);                                               \
                                                                              \
            Y0 = vec_unh(y0);                                                 \
            Y1 = vec_unl(y0);                                                 \
            Y2 = vec_unh(y1);                                                 \
            Y3 = vec_unl(y1);                                                 \
                                                                              \
            Y0 = vec_mradds(Y0, lCY, lOY);                                    \
            Y1 = vec_mradds(Y1, lCY, lOY);                                    \
            Y2 = vec_mradds(Y2, lCY, lOY);                                    \
            Y3 = vec_mradds(Y3, lCY, lOY);                                    \
                                                                              \
            /* ux  = (CBU * (u << CSHIFT) + 0x4000) >> 15 */                  \
            ux  = vec_sl(U, lCSHIFT);                                         \
            ux  = vec_mradds(ux, lCBU, (vector signed short) { 0 });          \
            ux0 = vec_mergeh(ux, ux);                                         \
            ux1 = vec_mergel(ux, ux);                                         \
                                                                              \
            /* vx  = (CRV * (v << CSHIFT) + 0x4000) >> 15; */                 \
            vx  = vec_sl(V, lCSHIFT);                                         \
            vx  = vec_mradds(vx, lCRV, (vector signed short) { 0 });          \
            vx0 = vec_mergeh(vx, vx);                                         \
            vx1 = vec_mergel(vx, vx);                                         \
                                                                              \
            /* uvx = ((CGU * u) + (CGV * v)) >> 15 */                         \
            uvx  = vec_mradds(U, lCGU, (vector signed short) { 0 });          \
            uvx  = vec_mradds(V, lCGV, uvx);                                  \
            uvx0 = vec_mergeh(uvx, uvx);                                      \
            uvx1 = vec_mergel(uvx, uvx);                                      \
                                                                              \
            R0 = vec_add(Y0, vx0);                                            \
            G0 = vec_add(Y0, uvx0);                                           \
            B0 = vec_add(Y0, ux0);                                            \
            R1 = vec_add(Y1, vx1);                                            \
            G1 = vec_add(Y1, uvx1);                                           \
            B1 = vec_add(Y1, ux1);                                            \
                                                                              \
            R = vec_packclp(R0, R1);                                          \
            G = vec_packclp(G0, G1);                                          \
            B = vec_packclp(B0, B1);                                          \
                                                                              \
            out_pixels(R, G, B, oute);                                        \
                                                                              \
            R0 = vec_add(Y2, vx0);                                            \
            G0 = vec_add(Y2, uvx0);                                           \
            B0 = vec_add(Y2, ux0);                                            \
            R1 = vec_add(Y3, vx1);                                            \
            G1 = vec_add(Y3, uvx1);                                           \
            B1 = vec_add(Y3, ux1);                                            \
            R  = vec_packclp(R0, R1);                                         \
            G  = vec_packclp(G0, G1);                                         \
            B  = vec_packclp(B0, B1);                                         \
                                                                              \
                                                                              \
            out_pixels(R, G, B, outo);                                        \
                                                                              \
            y1i += 16;                                                        \
            y2i += 16;                                                        \
            ui  += 8;                                                         \
            vi  += 8;                                                         \
        }                                                                     \
                                                                              \
        ui  += instrides_scl[1];                                              \
        vi  += instrides_scl[2];                                              \
        y1i += instrides_scl[0];                                              \
        y2i += instrides_scl[0];                                              \
    }                                                                         \
    return srcSliceH;                                                         \
}

#define out_abgr(a, b, c, ptr)                                          \
    vec_mstrgb32(__typeof__(a), ((__typeof__(a)) { 255 }), c, b, a, ptr)
#define out_bgra(a, b, c, ptr)                                          \
    vec_mstrgb32(__typeof__(a), c, b, a, ((__typeof__(a)) { 255 }), ptr)
#define out_rgba(a, b, c, ptr)                                          \
    vec_mstrgb32(__typeof__(a), a, b, c, ((__typeof__(a)) { 255 }), ptr)
#define out_argb(a, b, c, ptr)                                          \
    vec_mstrgb32(__typeof__(a), ((__typeof__(a)) { 255 }), a, b, c, ptr)
#define out_rgb24(a, b, c, ptr) vec_mstrgb24(a, b, c, ptr)
#define out_bgr24(a, b, c, ptr) vec_mstbgr24(a, b, c, ptr)

DEFCSP420_CVT(yuv2_abgr,  out_abgr)
DEFCSP420_CVT(yuv2_bgra,  out_bgra)
DEFCSP420_CVT(yuv2_rgba,  out_rgba)
DEFCSP420_CVT(yuv2_argb,  out_argb)
DEFCSP420_CVT(yuv2_rgb24, out_rgb24)
DEFCSP420_CVT(yuv2_bgr24, out_bgr24)

// uyvy|uyvy|uyvy|uyvy
// 0123 4567 89ab cdef
static const vector unsigned char
    demux_u = { 0x10, 0x00, 0x10, 0x00,
                0x10, 0x04, 0x10, 0x04,
                0x10, 0x08, 0x10, 0x08,
                0x10, 0x0c, 0x10, 0x0c },
    demux_v = { 0x10, 0x02, 0x10, 0x02,
                0x10, 0x06, 0x10, 0x06,
                0x10, 0x0A, 0x10, 0x0A,
                0x10, 0x0E, 0x10, 0x0E },
    demux_y = { 0x10, 0x01, 0x10, 0x03,
                0x10, 0x05, 0x10, 0x07,
                0x10, 0x09, 0x10, 0x0B,
                0x10, 0x0D, 0x10, 0x0F };

/*
 * this is so I can play live CCIR raw video
 */
static int altivec_uyvy_rgb32(SwsContext *c, const unsigned char **in,
                              int *instrides, int srcSliceY, int srcSliceH,
                              unsigned char **oplanes, int *outstrides)
{
    int w = c->srcW;
    int h = srcSliceH;
    int i, j;
    vector unsigned char uyvy;
    vector signed short Y, U, V;
    vector signed short R0, G0, B0, R1, G1, B1;
    vector unsigned char R, G, B;
    vector unsigned char *out;
    const ubyte *img;

    img = in[0];
    out = (vector unsigned char *) (oplanes[0] + srcSliceY * outstrides[0]);

    for (i = 0; i < h; i++)
        for (j = 0; j < w / 16; j++) {
            uyvy = vec_ld(0, img);

            U = (vector signed short)
                    vec_perm(uyvy, (vector unsigned char) { 0 }, demux_u);
            V = (vector signed short)
                    vec_perm(uyvy, (vector unsigned char) { 0 }, demux_v);
            Y = (vector signed short)
                    vec_perm(uyvy, (vector unsigned char) { 0 }, demux_y);

            cvtyuvtoRGB(c, Y, U, V, &R0, &G0, &B0);

            uyvy = vec_ld(16, img);

            U = (vector signed short)
                    vec_perm(uyvy, (vector unsigned char) { 0 }, demux_u);
            V = (vector signed short)
                    vec_perm(uyvy, (vector unsigned char) { 0 }, demux_v);
            Y = (vector signed short)
                    vec_perm(uyvy, (vector unsigned char) { 0 }, demux_y);

            cvtyuvtoRGB(c, Y, U, V, &R1, &G1, &B1);

            R = vec_packclp(R0, R1);
            G = vec_packclp(G0, G1);
            B = vec_packclp(B0, B1);

            // vec_mstbgr24 (R,G,B, out);
            out_rgba(R, G, B, out);

            img += 32;
        }
    return srcSliceH;
}

#endif /* HAVE_ALTIVEC */

/* Ok currently the acceleration routine only supports
 * inputs of widths a multiple of 16
 * and heights a multiple 2
 *
 * So we just fall back to the C codes for this.
 */
av_cold SwsFunc ff_yuv2rgb_init_ppc(SwsContext *c)
{
#if HAVE_ALTIVEC
    if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
        return NULL;

    /*
     * and this seems not to matter too much I tried a bunch of
     * videos with abnormal widths and MPlayer crashes elsewhere.
     * mplayer -vo x11 -rawvideo on:w=350:h=240 raw-350x240.eyuv
     * boom with X11 bad match.
     *
     */
    if ((c->srcW & 0xf) != 0)
        return NULL;

    switch (c->srcFormat) {
    case AV_PIX_FMT_YUV410P:
    case AV_PIX_FMT_YUV420P:
    /*case IMGFMT_CLPL:        ??? */
    case AV_PIX_FMT_GRAY8:
    case AV_PIX_FMT_NV12:
    case AV_PIX_FMT_NV21:
        if ((c->srcH & 0x1) != 0)
            return NULL;

        switch (c->dstFormat) {
        case AV_PIX_FMT_RGB24:
            av_log(c, AV_LOG_WARNING, "ALTIVEC: Color Space RGB24\n");
            return altivec_yuv2_rgb24;
        case AV_PIX_FMT_BGR24:
            av_log(c, AV_LOG_WARNING, "ALTIVEC: Color Space BGR24\n");
            return altivec_yuv2_bgr24;
        case AV_PIX_FMT_ARGB:
            av_log(c, AV_LOG_WARNING, "ALTIVEC: Color Space ARGB\n");
            return altivec_yuv2_argb;
        case AV_PIX_FMT_ABGR:
            av_log(c, AV_LOG_WARNING, "ALTIVEC: Color Space ABGR\n");
            return altivec_yuv2_abgr;
        case AV_PIX_FMT_RGBA:
            av_log(c, AV_LOG_WARNING, "ALTIVEC: Color Space RGBA\n");
            return altivec_yuv2_rgba;
        case AV_PIX_FMT_BGRA:
            av_log(c, AV_LOG_WARNING, "ALTIVEC: Color Space BGRA\n");
            return altivec_yuv2_bgra;
        default: return NULL;
        }
        break;

    case AV_PIX_FMT_UYVY422:
        switch (c->dstFormat) {
        case AV_PIX_FMT_BGR32:
            av_log(c, AV_LOG_WARNING, "ALTIVEC: Color Space UYVY -> RGB32\n");
            return altivec_uyvy_rgb32;
        default: return NULL;
        }
        break;
    }
#endif /* HAVE_ALTIVEC */

    return NULL;
}

av_cold void ff_yuv2rgb_init_tables_ppc(SwsContext *c,
                                        const int inv_table[4],
                                        int brightness,
                                        int contrast,
                                        int saturation)
{
#if HAVE_ALTIVEC
    union {
        DECLARE_ALIGNED(16, signed short, tmp)[8];
        vector signed short vec;
    } buf;

    if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
        return;

    buf.tmp[0] = ((0xffffLL) * contrast >> 8) >> 9;                               // cy
    buf.tmp[1] = -256 * brightness;                                               // oy
    buf.tmp[2] =   (inv_table[0] >> 3) * (contrast >> 16) * (saturation >> 16);   // crv
    buf.tmp[3] =   (inv_table[1] >> 3) * (contrast >> 16) * (saturation >> 16);   // cbu
    buf.tmp[4] = -((inv_table[2] >> 1) * (contrast >> 16) * (saturation >> 16));  // cgu
    buf.tmp[5] = -((inv_table[3] >> 1) * (contrast >> 16) * (saturation >> 16));  // cgv

    c->CSHIFT = (vector unsigned short) vec_splat_u16(2);
    c->CY     = vec_splat((vector signed short) buf.vec, 0);
    c->OY     = vec_splat((vector signed short) buf.vec, 1);
    c->CRV    = vec_splat((vector signed short) buf.vec, 2);
    c->CBU    = vec_splat((vector signed short) buf.vec, 3);
    c->CGU    = vec_splat((vector signed short) buf.vec, 4);
    c->CGV    = vec_splat((vector signed short) buf.vec, 5);
    return;
#endif /* HAVE_ALTIVEC */
}

#if HAVE_ALTIVEC

static av_always_inline void yuv2packedX_altivec(SwsContext *c,
                                                 const int16_t *lumFilter,
                                                 const int16_t **lumSrc,
                                                 int lumFilterSize,
                                                 const int16_t *chrFilter,
                                                 const int16_t **chrUSrc,
                                                 const int16_t **chrVSrc,
                                                 int chrFilterSize,
                                                 const int16_t **alpSrc,
                                                 uint8_t *dest,
                                                 int dstW, int dstY,
                                                 enum AVPixelFormat target)
{
    int i, j;
    vector signed short X, X0, X1, Y0, U0, V0, Y1, U1, V1, U, V;
    vector signed short R0, G0, B0, R1, G1, B1;

    vector unsigned char R, G, B;
    vector unsigned char *out, *nout;

    vector signed short RND   = vec_splat_s16(1 << 3);
    vector unsigned short SCL = vec_splat_u16(4);
    DECLARE_ALIGNED(16, unsigned int, scratch)[16];

    vector signed short *YCoeffs, *CCoeffs;

    YCoeffs = c->vYCoeffsBank + dstY * lumFilterSize;
    CCoeffs = c->vCCoeffsBank + dstY * chrFilterSize;

    out = (vector unsigned char *) dest;

    for (i = 0; i < dstW; i += 16) {
        Y0 = RND;
        Y1 = RND;
        /* extract 16 coeffs from lumSrc */
        for (j = 0; j < lumFilterSize; j++) {
            X0 = vec_ld(0, &lumSrc[j][i]);
            X1 = vec_ld(16, &lumSrc[j][i]);
            Y0 = vec_mradds(X0, YCoeffs[j], Y0);
            Y1 = vec_mradds(X1, YCoeffs[j], Y1);
        }

        U = RND;
        V = RND;
        /* extract 8 coeffs from U,V */
        for (j = 0; j < chrFilterSize; j++) {
            X = vec_ld(0, &chrUSrc[j][i / 2]);
            U = vec_mradds(X, CCoeffs[j], U);
            X = vec_ld(0, &chrVSrc[j][i / 2]);
            V = vec_mradds(X, CCoeffs[j], V);
        }

        /* scale and clip signals */
        Y0 = vec_sra(Y0, SCL);
        Y1 = vec_sra(Y1, SCL);
        U  = vec_sra(U, SCL);
        V  = vec_sra(V, SCL);

        Y0 = vec_clip_s16(Y0);
        Y1 = vec_clip_s16(Y1);
        U  = vec_clip_s16(U);
        V  = vec_clip_s16(V);

        /* now we have
         * Y0 = y0 y1 y2 y3 y4 y5 y6 y7    Y1 = y8 y9 y10 y11 y12 y13 y14 y15
         * U  = u0 u1 u2 u3 u4 u5 u6 u7    V  = v0 v1 v2 v3 v4 v5 v6 v7
         *
         * Y0 = y0 y1 y2 y3 y4 y5 y6 y7    Y1 = y8 y9 y10 y11 y12 y13 y14 y15
         * U0 = u0 u0 u1 u1 u2 u2 u3 u3    U1 = u4 u4 u5 u5 u6 u6 u7 u7
         * V0 = v0 v0 v1 v1 v2 v2 v3 v3    V1 = v4 v4 v5 v5 v6 v6 v7 v7
         */

        U0 = vec_mergeh(U, U);
        V0 = vec_mergeh(V, V);

        U1 = vec_mergel(U, U);
        V1 = vec_mergel(V, V);

        cvtyuvtoRGB(c, Y0, U0, V0, &R0, &G0, &B0);
        cvtyuvtoRGB(c, Y1, U1, V1, &R1, &G1, &B1);

        R = vec_packclp(R0, R1);
        G = vec_packclp(G0, G1);
        B = vec_packclp(B0, B1);

        switch (target) {
        case AV_PIX_FMT_ABGR:
            out_abgr(R, G, B, out);
            break;
        case AV_PIX_FMT_BGRA:
            out_bgra(R, G, B, out);
            break;
        case AV_PIX_FMT_RGBA:
            out_rgba(R, G, B, out);
            break;
        case AV_PIX_FMT_ARGB:
            out_argb(R, G, B, out);
            break;
        case AV_PIX_FMT_RGB24:
            out_rgb24(R, G, B, out);
            break;
        case AV_PIX_FMT_BGR24:
            out_bgr24(R, G, B, out);
            break;
        default:
        {
            /* If this is reached, the caller should have called yuv2packedXinC
             * instead. */
            static int printed_error_message;
            if (!printed_error_message) {
                av_log(c, AV_LOG_ERROR,
                       "altivec_yuv2packedX doesn't support %s output\n",
                       av_get_pix_fmt_name(c->dstFormat));
                printed_error_message = 1;
            }
            return;
        }
        }
    }

    if (i < dstW) {
        i -= 16;

        Y0 = RND;
        Y1 = RND;
        /* extract 16 coeffs from lumSrc */
        for (j = 0; j < lumFilterSize; j++) {
            X0 = vec_ld(0, &lumSrc[j][i]);
            X1 = vec_ld(16, &lumSrc[j][i]);
            Y0 = vec_mradds(X0, YCoeffs[j], Y0);
            Y1 = vec_mradds(X1, YCoeffs[j], Y1);
        }

        U = RND;
        V = RND;
        /* extract 8 coeffs from U,V */
        for (j = 0; j < chrFilterSize; j++) {
            X = vec_ld(0, &chrUSrc[j][i / 2]);
            U = vec_mradds(X, CCoeffs[j], U);
            X = vec_ld(0, &chrVSrc[j][i / 2]);
            V = vec_mradds(X, CCoeffs[j], V);
        }

        /* scale and clip signals */
        Y0 = vec_sra(Y0, SCL);
        Y1 = vec_sra(Y1, SCL);
        U  = vec_sra(U, SCL);
        V  = vec_sra(V, SCL);

        Y0 = vec_clip_s16(Y0);
        Y1 = vec_clip_s16(Y1);
        U  = vec_clip_s16(U);
        V  = vec_clip_s16(V);

        /* now we have
         * Y0 = y0 y1 y2 y3 y4 y5 y6 y7    Y1 = y8 y9 y10 y11 y12 y13 y14 y15
         * U  = u0 u1 u2 u3 u4 u5 u6 u7    V  = v0 v1 v2 v3 v4 v5 v6 v7
         *
         * Y0 = y0 y1 y2 y3 y4 y5 y6 y7    Y1 = y8 y9 y10 y11 y12 y13 y14 y15
         * U0 = u0 u0 u1 u1 u2 u2 u3 u3    U1 = u4 u4 u5 u5 u6 u6 u7 u7
         * V0 = v0 v0 v1 v1 v2 v2 v3 v3    V1 = v4 v4 v5 v5 v6 v6 v7 v7
         */

        U0 = vec_mergeh(U, U);
        V0 = vec_mergeh(V, V);

        U1 = vec_mergel(U, U);
        V1 = vec_mergel(V, V);

        cvtyuvtoRGB(c, Y0, U0, V0, &R0, &G0, &B0);
        cvtyuvtoRGB(c, Y1, U1, V1, &R1, &G1, &B1);

        R = vec_packclp(R0, R1);
        G = vec_packclp(G0, G1);
        B = vec_packclp(B0, B1);

        nout = (vector unsigned char *) scratch;
        switch (target) {
        case AV_PIX_FMT_ABGR:
            out_abgr(R, G, B, nout);
            break;
        case AV_PIX_FMT_BGRA:
            out_bgra(R, G, B, nout);
            break;
        case AV_PIX_FMT_RGBA:
            out_rgba(R, G, B, nout);
            break;
        case AV_PIX_FMT_ARGB:
            out_argb(R, G, B, nout);
            break;
        case AV_PIX_FMT_RGB24:
            out_rgb24(R, G, B, nout);
            break;
        case AV_PIX_FMT_BGR24:
            out_bgr24(R, G, B, nout);
            break;
        default:
            /* Unreachable, I think. */
            av_log(c, AV_LOG_ERROR,
                   "altivec_yuv2packedX doesn't support %s output\n",
                   av_get_pix_fmt_name(c->dstFormat));
            return;
        }

        memcpy(&((uint32_t *) dest)[i], scratch, (dstW - i) / 4);
    }
}

#define YUV2PACKEDX_WRAPPER(suffix, pixfmt)                             \
void ff_yuv2 ## suffix ## _X_altivec(SwsContext *c,                     \
                                     const int16_t *lumFilter,          \
                                     const int16_t **lumSrc,            \
                                     int lumFilterSize,                 \
                                     const int16_t *chrFilter,          \
                                     const int16_t **chrUSrc,           \
                                     const int16_t **chrVSrc,           \
                                     int chrFilterSize,                 \
                                     const int16_t **alpSrc,            \
                                     uint8_t *dest, int dstW, int dstY) \
{                                                                       \
    yuv2packedX_altivec(c, lumFilter, lumSrc, lumFilterSize,            \
                        chrFilter, chrUSrc, chrVSrc,                    \
                        chrFilterSize, alpSrc,                          \
                        dest, dstW, dstY, pixfmt);                      \
}

YUV2PACKEDX_WRAPPER(abgr,  AV_PIX_FMT_ABGR);
YUV2PACKEDX_WRAPPER(bgra,  AV_PIX_FMT_BGRA);
YUV2PACKEDX_WRAPPER(argb,  AV_PIX_FMT_ARGB);
YUV2PACKEDX_WRAPPER(rgba,  AV_PIX_FMT_RGBA);
YUV2PACKEDX_WRAPPER(rgb24, AV_PIX_FMT_RGB24);
YUV2PACKEDX_WRAPPER(bgr24, AV_PIX_FMT_BGR24);

#endif /* HAVE_ALTIVEC */
