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.

111 lines
2.8KB

  1. /* libFLAC - Free Lossless Audio Codec library
  2. * Copyright (C) 2001-2009 Josh Coalson
  3. * Copyright (C) 2011-2013 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. #if HAVE_CONFIG_H
  33. # include <config.h>
  34. #endif
  35. #include "include/private/bitmath.h"
  36. #include "../assert.h"
  37. /* An example of what FLAC__bitmath_silog2() computes:
  38. *
  39. * silog2(-10) = 5
  40. * silog2(- 9) = 5
  41. * silog2(- 8) = 4
  42. * silog2(- 7) = 4
  43. * silog2(- 6) = 4
  44. * silog2(- 5) = 4
  45. * silog2(- 4) = 3
  46. * silog2(- 3) = 3
  47. * silog2(- 2) = 2
  48. * silog2(- 1) = 2
  49. * silog2( 0) = 0
  50. * silog2( 1) = 2
  51. * silog2( 2) = 3
  52. * silog2( 3) = 3
  53. * silog2( 4) = 4
  54. * silog2( 5) = 4
  55. * silog2( 6) = 4
  56. * silog2( 7) = 4
  57. * silog2( 8) = 5
  58. * silog2( 9) = 5
  59. * silog2( 10) = 5
  60. */
  61. unsigned FLAC__bitmath_silog2(int v)
  62. {
  63. while(1) {
  64. if(v == 0) {
  65. return 0;
  66. }
  67. else if(v > 0) {
  68. unsigned l = 0;
  69. while(v) {
  70. l++;
  71. v >>= 1;
  72. }
  73. return l+1;
  74. }
  75. else if(v == -1) {
  76. return 2;
  77. }
  78. else {
  79. v++;
  80. v = -v;
  81. }
  82. }
  83. }
  84. unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v)
  85. {
  86. while(1) {
  87. if(v == 0) {
  88. return 0;
  89. }
  90. else if(v > 0) {
  91. unsigned l = 0;
  92. while(v) {
  93. l++;
  94. v >>= 1;
  95. }
  96. return l+1;
  97. }
  98. else if(v == -1) {
  99. return 2;
  100. }
  101. else {
  102. v++;
  103. v = -v;
  104. }
  105. }
  106. }