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.

72 lines
2.0KB

  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. * returns 0 if a==b, 1 if a>b and -1 if a<b.
  38. */
  39. static inline int av_cmp_q(AVRational a, AVRational b){
  40. const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
  41. if(tmp) return (tmp>>63)|1;
  42. else return 0;
  43. }
  44. /**
  45. * converts the given AVRational to a double.
  46. */
  47. static inline double av_q2d(AVRational a){
  48. return a.num / (double) a.den;
  49. }
  50. /**
  51. * reduce a fraction.
  52. * this is usefull for framerate calculations
  53. * @param max the maximum allowed for dst_nom & dst_den
  54. * @return 1 if exact, 0 otherwise
  55. */
  56. int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max);
  57. AVRational av_mul_q(AVRational b, AVRational c);
  58. AVRational av_div_q(AVRational b, AVRational c);
  59. AVRational av_add_q(AVRational b, AVRational c);
  60. AVRational av_sub_q(AVRational b, AVRational c);
  61. AVRational av_d2q(double d, int max);
  62. #endif // RATIONAL_H