]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/ppc/vc1dsp_altivec.c
ppc: Include string.h for memset
[ffmpeg] / libavcodec / ppc / vc1dsp_altivec.c
index a754b1da811d3a3f86316ecc87d3f32a533e44a8..6c110dba475cab24ae20cd022934baf63e0109f5 100644 (file)
@@ -2,63 +2,27 @@
  * VC-1 and WMV3 decoder - DSP functions AltiVec-optimized
  * Copyright (c) 2006 Konstantin Shishkov
  *
- * This file is part of FFmpeg.
+ * This file is part of Libav.
  *
- * FFmpeg is free software; you can redistribute it and/or
+ * Libav 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,
+ * Libav 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
+ * License along with Libav; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
  */
 
-#include "../dsputil.h"
-
-#include "gcc_fixes.h"
-
-#include "dsputil_altivec.h"
-
-// Transpose 8x8 matrix of 16-bit elements. Borrowed from mpegvideo_altivec.c
-#define TRANSPOSE8(a,b,c,d,e,f,g,h) \
-do { \
-    vector signed short A1, B1, C1, D1, E1, F1, G1, H1; \
-    vector signed short A2, B2, C2, D2, E2, F2, G2, H2; \
- \
-    A1 = vec_mergeh (a, e); \
-    B1 = vec_mergel (a, e); \
-    C1 = vec_mergeh (b, f); \
-    D1 = vec_mergel (b, f); \
-    E1 = vec_mergeh (c, g); \
-    F1 = vec_mergel (c, g); \
-    G1 = vec_mergeh (d, h); \
-    H1 = vec_mergel (d, h); \
- \
-    A2 = vec_mergeh (A1, E1); \
-    B2 = vec_mergel (A1, E1); \
-    C2 = vec_mergeh (B1, F1); \
-    D2 = vec_mergel (B1, F1); \
-    E2 = vec_mergeh (C1, G1); \
-    F2 = vec_mergel (C1, G1); \
-    G2 = vec_mergeh (D1, H1); \
-    H2 = vec_mergel (D1, H1); \
- \
-    a = vec_mergeh (A2, E2); \
-    b = vec_mergel (A2, E2); \
-    c = vec_mergeh (B2, F2); \
-    d = vec_mergel (B2, F2); \
-    e = vec_mergeh (C2, G2); \
-    f = vec_mergel (C2, G2); \
-    g = vec_mergeh (D2, H2); \
-    h = vec_mergel (D2, H2); \
-} while (0)
+#include "libavutil/ppc/types_altivec.h"
+#include "libavutil/ppc/util_altivec.h"
+#include "libavcodec/dsputil.h"
+#include "libavcodec/vc1dsp.h"
 
 // main steps of 8x8 transform
 #define STEP8(s0, s1, s2, s3, s4, s5, s6, s7, vec_rnd) \
@@ -173,7 +137,6 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64])
     vector signed int t0, t1, t2, t3, t4, t5, t6, t7;
     const vector signed int vec_64 = vec_sl(vec_splat_s32(4), vec_splat_u32(4));
     const vector unsigned int vec_7 = vec_splat_u32(7);
-    const vector unsigned int vec_5 = vec_splat_u32(5);
     const vector unsigned int vec_4 = vec_splat_u32(4);
     const vector  signed int vec_4s = vec_splat_s32(4);
     const vector unsigned int vec_3 = vec_splat_u32(3);
@@ -181,7 +144,6 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64])
     const vector  signed int vec_1s = vec_splat_s32(1);
     const vector unsigned int vec_1 = vec_splat_u32(1);
 
-
     src0 = vec_ld(  0, block);
     src1 = vec_ld( 16, block);
     src2 = vec_ld( 32, block);
@@ -191,7 +153,6 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64])
     src6 = vec_ld( 96, block);
     src7 = vec_ld(112, block);
 
-    TRANSPOSE8(src0, src1, src2, src3, src4, src5, src6, src7);
     s0 = vec_unpackl(src0);
     s1 = vec_unpackl(src1);
     s2 = vec_unpackl(src2);
@@ -263,7 +224,7 @@ static void vc1_inv_trans_8x8_altivec(DCTELEM block[64])
 
 /** Do inverse transform on 8x4 part of block
 */
