Home | History | Annotate | Download | only in audio_utils
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_AUDIO_PRIMITIVES_H
     18 #define ANDROID_AUDIO_PRIMITIVES_H
     19 
     20 #include <stdint.h>
     21 #include <stdlib.h>
     22 #include <sys/cdefs.h>
     23 
     24 /** \cond */
     25 __BEGIN_DECLS
     26 /** \endcond */
     27 
     28 /**
     29  * \file primitives.h
     30  * The memcpy_* conversion routines are designed to work in-place on same dst as src
     31  * buffers only if the types shrink on copy, with the exception of memcpy_to_i16_from_u8().
     32  * This allows the loops to go upwards for faster cache access (and may be more flexible
     33  * for future optimization later).
     34  */
     35 
     36 /**
     37  * Dither and clamp pairs of 32-bit input samples (sums) to 16-bit output samples (out).
     38  * Each 32-bit input sample can be viewed as a signed fixed-point Q19.12 of which the
     39  * .12 fraction bits are dithered and the 19 integer bits are clamped to signed 16 bits.
     40  * Alternatively the input can be viewed as Q4.27, of which the lowest .12 of the fraction
     41  * is dithered and the remaining fraction is converted to the output Q.15, with clamping
     42  * on the 4 integer guard bits.
     43  *
     44  * For interleaved stereo, c is the number of sample pairs,
     45  * and out is an array of interleaved pairs of 16-bit samples per channel.
     46  * For mono, c is the number of samples / 2, and out is an array of 16-bit samples.
     47  * The name "dither" is a misnomer; the current implementation does not actually dither
     48  * but uses truncation.  This may change.
     49  * The out and sums buffers must either be completely separate (non-overlapping), or
     50  * they must both start at the same address.  Partially overlapping buffers are not supported.
     51  */
     52 void ditherAndClamp(int32_t* out, const int32_t *sums, size_t c);
     53 
     54 /**
     55  * Expand and copy samples from unsigned 8-bit offset by 0x80 to signed 16-bit.
     56  *
     57  *  \param dst     Destination buffer
     58  *  \param src     Source buffer
     59  *  \param count   Number of samples to copy
     60  *
     61  * The destination and source buffers must either be completely separate (non-overlapping), or
     62  * they must both start at the same address.  Partially overlapping buffers are not supported.
     63  */
     64 void memcpy_to_i16_from_u8(int16_t *dst, const uint8_t *src, size_t count);
     65 
     66 /**
     67  * Shrink and copy samples from signed 16-bit to unsigned 8-bit offset by 0x80.
     68  *
     69  *  \param dst     Destination buffer
     70  *  \param src     Source buffer
     71  *  \param count   Number of samples to copy
     72  *
     73  * The destination and source buffers must either be completely separate (non-overlapping), or
     74  * they must both start at the same address.  Partially overlapping buffers are not supported.
     75  * The conversion is done by truncation, without dithering, so it loses resolution.
     76  */
     77 void memcpy_to_u8_from_i16(uint8_t *dst, const int16_t *src, size_t count);
     78 
     79 /**
     80  * Copy samples from float to unsigned 8-bit offset by 0x80.
     81  *
     82  *  \param dst     Destination buffer
     83  *  \param src     Source buffer
     84  *  \param count   Number of samples to copy
     85  *
     86  * The destination and source buffers must either be completely separate (non-overlapping), or
     87  * they must both start at the same address.  Partially overlapping buffers are not supported.
     88  * The conversion is done by truncation, without dithering, so it loses resolution.
     89  */
     90 void memcpy_to_u8_from_float(uint8_t *dst, const float *src, size_t count);
     91 
     92 /**
     93  * Shrink and copy samples from signed 32-bit fixed-point Q0.31 to signed 16-bit Q0.15.
     94  *
     95  *  \param dst     Destination buffer
     96  *  \param src     Source buffer
     97  *  \param count   Number of samples to copy
     98  *
     99  * The destination and source buffers must either be completely separate (non-overlapping), or
    100  * they must both start at the same address.  Partially overlapping buffers are not supported.
    101  * The conversion is done by truncation, without dithering, so it loses resolution.
    102  */
    103 void memcpy_to_i16_from_i32(int16_t *dst, const int32_t *src, size_t count);
    104 
    105 /**
    106  * Shrink and copy samples from single-precision floating-point to signed 16-bit.
    107  * Each float should be in the range -1.0 to 1.0.  Values outside that range are clamped,
    108  * refer to clamp16_from_float().
    109  *
    110  *  \param dst     Destination buffer
    111  *  \param src     Source buffer
    112  *  \param count   Number of samples to copy
    113  *
    114  * The destination and source buffers must either be completely separate (non-overlapping), or
    115  * they must both start at the same address.  Partially overlapping buffers are not supported.
    116  * The conversion is done by truncation, without dithering, so it loses resolution.
    117  */
    118 void memcpy_to_i16_from_float(int16_t *dst, const float *src, size_t count);
    119 
    120 /**
    121  * Copy samples from signed fixed-point 32-bit Q4.27 to single-precision floating-point.
    122  * The nominal output float range is [-1.0, 1.0] if the fixed-point range is
    123  * [0xf8000000, 0x07ffffff].  The full float range is [-16.0, 16.0].  Note the closed range
    124  * at 1.0 and 16.0 is due to rounding on conversion to float. See float_from_q4_27() for details.
    125  *
    126  *  \param dst     Destination buffer
    127  *  \param src     Source buffer
    128  *  \param count   Number of samples to copy
    129  *
    130  * The destination and source buffers must either be completely separate (non-overlapping), or
    131  * they must both start at the same address.  Partially overlapping buffers are not supported.
    132  */
    133 void memcpy_to_float_from_q4_27(float *dst, const int32_t *src, size_t count);
    134 
    135 /**
    136  * Copy samples from signed fixed-point 16 bit Q0.15 to single-precision floating-point.
    137  * The output float range is [-1.0, 1.0) for the fixed-point range [0x8000, 0x7fff].
    138  * No rounding is needed as the representation is exact.
    139  *
    140  *  \param dst     Destination buffer
    141  *  \param src     Source buffer
    142  *  \param count   Number of samples to copy
    143  *
    144  * The destination and source buffers must be completely separate.
    145  */
    146 void memcpy_to_float_from_i16(float *dst, const int16_t *src, size_t count);
    147 
    148 /**
    149  * Copy samples from unsigned fixed-point 8 bit to single-precision floating-point.
    150  * The output float range is [-1.0, 1.0) for the fixed-point range [0x00, 0xFF].
    151  * No rounding is needed as the representation is exact.
    152  *
    153  *  \param dst     Destination buffer
    154  *  \param src     Source buffer
    155  *  \param count   Number of samples to copy
    156  *
    157  * The destination and source buffers must be completely separate.
    158  */
    159 void memcpy_to_float_from_u8(float *dst, const uint8_t *src, size_t count);
    160 
    161 /**
    162  * Copy samples from signed fixed-point packed 24 bit Q0.23 to single-precision floating-point.
    163  * The packed 24 bit input is stored in native endian format in a uint8_t byte array.
    164  * The output float range is [-1.0, 1.0) for the fixed-point range [0x800000, 0x7fffff].
    165  * No rounding is needed as the representation is exact.
    166  *
    167  *  \param dst     Destination buffer
    168  *  \param src     Source buffer
    169  *  \param count   Number of samples to copy
    170  *
    171  * The destination and source buffers must be completely separate.
    172  */
    173 void memcpy_to_float_from_p24(float *dst, const uint8_t *src, size_t count);
    174 
    175 /**
    176  * Copy samples from signed fixed-point packed 24 bit Q0.23 to signed fixed point 16 bit Q0.15.
    177  * The packed 24 bit output is stored in native endian format in a uint8_t byte array.
    178  * The data is truncated without rounding.
    179  *
    180  *  \param dst     Destination buffer
    181  *  \param src     Source buffer
    182  *  \param count   Number of samples to copy
    183  *
    184  * The destination and source buffers must either be completely separate (non-overlapping), or
    185  * they must both start at the same address.  Partially overlapping buffers are not supported.
    186  */
    187 void memcpy_to_i16_from_p24(int16_t *dst, const uint8_t *src, size_t count);
    188 
    189 /**
    190  * Copy samples from signed fixed-point packed 24 bit Q0.23 to signed fixed-point 32-bit Q0.31.
    191  * The packed 24 bit input is stored in native endian format in a uint8_t byte array.
    192  * The output data range is [0x80000000, 0x7fffff00] at intervals of 0x100.
    193  *
    194  *  \param dst     Destination buffer
    195  *  \param src     Source buffer
    196  *  \param count   Number of samples to copy
    197  *
    198  * The destination and source buffers must be completely separate.
    199  */
    200 void memcpy_to_i32_from_p24(int32_t *dst, const uint8_t *src, size_t count);
    201 
    202 /**
    203  * Copy samples from signed fixed point 16 bit Q0.15 to signed fixed-point packed 24 bit Q0.23.
    204  * The packed 24 bit output is assumed to be a native-endian uint8_t byte array.
    205  * The output data range is [0x800000, 0x7fff00] (not full).
    206  * Nevertheless there is no DC offset on the output, if the input has no DC offset.
    207  *
    208  *  \param dst     Destination buffer
    209  *  \param src     Source buffer
    210  *  \param count   Number of samples to copy
    211  *
    212  * The destination and source buffers must be completely separate.
    213  */
    214 void memcpy_to_p24_from_i16(uint8_t *dst, const int16_t *src, size_t count);
    215 
    216 /**
    217  * Copy samples from single-precision floating-point to signed fixed-point packed 24 bit Q0.23.
    218  * The packed 24 bit output is assumed to be a native-endian uint8_t byte array.
    219  * The data is clamped and rounded to nearest, ties away from zero. See clamp24_from_float()
    220  * for details.
    221  *
    222  *  \param dst     Destination buffer
    223  *  \param src     Source buffer
    224  *  \param count   Number of samples to copy
    225  *
    226  * The destination and source buffers must either be completely separate (non-overlapping), or
    227  * they must both start at the same address.  Partially overlapping buffers are not supported.
    228  */
    229 void memcpy_to_p24_from_float(uint8_t *dst, const float *src, size_t count);
    230 
    231 /**
    232  * Copy samples from signed fixed-point 32-bit Q8.23 to signed fixed-point packed 24 bit Q0.23.
    233  * The packed 24 bit output is assumed to be a native-endian uint8_t byte array.
    234  * The data is clamped to the range is [0x800000, 0x7fffff].
    235  *
    236  *  \param dst     Destination buffer
    237  *  \param src     Source buffer
    238  *  \param count   Number of samples to copy
    239  *
    240  * The destination and source buffers must be completely separate.
    241  */
    242 void memcpy_to_p24_from_q8_23(uint8_t *dst, const int32_t *src, size_t count);
    243 
    244 /**
    245  * Shrink and copy samples from signed 32-bit fixed-point Q0.31
    246  * to signed fixed-point packed 24 bit Q0.23.
    247  * The packed 24 bit output is assumed to be a native-endian uint8_t byte array.
    248  *
    249  *  \param dst     Destination buffer
    250  *  \param src     Source buffer
    251  *  \param count   Number of samples to copy
    252  *
    253  * The destination and source buffers must either be completely separate (non-overlapping), or
    254  * they must both start at the same address.  Partially overlapping buffers are not supported.
    255  * The conversion is done by truncation, without dithering, so it loses resolution.
    256  */
    257 void memcpy_to_p24_from_i32(uint8_t *dst, const int32_t *src, size_t count);
    258 
    259 /**
    260  * Copy samples from signed fixed point 16-bit Q0.15 to signed fixed-point 32-bit Q8.23.
    261  * The output data range is [0xff800000, 0x007fff00] at intervals of 0x100.
    262  *
    263  *  \param dst     Destination buffer
    264  *  \param src     Source buffer
    265  *  \param count   Number of samples to copy
    266  *
    267  * The destination and source buffers must be completely separate.
    268  */
    269 void memcpy_to_q8_23_from_i16(int32_t *dst, const int16_t *src, size_t count);
    270 
    271 /**
    272  * Copy samples from single-precision floating-point to signed fixed-point 32-bit Q8.23.
    273  * This copy will clamp the Q8.23 representation to [0xff800000, 0x007fffff] even though there
    274  * are guard bits available. Fractional lsb is rounded to nearest, ties away from zero.
    275  * See clamp24_from_float() for details.
    276  *
    277  *  \param dst     Destination buffer
    278  *  \param src     Source buffer
    279  *  \param count   Number of samples to copy
    280  *
    281  * The destination and source buffers must either be completely separate (non-overlapping), or
    282  * they must both start at the same address.  Partially overlapping buffers are not supported.
    283  */
    284 void memcpy_to_q8_23_from_float_with_clamp(int32_t *dst, const float *src, size_t count);
    285 
    286 /**
    287  * Copy samples from signed fixed point packed 24-bit Q0.23 to signed fixed-point 32-bit Q8.23.
    288  * The output data range is [0xff800000, 0x007fffff].
    289  *
    290  *  \param dst     Destination buffer
    291  *  \param src     Source buffer
    292  *  \param count   Number of samples to copy
    293  *
    294  * The destination and source buffers must be completely separate.
    295  */
    296 void memcpy_to_q8_23_from_p24(int32_t *dst, const uint8_t *src, size_t count);
    297 
    298 /**
    299  * Copy samples from single-precision floating-point to signed fixed-point 32-bit Q4.27.
    300  * The conversion will use the full available Q4.27 range, including guard bits.
    301  * Fractional lsb is rounded to nearest, ties away from zero.
    302  * See clampq4_27_from_float() for details.
    303  *
    304  *  \param dst     Destination buffer
    305  *  \param src     Source buffer
    306  *  \param count   Number of samples to copy
    307  *
    308  * The destination and source buffers must either be completely separate (non-overlapping), or
    309  * they must both start at the same address.  Partially overlapping buffers are not supported.
    310  */
    311 void memcpy_to_q4_27_from_float(int32_t *dst, const float *src, size_t count);
    312 
    313 /**
    314  * Copy samples from signed fixed-point 32-bit Q8.23 to signed fixed point 16-bit Q0.15.
    315  * The data is clamped, and truncated without rounding.
    316  *
    317  *  \param dst     Destination buffer
    318  *  \param src     Source buffer
    319  *  \param count   Number of samples to copy
    320  *
    321  * The destination and source buffers must either be completely separate (non-overlapping), or
    322  * they must both start at the same address.  Partially overlapping buffers are not supported.
    323  */
    324 void memcpy_to_i16_from_q8_23(int16_t *dst, const int32_t *src, size_t count);
    325 
    326 /**
    327  * Copy samples from signed fixed-point 32-bit Q8.23 to single-precision floating-point.
    328  * The nominal output float range is [-1.0, 1.0) for the fixed-point
    329  * range [0xff800000, 0x007fffff]. The maximum output float range is [-256.0, 256.0).
    330  * No rounding is needed as the representation is exact for nominal values.
    331  * Rounding for overflow values is to nearest, ties to even.
    332  *
    333  *  \param dst     Destination buffer
    334  *  \param src     Source buffer
    335  *  \param count   Number of samples to copy
    336  *
    337  * The destination and source buffers must either be completely separate (non-overlapping), or
    338  * they must both start at the same address.  Partially overlapping buffers are not supported.
    339  */
    340 void memcpy_to_float_from_q8_23(float *dst, const int32_t *src, size_t count);
    341 
    342 /**
    343  * Copy samples from signed fixed point 16-bit Q0.15 to signed fixed-point 32-bit Q0.31.
    344  * The output data range is [0x80000000, 0x7fff0000] at intervals of 0x10000.
    345  *
    346  *  \param dst     Destination buffer
    347  *  \param src     Source buffer
    348  *  \param count   Number of samples to copy
    349  *
    350  * The destination and source buffers must be completely separate.
    351  */
    352 void memcpy_to_i32_from_i16(int32_t *dst, const int16_t *src, size_t count);
    353 
    354 /**
    355  * Copy samples from single-precision floating-point to signed fixed-point 32-bit Q0.31.
    356  * If rounding is needed on truncation, the fractional lsb is rounded to nearest,
    357  * ties away from zero. See clamp32_from_float() for details.
    358  *
    359  *  \param dst     Destination buffer
    360  *  \param src     Source buffer
    361  *  \param count   Number of samples to copy
    362  *
    363  * The destination and source buffers must either be completely separate (non-overlapping), or
    364  * they must both start at the same address.  Partially overlapping buffers are not supported.
    365  */
    366 void memcpy_to_i32_from_float(int32_t *dst, const float *src, size_t count);
    367 
    368 /**
    369  * Copy samples from signed fixed-point 32-bit Q0.31 to single-precision floating-point.
    370  * The float range is [-1.0, 1.0] for the fixed-point range [0x80000000, 0x7fffffff].
    371  * Rounding is done according to float_from_i32().
    372  *
    373  *  \param dst     Destination buffer
    374  *  \param src     Source buffer
    375  *  \param count   Number of samples to copy
    376  *
    377  * The destination and source buffers must either be completely separate (non-overlapping), or
    378  * they must both start at the same address.  Partially overlapping buffers are not supported.
    379  */
    380 void memcpy_to_float_from_i32(float *dst, const int32_t *src, size_t count);
    381 
    382 /**
    383  * Downmix pairs of interleaved stereo input 16-bit samples to mono output 16-bit samples.
    384  *
    385  *  \param dst     Destination buffer
    386  *  \param src     Source buffer
    387  *  \param count   Number of stereo frames to downmix
    388  *
    389  * The destination and source buffers must be completely separate (non-overlapping).
    390  * The current implementation truncates the mean rather than dither, but this may change.
    391  */
    392 void downmix_to_mono_i16_from_stereo_i16(int16_t *dst, const int16_t *src, size_t count);
    393 
    394 /**
    395  * Upmix mono input 16-bit samples to pairs of interleaved stereo output 16-bit samples by
    396  * duplicating.
    397  *
    398  *  \param dst     Destination buffer
    399  *  \param src     Source buffer
    400  *  \param count   Number of mono samples to upmix
    401  *
    402  * The destination and source buffers must be completely separate (non-overlapping).
    403  */
    404 void upmix_to_stereo_i16_from_mono_i16(int16_t *dst, const int16_t *src, size_t count);
    405 
    406 /**
    407  * Downmix pairs of interleaved stereo input float samples to mono output float samples
    408  * by averaging the stereo pair together.
    409  *
    410  *  \param dst     Destination buffer
    411  *  \param src     Source buffer
    412  *  \param count   Number of stereo frames to downmix
    413  *
    414  * The destination and source buffers must be completely separate (non-overlapping),
    415  * or they must both start at the same address.
    416  */
    417 void downmix_to_mono_float_from_stereo_float(float *dst, const float *src, size_t count);
    418 
    419 /**
    420  * Upmix mono input float samples to pairs of interleaved stereo output float samples by
    421  * duplicating.
    422  *
    423  *  \param dst     Destination buffer
    424  *  \param src     Source buffer
    425  *  \param count   Number of mono samples to upmix
    426  *
    427  * The destination and source buffers must be completely separate (non-overlapping).
    428  */
    429 void upmix_to_stereo_float_from_mono_float(float *dst, const float *src, size_t count);
    430 
    431 /**
    432  * \return the total number of non-zero 32-bit samples.
    433  */
    434 size_t nonZeroMono32(const int32_t *samples, size_t count);
    435 
    436 /**
    437  * \return the total number of non-zero 16-bit samples.
    438  */
    439 size_t nonZeroMono16(const int16_t *samples, size_t count);
    440 
    441 /**
    442  * \return the total number of non-zero stereo frames, where a frame is considered non-zero
    443  * if either of its constituent 32-bit samples is non-zero.
    444  */
    445 size_t nonZeroStereo32(const int32_t *frames, size_t count);
    446 
    447 /**
    448  * \return the total number of non-zero stereo frames, where a frame is considered non-zero
    449  * if either of its constituent 16-bit samples is non-zero.
    450  */
    451 size_t nonZeroStereo16(const int16_t *frames, size_t count);
    452 
    453 /**
    454  * Copy frames, selecting source samples based on a source channel mask to fit
    455  * the destination channel mask. Unmatched channels in the destination channel mask
    456  * are zero filled. Unmatched channels in the source channel mask are dropped.
    457  * Channels present in the channel mask are represented by set bits in the
    458  * uint32_t value and are matched without further interpretation.
    459  *
    460  *  \param dst         Destination buffer
    461  *  \param dst_mask    Bit mask corresponding to destination channels present
    462  *  \param src         Source buffer
    463  *  \param src_mask    Bit mask corresponding to source channels present
    464  *  \param sample_size Size of each sample in bytes.  Must be 1, 2, 3, or 4.
    465  *  \param count       Number of frames to copy
    466  *
    467  * The destination and source buffers must be completely separate (non-overlapping).
    468  * If the sample size is not in range, the function will abort.
    469  */
    470 void memcpy_by_channel_mask(void *dst, uint32_t dst_mask,
    471         const void *src, uint32_t src_mask, size_t sample_size, size_t count);
    472 
    473 /**
    474  * Copy frames, selecting source samples based on an index array (idxary).
    475  * The idxary[] consists of dst_channels number of elements.
    476  * The ith element if idxary[] corresponds the ith destination channel.
    477  * A non-negative value is the channel index in the source frame.
    478  * A negative index (-1) represents filling with 0.
    479  *
    480  * Example: Swapping L and R channels for stereo streams
    481  * <PRE>
    482  * idxary[0] = 1;
    483  * idxary[1] = 0;
    484  * </PRE>
    485  *
    486  * Example: Copying a mono source to the front center 5.1 channel
    487  * <PRE>
    488  * idxary[0] = -1;
    489  * idxary[1] = -1;
    490  * idxary[2] = 0;
    491  * idxary[3] = -1;
    492  * idxary[4] = -1;
    493  * idxary[5] = -1;
    494  * </PRE>
    495  *
    496  * This copy allows swizzling of channels or replication of channels.
    497  *
    498  *  \param dst           Destination buffer
    499  *  \param dst_channels  Number of destination channels per frame
    500  *  \param src           Source buffer
    501  *  \param src_channels  Number of source channels per frame
    502  *  \param idxary        Array of indices representing channels in the source frame
    503  *  \param sample_size   Size of each sample in bytes.  Must be 1, 2, 3, or 4.
    504  *  \param count         Number of frames to copy
    505  *
    506  * The destination and source buffers must be completely separate (non-overlapping).
    507  * If the sample size is not in range, the function will abort.
    508  */
    509 void memcpy_by_index_array(void *dst, uint32_t dst_channels,
    510         const void *src, uint32_t src_channels,
    511         const int8_t *idxary, size_t sample_size, size_t count);
    512 
    513 /**
    514  * Prepares an index array (idxary) from channel masks, which can be later
    515  * used by memcpy_by_index_array().
    516  *
    517  * \return the number of array elements required.
    518  * This may be greater than idxcount, so the return value should be checked
    519  * if idxary size is less than 32.
    520  *
    521  * Note that idxary is a caller allocated array
    522  * of at least as many channels as present in the dst_mask.
    523  * Channels present in the channel mask are represented by set bits in the
    524  * uint32_t value and are matched without further interpretation.
    525  *
    526  * This function is typically used for converting audio data with different
    527  * channel position masks.
    528  *
    529  *  \param idxary      Updated array of indices of channels in the src frame for the dst frame
    530  *  \param idxcount    Number of caller allocated elements in idxary
    531  *  \param dst_mask    Bit mask corresponding to destination channels present
    532  *  \param src_mask    Bit mask corresponding to source channels present
    533  */
    534 size_t memcpy_by_index_array_initialization(int8_t *idxary, size_t idxcount,
    535         uint32_t dst_mask, uint32_t src_mask);
    536 
    537 /**
    538  * Prepares an index array (idxary) from channel masks, which can be later
    539  * used by memcpy_by_index_array().
    540  *
    541  * \return the number of array elements required.
    542  *
    543  * For a source channel index mask, the source channels will map to the destination
    544  * channels as if counting the set bits in dst_mask in order from lsb to msb
    545  * (zero bits are ignored). The ith bit of the src_mask corresponds to the
    546  * ith SET bit of dst_mask and the ith destination channel.  Hence, a zero ith
    547  * bit of the src_mask indicates that the ith destination channel plays silence.
    548  *
    549  *  \param idxary      Updated array of indices of channels in the src frame for the dst frame
    550  *  \param idxcount    Number of caller allocated elements in idxary
    551  *  \param dst_mask    Bit mask corresponding to destination channels present
    552  *  \param src_mask    Bit mask corresponding to source channels present
    553  */
    554 size_t memcpy_by_index_array_initialization_src_index(int8_t *idxary, size_t idxcount,
    555         uint32_t dst_mask, uint32_t src_mask);
    556 
    557 /**
    558  * Prepares an index array (idxary) from channel mask bits, which can be later
    559  * used by memcpy_by_index_array().
    560  *
    561  * \return the number of array elements required.
    562  *
    563  * This initialization is for a destination channel index mask from a positional
    564  * source mask.
    565  *
    566  * For an destination channel index mask, the input channels will map
    567  * to the destination channels, with the ith SET bit in the source bits corresponding
    568  * to the ith bit in the destination bits. If there is a zero bit in the middle
    569  * of set destination bits (unlikely), the corresponding source channel will
    570  * be dropped.
    571  *
    572  *  \param idxary      Updated array of indices of channels in the src frame for the dst frame
    573  *  \param idxcount    Number of caller allocated elements in idxary
    574  *  \param dst_mask    Bit mask corresponding to destination channels present
    575  *  \param src_mask    Bit mask corresponding to source channels present
    576  */
    577 size_t memcpy_by_index_array_initialization_dst_index(int8_t *idxary, size_t idxcount,
    578         uint32_t dst_mask, uint32_t src_mask);
    579 
    580 /**
    581  * Clamp (aka hard limit or clip) a signed 32-bit sample to 16-bit range.
    582  */
    583 static inline int16_t clamp16(int32_t sample)
    584 {
    585     if ((sample>>15) ^ (sample>>31))
    586         sample = 0x7FFF ^ (sample>>31);
    587     return sample;
    588 }
    589 
    590 /**
    591  * Convert a IEEE 754 single precision float [-1.0, 1.0) to int16_t [-32768, 32767]
    592  * with clamping.  Note the open bound at 1.0, values within 1/65536 of 1.0 map
    593  * to 32767 instead of 32768 (early clamping due to the smaller positive integer subrange).
    594  *
    595  * Values outside the range [-1.0, 1.0) are properly clamped to -32768 and 32767,
    596  * including -Inf and +Inf. NaN will generally be treated either as -32768 or 32767,
    597  * depending on the sign bit inside NaN (whose representation is not unique).
    598  * Nevertheless, strictly speaking, NaN behavior should be considered undefined.
    599  *
    600  * Rounding of 0.5 lsb is to even (default for IEEE 754).
    601  */
    602 static inline int16_t clamp16_from_float(float f)
    603 {
    604     /* Offset is used to expand the valid range of [-1.0, 1.0) into the 16 lsbs of the
    605      * floating point significand. The normal shift is 3<<22, but the -15 offset
    606      * is used to multiply by 32768.
    607      */
    608     static const float offset = (float)(3 << (22 - 15));
    609     /* zero = (0x10f << 22) =  0x43c00000 (not directly used) */
    610     static const int32_t limneg = (0x10f << 22) /*zero*/ - 32768; /* 0x43bf8000 */
    611     static const int32_t limpos = (0x10f << 22) /*zero*/ + 32767; /* 0x43c07fff */
    612 
    613     union {
    614         float f;
    615         int32_t i;
    616     } u;
    617 
    618     u.f = f + offset; /* recenter valid range */
    619     /* Now the valid range is represented as integers between [limneg, limpos].
    620      * Clamp using the fact that float representation (as an integer) is an ordered set.
    621      */
    622     if (u.i < limneg)
    623         u.i = -32768;
    624     else if (u.i > limpos)
    625         u.i = 32767;
    626     return u.i; /* Return lower 16 bits, the part of interest in the significand. */
    627 }
    628 
    629 /**
    630  * Convert a IEEE 754 single precision float [-1.0, 1.0) to uint8_t [0, 0xff]
    631  * with clamping.  Note the open bound at 1.0, values within 1/128 of 1.0 map
    632  * to 255 instead of 256 (early clamping due to the smaller positive integer subrange).
    633  *
    634  * Values outside the range [-1.0, 1.0) are properly clamped to 0 and 255,
    635  * including -Inf and +Inf. NaN will generally be treated either as 0 or 255,
    636  * depending on the sign bit inside NaN (whose representation is not unique).
    637  * Nevertheless, strictly speaking, NaN behavior should be considered undefined.
    638  *
    639  * Rounding of 0.5 lsb is to even (default for IEEE 754).
    640  */
    641 static inline uint8_t clamp8_from_float(float f)
    642 {
    643     /* Offset is used to expand the valid range of [-1.0, 1.0) into the 16 lsbs of the
    644      * floating point significand. The normal shift is 3<<22, but the -7 offset
    645      * is used to multiply by 128.
    646      */
    647     static const float offset = (float)((3 << (22 - 7)) + 1 /* to cancel -1.0 */);
    648     /* zero = (0x11f << 22) =  0x47c00000 */
    649     static const int32_t limneg = (0x11f << 22) /*zero*/;
    650     static const int32_t limpos = (0x11f << 22) /*zero*/ + 255; /* 0x47c000ff */
    651 
    652     union {
    653         float f;
    654         int32_t i;
    655     } u;
    656 
    657     u.f = f + offset; /* recenter valid range */
    658     /* Now the valid range is represented as integers between [limneg, limpos].
    659      * Clamp using the fact that float representation (as an integer) is an ordered set.
    660      */
    661     if (u.i < limneg)
    662         return 0;
    663     if (u.i > limpos)
    664         return 255;
    665     return u.i; /* Return lower 8 bits, the part of interest in the significand. */
    666 }
    667 
    668 /**
    669  * Convert a single-precision floating point value to a Q0.23 integer value, stored in a
    670  * 32 bit signed integer (technically stored as Q8.23, but clamped to Q0.23).
    671  *
    672  * Rounds to nearest, ties away from 0.
    673  *
    674  * Values outside the range [-1.0, 1.0) are properly clamped to -8388608 and 8388607,
    675  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    676  * depending on hardware and future implementation of this function.
    677  */
    678 static inline int32_t clamp24_from_float(float f)
    679 {
    680     static const float scale = (float)(1 << 23);
    681     static const float limpos = 0x7fffff / scale;
    682     static const float limneg = -0x800000 / scale;
    683 
    684     if (f <= limneg) {
    685         return -0x800000;
    686     } else if (f >= limpos) {
    687         return 0x7fffff;
    688     }
    689     f *= scale;
    690     /* integer conversion is through truncation (though int to float is not).
    691      * ensure that we round to nearest, ties away from 0.
    692      */
    693     return f > 0 ? f + 0.5 : f - 0.5;
    694 }
    695 
    696 /**
    697  * Convert a signed fixed-point 32-bit Q8.23 value to a Q0.23 integer value,
    698  * stored in a 32-bit signed integer (technically stored as Q8.23, but clamped to Q0.23).
    699  *
    700  * Values outside the range [-0x800000, 0x7fffff] are clamped to that range.
    701  */
    702 static inline int32_t clamp24_from_q8_23(int32_t ival)
    703 {
    704     static const int32_t limpos = 0x7fffff;
    705     static const int32_t limneg = -0x800000;
    706     if (ival < limneg) {
    707         return limneg;
    708     } else if (ival > limpos) {
    709         return limpos;
    710     } else {
    711         return ival;
    712     }
    713 }
    714 
    715 /**
    716  * Convert a single-precision floating point value to a Q4.27 integer value.
    717  * Rounds to nearest, ties away from 0.
    718  *
    719  * Values outside the range [-16.0, 16.0) are properly clamped to -2147483648 and 2147483647,
    720  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    721  * depending on hardware and future implementation of this function.
    722  */
    723 static inline int32_t clampq4_27_from_float(float f)
    724 {
    725     static const float scale = (float)(1UL << 27);
    726     static const float limpos = 16.;
    727     static const float limneg = -16.;
    728 
    729     if (f <= limneg) {
    730         return -0x80000000; /* or 0x80000000 */
    731     } else if (f >= limpos) {
    732         return 0x7fffffff;
    733     }
    734     f *= scale;
    735     /* integer conversion is through truncation (though int to float is not).
    736      * ensure that we round to nearest, ties away from 0.
    737      */
    738     return f > 0 ? f + 0.5 : f - 0.5;
    739 }
    740 
    741 /**
    742  * Convert a single-precision floating point value to a Q0.31 integer value.
    743  * Rounds to nearest, ties away from 0.
    744  *
    745  * Values outside the range [-1.0, 1.0) are properly clamped to -2147483648 and 2147483647,
    746  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    747  * depending on hardware and future implementation of this function.
    748  */
    749 static inline int32_t clamp32_from_float(float f)
    750 {
    751     static const float scale = (float)(1UL << 31);
    752     static const float limpos = 1.;
    753     static const float limneg = -1.;
    754 
    755     if (f <= limneg) {
    756         return -0x80000000; /* or 0x80000000 */
    757     } else if (f >= limpos) {
    758         return 0x7fffffff;
    759     }
    760     f *= scale;
    761     /* integer conversion is through truncation (though int to float is not).
    762      * ensure that we round to nearest, ties away from 0.
    763      */
    764     return f > 0 ? f + 0.5 : f - 0.5;
    765 }
    766 
    767 /**
    768  * Convert a signed fixed-point 32-bit Q4.27 value to single-precision floating-point.
    769  * The nominal output float range is [-1.0, 1.0] if the fixed-point range is
    770  * [0xf8000000, 0x07ffffff].  The full float range is [-16.0, 16.0].
    771  *
    772  * Note the closed range at 1.0 and 16.0 is due to rounding on conversion to float.
    773  * In more detail: if the fixed-point integer exceeds 24 bit significand of single
    774  * precision floating point, the 0.5 lsb in the significand conversion will round
    775  * towards even, as per IEEE 754 default.
    776  */
    777 static inline float float_from_q4_27(int32_t ival)
    778 {
    779     /* The scale factor is the reciprocal of the fractional bits.
    780      *
    781      * Since the scale factor is a power of 2, the scaling is exact, and there
    782      * is no rounding due to the multiplication - the bit pattern is preserved.
    783      * However, there may be rounding due to the fixed-point to float conversion,
    784      * as described above.
    785      */
    786     static const float scale = 1. / (float)(1UL << 27);
    787 
    788     return ival * scale;
    789 }
    790 
    791 /**
    792  * Convert an unsigned fixed-point 32-bit U4.28 value to single-precision floating-point.
    793  * The nominal output float range is [0.0, 1.0] if the fixed-point range is
    794  * [0x00000000, 0x10000000].  The full float range is [0.0, 16.0].
    795  *
    796  * Note the closed range at 1.0 and 16.0 is due to rounding on conversion to float.
    797  * In more detail: if the fixed-point integer exceeds 24 bit significand of single
    798  * precision floating point, the 0.5 lsb in the significand conversion will round
    799  * towards even, as per IEEE 754 default.
    800  */
    801 static inline float float_from_u4_28(uint32_t uval)
    802 {
    803     static const float scale = 1. / (float)(1UL << 28);
    804 
    805     return uval * scale;
    806 }
    807 
    808 /**
    809  * Convert an unsigned fixed-point 16-bit U4.12 value to single-precision floating-point.
    810  * The nominal output float range is [0.0, 1.0] if the fixed-point range is
    811  * [0x0000, 0x1000].  The full float range is [0.0, 16.0).
    812  */
    813 static inline float float_from_u4_12(uint16_t uval)
    814 {
    815     static const float scale = 1. / (float)(1UL << 12);
    816 
    817     return uval * scale;
    818 }
    819 
    820 /**
    821  * Convert a single-precision floating point value to a U4.28 integer value.
    822  * Rounds to nearest, ties away from 0.
    823  *
    824  * Values outside the range [0, 16.0] are properly clamped to [0, 4294967295]
    825  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    826  * depending on hardware and future implementation of this function.
    827  */
    828 static inline uint32_t u4_28_from_float(float f)
    829 {
    830     static const float scale = (float)(1 << 28);
    831     static const float limpos = 0xffffffffUL / scale;
    832 
    833     if (f <= 0.) {
    834         return 0;
    835     } else if (f >= limpos) {
    836         return 0xffffffff;
    837     }
    838     /* integer conversion is through truncation (though int to float is not).
    839      * ensure that we round to nearest, ties away from 0.
    840      */
    841     return f * scale + 0.5;
    842 }
    843 
    844 /**
    845  * Convert a single-precision floating point value to a U4.12 integer value.
    846  * Rounds to nearest, ties away from 0.
    847  *
    848  * Values outside the range [0, 16.0) are properly clamped to [0, 65535]
    849  * including -Inf and +Inf. NaN values are considered undefined, and behavior may change
    850  * depending on hardware and future implementation of this function.
    851  */
    852 static inline uint16_t u4_12_from_float(float f)
    853 {
    854     static const float scale = (float)(1 << 12);
    855     static const float limpos = 0xffff / scale;
    856 
    857     if (f <= 0.) {
    858         return 0;
    859     } else if (f >= limpos) {
    860         return 0xffff;
    861     }
    862     /* integer conversion is through truncation (though int to float is not).
    863      * ensure that we round to nearest, ties away from 0.
    864      */
    865     return f * scale + 0.5;
    866 }
    867 
    868 /**
    869  * Convert a signed fixed-point 16-bit Q0.15 value to single-precision floating-point.
    870  * The output float range is [-1.0, 1.0) for the fixed-point range
    871  * [0x8000, 0x7fff].
    872  *
    873  * There is no rounding, the conversion and representation is exact.
    874  */
    875 static inline float float_from_i16(int16_t ival)
    876 {
    877     /* The scale factor is the reciprocal of the nominal 16 bit integer
    878      * half-sided range (32768).
    879      *
    880      * Since the scale factor is a power of 2, the scaling is exact, and there
    881      * is no rounding due to the multiplication - the bit pattern is preserved.
    882      */
    883     static const float scale = 1. / (float)(1UL << 15);
    884 
    885     return ival * scale;
    886 }
    887 
    888 /**
    889  * Convert an unsigned fixed-point 8-bit U0.8 value to single-precision floating-point.
    890  * The nominal output float range is [-1.0, 1.0) if the fixed-point range is
    891  * [0x00, 0xff].
    892  */
    893 static inline float float_from_u8(uint8_t uval)
    894 {
    895     static const float scale = 1. / (float)(1UL << 7);
    896 
    897     return ((int)uval - 128) * scale;
    898 }
    899 
    900 /**
    901  * Convert a packed 24bit Q0.23 value stored native-endian in a uint8_t ptr
    902  * to a signed fixed-point 32 bit integer Q0.31 value. The output Q0.31 range
    903  * is [0x80000000, 0x7fffff00] for the fixed-point range [0x800000, 0x7fffff].
    904  * Even though the output range is limited on the positive side, there is no
    905  * DC offset on the output, if the input has no DC offset.
    906  *
    907  * Avoid relying on the limited output range, as future implementations may go
    908  * to full range.
    909  */
    910 static inline int32_t i32_from_p24(const uint8_t *packed24)
    911 {
    912     /* convert to 32b */
    913     return (packed24[0] << 8) | (packed24[1] << 16) | (packed24[2] << 24);
    914 }
    915 
    916 /**
    917  * Convert a 32-bit Q0.31 value to single-precision floating-point.
    918  * The output float range is [-1.0, 1.0] for the fixed-point range
    919  * [0x80000000, 0x7fffffff].
    920  *
    921  * Rounding may occur in the least significant 8 bits for large fixed point
    922  * values due to storage into the 24-bit floating-point significand.
    923  * Rounding will be to nearest, ties to even.
    924  */
    925 static inline float float_from_i32(int32_t ival)
    926 {
    927     static const float scale = 1. / (float)(1UL << 31);
    928 
    929     return ival * scale;
    930 }
    931 
    932 /**
    933  * Convert a packed 24bit Q0.23 value stored native endian in a uint8_t ptr
    934  * to single-precision floating-point. The output float range is [-1.0, 1.0)
    935  * for the fixed-point range [0x800000, 0x7fffff].
    936  *
    937  * There is no rounding, the conversion and representation is exact.
    938  */
    939 static inline float float_from_p24(const uint8_t *packed24)
    940 {
    941     return float_from_i32(i32_from_p24(packed24));
    942 }
    943 
    944 /**
    945  * Convert a 24-bit Q8.23 value to single-precision floating-point.
    946  * The nominal output float range is [-1.0, 1.0) for the fixed-point
    947  * range [0xff800000, 0x007fffff].  The maximum float range is [-256.0, 256.0).
    948  *
    949  * There is no rounding in the nominal range, the conversion and representation
    950  * is exact. For values outside the nominal range, rounding is to nearest, ties to even.
    951  */
    952 static inline float float_from_q8_23(int32_t ival)
    953 {
    954     static const float scale = 1. / (float)(1UL << 23);
    955 
    956     return ival * scale;
    957 }
    958 
    959 /**
    960  * Multiply-accumulate 16-bit terms with 32-bit result: return a + in*v.
    961  */
    962 static inline
    963 int32_t mulAdd(int16_t in, int16_t v, int32_t a)
    964 {
    965 #if defined(__arm__) && !defined(__thumb__)
    966     int32_t out;
    967     asm( "smlabb %[out], %[in], %[v], %[a] \n"
    968          : [out]"=r"(out)
    969          : [in]"%r"(in), [v]"r"(v), [a]"r"(a)
    970          : );
    971     return out;
    972 #else
    973     return a + in * (int32_t)v;
    974 #endif
    975 }
    976 
    977 /**
    978  * Multiply 16-bit terms with 32-bit result: return in*v.
    979  */
    980 static inline
    981 int32_t mul(int16_t in, int16_t v)
    982 {
    983 #if defined(__arm__) && !defined(__thumb__)
    984     int32_t out;
    985     asm( "smulbb %[out], %[in], %[v] \n"
    986          : [out]"=r"(out)
    987          : [in]"%r"(in), [v]"r"(v)
    988          : );
    989     return out;
    990 #else
    991     return in * (int32_t)v;
    992 #endif
    993 }
    994 
    995 /**
    996  * Similar to mulAdd, but the 16-bit terms are extracted from a 32-bit interleaved stereo pair.
    997  */
    998 static inline
    999 int32_t mulAddRL(int left, uint32_t inRL, uint32_t vRL, int32_t a)
   1000 {
   1001 #if defined(__arm__) && !defined(__thumb__)
   1002     int32_t out;
   1003     if (left) {
   1004         asm( "smlabb %[out], %[inRL], %[vRL], %[a] \n"
   1005              : [out]"=r"(out)
   1006              : [inRL]"%r"(inRL), [vRL]"r"(vRL), [a]"r"(a)
   1007              : );
   1008     } else {
   1009         asm( "smlatt %[out], %[inRL], %[vRL], %[a] \n"
   1010              : [out]"=r"(out)
   1011              : [inRL]"%r"(inRL), [vRL]"r"(vRL), [a]"r"(a)
   1012              : );
   1013     }
   1014     return out;
   1015 #else
   1016     if (left) {
   1017         return a + (int16_t)(inRL&0xFFFF) * (int16_t)(vRL&0xFFFF);
   1018     } else {
   1019         return a + (int16_t)(inRL>>16) * (int16_t)(vRL>>16);
   1020     }
   1021 #endif
   1022 }
   1023 
   1024 /**
   1025  * Similar to mul, but the 16-bit terms are extracted from a 32-bit interleaved stereo pair.
   1026  */
   1027 static inline
   1028 int32_t mulRL(int left, uint32_t inRL, uint32_t vRL)
   1029 {
   1030 #if defined(__arm__) && !defined(__thumb__)
   1031     int32_t out;
   1032     if (left) {
   1033         asm( "smulbb %[out], %[inRL], %[vRL] \n"
   1034              : [out]"=r"(out)
   1035              : [inRL]"%r"(inRL), [vRL]"r"(vRL)
   1036              : );
   1037     } else {
   1038         asm( "smultt %[out], %[inRL], %[vRL] \n"
   1039              : [out]"=r"(out)
   1040              : [inRL]"%r"(inRL), [vRL]"r"(vRL)
   1041              : );
   1042     }
   1043     return out;
   1044 #else
   1045     if (left) {
   1046         return (int16_t)(inRL&0xFFFF) * (int16_t)(vRL&0xFFFF);
   1047     } else {
   1048         return (int16_t)(inRL>>16) * (int16_t)(vRL>>16);
   1049     }
   1050 #endif
   1051 }
   1052 
   1053 /** \cond */
   1054 __END_DECLS
   1055 /** \endcond */
   1056 
   1057 #endif  // ANDROID_AUDIO_PRIMITIVES_H
   1058