Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * This file is part of FFmpeg.
  3.  *
  4.  * FFmpeg is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2.1 of the License, or (at your option) any later version.
  8.  *
  9.  * FFmpeg is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with FFmpeg; if not, write to the Free Software
  16.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17.  */
  18.  
  19. #include <stdint.h>
  20.  
  21. #include "config.h"
  22. #include "libavutil/attributes.h"
  23. #include "mathops.h"
  24. #include "huffyuvdsp.h"
  25.  
  26. // 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size
  27. #define pb_7f (~0UL / 255 * 0x7f)
  28. #define pb_80 (~0UL / 255 * 0x80)
  29.  
  30. static void add_bytes_c(uint8_t *dst, uint8_t *src, intptr_t w)
  31. {
  32.     long i;
  33.  
  34.     for (i = 0; i <= w - (int) sizeof(long); i += sizeof(long)) {
  35.         long a = *(long *) (src + i);
  36.         long b = *(long *) (dst + i);
  37.         *(long *) (dst + i) = ((a & pb_7f) + (b & pb_7f)) ^ ((a ^ b) & pb_80);
  38.     }
  39.     for (; i < w; i++)
  40.         dst[i + 0] += src[i + 0];
  41. }
  42.  
  43. static void add_hfyu_median_pred_c(uint8_t *dst, const uint8_t *src1,
  44.                                    const uint8_t *diff, intptr_t w,
  45.                                    int *left, int *left_top)
  46. {
  47.     int i;
  48.     uint8_t l, lt;
  49.  
  50.     l  = *left;
  51.     lt = *left_top;
  52.  
  53.     for (i = 0; i < w; i++) {
  54.         l      = mid_pred(l, src1[i], (l + src1[i] - lt) & 0xFF) + diff[i];
  55.         lt     = src1[i];
  56.         dst[i] = l;
  57.     }
  58.  
  59.     *left     = l;
  60.     *left_top = lt;
  61. }
  62.  
  63. static int add_hfyu_left_pred_c(uint8_t *dst, const uint8_t *src, intptr_t w,
  64.                                 int acc)
  65. {
  66.     int i;
  67.  
  68.     for (i = 0; i < w - 1; i++) {
  69.         acc   += src[i];
  70.         dst[i] = acc;
  71.         i++;
  72.         acc   += src[i];
  73.         dst[i] = acc;
  74.     }
  75.  
  76.     for (; i < w; i++) {
  77.         acc   += src[i];
  78.         dst[i] = acc;
  79.     }
  80.  
  81.     return acc;
  82. }
  83.  
  84. static void add_hfyu_left_pred_bgr32_c(uint8_t *dst, const uint8_t *src,
  85.                                        intptr_t w, uint8_t *left)
  86. {
  87.     int i;
  88.     uint8_t r = left[R], g = left[G], b = left[B], a = left[A];
  89.  
  90.     for (i = 0; i < w; i++) {
  91.         b += src[4 * i + B];
  92.         g += src[4 * i + G];
  93.         r += src[4 * i + R];
  94.         a += src[4 * i + A];
  95.  
  96.         dst[4 * i + B] = b;
  97.         dst[4 * i + G] = g;
  98.         dst[4 * i + R] = r;
  99.         dst[4 * i + A] = a;
  100.     }
  101.  
  102.     left[B] = b;
  103.     left[G] = g;
  104.     left[R] = r;
  105.     left[A] = a;
  106. }
  107.  
  108. av_cold void ff_huffyuvdsp_init(HuffYUVDSPContext *c)
  109. {
  110.     c->add_bytes                = add_bytes_c;
  111.     c->add_hfyu_median_pred     = add_hfyu_median_pred_c;
  112.     c->add_hfyu_left_pred       = add_hfyu_left_pred_c;
  113.     c->add_hfyu_left_pred_bgr32 = add_hfyu_left_pred_bgr32_c;
  114.  
  115.     if (ARCH_X86)
  116.         ff_huffyuvdsp_init_x86(c);
  117. }
  118.