-static void vc1_inv_trans_8x4_altivec(DCTELEM block[64], int n)
+static void vc1_inv_trans_8x4_altivec(uint8_t *dest, int stride, DCTELEM *block)
 {
     vector signed short src0, src1, src2, src3, src4, src5, src6, src7;
     vector signed int s0, s1, s2, s3, s4, s5, s6, s7;
@@ -277,6 +238,9 @@ static void vc1_inv_trans_8x4_altivec(DCTELEM block[64], int n)
     const vector unsigned int vec_3 = vec_splat_u32(3);
     const vector unsigned int vec_2 = vec_splat_u32(2);
     const vector unsigned int vec_1 = vec_splat_u32(1);
+    vector unsigned char tmp;
+    vector signed short tmp2, tmp3;
+    vector unsigned char perm0, perm1, p0, p1, p;
 
     src0 = vec_ld(  0, block);
     src1 = vec_ld( 16, block);
@@ -318,55 +282,66 @@ static void vc1_inv_trans_8x4_altivec(DCTELEM block[64], int n)
     src7 = vec_pack(sF, s7);
     TRANSPOSE8(src0, src1, src2, src3, src4, src5, src6, src7);
 
-    if(!n){ // upper half of block
-        s0 = vec_unpackh(src0);
-        s1 = vec_unpackh(src1);
-        s2 = vec_unpackh(src2);
-        s3 = vec_unpackh(src3);
-        s8 = vec_unpackl(src0);
-        s9 = vec_unpackl(src1);
-        sA = vec_unpackl(src2);
-        sB = vec_unpackl(src3);
-        STEP4(s0, s1, s2, s3, vec_64);
-        SHIFT_VERT4(s0, s1, s2, s3);
-        STEP4(s8, s9, sA, sB, vec_64);
-        SHIFT_VERT4(s8, s9, sA, sB);
-        src0 = vec_pack(s0, s8);
-        src1 = vec_pack(s1, s9);
-        src2 = vec_pack(s2, sA);
-        src3 = vec_pack(s3, sB);
+    s0 = vec_unpackh(src0);
+    s1 = vec_unpackh(src1);
+    s2 = vec_unpackh(src2);
+    s3 = vec_unpackh(src3);
+    s8 = vec_unpackl(src0);
+    s9 = vec_unpackl(src1);
+    sA = vec_unpackl(src2);
+    sB = vec_unpackl(src3);
+    STEP4(s0, s1, s2, s3, vec_64);
+    SHIFT_VERT4(s0, s1, s2, s3);
+    STEP4(s8, s9, sA, sB, vec_64);
+    SHIFT_VERT4(s8, s9, sA, sB);
+    src0 = vec_pack(s0, s8);
+    src1 = vec_pack(s1, s9);
+    src2 = vec_pack(s2, sA);
+    src3 = vec_pack(s3, sB);
+
+    p0 = vec_lvsl (0, dest);
+    p1 = vec_lvsl (stride, dest);
+    p = vec_splat_u8 (-1);
+    perm0 = vec_mergeh (p, p0);
+    perm1 = vec_mergeh (p, p1);
 
-        vec_st(src0,  0, block);
-        vec_st(src1, 16, block);
-        vec_st(src2, 32, block);
-        vec_st(src3, 48, block);
-    } else { //lower half of block
-        s0 = vec_unpackh(src4);
-        s1 = vec_unpackh(src5);
-        s2 = vec_unpackh(src6);
-        s3 = vec_unpackh(src7);
-        s8 = vec_unpackl(src4);
-        s9 = vec_unpackl(src5);
-        sA = vec_unpackl(src6);
-        sB = vec_unpackl(src7);
-        STEP4(s0, s1, s2, s3, vec_64);
-        SHIFT_VERT4(s0, s1, s2, s3);
-        STEP4(s8, s9, sA, sB, vec_64);
-        SHIFT_VERT4(s8, s9, sA, sB);
-        src4 = vec_pack(s0, s8);
-        src5 = vec_pack(s1, s9);
-        src6 = vec_pack(s2, sA);
-        src7 = vec_pack(s3, sB);
+#define ADD(dest,src,perm)                                              \
+    /* *(uint64_t *)&tmp = *(uint64_t *)dest; */                        \
+    tmp = vec_ld (0, dest);                                             \
+    tmp2 = (vector signed short)vec_perm (tmp, vec_splat_u8(0), perm);  \
+    tmp3 = vec_adds (tmp2, src);                                        \
+    tmp = vec_packsu (tmp3, tmp3);                                      \
+    vec_ste ((vector unsigned int)tmp, 0, (unsigned int *)dest);        \
+    vec_ste ((vector unsigned int)tmp, 4, (unsigned int *)dest);
 
-        vec_st(src4, 64, block);
-        vec_st(src5, 80, block);
-        vec_st(src6, 96, block);
-        vec_st(src7,112, block);
-    }
+    ADD (dest, src0, perm0)      dest += stride;
+    ADD (dest, src1, perm1)      dest += stride;
+    ADD (dest, src2, perm0)      dest += stride;
+    ADD (dest, src3, perm1)
 }
 
+#define PUT_OP_U8_ALTIVEC(d, s, dst) d = s
+#define AVG_OP_U8_ALTIVEC(d, s, dst) d = vec_avg(dst, s)
+
+#define OP_U8_ALTIVEC                          PUT_OP_U8_ALTIVEC
+#define PREFIX_no_rnd_vc1_chroma_mc8_altivec   put_no_rnd_vc1_chroma_mc8_altivec
+#include "h264_altivec_template.c"
+#undef OP_U8_ALTIVEC
+#undef PREFIX_no_rnd_vc1_chroma_mc8_altivec
+
+#define OP_U8_ALTIVEC                          AVG_OP_U8_ALTIVEC
+#define PREFIX_no_rnd_vc1_chroma_mc8_altivec   avg_no_rnd_vc1_chroma_mc8_altivec
+#include "h264_altivec_template.c"
+#undef OP_U8_ALTIVEC
+#undef PREFIX_no_rnd_vc1_chroma_mc8_altivec
+
+void ff_vc1dsp_init_altivec(VC1DSPContext* dsp)
+{
+    if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
+        return;
 
-void vc1dsp_init_altivec(DSPContext* dsp, AVCodecContext *avctx) {
     dsp->vc1_inv_trans_8x8 = vc1_inv_trans_8x8_altivec;
     dsp->vc1_inv_trans_8x4 = vc1_inv_trans_8x4_altivec;
+    dsp->put_no_rnd_vc1_chroma_pixels_tab[0] = put_no_rnd_vc1_chroma_mc8_altivec;
+    dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = avg_no_rnd_vc1_chroma_mc8_altivec;
 }