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 module ffmpeg.libavutil.rational; 22 import std.stdint; 23 24 @nogc nothrow extern(C): 25 26 /** 27 * @addtogroup lavu_math 28 * @{ 29 */ 30 31 /** 32 * rational number numerator/denominator 33 */ 34 struct AVRational { 35 int num; 36 int den; 37 } 38 39 /** 40 * Create a rational. 41 * Useful for compilers that do not support compound literals. 42 * @note The return value is not reduced. 43 */ 44 static AVRational av_make_q(int num, int den) 45 { 46 AVRational r = { num, den }; 47 return r; 48 } 49 50 /** 51 * Compare two rationals. 52 * @param a first rational 53 * @param b second rational 54 * @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the 55 * values is of the form 0/0 56 */ 57 static int av_cmp_q(AVRational a, AVRational b){ 58 const int64_t tmp= a.num * cast(int64_t)b.den - b.num * cast(int64_t)a.den; 59 60 if(tmp) return ((tmp ^ a.den ^ b.den)>>63)|1; 61 else if(b.den && a.den) return 0; 62 else if(a.num && b.num) return (a.num>>31) - (b.num>>31); 63 else return int.min; 64 } 65 66 /** 67 * Convert rational to double. 68 * @param a rational to convert 69 * @return (double) a 70 */ 71 static double av_q2d(AVRational a){ 72 return a.num / cast(double) a.den; 73 } 74 75 /** 76 * Reduce a fraction. 77 * This is useful for framerate calculations. 78 * @param dst_num destination numerator 79 * @param dst_den destination denominator 80 * @param num source numerator 81 * @param den source denominator 82 * @param max the maximum allowed for dst_num & dst_den 83 * @return 1 if exact, 0 otherwise 84 */ 85 int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); 86 87 /** 88 * Multiply two rationals. 89 * @param b first rational 90 * @param c second rational 91 * @return b*c 92 */ 93 AVRational av_mul_q(AVRational b, AVRational c); 94 95 /** 96 * Divide one rational by another. 97 * @param b first rational 98 * @param c second rational 99 * @return b/c 100 */ 101 AVRational av_div_q(AVRational b, AVRational c); 102 103 /** 104 * Add two rationals. 105 * @param b first rational 106 * @param c second rational 107 * @return b+c 108 */ 109 AVRational av_add_q(AVRational b, AVRational c); 110 111 /** 112 * Subtract one rational from another. 113 * @param b first rational 114 * @param c second rational 115 * @return b-c 116 */ 117 AVRational av_sub_q(AVRational b, AVRational c); 118 119 /** 120 * Invert a rational. 121 * @param q value 122 * @return 1 / q 123 */ 124 static AVRational av_inv_q(AVRational q) 125 { 126 AVRational r = { q.den, q.num }; 127 return r; 128 } 129 130 /** 131 * Convert a double precision floating point number to a rational. 132 * inf is expressed as {1,0} or {-1,0} depending on the sign. 133 * 134 * @param d double to convert 135 * @param max the maximum allowed numerator and denominator 136 * @return (AVRational) d 137 */ 138 AVRational av_d2q(double d, int max); 139 140 /** 141 * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer 142 * than q1, 0 if they have the same distance. 143 */ 144 int av_nearer_q(AVRational q, AVRational q1, AVRational q2); 145 146 /** 147 * Find the nearest value in q_list to q. 148 * @param q_list an array of rationals terminated by {0, 0} 149 * @return the index of the nearest value found in the array 150 */ 151 int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); 152 153 /** 154 * Converts a AVRational to a IEEE 32bit float. 155 * 156 * The float is returned in a uint32_t and its value is platform indepenant. 157 */ 158 uint32_t av_q2intfloat(AVRational q);