dither.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:7k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* plugin_common - Routines common to several plugins
  2.  * Copyright (C) 2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * dithering routine derived from (other GPLed source):
  5.  * mad - MPEG audio decoder
  6.  * Copyright (C) 2000-2001 Robert Leslie
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License
  10.  * as published by the Free Software Foundation; either version 2
  11.  * of the License, or (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21.  */
  22. #include "dither.h"
  23. #include "FLAC/assert.h"
  24. #ifdef max
  25. #undef max
  26. #endif
  27. #define max(a,b) ((a)>(b)?(a):(b))
  28. #if defined _MSC_VER
  29. #define FLAC__INLINE __inline
  30. #else
  31. #define FLAC__INLINE
  32. #endif
  33. /* 32-bit pseudo-random number generator
  34.  *
  35.  * @@@ According to Miroslav, this one is poor quality, the one from the
  36.  * @@@ original replaygain code is much better
  37.  */
  38. static FLAC__INLINE FLAC__uint32 prng(FLAC__uint32 state)
  39. {
  40. return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
  41. }
  42. /* dither routine derived from MAD winamp plugin */
  43. typedef struct {
  44. FLAC__int32 error[3];
  45. FLAC__int32 random;
  46. } dither_state;
  47. static FLAC__INLINE FLAC__int32 linear_dither(unsigned source_bps, unsigned target_bps, FLAC__int32 sample, dither_state *dither, const FLAC__int32 MIN, const FLAC__int32 MAX)
  48. {
  49. unsigned scalebits;
  50. FLAC__int32 output, mask, random;
  51. FLAC__ASSERT(source_bps < 32);
  52. FLAC__ASSERT(target_bps <= 24);
  53. FLAC__ASSERT(target_bps <= source_bps);
  54. /* noise shape */
  55. sample += dither->error[0] - dither->error[1] + dither->error[2];
  56. dither->error[2] = dither->error[1];
  57. dither->error[1] = dither->error[0] / 2;
  58. /* bias */
  59. output = sample + (1L << (source_bps - target_bps - 1));
  60. scalebits = source_bps - target_bps;
  61. mask = (1L << scalebits) - 1;
  62. /* dither */
  63. random = (FLAC__int32)prng(dither->random);
  64. output += (random & mask) - (dither->random & mask);
  65. dither->random = random;
  66. /* clip */
  67. if(output > MAX) {
  68. output = MAX;
  69. if(sample > MAX)
  70. sample = MAX;
  71. }
  72. else if(output < MIN) {
  73. output = MIN;
  74. if(sample < MIN)
  75. sample = MIN;
  76. }
  77. /* quantize */
  78. output &= ~mask;
  79. /* error feedback */
  80. dither->error[0] = sample - output;
  81. /* scale */
  82. return output >> scalebits;
  83. }
  84. size_t FLAC__plugin_common__pack_pcm_signed_big_endian(FLAC__byte *data, const FLAC__int32 * const input[], unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps)
  85. {
  86. static dither_state dither[FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS];
  87. FLAC__byte * const start = data;
  88. FLAC__int32 sample;
  89. const FLAC__int32 *input_;
  90. unsigned samples, channel;
  91. const unsigned bytes_per_sample = target_bps / 8;
  92. const unsigned incr = bytes_per_sample * channels;
  93. FLAC__ASSERT(channels > 0 && channels <= FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS);
  94. FLAC__ASSERT(source_bps < 32);
  95. FLAC__ASSERT(target_bps <= 24);
  96. FLAC__ASSERT(target_bps <= source_bps);
  97. FLAC__ASSERT((source_bps & 7) == 0);
  98. FLAC__ASSERT((target_bps & 7) == 0);
  99. if(source_bps != target_bps) {
  100. const FLAC__int32 MIN = -(1L << (source_bps - 1));
  101. const FLAC__int32 MAX = ~MIN; /*(1L << (source_bps-1)) - 1 */
  102. for(channel = 0; channel < channels; channel++) {
  103. samples = wide_samples;
  104. data = start + bytes_per_sample * channel;
  105. input_ = input[channel];
  106. while(samples--) {
  107. sample = linear_dither(source_bps, target_bps, *input_++, &dither[channel], MIN, MAX);
  108. switch(target_bps) {
  109. case 8:
  110. data[0] = sample ^ 0x80;
  111. break;
  112. case 16:
  113. data[0] = (FLAC__byte)(sample >> 8);
  114. data[1] = (FLAC__byte)sample;
  115. break;
  116. case 24:
  117. data[0] = (FLAC__byte)(sample >> 16);
  118. data[1] = (FLAC__byte)(sample >> 8);
  119. data[2] = (FLAC__byte)sample;
  120. break;
  121. }
  122. data += incr;
  123. }
  124. }
  125. }
  126. else {
  127. for(channel = 0; channel < channels; channel++) {
  128. samples = wide_samples;
  129. data = start + bytes_per_sample * channel;
  130. input_ = input[channel];
  131. while(samples--) {
  132. sample = *input_++;
  133. switch(target_bps) {
  134. case 8:
  135. data[0] = sample ^ 0x80;
  136. break;
  137. case 16:
  138. data[0] = (FLAC__byte)(sample >> 8);
  139. data[1] = (FLAC__byte)sample;
  140. break;
  141. case 24:
  142. data[0] = (FLAC__byte)(sample >> 16);
  143. data[1] = (FLAC__byte)(sample >> 8);
  144. data[2] = (FLAC__byte)sample;
  145. break;
  146. }
  147. data += incr;
  148. }
  149. }
  150. }
  151. return wide_samples * channels * (target_bps/8);
  152. }
  153. size_t FLAC__plugin_common__pack_pcm_signed_little_endian(FLAC__byte *data, const FLAC__int32 * const input[], unsigned wide_samples, unsigned channels, unsigned source_bps, unsigned target_bps)
  154. {
  155. static dither_state dither[FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS];
  156. FLAC__byte * const start = data;
  157. FLAC__int32 sample;
  158. const FLAC__int32 *input_;
  159. unsigned samples, channel;
  160. const unsigned bytes_per_sample = target_bps / 8;
  161. const unsigned incr = bytes_per_sample * channels;
  162. FLAC__ASSERT(channels > 0 && channels <= FLAC_PLUGIN__MAX_SUPPORTED_CHANNELS);
  163. FLAC__ASSERT(source_bps < 32);
  164. FLAC__ASSERT(target_bps <= 24);
  165. FLAC__ASSERT(target_bps <= source_bps);
  166. FLAC__ASSERT((source_bps & 7) == 0);
  167. FLAC__ASSERT((target_bps & 7) == 0);
  168. if(source_bps != target_bps) {
  169. const FLAC__int32 MIN = -(1L << (source_bps - 1));
  170. const FLAC__int32 MAX = ~MIN; /*(1L << (source_bps-1)) - 1 */
  171. for(channel = 0; channel < channels; channel++) {
  172. samples = wide_samples;
  173. data = start + bytes_per_sample * channel;
  174. input_ = input[channel];
  175. while(samples--) {
  176. sample = linear_dither(source_bps, target_bps, *input_++, &dither[channel], MIN, MAX);
  177. switch(target_bps) {
  178. case 8:
  179. data[0] = sample ^ 0x80;
  180. break;
  181. case 24:
  182. data[2] = (FLAC__byte)(sample >> 16);
  183. /* fall through */
  184. case 16:
  185. data[1] = (FLAC__byte)(sample >> 8);
  186. data[0] = (FLAC__byte)sample;
  187. }
  188. data += incr;
  189. }
  190. }
  191. }
  192. else {
  193. for(channel = 0; channel < channels; channel++) {
  194. samples = wide_samples;
  195. data = start + bytes_per_sample * channel;
  196. input_ = input[channel];
  197. while(samples--) {
  198. sample = *input_++;
  199. switch(target_bps) {
  200. case 8:
  201. data[0] = sample ^ 0x80;
  202. break;
  203. case 24:
  204. data[2] = (FLAC__byte)(sample >> 16);
  205. /* fall through */
  206. case 16:
  207. data[1] = (FLAC__byte)(sample >> 8);
  208. data[0] = (FLAC__byte)sample;
  209. }
  210. data += incr;
  211. }
  212. }
  213. }
  214. return wide_samples * channels * (target_bps/8);
  215. }