tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

rational.h (4364B)


      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 * Converts a AVRational to a IEEE 32bit float.
    164 *
    165 * The float is returned in a uint32_t and its value is platform indepenant.
    166 */
    167 uint32_t av_q2intfloat(AVRational q);
    168 
    169 /**
    170 * @}
    171 */
    172 
    173 #endif /* AVUTIL_RATIONAL_H */