The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.8KB

  1. /* libFLAC - Free Lossless Audio Codec library
  2. * Copyright (C) 2001-2009 Josh Coalson
  3. * Copyright (C) 2011-2014 Xiph.Org Foundation
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. *
  9. * - Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. *
  12. * - Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. *
  16. * - Neither the name of the Xiph.org Foundation nor the names of its
  17. * contributors may be used to endorse or promote products derived from
  18. * this software without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
  24. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. #ifdef HAVE_CONFIG_H
  33. # include <config.h>
  34. #endif
  35. #include "include/private/bitmath.h"
  36. /* An example of what FLAC__bitmath_silog2() computes:
  37. *
  38. * silog2(-10) = 5
  39. * silog2(- 9) = 5
  40. * silog2(- 8) = 4
  41. * silog2(- 7) = 4
  42. * silog2(- 6) = 4
  43. * silog2(- 5) = 4
  44. * silog2(- 4) = 3
  45. * silog2(- 3) = 3
  46. * silog2(- 2) = 2
  47. * silog2(- 1) = 2
  48. * silog2( 0) = 0
  49. * silog2( 1) = 2
  50. * silog2( 2) = 3
  51. * silog2( 3) = 3
  52. * silog2( 4) = 4
  53. * silog2( 5) = 4
  54. * silog2( 6) = 4
  55. * silog2( 7) = 4
  56. * silog2( 8) = 5
  57. * silog2( 9) = 5
  58. * silog2( 10) = 5
  59. */
  60. unsigned FLAC__bitmath_silog2(int v)
  61. {
  62. while(1) {
  63. if(v == 0) {
  64. return 0;
  65. }
  66. else if(v > 0) {
  67. unsigned l = 0;
  68. while(v) {
  69. l++;
  70. v >>= 1;
  71. }
  72. return l+1;
  73. }
  74. else if(v == -1) {
  75. return 2;
  76. }
  77. else {
  78. v++;
  79. v = -v;
  80. }
  81. }
  82. }
  83. unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v)
  84. {
  85. while(1) {
  86. if(v == 0) {
  87. return 0;
  88. }
  89. else if(v > 0) {
  90. unsigned l = 0;
  91. while(v) {
  92. l++;
  93. v >>= 1;
  94. }
  95. return l+1;
  96. }
  97. else if(v == -1) {
  98. return 2;
  99. }
  100. else {
  101. v++;
  102. v = -v;
  103. }
  104. }
  105. }