## ffmpeg / libavutil / rational.h @ 5d6e4c16

History | View | Annotate | Download (3.62 KB)

1 | 5ff85f1d | Michael Niedermayer | ```
/*
``` |
---|---|---|---|

2 | 89c9ff50 | Diego Biurrun | ```
* rational numbers
``` |

3 | 5ff85f1d | Michael Niedermayer | ```
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
``` |

4 | ```
*
``` |
||

5 | b78e7197 | Diego Biurrun | ```
* This file is part of FFmpeg.
``` |

6 | ```
*
``` |
||

7 | ```
* FFmpeg is free software; you can redistribute it and/or
``` |
||

8 | 5ff85f1d | Michael Niedermayer | ```
* modify it under the terms of the GNU Lesser General Public
``` |

9 | ```
* License as published by the Free Software Foundation; either
``` |
||

10 | b78e7197 | Diego Biurrun | ```
* version 2.1 of the License, or (at your option) any later version.
``` |

11 | 5ff85f1d | Michael Niedermayer | ```
*
``` |

12 | b78e7197 | Diego Biurrun | ```
* FFmpeg is distributed in the hope that it will be useful,
``` |

13 | 5ff85f1d | Michael Niedermayer | ```
* 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 | b78e7197 | Diego Biurrun | ```
* License along with FFmpeg; if not, write to the Free Software
``` |

19 | 5509bffa | Diego Biurrun | ```
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
``` |

20 | 5ff85f1d | Michael Niedermayer | ```
*/
``` |

21 | 115329f1 | Diego Biurrun | |

22 | 5ff85f1d | Michael Niedermayer | ```
/**
``` |

23 | ba87f080 | Diego Biurrun | ```
* @file
``` |

24 | 89c9ff50 | Diego Biurrun | ```
* rational numbers
``` |

25 | 5ff85f1d | Michael Niedermayer | ```
* @author Michael Niedermayer <michaelni@gmx.at>
``` |

26 | ```
*/
``` |
||

27 | |||

28 | 98790382 | Stefano Sabatini | ```
#ifndef AVUTIL_RATIONAL_H
``` |

29 | ```
#define AVUTIL_RATIONAL_H
``` |
||

30 | 5ff85f1d | Michael Niedermayer | |

31 | 99545457 | Måns Rullgård | #include <stdint.h> |

32 | dec11269 | Michael Niedermayer | #include <limits.h> |

33 | 2ed6f399 | Måns Rullgård | #include "attributes.h" |

34 | 99545457 | Måns Rullgård | |

35 | 5c07b9e9 | Michael Niedermayer | ```
/**
``` |

36 | 89c9ff50 | Diego Biurrun | ```
* rational number numerator/denominator
``` |

37 | 5c07b9e9 | Michael Niedermayer | ```
*/
``` |

38 | 5ff85f1d | Michael Niedermayer | typedef struct AVRational{ |

39 | 5c07b9e9 | Michael Niedermayer | int num; ///< numerator |

40 | int den; ///< denominator |
||

41 | 5ff85f1d | Michael Niedermayer | } AVRational; |

42 | |||

43 | 5c07b9e9 | Michael Niedermayer | ```
/**
``` |

44 | 49bd8e4b | Måns Rullgård | ```
* Compare two rationals.
``` |

45 | 1c95ef8b | Dujardin Bernard | ```
* @param a first rational
``` |

46 | ```
* @param b second rational
``` |
||

47 | 3a1429ec | Stefano Sabatini | ```
* @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
``` |

48 | ```
* values is of the form 0/0
``` |
||

49 | 5c07b9e9 | Michael Niedermayer | ```
*/
``` |

50 | 5ff85f1d | Michael Niedermayer | static inline int av_cmp_q(AVRational a, AVRational b){ |

51 | ```
const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
``` |
||

52 | |||

53 | 8a47d90b | Michael Niedermayer | if(tmp) return ((tmp ^ a.den ^ b.den)>>63)|1; |

54 | dec11269 | Michael Niedermayer | else if(b.den && a.den) return 0; |

55 | else if(a.num && b.num) return (a.num>>31) - (b.num>>31); |
||

56 | else return INT_MIN; |
||

57 | 5ff85f1d | Michael Niedermayer | } |

58 | |||

59 | 5c07b9e9 | Michael Niedermayer | ```
/**
``` |

60 | 49bd8e4b | Måns Rullgård | ```
* Convert rational to double.
``` |

61 | 1c95ef8b | Dujardin Bernard | ```
* @param a rational to convert
``` |

62 | ```
* @return (double) a
``` |
||

63 | 5c07b9e9 | Michael Niedermayer | ```
*/
``` |

64 | 5ff85f1d | Michael Niedermayer | static inline double av_q2d(AVRational a){ |

65 | return a.num / (double) a.den; |
||

66 | } |
||

67 | |||

68 | c11c2bc2 | Alexander Strasser | ```
/**
``` |

69 | 49bd8e4b | Måns Rullgård | ```
* Reduce a fraction.
``` |

70 | 804de96a | Diego Biurrun | ```
* This is useful for framerate calculations.
``` |

71 | 674bd4f6 | Diego Biurrun | ```
* @param dst_num destination numerator
``` |

72 | 1c95ef8b | Dujardin Bernard | ```
* @param dst_den destination denominator
``` |

73 | 674bd4f6 | Diego Biurrun | ```
* @param num source numerator
``` |

74 | 1c95ef8b | Dujardin Bernard | ```
* @param den source denominator
``` |

75 | 674bd4f6 | Diego Biurrun | ```
* @param max the maximum allowed for dst_num & dst_den
``` |

76 | c11c2bc2 | Alexander Strasser | ```
* @return 1 if exact, 0 otherwise
``` |

77 | ```
*/
``` |
||

78 | 674bd4f6 | Diego Biurrun | int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); |

79 | c11c2bc2 | Alexander Strasser | |

80 | 0b006599 | Dujardin Bernard | ```
/**
``` |

81 | 49bd8e4b | Måns Rullgård | ```
* Multiply two rationals.
``` |

82 | 89c9ff50 | Diego Biurrun | ```
* @param b first rational
``` |

83 | ```
* @param c second rational
``` |
||

84 | ```
* @return b*c
``` |
||

85 | 0b006599 | Dujardin Bernard | ```
*/
``` |

86 | 85074d3c | Zuxy Meng | AVRational av_mul_q(AVRational b, AVRational c) av_const; |

87 | 0b006599 | Dujardin Bernard | |

88 | ```
/**
``` |
||

89 | 49bd8e4b | Måns Rullgård | ```
* Divide one rational by another.
``` |

90 | 89c9ff50 | Diego Biurrun | ```
* @param b first rational
``` |

91 | ```
* @param c second rational
``` |
||

92 | ```
* @return b/c
``` |
||

93 | 0b006599 | Dujardin Bernard | ```
*/
``` |

94 | 85074d3c | Zuxy Meng | AVRational av_div_q(AVRational b, AVRational c) av_const; |

95 | 0b006599 | Dujardin Bernard | |

96 | ```
/**
``` |
||

97 | 49bd8e4b | Måns Rullgård | ```
* Add two rationals.
``` |

98 | 89c9ff50 | Diego Biurrun | ```
* @param b first rational
``` |

99 | ```
* @param c second rational
``` |
||

100 | ```
* @return b+c
``` |
||

101 | 0b006599 | Dujardin Bernard | ```
*/
``` |

102 | 85074d3c | Zuxy Meng | AVRational av_add_q(AVRational b, AVRational c) av_const; |

103 | 0b006599 | Dujardin Bernard | |

104 | ```
/**
``` |
||

105 | 49bd8e4b | Måns Rullgård | ```
* Subtract one rational from another.
``` |

106 | 89c9ff50 | Diego Biurrun | ```
* @param b first rational
``` |

107 | ```
* @param c second rational
``` |
||

108 | ```
* @return b-c
``` |
||

109 | 0b006599 | Dujardin Bernard | ```
*/
``` |

110 | 85074d3c | Zuxy Meng | AVRational av_sub_q(AVRational b, AVRational c) av_const; |

111 | 0b006599 | Dujardin Bernard | |

112 | ```
/**
``` |
||

113 | 49bd8e4b | Måns Rullgård | ```
* Convert a double precision floating point number to a rational.
``` |

114 | 6b4ed22f | Stefano Sabatini | ```
* inf is expressed as {1,0} or {-1,0} depending on the sign.
``` |

115 | ```
*
``` |
||

116 | 0b006599 | Dujardin Bernard | ```
* @param d double to convert
``` |

117 | ```
* @param max the maximum allowed numerator and denominator
``` |
||

118 | 89c9ff50 | Diego Biurrun | ```
* @return (AVRational) d
``` |

119 | 0b006599 | Dujardin Bernard | ```
*/
``` |

120 | 85074d3c | Zuxy Meng | AVRational av_d2q(double d, int max) av_const; |

121 | 5ff85f1d | Michael Niedermayer | |

122 | 05b90fc0 | Stefano Sabatini | ```
/**
``` |

123 | bf7e799c | Stefano Sabatini | ```
* @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer
``` |

124 | ```
* than q1, 0 if they have the same distance.
``` |
||

125 | 05b90fc0 | Stefano Sabatini | ```
*/
``` |

126 | ```
int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
``` |
||

127 | |||

128 | ```
/**
``` |
||

129 | 49bd8e4b | Måns Rullgård | ```
* Find the nearest value in q_list to q.
``` |

130 | 05b90fc0 | Stefano Sabatini | ```
* @param q_list an array of rationals terminated by {0, 0}
``` |

131 | ```
* @return the index of the nearest value found in the array
``` |
||

132 | ```
*/
``` |
||

133 | int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); |
||

134 | |||

135 | 98790382 | Stefano Sabatini | #endif /* AVUTIL_RATIONAL_H */ |