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.

230 lines
8.2KB

  1. /*
  2. * Copyright (c) 2011 Jan Kokemüller
  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. * This file is based on libebur128 which is available at
  21. * https://github.com/jiixyj/libebur128/
  22. *
  23. */
  24. #ifndef AVFILTER_EBUR128_H
  25. #define AVFILTER_EBUR128_H
  26. /** \file ebur128.h
  27. * \brief libebur128 - a library for loudness measurement according to
  28. * the EBU R128 standard.
  29. */
  30. #include <stddef.h> /* for size_t */
  31. /** \enum channel
  32. * Use these values when setting the channel map with ebur128_set_channel().
  33. * See definitions in ITU R-REC-BS 1770-4
  34. */
  35. enum channel {
  36. FF_EBUR128_UNUSED = 0, /**< unused channel (for example LFE channel) */
  37. FF_EBUR128_LEFT,
  38. FF_EBUR128_Mp030 = 1, /**< itu M+030 */
  39. FF_EBUR128_RIGHT,
  40. FF_EBUR128_Mm030 = 2, /**< itu M-030 */
  41. FF_EBUR128_CENTER,
  42. FF_EBUR128_Mp000 = 3, /**< itu M+000 */
  43. FF_EBUR128_LEFT_SURROUND,
  44. FF_EBUR128_Mp110 = 4, /**< itu M+110 */
  45. FF_EBUR128_RIGHT_SURROUND,
  46. FF_EBUR128_Mm110 = 5, /**< itu M-110 */
  47. FF_EBUR128_DUAL_MONO, /**< a channel that is counted twice */
  48. FF_EBUR128_MpSC, /**< itu M+SC */
  49. FF_EBUR128_MmSC, /**< itu M-SC */
  50. FF_EBUR128_Mp060, /**< itu M+060 */
  51. FF_EBUR128_Mm060, /**< itu M-060 */
  52. FF_EBUR128_Mp090, /**< itu M+090 */
  53. FF_EBUR128_Mm090, /**< itu M-090 */
  54. FF_EBUR128_Mp135, /**< itu M+135 */
  55. FF_EBUR128_Mm135, /**< itu M-135 */
  56. FF_EBUR128_Mp180, /**< itu M+180 */
  57. FF_EBUR128_Up000, /**< itu U+000 */
  58. FF_EBUR128_Up030, /**< itu U+030 */
  59. FF_EBUR128_Um030, /**< itu U-030 */
  60. FF_EBUR128_Up045, /**< itu U+045 */
  61. FF_EBUR128_Um045, /**< itu U-030 */
  62. FF_EBUR128_Up090, /**< itu U+090 */
  63. FF_EBUR128_Um090, /**< itu U-090 */
  64. FF_EBUR128_Up110, /**< itu U+110 */
  65. FF_EBUR128_Um110, /**< itu U-110 */
  66. FF_EBUR128_Up135, /**< itu U+135 */
  67. FF_EBUR128_Um135, /**< itu U-135 */
  68. FF_EBUR128_Up180, /**< itu U+180 */
  69. FF_EBUR128_Tp000, /**< itu T+000 */
  70. FF_EBUR128_Bp000, /**< itu B+000 */
  71. FF_EBUR128_Bp045, /**< itu B+045 */
  72. FF_EBUR128_Bm045 /**< itu B-045 */
  73. };
  74. /** \enum mode
  75. * Use these values in ebur128_init (or'ed). Try to use the lowest possible
  76. * modes that suit your needs, as performance will be better.
  77. */
  78. enum mode {
  79. /** can resurrrect and call ff_ebur128_loudness_momentary */
  80. FF_EBUR128_MODE_M = (1 << 0),
  81. /** can call ff_ebur128_loudness_shortterm */
  82. FF_EBUR128_MODE_S = (1 << 1) | FF_EBUR128_MODE_M,
  83. /** can call ff_ebur128_loudness_global_* and ff_ebur128_relative_threshold */
  84. FF_EBUR128_MODE_I = (1 << 2) | FF_EBUR128_MODE_M,
  85. /** can call ff_ebur128_loudness_range */
  86. FF_EBUR128_MODE_LRA = (1 << 3) | FF_EBUR128_MODE_S,
  87. /** can call ff_ebur128_sample_peak */
  88. FF_EBUR128_MODE_SAMPLE_PEAK = (1 << 4) | FF_EBUR128_MODE_M,
  89. };
  90. /** forward declaration of FFEBUR128StateInternal */
  91. struct FFEBUR128StateInternal;
  92. /** \brief Contains information about the state of a loudness measurement.
  93. *
  94. * You should not need to modify this struct directly.
  95. */
  96. typedef struct FFEBUR128State {
  97. int mode; /**< The current mode. */
  98. unsigned int channels; /**< The number of channels. */
  99. unsigned long samplerate; /**< The sample rate. */
  100. struct FFEBUR128StateInternal *d; /**< Internal state. */
  101. } FFEBUR128State;
  102. /** \brief Initialize library state.
  103. *
  104. * @param channels the number of channels.
  105. * @param samplerate the sample rate.
  106. * @param window set the maximum window size in ms, set to 0 for auto.
  107. * @param mode see the mode enum for possible values.
  108. * @return an initialized library state.
  109. */
  110. FFEBUR128State *ff_ebur128_init(unsigned int channels,
  111. unsigned long samplerate,
  112. unsigned long window, int mode);
  113. /** \brief Destroy library state.
  114. *
  115. * @param st pointer to a library state.
  116. */
  117. void ff_ebur128_destroy(FFEBUR128State ** st);
  118. /** \brief Set channel type.
  119. *
  120. * The default is:
  121. * - 0 -> FF_EBUR128_LEFT
  122. * - 1 -> FF_EBUR128_RIGHT
  123. * - 2 -> FF_EBUR128_CENTER
  124. * - 3 -> FF_EBUR128_UNUSED
  125. * - 4 -> FF_EBUR128_LEFT_SURROUND
  126. * - 5 -> FF_EBUR128_RIGHT_SURROUND
  127. *
  128. * @param st library state.
  129. * @param channel_number zero based channel index.
  130. * @param value channel type from the "channel" enum.
  131. * @return
  132. * - 0 on success.
  133. * - AVERROR(EINVAL) if invalid channel index.
  134. */
  135. int ff_ebur128_set_channel(FFEBUR128State * st,
  136. unsigned int channel_number, int value);
  137. /** \brief Add frames to be processed.
  138. *
  139. * @param st library state.
  140. * @param src array of source frames. Channels must be interleaved.
  141. * @param frames number of frames. Not number of samples!
  142. */
  143. void ff_ebur128_add_frames_double(FFEBUR128State * st,
  144. const double *src, size_t frames);
  145. /** \brief Get global integrated loudness in LUFS.
  146. *
  147. * @param st library state.
  148. * @param out integrated loudness in LUFS. -HUGE_VAL if result is negative
  149. * infinity.
  150. * @return
  151. * - 0 on success.
  152. * - AVERROR(EINVAL) if mode "FF_EBUR128_MODE_I" has not been set.
  153. */
  154. int ff_ebur128_loudness_global(FFEBUR128State * st, double *out);
  155. /** \brief Get short-term loudness (last 3s) in LUFS.
  156. *
  157. * @param st library state.
  158. * @param out short-term loudness in LUFS. -HUGE_VAL if result is negative
  159. * infinity.
  160. * @return
  161. * - 0 on success.
  162. * - AVERROR(EINVAL) if mode "FF_EBUR128_MODE_S" has not been set.
  163. */
  164. int ff_ebur128_loudness_shortterm(FFEBUR128State * st, double *out);
  165. /** \brief Get loudness range (LRA) of programme in LU.
  166. *
  167. * Calculates loudness range according to EBU 3342.
  168. *
  169. * @param st library state.
  170. * @param out loudness range (LRA) in LU. Will not be changed in case of
  171. * error. AVERROR(EINVAL) will be returned in this case.
  172. * @return
  173. * - 0 on success.
  174. * - AVERROR(EINVAL) if mode "FF_EBUR128_MODE_LRA" has not been set.
  175. */
  176. int ff_ebur128_loudness_range(FFEBUR128State * st, double *out);
  177. /** \brief Get loudness range (LRA) in LU across multiple instances.
  178. *
  179. * Calculates loudness range according to EBU 3342.
  180. *
  181. * @param sts array of library states.
  182. * @param size length of sts
  183. * @param out loudness range (LRA) in LU. Will not be changed in case of
  184. * error. AVERROR(EINVAL) will be returned in this case.
  185. * @return
  186. * - 0 on success.
  187. * - AVERROR(EINVAL) if mode "FF_EBUR128_MODE_LRA" has not been set.
  188. */
  189. int ff_ebur128_loudness_range_multiple(FFEBUR128State ** sts,
  190. size_t size, double *out);
  191. /** \brief Get maximum sample peak of selected channel in float format.
  192. *
  193. * @param st library state
  194. * @param channel_number channel to analyse
  195. * @param out maximum sample peak in float format (1.0 is 0 dBFS)
  196. * @return
  197. * - 0 on success.
  198. * - AVERROR(EINVAL) if mode "FF_EBUR128_MODE_SAMPLE_PEAK" has not been set.
  199. * - AVERROR(EINVAL) if invalid channel index.
  200. */
  201. int ff_ebur128_sample_peak(FFEBUR128State * st,
  202. unsigned int channel_number, double *out);
  203. /** \brief Get relative threshold in LUFS.
  204. *
  205. * @param st library state
  206. * @param out relative threshold in LUFS.
  207. * @return
  208. * - 0 on success.
  209. * - AVERROR(EINVAL) if mode "FF_EBUR128_MODE_I" has not been set.
  210. */
  211. int ff_ebur128_relative_threshold(FFEBUR128State * st, double *out);
  212. #endif /* AVFILTER_EBUR128_H */