FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavutil
rational.h
Go to the documentation of this file.
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
24
* rational numbers
25
* @author Michael Niedermayer <michaelni@gmx.at>
26
*/
27
28
#ifndef AVUTIL_RATIONAL_H
29
#define AVUTIL_RATIONAL_H
30
31
#include <stdint.h>
32
#include <
limits.h
>
33
#include "
attributes.h
"
34
35
/**
36
* @addtogroup lavu_math
37
* @{
38
*/
39
40
/**
41
* rational number numerator/denominator
42
*/
43
typedef
struct
AVRational
{
44
int
num
;
///< numerator
45
int
den
;
///< denominator
46
}
AVRational
;
47
48
/**
49
* Create a rational.
50
* Useful for compilers that do not support compound literals.
51
* @note The return value is not reduced.
52
*/
53
static
inline
AVRational
av_make_q
(
int
num,
int
den)
54
{
55
AVRational
r
= { num, den };
56
return
r
;
57
}
58
59
/**
60
* Compare two rationals.
61
* @param a first rational
62
* @param b second rational
63
* @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
64
* values is of the form 0/0
65
*/
66
static
inline
int
av_cmp_q
(
AVRational
a
,
AVRational
b
){
67
const
int64_t tmp= a.
num
* (int64_t)b.
den
- b.
num
* (int64_t)a.
den
;
68
69
if
(tmp)
return
(
int
)((tmp ^ a.
den
^ b.
den
)>>63)|1;
70
else
if
(b.
den
&& a.
den
)
return
0;
71
else
if
(a.
num
&& b.
num
)
return
(a.
num
>>31) - (b.
num
>>31);
72
else
return
INT_MIN;
73
}
74
75
/**
76
* Convert rational to double.
77
* @param a rational to convert
78
* @return (double) a
79
*/
80
static
inline
double
av_q2d
(
AVRational
a
){
81
return
a.
num
/ (double) a.
den
;
82
}
83
84
/**
85
* Reduce a fraction.
86
* This is useful for framerate calculations.
87
* @param dst_num destination numerator
88
* @param dst_den destination denominator
89
* @param num source numerator
90
* @param den source denominator
91
* @param max the maximum allowed for dst_num & dst_den
92
* @return 1 if exact, 0 otherwise
93
*/
94
int
av_reduce
(
int
*dst_num,
int
*dst_den, int64_t num, int64_t den, int64_t max);
95
96
/**
97
* Multiply two rationals.
98
* @param b first rational
99
* @param c second rational
100
* @return b*c
101
*/
102
AVRational
av_mul_q
(
AVRational
b
,
AVRational
c
)
av_const
;
103
104
/**
105
* Divide one rational by another.
106
* @param b first rational
107
* @param c second rational
108
* @return b/c
109
*/
110
AVRational
av_div_q
(
AVRational
b
,
AVRational
c
)
av_const
;
111
112
/**
113
* Add two rationals.
114
* @param b first rational
115
* @param c second rational
116
* @return b+c
117
*/
118
AVRational
av_add_q
(
AVRational
b
,
AVRational
c
)
av_const
;
119
120
/**
121
* Subtract one rational from another.
122
* @param b first rational
123
* @param c second rational
124
* @return b-c
125
*/
126
AVRational
av_sub_q
(
AVRational
b
,
AVRational
c
)
av_const
;
127
128
/**
129
* Invert a rational.
130
* @param q value
131
* @return 1 / q
132
*/
133
static
av_always_inline
AVRational
av_inv_q
(
AVRational
q)
134
{
135
AVRational
r
= { q.
den
, q.
num
};
136
return
r
;
137
}
138
139
/**
140
* Convert a double precision floating point number to a rational.
141
* inf is expressed as {1,0} or {-1,0} depending on the sign.
142
*
143
* @param d double to convert
144
* @param max the maximum allowed numerator and denominator
145
* @return (AVRational) d
146
*/
147
AVRational
av_d2q
(
double
d,
int
max)
av_const
;
148
149
/**
150
* @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer
151
* than q1, 0 if they have the same distance.
152
*/
153
int
av_nearer_q
(
AVRational
q,
AVRational
q1
,
AVRational
q2);
154
155
/**
156
* Find the nearest value in q_list to q.
157
* @param q_list an array of rationals terminated by {0, 0}
158
* @return the index of the nearest value found in the array
159
*/
160
int
av_find_nearest_q_idx
(
AVRational
q,
const
AVRational
* q_list);
161
162
/**
163
* @}
164
*/
165
166
#endif
/* AVUTIL_RATIONAL_H */
Generated on Sun Mar 8 2015 02:35:14 for FFmpeg by
1.8.2