tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

idctdsp_init_arm.c (3233B)


      1 /*
      2 * ARM-optimized IDCT functions
      3 * Copyright (c) 2001 Lionel Ulmer
      4 *
      5 * This file is part of FFmpeg.
      6 *
      7 * FFmpeg is free software; you can redistribute it and/or
      8 * modify it under the terms of the GNU Lesser General Public
      9 * License as published by the Free Software Foundation; either
     10 * version 2.1 of the License, or (at your option) any later version.
     11 *
     12 * FFmpeg is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15 * Lesser General Public License for more details.
     16 *
     17 * You should have received a copy of the GNU Lesser General Public
     18 * License along with FFmpeg; if not, write to the Free Software
     19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     20 */
     21 
     22 #include <stddef.h>
     23 #include <stdint.h>
     24 
     25 #include "libavutil/attributes.h"
     26 #include "libavutil/cpu.h"
     27 #include "libavutil/arm/cpu.h"
     28 #include "libavcodec/avcodec.h"
     29 #include "libavcodec/idctdsp.h"
     30 #include "idct.h"
     31 #include "idctdsp_arm.h"
     32 
     33 void ff_add_pixels_clamped_arm(const int16_t *block, uint8_t *dest,
     34                               ptrdiff_t line_size);
     35 
     36 /* XXX: those functions should be suppressed ASAP when all IDCTs are
     37 * converted */
     38 static void j_rev_dct_arm_put(uint8_t *dest, ptrdiff_t line_size,
     39                              int16_t *block)
     40 {
     41    ff_j_rev_dct_arm(block);
     42    ff_put_pixels_clamped_c(block, dest, line_size);
     43 }
     44 
     45 static void j_rev_dct_arm_add(uint8_t *dest, ptrdiff_t line_size,
     46                              int16_t *block)
     47 {
     48    ff_j_rev_dct_arm(block);
     49    ff_add_pixels_clamped_arm(block, dest, line_size);
     50 }
     51 
     52 static void simple_idct_arm_put(uint8_t *dest, ptrdiff_t line_size,
     53                                int16_t *block)
     54 {
     55    ff_simple_idct_arm(block);
     56    ff_put_pixels_clamped_c(block, dest, line_size);
     57 }
     58 
     59 static void simple_idct_arm_add(uint8_t *dest, ptrdiff_t line_size,
     60                                int16_t *block)
     61 {
     62    ff_simple_idct_arm(block);
     63    ff_add_pixels_clamped_arm(block, dest, line_size);
     64 }
     65 
     66 av_cold void ff_idctdsp_init_arm(IDCTDSPContext *c, AVCodecContext *avctx,
     67                                 unsigned high_bit_depth)
     68 {
     69    int cpu_flags = av_get_cpu_flags();
     70 
     71    if (!avctx->lowres && !high_bit_depth) {
     72        if ((avctx->idct_algo == FF_IDCT_AUTO && !(avctx->flags & AV_CODEC_FLAG_BITEXACT)) ||
     73            avctx->idct_algo == FF_IDCT_ARM) {
     74            c->idct_put  = j_rev_dct_arm_put;
     75            c->idct_add  = j_rev_dct_arm_add;
     76            c->idct      = ff_j_rev_dct_arm;
     77            c->perm_type = FF_IDCT_PERM_LIBMPEG2;
     78        } else if (avctx->idct_algo == FF_IDCT_SIMPLEARM) {
     79            c->idct_put  = simple_idct_arm_put;
     80            c->idct_add  = simple_idct_arm_add;
     81            c->idct      = ff_simple_idct_arm;
     82            c->perm_type = FF_IDCT_PERM_NONE;
     83        }
     84    }
     85 
     86    c->add_pixels_clamped = ff_add_pixels_clamped_arm;
     87 
     88    if (have_armv5te(cpu_flags))
     89        ff_idctdsp_init_armv5te(c, avctx, high_bit_depth);
     90    if (have_armv6(cpu_flags))
     91        ff_idctdsp_init_armv6(c, avctx, high_bit_depth);
     92    if (have_neon(cpu_flags))
     93        ff_idctdsp_init_neon(c, avctx, high_bit_depth);
     94 }