annotate mathematics.c @ 1002:3aefb6df1f86 libavutil

Define macro AV_NE() and use it in libavdevice. Help further refactoring.
author stefano
date Tue, 17 Aug 2010 18:25:34 +0000
parents c0a0cf0c61c7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
1 /*
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
2 * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
3 *
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 41
diff changeset
4 * This file is part of FFmpeg.
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 41
diff changeset
5 *
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 41
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 41
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
10 *
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 41
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
14 * Lesser General Public License for more details.
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
15 *
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 41
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
15
af59e84e283d Update licensing information: The FSF changed postal address.
diego
parents: 12
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
19 */
12
ce8f9f4390c3 COSMETICS: Remove all trailing whitespace.
diego
parents: 0
diff changeset
20
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
21 /**
899
0795a743bda1 Remove explicit filename from Doxygen @file commands.
diego
parents: 873
diff changeset
22 * @file
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 632
diff changeset
23 * miscellaneous math routines and tables
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
24 */
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
25
618
e0bf946f7d23 Directly #include a bunch of indirectly #included headers.
diego
parents: 607
diff changeset
26 #include <assert.h>
873
4d9ad0ed07d0 Replace many includes of libavutil/common.h with what is actually needed
mru
parents: 830
diff changeset
27 #include <stdint.h>
4d9ad0ed07d0 Replace many includes of libavutil/common.h with what is actually needed
mru
parents: 830
diff changeset
28 #include <limits.h>
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
29 #include "mathematics.h"
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
30
432
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
31 const uint8_t ff_sqrt_tab[256]={
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
32 0, 16, 23, 28, 32, 36, 40, 43, 46, 48, 51, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 77, 79, 80, 82, 84, 85, 87, 88, 90,
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
33 91, 92, 94, 95, 96, 98, 99,100,102,103,104,105,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
34 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,144,145,146,147,148,149,150,151,151,152,153,154,155,156,156,
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
35 157,158,159,160,160,161,162,163,164,164,165,166,167,168,168,169,170,171,171,172,173,174,174,175,176,176,177,178,179,179,180,181,
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
36 182,182,183,184,184,185,186,186,187,188,188,189,190,190,191,192,192,193,194,194,195,196,196,197,198,198,199,200,200,201,202,202,
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
37 203,204,204,205,205,206,207,207,208,208,209,210,210,211,212,212,213,213,214,215,215,216,216,217,218,218,219,219,220,220,221,222,
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
38 222,223,223,224,224,225,226,226,227,227,228,228,229,230,230,231,231,232,232,233,233,234,235,235,236,236,237,237,238,238,239,239,
dcb08e8f3b2e Faster ff_sqrt()
michael
parents: 427
diff changeset
39 240,240,241,242,242,243,243,244,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,252,252,253,253,254,254,255,255,255
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
40 };
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
41
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
42 const uint8_t ff_log2_tab[256]={
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
43 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
44 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
45 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
46 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
47 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
48 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
49 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
50 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
51 };
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
52
784
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
53 const uint8_t av_reverse[256]={
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
54 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
55 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
56 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
57 0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
58 0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
59 0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
60 0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
61 0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
62 0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
63 0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
64 0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
65 0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
66 0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
67 0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
68 0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
69 0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF,
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
70 };
fd7a78f003e7 Move ff_reverse in libavcodec to av_reverse in libavutil.
cehoyos
parents: 689
diff changeset
71
607
819752f80c64 export gcd function as av_gcd()
aurel
parents: 432
diff changeset
72 int64_t av_gcd(int64_t a, int64_t b){
819752f80c64 export gcd function as av_gcd()
aurel
parents: 432
diff changeset
73 if(b) return av_gcd(b, a%b);
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
74 else return a;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
75 }
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
76
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
77 int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd){
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
78 int64_t r=0;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
79 assert(c > 0);
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
80 assert(b >=0);
975
c0a0cf0c61c7 Silence "comparison of unsigned expression >= 0 is always true" warning.
cehoyos
parents: 933
diff changeset
81 assert((unsigned)rnd<=5 && rnd!=4);
12
ce8f9f4390c3 COSMETICS: Remove all trailing whitespace.
diego
parents: 0
diff changeset
82
ce8f9f4390c3 COSMETICS: Remove all trailing whitespace.
diego
parents: 0
diff changeset
83 if(a<0 && a != INT64_MIN) return -av_rescale_rnd(-a, b, c, rnd ^ ((rnd>>1)&1));
ce8f9f4390c3 COSMETICS: Remove all trailing whitespace.
diego
parents: 0
diff changeset
84
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
85 if(rnd==AV_ROUND_NEAR_INF) r= c/2;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
86 else if(rnd&1) r= c-1;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
87
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
88 if(b<=INT_MAX && c<=INT_MAX){
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
89 if(a<=INT_MAX)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
90 return (a * b + r)/c;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
91 else
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
92 return a/c*b + (a%c*b + r)/c;
34
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
93 }else{
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
94 #if 1
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
95 uint64_t a0= a&0xFFFFFFFF;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
96 uint64_t a1= a>>32;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
97 uint64_t b0= b&0xFFFFFFFF;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
98 uint64_t b1= b>>32;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
99 uint64_t t1= a0*b1 + a1*b0;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
100 uint64_t t1a= t1<<32;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
101 int i;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
102
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
103 a0 = a0*b0 + t1a;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
104 a1 = a1*b1 + (t1>>32) + (a0<t1a);
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
105 a0 += r;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
106 a1 += a0<r;
12
ce8f9f4390c3 COSMETICS: Remove all trailing whitespace.
diego
parents: 0
diff changeset
107
34
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
108 for(i=63; i>=0; i--){
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
109 // int o= a1 & 0x8000000000000000ULL;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
110 a1+= a1 + ((a0>>i)&1);
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
111 t1+=t1;
36
8795371b6c88 <= vs. >= 10l bug
michael
parents: 35
diff changeset
112 if(/*o || */c <= a1){
34
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
113 a1 -= c;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
114 t1++;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
115 }
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
116 }
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
117 return t1;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
118 }
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
119 #else
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
120 AVInteger ai;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
121 ai= av_mul_i(av_int2i(a), av_int2i(b));
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
122 ai= av_add_i(ai, av_int2i(r));
12
ce8f9f4390c3 COSMETICS: Remove all trailing whitespace.
diego
parents: 0
diff changeset
123
34
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
124 return av_i2int(av_div_i(ai, av_int2i(c)));
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
125 }
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
126 #endif
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
127 }
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
128
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
129 int64_t av_rescale(int64_t a, int64_t b, int64_t c){
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
130 return av_rescale_rnd(a, b, c, AV_ROUND_NEAR_INF);
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
131 }
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
132
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
133 int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq){
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
134 int64_t b= bq.num * (int64_t)cq.den;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
135 int64_t c= cq.num * (int64_t)bq.den;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
136 return av_rescale_rnd(a, b, c, AV_ROUND_NEAR_INF);
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
137 }
426
d9390a931aef Allow compilation of test programs when TEST is defined.
diego
parents: 404
diff changeset
138
830
a6eab70dd366 av_compare_ts()
michael
parents: 784
diff changeset
139 int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b){
a6eab70dd366 av_compare_ts()
michael
parents: 784
diff changeset
140 int64_t a= tb_a.num * (int64_t)tb_b.den;
a6eab70dd366 av_compare_ts()
michael
parents: 784
diff changeset
141 int64_t b= tb_b.num * (int64_t)tb_a.den;
a6eab70dd366 av_compare_ts()
michael
parents: 784
diff changeset
142 if (av_rescale_rnd(ts_a, a, b, AV_ROUND_DOWN) < ts_b) return -1;
a6eab70dd366 av_compare_ts()
michael
parents: 784
diff changeset
143 if (av_rescale_rnd(ts_b, b, a, AV_ROUND_DOWN) < ts_a) return 1;
a6eab70dd366 av_compare_ts()
michael
parents: 784
diff changeset
144 return 0;
a6eab70dd366 av_compare_ts()
michael
parents: 784
diff changeset
145 }
a6eab70dd366 av_compare_ts()
michael
parents: 784
diff changeset
146
933
93bd29f34e99 Add av_compare_mod()
michael
parents: 899
diff changeset
147 int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod){
93bd29f34e99 Add av_compare_mod()
michael
parents: 899
diff changeset
148 int64_t c= (a-b) & (mod-1);
93bd29f34e99 Add av_compare_mod()
michael
parents: 899
diff changeset
149 if(c > (mod>>1))
93bd29f34e99 Add av_compare_mod()
michael
parents: 899
diff changeset
150 c-= mod;
93bd29f34e99 Add av_compare_mod()
michael
parents: 899
diff changeset
151 return c;
93bd29f34e99 Add av_compare_mod()
michael
parents: 899
diff changeset
152 }
93bd29f34e99 Add av_compare_mod()
michael
parents: 899
diff changeset
153
426
d9390a931aef Allow compilation of test programs when TEST is defined.
diego
parents: 404
diff changeset
154 #ifdef TEST
41
e2d207b1cb8e improve selftest
michael
parents: 37
diff changeset
155 #include "integer.h"
36
8795371b6c88 <= vs. >= 10l bug
michael
parents: 35
diff changeset
156 #undef printf
427
e7192ff1857d Fix a couple of 'return type defaults to int' and 'control reaches end of
diego
parents: 426
diff changeset
157 int main(void){
34
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
158 int64_t a,b,c,d,e;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
159
41
e2d207b1cb8e improve selftest
michael
parents: 37
diff changeset
160 for(a=7; a<(1LL<<62); a+=a/3+1){
e2d207b1cb8e improve selftest
michael
parents: 37
diff changeset
161 for(b=3; b<(1LL<<62); b+=b/4+1){
e2d207b1cb8e improve selftest
michael
parents: 37
diff changeset
162 for(c=9; c<(1LL<<62); c+=(c*2)/5+3){
34
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
163 int64_t r= c/2;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
164 AVInteger ai;
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
165 ai= av_mul_i(av_int2i(a), av_int2i(b));
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
166 ai= av_add_i(ai, av_int2i(r));
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
167
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
168 d= av_i2int(av_div_i(ai, av_int2i(c)));
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
169
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
170 e= av_rescale(a,b,c);
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
171
36
8795371b6c88 <= vs. >= 10l bug
michael
parents: 35
diff changeset
172 if((double)a * (double)b / (double)c > (1LL<<63))
8795371b6c88 <= vs. >= 10l bug
michael
parents: 35
diff changeset
173 continue;
8795371b6c88 <= vs. >= 10l bug
michael
parents: 35
diff changeset
174
128
d94fb7e6cb53 Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 116
diff changeset
175 if(d!=e) printf("%"PRId64"*%"PRId64"/%"PRId64"= %"PRId64"=%"PRId64"\n", a, b, c, d, e);
34
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
176 }
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
177 }
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
178 }
427
e7192ff1857d Fix a couple of 'return type defaults to int' and 'control reaches end of
diego
parents: 426
diff changeset
179 return 0;
34
dedc1568e2cf avoid AVInteger usage in av_rescale
michael
parents: 15
diff changeset
180 }
35
b734d9f69ff4 add newline at end of file
mru
parents: 34
diff changeset
181 #endif