Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
952c4cf7
Commit
952c4cf7
authored
Jul 30, 2016
by
Timothy Gu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rational: Extend Doxygen
parent
f29ffbc8
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
80 additions
and
39 deletions
+80
-39
rational.h
libavutil/rational.h
+80
-39
No files found.
libavutil/rational.h
View file @
952c4cf7
...
...
@@ -21,7 +21,8 @@
/**
* @file
* rational numbers
* @ingroup lavu_math_rational
* Utilties for rational number calculation.
* @author Michael Niedermayer <michaelni@gmx.at>
*/
...
...
@@ -33,22 +34,39 @@
#include "attributes.h"
/**
* @addtogroup lavu_math
* @defgroup lavu_math_rational AVRational
* @ingroup lavu_math
* Rational number calculation.
*
* While rational numbers can be expressed as floating-point numbers, the
* conversion process is a lossy one, so are floating-point operations. On the
* other hand, the nature of FFmpeg demands highly accurate calculation of
* timestamps. This set of rational number utilities serves as a generic
* interface for manipulating rational numbers as pairs of numerators and
* denominators.
*
* Many of the functions that operate on AVRational's have the suffix `_q`, in
* reference to the mathematical symbol "ℚ" (Q) which denotes the set of all
* rational numbers.
*
* @{
*/
/**
*
rational number numerator/denominator
*
Rational number (pair of numerator and denominator).
*/
typedef
struct
AVRational
{
int
num
;
///<
n
umerator
int
den
;
///<
d
enominator
int
num
;
///<
N
umerator
int
den
;
///<
D
enominator
}
AVRational
;
/**
* Create a rational.
* Create an AVRational.
*
* Useful for compilers that do not support compound literals.
* @note The return value is not reduced.
*
* @note The return value is not reduced.
* @see av_reduce()
*/
static
inline
AVRational
av_make_q
(
int
num
,
int
den
)
{
...
...
@@ -58,10 +76,15 @@ static inline AVRational av_make_q(int num, int den)
/**
* Compare two rationals.
* @param a first rational
* @param b second rational
* @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
* values is of the form 0/0
*
* @param a First rational
* @param b Second rational
*
* @return One of the following values:
* - 0 if `a == b`
* - 1 if `a > b`
* - -1 if `a < b`
* - `INT_MIN` if one of the values is of the form `0 / 0`
*/
static
inline
int
av_cmp_q
(
AVRational
a
,
AVRational
b
){
const
int64_t
tmp
=
a
.
num
*
(
int64_t
)
b
.
den
-
b
.
num
*
(
int64_t
)
a
.
den
;
...
...
@@ -73,9 +96,10 @@ static inline int av_cmp_q(AVRational a, AVRational b){
}
/**
* Convert rational to double.
* @param a rational to convert
* @return (double) a
* Convert an AVRational to a `double`.
* @param a AVRational to convert
* @return `a` in floating-point form
* @see av_d2q()
*/
static
inline
double
av_q2d
(
AVRational
a
){
return
a
.
num
/
(
double
)
a
.
den
;
...
...
@@ -83,44 +107,46 @@ static inline double av_q2d(AVRational a){
/**
* Reduce a fraction.
*
* This is useful for framerate calculations.
* @param dst_num destination numerator
* @param dst_den destination denominator
* @param num source numerator
* @param den source denominator
* @param max the maximum allowed for dst_num & dst_den
* @return 1 if exact, 0 otherwise
*
* @param[out] dst_num Destination numerator
* @param[out] dst_den Destination denominator
* @param[in] num Source numerator
* @param[in] den Source denominator
* @param[in] max Maximum allowed values for `dst_num` & `dst_den`
* @return 1 if the operation is exact, 0 otherwise
*/
int
av_reduce
(
int
*
dst_num
,
int
*
dst_den
,
int64_t
num
,
int64_t
den
,
int64_t
max
);
/**
* Multiply two rationals.
* @param b
f
irst rational
* @param c
s
econd rational
* @param b
F
irst rational
* @param c
S
econd rational
* @return b*c
*/
AVRational
av_mul_q
(
AVRational
b
,
AVRational
c
)
av_const
;
/**
* Divide one rational by another.
* @param b
f
irst rational
* @param c
s
econd rational
* @param b
F
irst rational
* @param c
S
econd rational
* @return b/c
*/
AVRational
av_div_q
(
AVRational
b
,
AVRational
c
)
av_const
;
/**
* Add two rationals.
* @param b
f
irst rational
* @param c
s
econd rational
* @param b
F
irst rational
* @param c
S
econd rational
* @return b+c
*/
AVRational
av_add_q
(
AVRational
b
,
AVRational
c
)
av_const
;
/**
* Subtract one rational from another.
* @param b
f
irst rational
* @param c
s
econd rational
* @param b
F
irst rational
* @param c
S
econd rational
* @return b-c
*/
AVRational
av_sub_q
(
AVRational
b
,
AVRational
c
)
av_const
;
...
...
@@ -138,31 +164,46 @@ static av_always_inline AVRational av_inv_q(AVRational q)
/**
* Convert a double precision floating point number to a rational.
* inf is expressed as {1,0} or {-1,0} depending on the sign.
*
* @param d double to convert
* @param max the maximum allowed numerator and denominator
* @return (AVRational) d
* In case of infinity, the returned value is expressed as `{1, 0}` or
* `{-1, 0}` depending on the sign.
*
* @param d `double` to convert
* @param max Maximum allowed numerator and denominator
* @return `d` in AVRational form
* @see av_q2d()
*/
AVRational
av_d2q
(
double
d
,
int
max
)
av_const
;
/**
* @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer
* than q1, 0 if they have the same distance.
* Find which of the two rationals is closer to another rational.
*
* @param q Rational to be compared against
* @param q1,q2 Rationals to be tested
* @return One of the following values:
* - 1 if `q1` is nearer to `q` than `q2`
* - -1 if `q2` is nearer to `q` than `q1`
* - 0 if they have the same distance
*/
int
av_nearer_q
(
AVRational
q
,
AVRational
q1
,
AVRational
q2
);
/**
* Find the nearest value in q_list to q.
* @param q_list an array of rationals terminated by {0, 0}
* @return the index of the nearest value found in the array
* Find the value in a list of rationals nearest a given reference rational.
*
* @param q Reference rational
* @param q_list Array of rationals terminated by `{0, 0}`
* @return Index of the nearest value found in the array
*/
int
av_find_nearest_q_idx
(
AVRational
q
,
const
AVRational
*
q_list
);
/**
* Converts a AVRational to a IEEE 32bit float.
* Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point
* format.
*
* The float is returned in a uint32_t and its value is platform indepenant.
* @param q Rational to be converted
* @return Equivalent floating-point value, expressed as an unsigned 32-bit
* integer.
* @note The returned value is platform-indepedant.
*/
uint32_t
av_q2intfloat
(
AVRational
q
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment