| Line | Branch | Exec | Source | 
|---|---|---|---|
| 1 | /* | ||
| 2 | * audio conversion | ||
| 3 | * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | ||
| 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 | /** | ||
| 23 | * @file | ||
| 24 | * audio conversion | ||
| 25 | * @author Michael Niedermayer <michaelni@gmx.at> | ||
| 26 | */ | ||
| 27 | |||
| 28 | #include "libavutil/avassert.h" | ||
| 29 | #include "libavutil/libm.h" | ||
| 30 | #include "libavutil/mem.h" | ||
| 31 | #include "libavutil/samplefmt.h" | ||
| 32 | #include "audioconvert.h" | ||
| 33 | |||
| 34 | |||
| 35 | #define CONV_FUNC_NAME(dst_fmt, src_fmt) conv_ ## src_fmt ## _to_ ## dst_fmt | ||
| 36 | |||
| 37 | //FIXME rounding ? | ||
| 38 | #define CONV_FUNC(ofmt, otype, ifmt, expr)\ | ||
| 39 | static void CONV_FUNC_NAME(ofmt, ifmt)(uint8_t *po, const uint8_t *pi, int is, int os, uint8_t *end)\ | ||
| 40 | {\ | ||
| 41 | uint8_t *end2 = end - 3*os;\ | ||
| 42 | while(po < end2){\ | ||
| 43 | *(otype*)po = expr; pi += is; po += os;\ | ||
| 44 | *(otype*)po = expr; pi += is; po += os;\ | ||
| 45 | *(otype*)po = expr; pi += is; po += os;\ | ||
| 46 | *(otype*)po = expr; pi += is; po += os;\ | ||
| 47 | }\ | ||
| 48 | while(po < end){\ | ||
| 49 | *(otype*)po = expr; pi += is; po += os;\ | ||
| 50 | }\ | ||
| 51 | } | ||
| 52 | |||
| 53 | //FIXME put things below under ifdefs so we do not waste space for cases no codec will need | ||
| 54 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_U8 , *(const uint8_t*)pi) | |
| 55 | 
        4/4✓ Branch 0 taken 1370593 times. 
          ✓ Branch 1 taken 3393 times. 
          ✓ Branch 2 taken 689 times. 
          ✓ Branch 3 taken 3393 times. 
         | 
      1374675 | CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80U)<<8) | 
| 56 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80U)<<24) | |
| 57 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8 , (uint64_t)((*(const uint8_t*)pi - 0x80U))<<56) | |
| 58 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0f/ (1<<7))) | |
| 59 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7))) | |
| 60 | 
        4/4✓ Branch 0 taken 2232972 times. 
          ✓ Branch 1 taken 736 times. 
          ✓ Branch 2 taken 236 times. 
          ✓ Branch 3 taken 736 times. 
         | 
      2233944 | CONV_FUNC(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S16, (*(const int16_t*)pi>>8) + 0x80) | 
| 61 | 
        4/4✓ Branch 0 taken 112009521 times. 
          ✓ Branch 1 taken 129556 times. 
          ✓ Branch 2 taken 35340 times. 
          ✓ Branch 3 taken 129556 times. 
         | 
      112174417 | CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi) | 
| 62 | 
        4/4✓ Branch 0 taken 2512984 times. 
          ✓ Branch 1 taken 3446 times. 
          ✓ Branch 2 taken 14 times. 
          ✓ Branch 3 taken 3446 times. 
         | 
      2516444 | CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi * (1 << 16)) | 
| 63 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16, (uint64_t)(*(const int16_t*)pi)<<48) | |
| 64 | 
        4/4✓ Branch 0 taken 4286755 times. 
          ✓ Branch 1 taken 7191 times. 
          ✓ Branch 2 taken 50 times. 
          ✓ Branch 3 taken 7191 times. 
         | 
      4293996 | CONV_FUNC(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0f/ (1<<15))) | 
| 65 | 
        3/4✓ Branch 0 taken 1224084 times. 
          ✓ Branch 1 taken 2102 times. 
          ✗ Branch 2 not taken. 
          ✓ Branch 3 taken 2102 times. 
         | 
      1226186 | CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15))) | 
