| @@ -21,7 +21,8 @@ | |||||
| /** | /** | ||||
| * @file | * @file | ||||
| * rational numbers | |||||
| * @ingroup lavu_math_rational | |||||
| * Utilties for rational number calculation. | |||||
| * @author Michael Niedermayer <michaelni@gmx.at> | * @author Michael Niedermayer <michaelni@gmx.at> | ||||
| */ | */ | ||||
| @@ -33,22 +34,39 @@ | |||||
| #include "attributes.h" | #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{ | typedef struct AVRational{ | ||||
| int num; ///< numerator | |||||
| int den; ///< denominator | |||||
| int num; ///< Numerator | |||||
| int den; ///< Denominator | |||||
| } AVRational; | } AVRational; | ||||
| /** | /** | ||||
| * Create a rational. | |||||
| * Create an AVRational. | |||||
| * | |||||
| * Useful for compilers that do not support compound literals. | * 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) | 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. | * 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){ | 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; | 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){ | static inline double av_q2d(AVRational a){ | ||||
| return a.num / (double) a.den; | return a.num / (double) a.den; | ||||
| @@ -83,44 +107,46 @@ static inline double av_q2d(AVRational a){ | |||||
| /** | /** | ||||
| * Reduce a fraction. | * Reduce a fraction. | ||||
| * | |||||
| * This is useful for framerate calculations. | * 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); | int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); | ||||
| /** | /** | ||||
| * Multiply two rationals. | * Multiply two rationals. | ||||
| * @param b first rational | |||||
| * @param c second rational | |||||
| * @param b First rational | |||||
| * @param c Second rational | |||||
| * @return b*c | * @return b*c | ||||
| */ | */ | ||||
| AVRational av_mul_q(AVRational b, AVRational c) av_const; | AVRational av_mul_q(AVRational b, AVRational c) av_const; | ||||
| /** | /** | ||||
| * Divide one rational by another. | * Divide one rational by another. | ||||
| * @param b first rational | |||||
| * @param c second rational | |||||
| * @param b First rational | |||||
| * @param c Second rational | |||||
| * @return b/c | * @return b/c | ||||
| */ | */ | ||||
| AVRational av_div_q(AVRational b, AVRational c) av_const; | AVRational av_div_q(AVRational b, AVRational c) av_const; | ||||
| /** | /** | ||||
| * Add two rationals. | * Add two rationals. | ||||
| * @param b first rational | |||||
| * @param c second rational | |||||
| * @param b First rational | |||||
| * @param c Second rational | |||||
| * @return b+c | * @return b+c | ||||
| */ | */ | ||||
| AVRational av_add_q(AVRational b, AVRational c) av_const; | AVRational av_add_q(AVRational b, AVRational c) av_const; | ||||
| /** | /** | ||||
| * Subtract one rational from another. | * Subtract one rational from another. | ||||
| * @param b first rational | |||||
| * @param c second rational | |||||
| * @param b First rational | |||||
| * @param c Second rational | |||||
| * @return b-c | * @return b-c | ||||
| */ | */ | ||||
| AVRational av_sub_q(AVRational b, AVRational c) av_const; | 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. | * 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; | 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); | 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); | 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); | uint32_t av_q2intfloat(AVRational q); | ||||