annotate ffmpeg/libavutil/rational.h @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * rational numbers
yading@11 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 /**
yading@11 23 * @file
yading@11 24 * rational numbers
yading@11 25 * @author Michael Niedermayer <michaelni@gmx.at>
yading@11 26 */
yading@11 27
yading@11 28 #ifndef AVUTIL_RATIONAL_H
yading@11 29 #define AVUTIL_RATIONAL_H
yading@11 30
yading@11 31 #include <stdint.h>
yading@11 32 #include <limits.h>
yading@11 33 #include "attributes.h"
yading@11 34
yading@11 35 /**
yading@11 36 * @addtogroup lavu_math
yading@11 37 * @{
yading@11 38 */
yading@11 39
yading@11 40 /**
yading@11 41 * rational number numerator/denominator
yading@11 42 */
yading@11 43 typedef struct AVRational{
yading@11 44 int num; ///< numerator
yading@11 45 int den; ///< denominator
yading@11 46 } AVRational;
yading@11 47
yading@11 48 /**
yading@11 49 * Compare two rationals.
yading@11 50 * @param a first rational
yading@11 51 * @param b second rational
yading@11 52 * @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
yading@11 53 * values is of the form 0/0
yading@11 54 */
yading@11 55 static inline int av_cmp_q(AVRational a, AVRational b){
yading@11 56 const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;
yading@11 57
yading@11 58 if(tmp) return ((tmp ^ a.den ^ b.den)>>63)|1;
yading@11 59 else if(b.den && a.den) return 0;
yading@11 60 else if(a.num && b.num) return (a.num>>31) - (b.num>>31);
yading@11 61 else return INT_MIN;
yading@11 62 }
yading@11 63
yading@11 64 /**
yading@11 65 * Convert rational to double.
yading@11 66 * @param a rational to convert
yading@11 67 * @return (double) a
yading@11 68 */
yading@11 69 static inline double av_q2d(AVRational a){
yading@11 70 return a.num / (double) a.den;
yading@11 71 }
yading@11 72
yading@11 73 /**
yading@11 74 * Reduce a fraction.
yading@11 75 * This is useful for framerate calculations.
yading@11 76 * @param dst_num destination numerator
yading@11 77 * @param dst_den destination denominator
yading@11 78 * @param num source numerator
yading@11 79 * @param den source denominator
yading@11 80 * @param max the maximum allowed for dst_num & dst_den
yading@11 81 * @return 1 if exact, 0 otherwise
yading@11 82 */
yading@11 83 int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max);
yading@11 84
yading@11 85 /**
yading@11 86 * Multiply two rationals.
yading@11 87 * @param b first rational
yading@11 88 * @param c second rational
yading@11 89 * @return b*c
yading@11 90 */
yading@11 91 AVRational av_mul_q(AVRational b, AVRational c) av_const;
yading@11 92
yading@11 93 /**
yading@11 94 * Divide one rational by another.
yading@11 95 * @param b first rational
yading@11 96 * @param c second rational
yading@11 97 * @return b/c
yading@11 98 */
yading@11 99 AVRational av_div_q(AVRational b, AVRational c) av_const;
yading@11 100
yading@11 101 /**
yading@11 102 * Add two rationals.
yading@11 103 * @param b first rational
yading@11 104 * @param c second rational
yading@11 105 * @return b+c
yading@11 106 */
yading@11 107 AVRational av_add_q(AVRational b, AVRational c) av_const;
yading@11 108
yading@11 109 /**
yading@11 110 * Subtract one rational from another.
yading@11 111 * @param b first rational
yading@11 112 * @param c second rational
yading@11 113 * @return b-c
yading@11 114 */
yading@11 115 AVRational av_sub_q(AVRational b, AVRational c) av_const;
yading@11 116
yading@11 117 /**
yading@11 118 * Invert a rational.
yading@11 119 * @param q value
yading@11 120 * @return 1 / q
yading@11 121 */
yading@11 122 static av_always_inline AVRational av_inv_q(AVRational q)
yading@11 123 {
yading@11 124 AVRational r = { q.den, q.num };
yading@11 125 return r;
yading@11 126 }
yading@11 127
yading@11 128 /**
yading@11 129 * Convert a double precision floating point number to a rational.
yading@11 130 * inf is expressed as {1,0} or {-1,0} depending on the sign.
yading@11 131 *
yading@11 132 * @param d double to convert
yading@11 133 * @param max the maximum allowed numerator and denominator
yading@11 134 * @return (AVRational) d
yading@11 135 */
yading@11 136 AVRational av_d2q(double d, int max) av_const;
yading@11 137
yading@11 138 /**
yading@11 139 * @return 1 if q1 is nearer to q than q2, -1 if q2 is nearer
yading@11 140 * than q1, 0 if they have the same distance.
yading@11 141 */
yading@11 142 int av_nearer_q(AVRational q, AVRational q1, AVRational q2);
yading@11 143
yading@11 144 /**
yading@11 145 * Find the nearest value in q_list to q.
yading@11 146 * @param q_list an array of rationals terminated by {0, 0}
yading@11 147 * @return the index of the nearest value found in the array
yading@11 148 */
yading@11 149 int av_find_nearest_q_idx(AVRational q, const AVRational* q_list);
yading@11 150
yading@11 151 /**
yading@11 152 * @}
yading@11 153 */
yading@11 154
yading@11 155 #endif /* AVUTIL_RATIONAL_H */