| 66 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S32, (*(const int32_t*)pi>>24) + 0x80) | |
| 67 | 
        4/4✓ Branch 0 taken 9104552 times. 
          ✓ Branch 1 taken 33037 times. 
          ✓ Branch 2 taken 784 times. 
          ✓ Branch 3 taken 33037 times. 
         | 
      9138373 | CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S32, *(const int32_t*)pi>>16) | 
| 68 | 
        4/4✓ Branch 0 taken 11688516 times. 
          ✓ Branch 1 taken 15587 times. 
          ✓ Branch 2 taken 78 times. 
          ✓ Branch 3 taken 15587 times. 
         | 
      11704181 | CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S32, *(const int32_t*)pi) | 
| 69 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32, (uint64_t)(*(const int32_t*)pi)<<32) | |
| 70 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0f/ (1U<<31))) | |
| 71 | 
        4/4✓ Branch 0 taken 671998 times. 
          ✓ Branch 1 taken 584 times. 
          ✓ Branch 2 taken 4 times. 
          ✓ Branch 3 taken 584 times. 
         | 
      672586 | CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1U<<31))) | 
| 72 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S64, (*(const int64_t*)pi>>56) + 0x80) | |
| 73 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S64, *(const int64_t*)pi>>48) | |
| 74 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S64, *(const int64_t*)pi>>32) | |
| 75 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S64, *(const int64_t*)pi) | |
| 76 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S64, *(const int64_t*)pi*(1.0f/ (UINT64_C(1)<<63))) | |
| 77 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S64, *(const int64_t*)pi*(1.0 / (UINT64_C(1)<<63))) | |
| 78 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8( lrintf(*(const float*)pi * (1<<7)) + 0x80)) | |
| 79 | 
        4/4✓ Branch 0 taken 37871686 times. 
          ✓ Branch 1 taken 181033 times. 
          ✓ Branch 2 taken 373 times. 
          ✓ Branch 3 taken 181033 times. 
         | 
      38053092 | CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16( lrintf(*(const float*)pi * (1<<15)))) | 
| 80 | 
        3/4✓ Branch 0 taken 101376 times. 
          ✓ Branch 1 taken 327 times. 
          ✗ Branch 2 not taken. 
          ✓ Branch 3 taken 327 times. 
         | 
      101703 | CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float*)pi * (1U<<31)))) | 
| 81 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float*)pi * (UINT64_C(1)<<63))) | |
| 82 | 
        4/4✓ Branch 0 taken 2627744 times. 
          ✓ Branch 1 taken 2951 times. 
          ✓ Branch 2 taken 352 times. 
          ✓ Branch 3 taken 2951 times. 
         | 
      2631047 | CONV_FUNC(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_FLT, *(const float*)pi) | 
| 83 | 
        3/4✓ Branch 0 taken 66150 times. 
          ✓ Branch 1 taken 65 times. 
          ✗ Branch 2 not taken. 
          ✓ Branch 3 taken 65 times. 
         | 
      66215 | CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_FLT, *(const float*)pi) | 
| 84 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8( lrint(*(const double*)pi * (1<<7)) + 0x80)) | |
| 85 | 
        4/4✓ Branch 0 taken 3439234 times. 
          ✓ Branch 1 taken 10571 times. 
          ✓ Branch 2 taken 306 times. 
          ✓ Branch 3 taken 10571 times. 
         | 
      3450111 | CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16( lrint(*(const double*)pi * (1<<15)))) | 
| 86 | 
        4/4✓ Branch 0 taken 1152 times. 
          ✓ Branch 1 taken 3 times. 
          ✓ Branch 2 taken 3 times. 
          ✓ Branch 3 taken 3 times. 
         | 
      1158 | CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double*)pi * (1U<<31)))) | 
| 87 | ✗ | CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double*)pi * (UINT64_C(1)<<63))) | |
| 88 | 
        3/4✓ Branch 0 taken 66150 times. 
          ✓ Branch 1 taken 65 times. 
          ✗ Branch 2 not taken. 
          ✓ Branch 3 taken 65 times. 
         | 
      66215 | CONV_FUNC(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_DBL, *(const double*)pi) | 
