LCOV - code coverage report
Current view: top level - libswresample/x86 - rematrix_init.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 37 43 86.0 %
Date: 2017-12-14 19:11:59 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2012 Michael Niedermayer (michaelni@gmx.at)
       3             :  *
       4             :  * This file is part of libswresample
       5             :  *
       6             :  * libswresample is free software; you can redistribute it and/or
       7             :  * modify it under the terms of the GNU Lesser General Public
       8             :  * License as published by the Free Software Foundation; either
       9             :  * version 2.1 of the License, or (at your option) any later version.
      10             :  *
      11             :  * libswresample is distributed in the hope that it will be useful,
      12             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14             :  * Lesser General Public License for more details.
      15             :  *
      16             :  * You should have received a copy of the GNU Lesser General Public
      17             :  * License along with libswresample; if not, write to the Free Software
      18             :  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
      19             :  */
      20             : 
      21             : #include "libavutil/x86/cpu.h"
      22             : #include "libswresample/swresample_internal.h"
      23             : 
      24             : #define D(type, simd) \
      25             : mix_1_1_func_type ff_mix_1_1_a_## type ## _ ## simd;\
      26             : mix_2_1_func_type ff_mix_2_1_a_## type ## _ ## simd;
      27             : 
      28             : D(float, sse)
      29             : D(float, avx)
      30             : D(int16, mmx)
      31             : D(int16, sse2)
      32             : 
      33          10 : av_cold int swri_rematrix_init_x86(struct SwrContext *s){
      34             : #if HAVE_X86ASM
      35          10 :     int mm_flags = av_get_cpu_flags();
      36          10 :     int nb_in  = av_get_channel_layout_nb_channels(s->in_ch_layout);
      37          10 :     int nb_out = av_get_channel_layout_nb_channels(s->out_ch_layout);
      38          10 :     int num    = nb_in * nb_out;
      39             :     int i,j;
      40             : 
      41          10 :     s->mix_1_1_simd = NULL;
      42          10 :     s->mix_2_1_simd = NULL;
      43             : 
      44          10 :     if (s->midbuf.fmt == AV_SAMPLE_FMT_S16P){
      45           3 :         if(EXTERNAL_MMX(mm_flags)) {
      46           0 :             s->mix_1_1_simd = ff_mix_1_1_a_int16_mmx;
      47           0 :             s->mix_2_1_simd = ff_mix_2_1_a_int16_mmx;
      48             :         }
      49           3 :         if(EXTERNAL_SSE2(mm_flags)) {
      50           0 :             s->mix_1_1_simd = ff_mix_1_1_a_int16_sse2;
      51           0 :             s->mix_2_1_simd = ff_mix_2_1_a_int16_sse2;
      52             :         }
      53           3 :         s->native_simd_matrix = av_mallocz_array(num,  2 * sizeof(int16_t));
      54           3 :         s->native_simd_one    = av_mallocz(2 * sizeof(int16_t));
      55           3 :         if (!s->native_simd_matrix || !s->native_simd_one)
      56           0 :             return AVERROR(ENOMEM);
      57             : 
      58           8 :         for(i=0; i<nb_out; i++){
      59           5 :             int sh = 0;
      60          11 :             for(j=0; j<nb_in; j++)
      61           6 :                 sh = FFMAX(sh, FFABS(((int*)s->native_matrix)[i * nb_in + j]));
      62           5 :             sh = FFMAX(av_log2(sh) - 14, 0);
      63          11 :             for(j=0; j<nb_in; j++) {
      64           6 :                 ((int16_t*)s->native_simd_matrix)[2*(i * nb_in + j)+1] = 15 - sh;
      65           6 :                 ((int16_t*)s->native_simd_matrix)[2*(i * nb_in + j)] =
      66           6 :                     ((((int*)s->native_matrix)[i * nb_in + j]) + (1<<sh>>1)) >> sh;
      67             :             }
      68             :         }
      69           3 :         ((int16_t*)s->native_simd_one)[1] = 14;
      70           3 :         ((int16_t*)s->native_simd_one)[0] = 16384;
      71           7 :     } else if(s->midbuf.fmt == AV_SAMPLE_FMT_FLTP){
      72           7 :         if(EXTERNAL_SSE(mm_flags)) {
      73           1 :             s->mix_1_1_simd = ff_mix_1_1_a_float_sse;
      74           1 :             s->mix_2_1_simd = ff_mix_2_1_a_float_sse;
      75             :         }
      76           7 :         if(EXTERNAL_AVX_FAST(mm_flags)) {
      77           1 :             s->mix_1_1_simd = ff_mix_1_1_a_float_avx;
      78           1 :             s->mix_2_1_simd = ff_mix_2_1_a_float_avx;
      79             :         }
      80           7 :         s->native_simd_matrix = av_mallocz_array(num, sizeof(float));
      81           7 :         s->native_simd_one = av_mallocz(sizeof(float));
      82           7 :         if (!s->native_simd_matrix || !s->native_simd_one)
      83           0 :             return AVERROR(ENOMEM);
      84           7 :         memcpy(s->native_simd_matrix, s->native_matrix, num * sizeof(float));
      85           7 :         memcpy(s->native_simd_one, s->native_one, sizeof(float));
      86             :     }
      87             : #endif
      88             : 
      89          10 :     return 0;
      90             : }

Generated by: LCOV version 1.13