Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21. #ifndef AVRESAMPLE_DITHER_H
  22. #define AVRESAMPLE_DITHER_H
  23.  
  24. #include "avresample.h"
  25. #include "audio_data.h"
  26.  
  27. typedef struct DitherContext DitherContext;
  28.  
  29. typedef struct DitherDSPContext {
  30.     /**
  31.      * Convert samples from flt to s16 with added dither noise.
  32.      *
  33.      * @param dst    destination float array, range -0.5 to 0.5
  34.      * @param src    source int array, range INT_MIN to INT_MAX.
  35.      * @param dither float dither noise array
  36.      * @param len    number of samples
  37.      */
  38.     void (*quantize)(int16_t *dst, const float *src, float *dither, int len);
  39.  
  40.     int ptr_align;      ///< src and dst constraits for quantize()
  41.     int samples_align;  ///< len constraits for quantize()
  42.  
  43.     /**
  44.      * Convert dither noise from int to float with triangular distribution.
  45.      *
  46.      * @param dst  destination float array, range -0.5 to 0.5
  47.      *             constraints: 32-byte aligned
  48.      * @param src0 source int array, range INT_MIN to INT_MAX.
  49.      *             the array size is len * 2
  50.      *             constraints: 32-byte aligned
  51.      * @param len  number of output noise samples
  52.      *             constraints: multiple of 16
  53.      */
  54.     void (*dither_int_to_float)(float *dst, int *src0, int len);
  55. } DitherDSPContext;
  56.  
  57. /**
  58.  * Allocate and initialize a DitherContext.
  59.  *
  60.  * The parameters in the AVAudioResampleContext are used to initialize the
  61.  * DitherContext.
  62.  *
  63.  * @param avr  AVAudioResampleContext
  64.  * @return     newly-allocated DitherContext
  65.  */
  66. DitherContext *ff_dither_alloc(AVAudioResampleContext *avr,
  67.                                enum AVSampleFormat out_fmt,
  68.                                enum AVSampleFormat in_fmt,
  69.                                int channels, int sample_rate, int apply_map);
  70.  
  71. /**
  72.  * Free a DitherContext.
  73.  *
  74.  * @param c  DitherContext
  75.  */
  76. void ff_dither_free(DitherContext **c);
  77.  
  78. /**
  79.  * Convert audio sample format with dithering.
  80.  *
  81.  * @param c    DitherContext
  82.  * @param dst  destination audio data
  83.  * @param src  source audio data
  84.  * @return     0 if ok, negative AVERROR code on failure
  85.  */
  86. int ff_convert_dither(DitherContext *c, AudioData *dst, AudioData *src);
  87.  
  88. /* arch-specific initialization functions */
  89.  
  90. void ff_dither_init_x86(DitherDSPContext *ddsp,
  91.                         enum AVResampleDitherMethod method);
  92.  
  93. #endif /* AVRESAMPLE_DITHER_H */
  94.