Mercurial > mplayer.hg
annotate libmpcodecs/cmmx.h @ 21584:3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
similar to the SHM case, it also eliminates the massive startup delay over
ssh (at least when you have a tiny upstream).
author | reimar |
---|---|
date | Tue, 12 Dec 2006 18:43:10 +0000 |
parents | 5eb66d37d539 |
children | 3f0d00abc073 |
rev | line source |
---|---|
11600
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
1 /* |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
2 * x86 MMX and MMX2 packed byte operations in portable C. |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
3 * Extra instructions: pdiffub, pcmpzb, psumbw, pcmpgtub |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
4 * Author: Zoltan Hidvegi |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
5 */ |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
6 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
7 #ifndef __CMMX_H |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
8 #define __CMMX_H |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
9 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
10 typedef unsigned long cmmx_t; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
11 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
12 #define ONE_BYTES (~(cmmx_t)0 / 255) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
13 #define SIGN_BITS (ONE_BYTES << 7) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
14 #define LOWBW_MASK (~(cmmx_t)0 / 257) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
15 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
16 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
17 paddb(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
18 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
19 return ((a & ~SIGN_BITS) + (b & ~SIGN_BITS)) ^ ((a^b) & SIGN_BITS); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
20 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
21 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
22 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
23 psubb(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
24 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
25 return ((a | SIGN_BITS) - (b & ~SIGN_BITS)) ^ (~(a^b) & SIGN_BITS); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
26 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
27 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
28 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
29 paddusb(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
30 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
31 cmmx_t s = (a & ~SIGN_BITS) + (b & ~SIGN_BITS); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
32 cmmx_t abs = (a | b) & SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
33 cmmx_t c = abs & (s | (a & b)); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
34 return s | abs | (abs - (c >> 7)); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
35 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
36 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
37 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
38 paddusb_s(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
39 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
40 cmmx_t sum = a+b; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
41 cmmx_t ov = sum & SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
42 return sum + (sum ^ (ov - (ov>>7))); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
43 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
44 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
45 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
46 psubusb(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
47 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
48 cmmx_t s = (a | SIGN_BITS) - (b & ~SIGN_BITS); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
49 cmmx_t anb = a & ~b; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
50 cmmx_t c = (anb | (s & ~(a^b))) & SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
51 return s & ((c & anb) | (c - (c >> 7))); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
52 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
53 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
54 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
55 psubusb_s(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
56 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
57 cmmx_t d = (a|SIGN_BITS) - b; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
58 cmmx_t m = d & SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
59 return d & (m - (m>>7)); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
60 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
61 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
62 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
63 pcmpgtub(cmmx_t b, cmmx_t a) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
64 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
65 cmmx_t s = (a | SIGN_BITS) - (b & ~SIGN_BITS); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
66 cmmx_t ret = ((~a & b) | (~s & ~(a ^ b))) & SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
67 return ret | (ret - (ret >> 7)); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
68 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
69 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
70 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
71 pdiffub(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
72 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
73 cmmx_t xs = (~a ^ b) & SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
74 cmmx_t s = ((a | SIGN_BITS) - (b & ~SIGN_BITS)) ^ xs; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
75 cmmx_t gt = ((~a & b) | (s & xs)) & SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
76 cmmx_t gt7 = gt >> 7; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
77 return (s ^ gt ^ (gt - gt7)) + gt7; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
78 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
79 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
80 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
81 pdiffub_s(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
82 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
83 cmmx_t d = (a|SIGN_BITS) - b; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
84 cmmx_t g = (~d & SIGN_BITS) >> 7; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
85 return (d ^ (SIGN_BITS-g)) + g; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
86 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
87 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
88 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
89 pmaxub(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
90 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
91 return psubusb(a,b) + b; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
92 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
93 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
94 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
95 pminub(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
96 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
97 return paddusb(a,~b) - ~b; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
98 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
99 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
100 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
101 pminub_s(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
102 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
103 cmmx_t d = (a|SIGN_BITS) - b; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
104 cmmx_t m = ~SIGN_BITS + ((d&SIGN_BITS)>>7); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
105 return ((d&m) + b) & ~SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
106 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
107 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
108 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
109 pavgb(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
110 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
111 cmmx_t ao = a & ONE_BYTES; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
112 cmmx_t bo = b & ONE_BYTES; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
113 return ((a^ao)>>1) + ((b^bo)>>1) + (ao|bo); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
114 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
115 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
116 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
117 pavgb_s(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
118 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
119 return ((a+b+ONE_BYTES)>>1) & ~SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
120 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
121 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
122 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
123 p31avgb(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
124 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
125 cmmx_t ao = a & (3*ONE_BYTES); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
126 cmmx_t bo = b & (3*ONE_BYTES); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
127 return 3*((a^ao)>>2) + ((b^bo)>>2) + |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
128 (((3*ao+bo+2*ONE_BYTES)>>2) & (3*ONE_BYTES)); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
129 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
130 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
131 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
132 p31avgb_s(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
133 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
134 cmmx_t avg = ((a+b)>>1) & ~SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
135 return pavgb_s(avg, a); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
136 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
137 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
138 static inline unsigned long |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
139 psumbw(cmmx_t a) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
140 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
141 cmmx_t t = (a & LOWBW_MASK) + ((a>>8) & LOWBW_MASK); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
142 unsigned long ret = |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
143 (unsigned long)t + (unsigned long)(t >> (4*sizeof(cmmx_t))); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
144 if (sizeof(cmmx_t) > 4) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
145 ret += ret >> 16; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
146 return ret & 0xffff; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
147 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
148 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
149 static inline unsigned long |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
150 psumbw_s(cmmx_t a) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
151 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
152 unsigned long ret = |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
153 (unsigned long)a + (unsigned long)(a >> (4*sizeof(cmmx_t))); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
154 if (sizeof(cmmx_t) <= 4) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
155 return (ret & 0xff) + ((ret>>8) & 0xff); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
156 ret = (ret & 0xff00ff) + ((ret>>8) & 0xff00ff); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
157 ret += ret >> 16; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
158 return ret & 0xffff; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
159 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
160 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
161 static inline unsigned long |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
162 psadbw(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
163 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
164 return psumbw(pdiffub(a,b)); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
165 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
166 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
167 static inline unsigned long |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
168 psadbw_s(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
169 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
170 return psumbw_s(pdiffub_s(a,b)); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
171 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
172 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
173 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
174 pcmpzb(cmmx_t a) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
175 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
176 cmmx_t ret = (((a | SIGN_BITS) - ONE_BYTES) | a) & SIGN_BITS; |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
177 return ~(ret | (ret - (ret >> 7))); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
178 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
179 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
180 static inline cmmx_t |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
181 pcmpeqb(cmmx_t a, cmmx_t b) |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
182 { |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
183 return pcmpzb(a ^ b); |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
184 } |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
185 |
5eb66d37d539
Yet another inverse telecine filter by Zoltan Hidvegi <mplayer@hzoli.2y.net>. Also heavily MMX centric.
alex
parents:
diff
changeset
|
186 #endif |