Merge remote-tracking branch 'qatar/master'
[ffmpeg.git] / libavcodec / sparc / dsputil_vis.c
index 9c85ae6..9576082 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 /* The *no_round* functions have been added by James A. Morrison, 2003,2004.
-   The vis code from libmpeg2 was adapted for ffmpeg by James A. Morrison.
+   The vis code from libmpeg2 was adapted for libavcodec by James A. Morrison.
  */
 
 #include "config.h"
  *      fpsub16         f12, f10, f10
  */
 
-#define ATTR_ALIGN(alignd) __attribute__ ((aligned(alignd)))
-
 #define DUP4(x) {x, x, x, x}
 #define DUP8(x) {x, x, x, x, x, x, x, x}
-static const int16_t constants1[] ATTR_ALIGN(8) = DUP4 (1);
-static const int16_t constants2[] ATTR_ALIGN(8) = DUP4 (2);
-static const int16_t constants3[] ATTR_ALIGN(8) = DUP4 (3);
-static const int16_t constants6[] ATTR_ALIGN(8) = DUP4 (6);
-static const int8_t constants_fe[] ATTR_ALIGN(8) = DUP8 (0xfe);
-static const int8_t constants_7f[] ATTR_ALIGN(8) = DUP8 (0x7f);
-static const int8_t constants128[] ATTR_ALIGN(8) = DUP8 (128);
-static const int16_t constants256_512[] ATTR_ALIGN(8) =
+DECLARE_ALIGNED(8, static const int16_t, constants1)[] = DUP4 (1);
+DECLARE_ALIGNED(8, static const int16_t, constants2)[] = DUP4 (2);
+DECLARE_ALIGNED(8, static const int16_t, constants3)[] = DUP4 (3);
+DECLARE_ALIGNED(8, static const int16_t, constants6)[] = DUP4 (6);
+DECLARE_ALIGNED(8, static const int8_t, constants_fe)[] = DUP8 (0xfe);
+DECLARE_ALIGNED(8, static const int8_t, constants_7f)[] = DUP8 (0x7f);
+DECLARE_ALIGNED(8, static const int8_t, constants128)[] = DUP8 (128);
+DECLARE_ALIGNED(8, static const int16_t, constants256_512)[] =
         {256, 512, 256, 512};
-static const int16_t constants256_1024[] ATTR_ALIGN(8) =
+DECLARE_ALIGNED(8, static const int16_t, constants256_1024)[] =
         {256, 1024, 256, 1024};
 
 #define REF_0           0
@@ -120,11 +118,9 @@ static const int16_t constants256_1024[] ATTR_ALIGN(8) =
 #define TMP30           56
 #define TMP32           58
 
-static void MC_put_o_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_o_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
         do {    /* 5 cycles */
                 vis_ld64(ref[0], TMP0);
@@ -143,11 +139,9 @@ static void MC_put_o_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_put_o_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_o_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
         do {    /* 4 cycles */
                 vis_ld64(ref[0], TMP0);
@@ -164,10 +158,9 @@ static void MC_put_o_8_vis (uint8_t * dest, const uint8_t * _ref,
 }
 
 
-static void MC_avg_o_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_o_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         int stride_8 = stride + 8;
 
         ref = vis_alignaddr(ref);
@@ -325,11 +318,9 @@ static void MC_avg_o_16_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64_2(TMP22, dest, 8);
 }
 
-static void MC_avg_o_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_o_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
 
         vis_ld64(ref[0], TMP0);
@@ -419,10 +410,9 @@ static void MC_avg_o_8_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64(TMP4, dest[0]);
 }
 
-static void MC_put_x_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_x_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
 
@@ -612,10 +602,9 @@ static void MC_put_x_16_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64_2(TMP8, dest, 8);
 }
 
-static void MC_put_x_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_x_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
 
@@ -736,10 +725,9 @@ static void MC_put_x_8_vis (uint8_t * dest, const uint8_t * _ref,
         dest += stride;
 }
 
-static void MC_avg_x_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_x_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
 
@@ -827,10 +815,9 @@ static void MC_avg_x_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_avg_x_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_x_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_times_2 = stride << 1;
@@ -993,11 +980,9 @@ static void MC_avg_x_8_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_put_y_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_y_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
         vis_ld64(ref[0], TMP0);
 
@@ -1149,11 +1134,9 @@ static void MC_put_y_16_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64_2(TMP2, dest, 8);
 }
 
-static void MC_put_y_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_y_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
         vis_ld64(ref[0], TMP0);
 
@@ -1241,10 +1224,9 @@ static void MC_put_y_8_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64(DST_0, dest[0]);
 }
 
-static void MC_avg_y_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_y_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         int stride_8 = stride + 8;
         int stride_16 = stride + 16;
 
@@ -1370,10 +1352,9 @@ static void MC_avg_y_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_avg_y_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_y_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         int stride_8 = stride + 8;
 
         vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
