alacdsp.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * ALAC (Apple Lossless Audio Codec) decoder
  3. * Copyright (c) 2005 David Hammerton
  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. #include "libavutil/attributes.h"
  22. #include "alacdsp.h"
  23. #include "config.h"
  24. static void decorrelate_stereo(int32_t *buffer[2], int nb_samples,
  25. int decorr_shift, int decorr_left_weight)
  26. {
  27. int i;
  28. for (i = 0; i < nb_samples; i++) {
  29. int32_t a, b;
  30. a = buffer[0][i];
  31. b = buffer[1][i];
  32. a -= (int)(b * (unsigned)decorr_left_weight) >> decorr_shift;
  33. b += a;
  34. buffer[0][i] = b;
  35. buffer[1][i] = a;
  36. }
  37. }
  38. static void append_extra_bits(int32_t *buffer[2], int32_t *extra_bits_buffer[2],
  39. int extra_bits, int channels, int nb_samples)
  40. {
  41. int i, ch;
  42. for (ch = 0; ch < channels; ch++)
  43. for (i = 0; i < nb_samples; i++)
  44. buffer[ch][i] = ((unsigned)buffer[ch][i] << extra_bits) | extra_bits_buffer[ch][i];
  45. }
  46. av_cold void ff_alacdsp_init(ALACDSPContext *c)
  47. {
  48. c->decorrelate_stereo = decorrelate_stereo;
  49. c->append_extra_bits[0] =
  50. c->append_extra_bits[1] = append_extra_bits;
  51. #if ARCH_X86
  52. ff_alacdsp_init_x86(c);
  53. #endif
  54. }