| 89 | 
        4/4✓ Branch 0 taken 2272528 times. 
          ✓ Branch 1 taken 8508 times. 
          ✓ Branch 2 taken 1 times. 
          ✓ Branch 3 taken 8508 times. 
         | 
      2281037 | CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_DBL, *(const double*)pi) | 
| 90 | |||
| 91 | #define FMT_PAIR_FUNC(out, in) [(out) + AV_SAMPLE_FMT_NB*(in)] = CONV_FUNC_NAME(out, in) | ||
| 92 | |||
| 93 | static conv_func_type * const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB*AV_SAMPLE_FMT_NB] = { | ||
| 94 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8 , AV_SAMPLE_FMT_U8 ), | ||
| 95 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8 ), | ||
| 96 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8 ), | ||
| 97 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8 ), | ||
| 98 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8 ), | ||
| 99 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8 ), | ||
| 100 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8 , AV_SAMPLE_FMT_S16), | ||
| 101 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), | ||
| 102 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), | ||
| 103 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), | ||
| 104 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), | ||
| 105 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), | ||
| 106 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8 , AV_SAMPLE_FMT_S32), | ||
| 107 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), | ||
| 108 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), | ||
| 109 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), | ||
| 110 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), | ||
| 111 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), | ||
| 112 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8 , AV_SAMPLE_FMT_FLT), | ||
| 113 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), | ||
| 114 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), | ||
| 115 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), | ||
| 116 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), | ||
| 117 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), | ||
| 118 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8 , AV_SAMPLE_FMT_DBL), | ||
| 119 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), | ||
| 120 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), | ||
| 121 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), | ||
| 122 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), | ||
| 123 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), | ||
| 124 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8 , AV_SAMPLE_FMT_S64), | ||
| 125 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), | ||
| 126 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), | ||
| 127 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), | ||
| 128 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), | ||
| 129 | FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), | ||
| 130 | }; | ||
| 131 | |||
| 132 | ✗ | static void cpy1(uint8_t **dst, const uint8_t **src, int len){ | |
| 133 | ✗ | memcpy(*dst, *src, len); | |
| 134 | ✗ | } | |
| 135 | ✗ | static void cpy2(uint8_t **dst, const uint8_t **src, int len){ | |
| 136 | ✗ | memcpy(*dst, *src, 2*len); | |
| 137 | ✗ | } | |
| 138 | ✗ | static void cpy4(uint8_t **dst, const uint8_t **src, int len){ | |
| 139 | ✗ | memcpy(*dst, *src, 4*len); | |
| 140 | ✗ | } | |
| 141 | ✗ | static void cpy8(uint8_t **dst, const uint8_t **src, int len){ | |
| 142 | ✗ | memcpy(*dst, *src, 8*len); | |
| 143 | ✗ | } | |
| 144 | |||
| 145 | 2264 | AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, | |
| 146 | enum AVSampleFormat in_fmt, | ||
| 147 | int channels, const int *ch_map, | ||
| 148 | int flags) | ||
| 149 | { | ||
| 150 | AudioConvert *ctx; | ||
| 151 | 2264 | conv_func_type *f = fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt) + AV_SAMPLE_FMT_NB*av_get_packed_sample_fmt(in_fmt)]; | |
| 152 | |||
| 153 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 2264 times. 
         | 
      2264 | if (!f) | 
| 154 | ✗ | return NULL; | |
| 155 | 2264 | ctx = av_mallocz(sizeof(*ctx)); | |
| 156 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 2264 times. 
         | 
      2264 | if (!ctx) | 
