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.

115 lines
2.9KB

  1. /*
  2. * Rational numbers
  3. * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  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. */
  22. /**
  23. * @file rational.h
  24. * Rational numbers.
  25. * @author Michael Niedermayer <michaelni@gmx.at>
  26. */
  27. #ifndef RATIONAL_H
  28. #define RATIONAL_H
  29. /**
  30. * Rational number num/den.
  31. */
  32. typedef struct AVRational{
  33. int num; ///< numerator
  34. int den; ///< denominator
  35. } AVRational;
  36. /**
  37. * Compare two rationals.
  38. * @param a first rational
  39. * @param b second rational
  40. * @return 0 if a==b, 1 if a>b and -1 if a<b.
  41. */
  42. static inline int av_cmp_q(AVRational a, AVRational b){
  43. const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
  44. if(tmp) return (tmp>>63)|1;
  45. else return 0;
  46. }
  47. /**
  48. * Rational to double conversion.
  49. * @param a rational to convert
  50. * @return (double) a
  51. */
  52. static inline double av_q2d(AVRational a){
  53. return a.num / (double) a.den;
  54. }
  55. /**
  56. * Reduce a fraction.
  57. * This is useful for framerate calculations.
  58. * @param dst_nom destination numerator
  59. * @param dst_den destination denominator
  60. * @param nom source numerator
  61. * @param den source denominator
  62. * @param max the maximum allowed for dst_nom & dst_den
  63. * @return 1 if exact, 0 otherwise
  64. */
  65. int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max);
  66. /**
  67. * Multiplies two rationals.
  68. * @param b first rational.
  69. * @param c second rational.
  70. * @return b*c.
  71. */
  72. AVRational av_mul_q(AVRational b, AVRational c);
  73. /**
  74. * Divides one rational by another.
  75. * @param b first rational.
  76. * @param c second rational.
  77. * @return b/c.
  78. */
  79. AVRational av_div_q(AVRational b, AVRational c);
  80. /**
  81. * Adds two rationals.
  82. * @param b first rational.
  83. * @param c second rational.
  84. * @return b+c.
  85. */
  86. AVRational av_add_q(AVRational b, AVRational c);
  87. /**
  88. * Subtracts one rational from another.
  89. * @param b first rational.
  90. * @param c second rational.
  91. * returns b-c.
  92. */
  93. AVRational av_sub_q(AVRational b, AVRational c);
  94. /**
  95. * Converts a double precision floating point number to a rational.
  96. * @param d double to convert
  97. * @param max the maximum allowed numerator and denominator
  98. * @return (AVRational) d.
  99. */
  100. AVRational av_d2q(double d, int max);
  101. #endif // RATIONAL_H