diff options
Diffstat (limited to 'Game/Code/lib/ffmpeg/rational.pas')
-rw-r--r-- | Game/Code/lib/ffmpeg/rational.pas | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/Game/Code/lib/ffmpeg/rational.pas b/Game/Code/lib/ffmpeg/rational.pas new file mode 100644 index 00000000..0d6f76b6 --- /dev/null +++ b/Game/Code/lib/ffmpeg/rational.pas @@ -0,0 +1,146 @@ +(* + * Rational numbers + * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> + * + * This library 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 of the License, or (at your option) any later version. + * + * This library 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 this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + *) + +(* This is a part of Pascal porting of ffmpeg. + * Originally by Victor Zinetz for Delphi and Free Pascal on Windows. + * For Mac OS X, some modifications were made by The Creative CAT, denoted as CAT + * in the source codes *) + +(* + * Revision: 10765, Wed Oct 17 09:37:46 2007 UTC + *) + +unit rational; + +{$IFDEF FPC} + {$MODE DELPHI} + {$PACKENUM 4} (* use 4-byte enums *) + {$PACKRECORDS C} (* C/C++-compatible record packing *) +{$ELSE} + {$MINENUMSIZE 4} (* use 4-byte enums *) +{$ENDIF} + +interface + +uses + UConfig; + +type +(* + * Rational number num/den. + *) + PAVRational = ^TAVRational; + TAVRational = 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 and -1 if a<b. + *) +function av_cmp_q(a: TAVRational; b: TAVRational): integer; inline; + +(** + * Rational to double conversion. + * @param a rational to convert + * @return (double) a + *) +function av_q2d(a: TAVRational): double; inline; + +(** + * Reduce a fraction. + * This is useful for framerate calculations. + * @param dst_nom destination numerator + * @param dst_den destination denominator + * @param nom source numerator + * @param den source denominator + * @param max the maximum allowed for dst_nom & dst_den + * @return 1 if exact, 0 otherwise + *) +function av_reduce(dst_nom: PInteger; dst_den: PInteger; nom: int64; den: int64; max: int64): integer; + cdecl; external av__util; + +(** + * Multiplies two rationals. + * @param b first rational. + * @param c second rational. + * @return b*c. + *) +function av_mul_q(b: TAVRational; c: TAVRational): TAVRational; + cdecl; external av__util; + +(** + * Divides one rational by another. + * @param b first rational. + * @param c second rational. + * @return b/c. + *) +function av_div_q(b: TAVRational; c: TAVRational): TAVRational; + cdecl; external av__util; + +(** + * Adds two rationals. + * @param b first rational. + * @param c second rational. + * @return b+c. + *) +function av_add_q(b: TAVRational; c: TAVRational): TAVRational; + cdecl; external av__util; + +(** + * Subtracts one rational from another. + * @param b first rational. + * @param c second rational. + * @return b-c. + *) +function av_sub_q(b: TAVRational; c: TAVRational): TAVRational; + cdecl; external av__util; + +(** + * Converts a double precision floating point number to a rational. + * @param d double to convert + * @param max the maximum allowed numerator and denominator + * @return (AVRational) d. + *) +function av_d2q(d: double; max: integer): TAVRational; + cdecl; external av__util; + +implementation + +function av_cmp_q (a: TAVRational; b: TAVRational): integer; +var + tmp: int64; +begin + tmp := a.num * int64(b.den) - b.num * int64(a.den); + + if (tmp <> 0) then + Result := (tmp shr 63) or 1 + else + Result := 0 +end; + +function av_q2d(a: TAVRational): double; +begin + Result := a.num / a.den; +end; + +end. |