| 157 | ✗ | return NULL; | |
| 158 | |||
| 159 | 
        2/2✓ Branch 0 taken 1655 times. 
          ✓ Branch 1 taken 609 times. 
         | 
      2264 | if(channels == 1){ | 
| 160 | 1655 | in_fmt = av_get_planar_sample_fmt( in_fmt); | |
| 161 | 1655 | out_fmt = av_get_planar_sample_fmt(out_fmt); | |
| 162 | } | ||
| 163 | |||
| 164 | 2264 | ctx->channels = channels; | |
| 165 | 2264 | ctx->conv_f = f; | |
| 166 | 2264 | ctx->ch_map = ch_map; | |
| 167 | 
        4/4✓ Branch 0 taken 2260 times. 
          ✓ Branch 1 taken 4 times. 
          ✓ Branch 2 taken 20 times. 
          ✓ Branch 3 taken 2240 times. 
         | 
      2264 | if (in_fmt == AV_SAMPLE_FMT_U8 || in_fmt == AV_SAMPLE_FMT_U8P) | 
| 168 | 24 | memset(ctx->silence, 0x80, sizeof(ctx->silence)); | |
| 169 | |||
| 170 | 
        4/4✓ Branch 0 taken 1137 times. 
          ✓ Branch 1 taken 1127 times. 
          ✓ Branch 2 taken 1127 times. 
          ✓ Branch 3 taken 10 times. 
         | 
      2264 | if(out_fmt == in_fmt && !ch_map) { | 
| 171 | 
        3/5✗ Branch 1 not taken. 
          ✓ Branch 2 taken 560 times. 
          ✓ Branch 3 taken 398 times. 
          ✓ Branch 4 taken 169 times. 
          ✗ Branch 5 not taken. 
         | 
      1127 | switch(av_get_bytes_per_sample(in_fmt)){ | 
| 172 | ✗ | case 1:ctx->simd_f = cpy1; break; | |
| 173 | 560 | case 2:ctx->simd_f = cpy2; break; | |
| 174 | 398 | case 4:ctx->simd_f = cpy4; break; | |
| 175 | 169 | case 8:ctx->simd_f = cpy8; break; | |
| 176 | } | ||
| 177 | } | ||
| 178 | |||
| 179 | #if ARCH_X86 && HAVE_X86ASM && HAVE_MMX | ||
| 180 | 2264 | swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels); | |
| 181 | #elif ARCH_ARM | ||
| 182 | swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels); | ||
| 183 | #elif ARCH_AARCH64 | ||
| 184 | swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels); | ||
| 185 | #endif | ||
| 186 | |||
| 187 | 2264 | return ctx; | |
| 188 | } | ||
| 189 | |||
| 190 | 12132 | void swri_audio_convert_free(AudioConvert **ctx) | |
| 191 | { | ||
| 192 | 12132 | av_freep(ctx); | |
| 193 | 12132 | } | |
| 194 | |||
| 195 | 225279 | int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) | |
| 196 | { | ||
| 197 | int ch; | ||
| 198 | 225279 | int off=0; | |
| 199 | 
        2/2✓ Branch 0 taken 122589 times. 
          ✓ Branch 1 taken 102690 times. 
         | 
      225279 | const int os= (out->planar ? 1 :out->ch_count) *out->bps; | 
| 200 | 225279 | unsigned misaligned = 0; | |
| 201 | |||
| 202 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 225279 times. 
         | 
      225279 | av_assert0(ctx->channels == out->ch_count); | 
| 203 | |||
| 204 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 225279 times. 
         | 
      225279 | if (ctx->in_simd_align_mask) { | 
| 205 | ✗ | int planes = in->planar ? in->ch_count : 1; | |
| 206 | ✗ | unsigned m = 0; | |
| 207 | ✗ | for (ch = 0; ch < planes; ch++) | |
| 208 | ✗ | m |= (intptr_t)in->ch[ch]; | |
| 209 | ✗ | misaligned |= m & ctx->in_simd_align_mask; | |
| 210 | } | ||
| 211 | 
        1/2✗ Branch 0 not taken. 
          ✓ Branch 1 taken 225279 times. 
         | 
      225279 | if (ctx->out_simd_align_mask) { | 
| 212 | ✗ | int planes = out->planar ? out->ch_count : 1; | |
| 213 | ✗ | unsigned m = 0; | |
| 214 | ✗ | for (ch = 0; ch < planes; ch++) | |
| 215 | ✗ | m |= (intptr_t)out->ch[ch]; | |
| 216 | ✗ | misaligned |= m & ctx->out_simd_align_mask; | |
| 217 | } | ||
| 218 | |||
| 219 | //FIXME optimize common cases | ||
| 220 | |||
| 221 | 
        4/6✓ Branch 0 taken 105 times. 
          ✓ Branch 1 taken 225174 times. 
          ✓ Branch 2 taken 105 times. 
          ✗ Branch 3 not taken. 
          ✓ Branch 4 taken 105 times. 
          ✗ Branch 5 not taken. 
         | 
      225279 | if(ctx->simd_f && !ctx->ch_map && !misaligned){ | 
| 222 | 105 | off = len&~15; | |
| 223 | av_assert1(off>=0); | ||
| 224 | av_assert1(off<=len); | ||
| 225 | av_assert2(ctx->channels == SWR_CH_MAX || !in->ch[ctx->channels]); | ||
| 226 | 
        1/2✓ Branch 0 taken 105 times. 
          ✗ Branch 1 not taken. 
         | 
      105 | if(off>0){ | 
| 227 | 
        2/2✓ Branch 0 taken 58 times. 
          ✓ Branch 1 taken 47 times. 
         | 
      105 | if(out->planar == in->planar){ | 
| 228 | 
        2/2✓ Branch 0 taken 47 times. 
          ✓ Branch 1 taken 11 times. 
         | 
      58 | int planes = out->planar ? out->ch_count : 1; | 
| 229 | 
        2/2✓ Branch 0 taken 58 times. 
          ✓ Branch 1 taken 58 times. 
         | 
      116 | for(ch=0; ch<planes; ch++){ | 
| 230 | 
        2/2✓ Branch 0 taken 11 times. 
          ✓ Branch 1 taken 47 times. 
         | 
      58 | ctx->simd_f(out->ch+ch, (const uint8_t **)in->ch+ch, off * (out->planar ? 1 :out->ch_count)); | 
| 231 | } | ||
| 232 | }else{ | ||
| 233 | 47 | ctx->simd_f(out->ch, (const uint8_t **)in->ch, off); | |
| 234 | } | ||
| 235 | } | ||
| 236 | 
        1/2✓ Branch 0 taken 105 times. 
          ✗ Branch 1 not taken. 
         | 
      105 | if(off == len) | 
| 237 | 105 | return 0; | |
| 238 | } | ||
| 239 | |||
| 240 | 
        2/2✓ Branch 0 taken 399207 times. 
          ✓ Branch 1 taken 225174 times. 
         | 
      624381 | for(ch=0; ch<ctx->channels; ch++){ | 
| 241 | 
        2/2✓ Branch 0 taken 2078 times. 
          ✓ Branch 1 taken 397129 times. 
         | 
      399207 | const int ich= ctx->ch_map ? ctx->ch_map[ch] : ch; | 
| 242 | 
        4/4✓ Branch 0 taken 398752 times. 
          ✓ Branch 1 taken 455 times. 
          ✓ Branch 2 taken 27342 times. 
          ✓ Branch 3 taken 371410 times. 
         | 
      399207 | const int is= ich < 0 ? 0 : (in->planar ? 1 : in->ch_count) * in->bps; | 
| 243 | 
        2/2✓ Branch 0 taken 455 times. 
          ✓ Branch 1 taken 398752 times. 
         | 
      399207 | const uint8_t *pi= ich < 0 ? ctx->silence : in->ch[ich]; | 
| 244 | 399207 | uint8_t *end, *po = out->ch[ch]; | |
| 245 | 
        2/2✓ Branch 0 taken 52 times. 
          ✓ Branch 1 taken 399155 times. 
         | 
      399207 | if(!po) | 
| 246 | 52 | continue; | |
| 247 | 399155 | end = po + os * len; | |
| 248 | 399155 | ctx->conv_f(po+off*os, pi+off*is, is, os, end); | |
| 249 | } | ||
| 250 | 225174 | return 0; | |
| 251 | } | ||
| 252 |