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 109567011 times.
✓ Branch 1 taken 110648 times.
✓ Branch 2 taken 35184 times.
✓ Branch 3 taken 110648 times.
|
109712843 | CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi) |
62 |
4/4✓ Branch 0 taken 2510936 times.
✓ Branch 1 taken 3444 times.
✓ Branch 2 taken 14 times.
✓ Branch 3 taken 3444 times.
|
2514394 | 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 4461413 times.
✓ Branch 1 taken 7362 times.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 7362 times.
|
4468829 | 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 1219988 times.
✓ Branch 1 taken 2098 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2098 times.
|
1222086 | 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 9102504 times.
✓ Branch 1 taken 33035 times.
✓ Branch 2 taken 784 times.
✓ Branch 3 taken 33035 times.
|
9136323 | 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 38070366 times.
✓ Branch 1 taken 181814 times.
✓ Branch 2 taken 373 times.
✓ Branch 3 taken 181814 times.
|
38252553 | 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 83200 times.
✓ Branch 1 taken 328 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 328 times.
|
83528 | 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 3435138 times.
✓ Branch 1 taken 10567 times.
✓ Branch 2 taken 306 times.
✓ Branch 3 taken 10567 times.
|
3446011 | 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 | 2235 | 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 | 2235 | 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 2235 times.
|
2235 | if (!f) |
154 | ✗ | return NULL; | |
155 | 2235 | ctx = av_mallocz(sizeof(*ctx)); | |
156 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2235 times.
|
2235 | if (!ctx) |
157 | ✗ | return NULL; | |
158 | |||
159 |
2/2✓ Branch 0 taken 1647 times.
✓ Branch 1 taken 588 times.
|
2235 | if(channels == 1){ |
160 | 1647 | in_fmt = av_get_planar_sample_fmt( in_fmt); | |
161 | 1647 | out_fmt = av_get_planar_sample_fmt(out_fmt); | |
162 | } | ||
163 | |||
164 | 2235 | ctx->channels = channels; | |
165 | 2235 | ctx->conv_f = f; | |
166 | 2235 | ctx->ch_map = ch_map; | |
167 |
4/4✓ Branch 0 taken 2231 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 2211 times.
|
2235 | 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 1131 times.
✓ Branch 1 taken 1104 times.
✓ Branch 2 taken 1121 times.
✓ Branch 3 taken 10 times.
|
2235 | if(out_fmt == in_fmt && !ch_map) { |
171 |
3/5✗ Branch 1 not taken.
✓ Branch 2 taken 554 times.
✓ Branch 3 taken 398 times.
✓ Branch 4 taken 169 times.
✗ Branch 5 not taken.
|
1121 | switch(av_get_bytes_per_sample(in_fmt)){ |
172 | ✗ | case 1:ctx->simd_f = cpy1; break; | |
173 | 554 | 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 | 2235 | 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 | 2235 | return ctx; | |
188 | } | ||
189 | |||
190 | 11901 | void swri_audio_convert_free(AudioConvert **ctx) | |
191 | { | ||
192 | 11901 | av_freep(ctx); | |
193 | 11901 | } | |
194 | |||
195 | 217045 | int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) | |
196 | { | ||
197 | int ch; | ||
198 | 217045 | int off=0; | |
199 |
2/2✓ Branch 0 taken 114618 times.
✓ Branch 1 taken 102427 times.
|
217045 | const int os= (out->planar ? 1 :out->ch_count) *out->bps; |
200 | 217045 | unsigned misaligned = 0; | |
201 | |||
202 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 217045 times.
|
217045 | av_assert0(ctx->channels == out->ch_count); |
203 | |||
204 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 217045 times.
|
217045 | 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 217045 times.
|
217045 | 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 216940 times.
✓ Branch 2 taken 105 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 105 times.
✗ Branch 5 not taken.
|
217045 | 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 381240 times.
✓ Branch 1 taken 216940 times.
|
598180 | for(ch=0; ch<ctx->channels; ch++){ |
241 |
2/2✓ Branch 0 taken 2075 times.
✓ Branch 1 taken 379165 times.
|
381240 | const int ich= ctx->ch_map ? ctx->ch_map[ch] : ch; |
242 |
4/4✓ Branch 0 taken 380785 times.
✓ Branch 1 taken 455 times.
✓ Branch 2 taken 25511 times.
✓ Branch 3 taken 355274 times.
|
381240 | 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 380785 times.
|
381240 | const uint8_t *pi= ich < 0 ? ctx->silence : in->ch[ich]; |
244 | 381240 | uint8_t *end, *po = out->ch[ch]; | |
245 |
2/2✓ Branch 0 taken 52 times.
✓ Branch 1 taken 381188 times.
|
381240 | if(!po) |
246 | 52 | continue; | |
247 | 381188 | end = po + os * len; | |
248 | 381188 | ctx->conv_f(po+off*os, pi+off*is, is, os, end); | |
249 | } | ||
250 | 216940 | return 0; | |
251 | } | ||
252 |