unit ffm.rational; {$i ffmpeg.inc} interface /// * // * rational numbers // * Copyright (c) 2003 Michael Niedermayer // * // * This file is part of ffm. // * // * FFmpeg is free software; you can redistribute it and/or // * modify it under the terms of the GNU Lesser General Public // * License as published by the Free Software Foundation; either // * version 2.1 of the License, or (at your option) any later version. // * // * FFmpeg is distributed in the hope that it will be useful, // * but WITHOUT ANY WARRANTY; without even the implied warranty of // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // * Lesser General Public License for more details. // * // * You should have received a copy of the GNU Lesser General Public // * License along with FFmpeg; if not, write to the Free Software // * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // */ // /// ** // * @file // * rational numbers // * @author Michael Niedermayer // */ // // #ifndef AVUTIL_RATIONAL_H // #define AVUTIL_RATIONAL_H // // #include // #include // #include "attributes.h" // /// ** // * @addtogroup lavu_math // * @{ // */ type (* * rational number numerator/denominator *) pAVRational = ^TAVRational; TAVRational = {packed} record num: Integer; /// < numerator den: Integer; /// < denominator end; /// ** // * Compare two rationals. // * @param a first rational // * @param b second rational // * @return 0 if a==b, 1 if a>b, -1 if a>63)|1; // else if(b.den && a.den) return 0; // else if(a.num && b.num) return (a.num>>31) - (b.num>>31); // else return INT_MIN; // } // /// ** // * Convert rational to double. // * @param a rational to convert // * @return (double) a // */ // static inline double av_q2d(AVRational a){ // return a.num / (double) a.den; // } // /// ** // * 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 // */ // int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max); // /// ** // * Multiply two rationals. // * @param b first rational // * @param c second rational // * @return b*c // */ // AVRational av_mul_q(AVRational b, AVRational c) av_const; // /// ** // * Divide one rational by another. // * @param b first rational // * @param c second rational // * @return b/c // */ // AVRational av_div_q(AVRational b, AVRational c) av_const; // /// ** // * Add two rationals. // * @param b first rational // * @param c second rational // * @return b+c // */ // AVRational av_add_q(AVRational b, AVRational c) av_const; // /// ** // * Subtract one rational from another. // * @param b first rational // * @param c second rational // * @return b-c // */ // AVRational av_sub_q(AVRational b, AVRational c) av_const; // /// ** // * Invert a rational. // * @param q value // * @return 1 / q // */ // static av_always_inline AVRational av_inv_q(AVRational q) // { // AVRational r = { q.den, q.num }; // return r; // } // /// ** // * 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 // */ // 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. // */ // 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 // */ // int av_find_nearest_q_idx(AVRational q, const AVRational* q_list); // /// ** // * @} // */ implementation end.