@@ -1450,10 +1431,9 @@ static void MC_avg_y_8_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_put_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_xy_16_vis (uint8_t * dest, const uint8_t * ref,
                               const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_8 = stride + 8;
@@ -1615,10 +1595,9 @@ static void MC_put_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_put_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_xy_8_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_8 = stride + 8;
@@ -1720,10 +1699,9 @@ static void MC_put_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_avg_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_xy_16_vis (uint8_t * dest, const uint8_t * ref,
                               const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_8 = stride + 8;
@@ -1917,10 +1895,9 @@ static void MC_avg_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_avg_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_xy_8_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_8 = stride + 8;
@@ -2061,11 +2038,9 @@ static void MC_avg_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
  *      fpadd16         f12, f10, f10
  */
 
-static void MC_put_no_round_o_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_no_round_o_16_vis (uint8_t * dest, const uint8_t * ref,
                                       const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
         do {    /* 5 cycles */
                 vis_ld64(ref[0], TMP0);
@@ -2084,11 +2059,9 @@ static void MC_put_no_round_o_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_put_no_round_o_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_no_round_o_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
         do {    /* 4 cycles */
                 vis_ld64(ref[0], TMP0);
@@ -2105,10 +2078,9 @@ static void MC_put_no_round_o_8_vis (uint8_t * dest, const uint8_t * _ref,
 }
 
 
-static void MC_avg_no_round_o_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_no_round_o_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         int stride_8 = stride + 8;
 
         ref = vis_alignaddr(ref);
@@ -2266,11 +2238,9 @@ static void MC_avg_no_round_o_16_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64_2(TMP22, dest, 8);
 }
 
-static void MC_avg_no_round_o_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_no_round_o_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
 
         vis_ld64(ref[0], TMP0);
@@ -2360,10 +2330,9 @@ static void MC_avg_no_round_o_8_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64(TMP4, dest[0]);
 }
 
-static void MC_put_no_round_x_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_no_round_x_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
 
@@ -2553,10 +2522,9 @@ static void MC_put_no_round_x_16_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64_2(TMP8, dest, 8);
 }
 
-static void MC_put_no_round_x_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_no_round_x_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
 
@@ -2677,10 +2645,9 @@ static void MC_put_no_round_x_8_vis (uint8_t * dest, const uint8_t * _ref,
         dest += stride;
 }
 
-static void MC_avg_no_round_x_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_no_round_x_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
 
@@ -2768,10 +2735,9 @@ static void MC_avg_no_round_x_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_avg_no_round_x_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_no_round_x_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_times_2 = stride << 1;
@@ -2934,11 +2900,9 @@ static void MC_avg_no_round_x_8_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_put_no_round_y_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_no_round_y_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
         vis_ld64(ref[0], TMP0);
 
@@ -3090,11 +3054,9 @@ static void MC_put_no_round_y_16_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64_2(TMP2, dest, 8);
 }
 
-static void MC_put_no_round_y_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_no_round_y_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
-
         ref = vis_alignaddr(ref);
         vis_ld64(ref[0], TMP0);
 
@@ -3182,10 +3144,9 @@ static void MC_put_no_round_y_8_vis (uint8_t * dest, const uint8_t * _ref,
         vis_st64(DST_0, dest[0]);
 }
 
-static void MC_avg_no_round_y_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_no_round_y_16_vis (uint8_t * dest, const uint8_t * ref,
                              const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         int stride_8 = stride + 8;
         int stride_16 = stride + 16;
 
@@ -3311,10 +3272,9 @@ static void MC_avg_no_round_y_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_avg_no_round_y_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_no_round_y_8_vis (uint8_t * dest, const uint8_t * ref,
                             const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         int stride_8 = stride + 8;
 
         vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
@@ -3391,10 +3351,9 @@ static void MC_avg_no_round_y_8_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_put_no_round_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_no_round_xy_16_vis (uint8_t * dest, const uint8_t * ref,
                                        const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_8 = stride + 8;
@@ -3556,10 +3515,9 @@ static void MC_put_no_round_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_put_no_round_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_put_no_round_xy_8_vis (uint8_t * dest, const uint8_t * ref,
                                       const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_8 = stride + 8;
@@ -3661,10 +3619,9 @@ static void MC_put_no_round_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_avg_no_round_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_no_round_xy_16_vis (uint8_t * dest, const uint8_t * ref,
                                        const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_8 = stride + 8;
@@ -3858,10 +3815,9 @@ static void MC_avg_no_round_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
         } while (--height);
 }
 
-static void MC_avg_no_round_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
+static void MC_avg_no_round_xy_8_vis (uint8_t * dest, const uint8_t * ref,
                                       const int stride, int height)
 {
-        uint8_t *ref = (uint8_t *) _ref;
         unsigned long off = (unsigned long) ref & 0x7;
         unsigned long off_plus_1 = off + 1;
         int stride_8 = stride + 8;
@@ -3993,19 +3949,22 @@ static int vis_level(void)
 }
 
 /* libavcodec initialization code */
-void dsputil_init_vis(DSPContext* c, AVCodecContext *avctx)
+void ff_dsputil_init_vis(DSPContext* c, AVCodecContext *avctx)
 {
   /* VIS-specific optimizations */
   int accel = vis_level ();
+  const int high_bit_depth = avctx->bits_per_raw_sample > 8;
 
   if (accel & ACCEL_SPARC_VIS) {
-      if(avctx->idct_algo==FF_IDCT_SIMPLEVIS){
+      if (avctx->bits_per_raw_sample <= 8 &&
+          avctx->idct_algo == FF_IDCT_SIMPLEVIS) {
           c->idct_put = ff_simple_idct_put_vis;
           c->idct_add = ff_simple_idct_add_vis;
           c->idct     = ff_simple_idct_vis;
           c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
       }
 
+      if (!high_bit_depth) {
       c->put_pixels_tab[0][0] = MC_put_o_16_vis;
       c->put_pixels_tab[0][1] = MC_put_x_16_vis;
       c->put_pixels_tab[0][2] = MC_put_y_16_vis;
@@ -4045,5 +4004,6 @@ void dsputil_init_vis(DSPContext* c, AVCodecContext *avctx)
       c->avg_no_rnd_pixels_tab[1][1] = MC_avg_no_round_x_8_vis;
       c->avg_no_rnd_pixels_tab[1][2] = MC_avg_no_round_y_8_vis;
       c->avg_no_rnd_pixels_tab[1][3] = MC_avg_no_round_xy_8_vis;
+      }
   }
 }