MythTV
master
mythtv
libs
libmythtv
visualisations
goom
zoom_filter_mmx.cpp
Go to the documentation of this file.
1
#include <algorithm>
2
#include <cstdint>
3
4
#include "
visualisations/goom/zoom_filters.h
"
5
6
#ifdef MMX
7
static
constexpr uint8_t
BUFFPOINTNB
{ 16 };
8
//static constexpr uint16_t BUFFPOINTMASK { 0xffff };
9
//static constexpr uint8_t BUFFINCR { 0xff };
10
11
#include "
mmx.h
"
12
13
//static constexpr uint8_t sqrtperte { 16 };
14
// faire : a % sqrtperte <=> a & pertemask
15
static
constexpr uint8_t
PERTEMASK
{ 0xf };
16
// faire : a / sqrtperte <=> a >> PERTEDEC
17
static
constexpr uint8_t
PERTEDEC
{ 4 };
18
19
extern
"C"
{
20
#include "libavutil/cpu.h"
21
}
22
23
int
zoom_filter_mmx_supported
() {
24
return
(av_get_cpu_flags() & AV_CPU_FLAG_MMX);
25
}
26
27
void
zoom_filter_mmx
(
int
prevX
,
int
prevY
,
28
const
unsigned
int
*
expix1
,
unsigned
int
*
expix2
,
//NOLINT(readability-non-const-parameter)
29
const
int
*
brutS
,
const
int
*
brutD
,
int
buffratio
,
30
const
GoomCoefficients
&
precalCoef
)
31
{
32
unsigned
int
ax = (
prevX
-1)<<
PERTEDEC
;
33
unsigned
int
ay = (
prevY
-1)<<
PERTEDEC
;
34
35
int
bufsize =
prevX
*
prevY
;
36
37
pxor_r2r(mm7,mm7);
38
39
for
(
int
loop=0; loop<bufsize; loop++)
40
{
41
int
pos = 0;
42
int
coeffs
= 0;
43
44
int
myPos = loop << 1;
45
int
myPos2 = myPos + 1;
46
int
brutSmypos =
brutS
[myPos];
47
48
int
px = brutSmypos +
49
(((
brutD
[myPos] - brutSmypos)*
buffratio
) >>
BUFFPOINTNB
);
50
51
brutSmypos =
brutS
[myPos2];
52
int
py = brutSmypos +
53
(((
brutD
[myPos2] - brutSmypos)*
buffratio
) >>
BUFFPOINTNB
);
54
55
px = std::max(px, 0);
56
py = std::max(py, 0);
57
58
if
((py>=(
int
)ay) || (px>=(
int
)ax))
59
{
60
pos=
coeffs
=0;
61
}
62
else
{
63
pos = ((px >>
PERTEDEC
) +
prevX
* (py >>
PERTEDEC
));
64
/* coef en modulo 15 */
65
coeffs
=
precalCoef
[px &
PERTEMASK
][py &
PERTEMASK
];
66
}
67
68
int
posplusprevX = pos +
prevX
;
69
70
movd_m2r(
coeffs
, mm6);
71
72
/* recuperation des deux premiers pixels dans mm0 et mm1 */
73
movq_m2r(
expix1
[pos], mm0);
/* b1-v1-r1-a1-b2-v2-r2-a2 */
74
movq_r2r(mm0, mm1);
/* b1-v1-r1-a1-b2-v2-r2-a2 */
75
76
/* depackage du premier pixel */
77
punpcklbw_r2r(mm7, mm0);
/* 00-b2-00-v2-00-r2-00-a2 */
78
movq_r2r(mm6, mm5);
/* xx-xx-xx-xx-c4-c3-c2-c1 */
79
80
/* depackage du 2ieme pixel */
81
punpckhbw_r2r(mm7, mm1);
/* 00-b1-00-v1-00-r1-00-a1 */
82
83
/* extraction des coefficients... */
84
punpcklbw_r2r(mm5, mm6);
/* c4-c4-c3-c3-c2-c2-c1-c1 */
85
movq_r2r(mm6, mm4);
/* c4-c4-c3-c3-c2-c2-c1-c1 */
86
movq_r2r(mm6, mm5);
/* c4-c4-c3-c3-c2-c2-c1-c1 */
87
punpcklbw_r2r(mm5, mm6);
/* c2-c2-c2-c2-c1-c1-c1-c1 */
88
punpckhbw_r2r(mm5, mm4);
/* c4-c4-c4-c4-c3-c3-c3-c3 */
89
90
movq_r2r(mm6, mm3);
/* c2-c2-c2-c2-c1-c1-c1-c1 */
91
punpcklbw_r2r(mm7, mm6);
/* 00-c1-00-c1-00-c1-00-c1 */
92
punpckhbw_r2r(mm7, mm3);
/* 00-c2-00-c2-00-c2-00-c2 */
93
94
/* multiplication des pixels par les coefficients */
95
pmullw_r2r(mm6, mm0);
/* c1*b2-c1*v2-c1*r2-c1*a2 */
96
pmullw_r2r(mm3, mm1);
/* c2*b1-c2*v1-c2*r1-c2*a1 */
97
paddw_r2r(mm1, mm0);
98
99
/* ...extraction des 2 derniers coefficients */
100
movq_r2r(mm4, mm5);
/* c4-c4-c4-c4-c3-c3-c3-c3 */
101
punpcklbw_r2r(mm7, mm4);
/* 00-c3-00-c3-00-c3-00-c3 */
102
punpckhbw_r2r(mm7, mm5);
/* 00-c4-00-c4-00-c4-00-c4 */
103
104
/* ajouter la longueur de ligne a esi */
105
/* recuperation des 2 derniers pixels */
106
movq_m2r(
expix1
[posplusprevX], mm1);
107
movq_r2r(mm1, mm2);
108
109
/* depackage des pixels */
110
punpcklbw_r2r(mm7, mm1);
111
punpckhbw_r2r(mm7, mm2);
112
113
/* multiplication pas les coeffs */
114
pmullw_r2r(mm4, mm1);
115
pmullw_r2r(mm5, mm2);
116
117
/* ajout des valeurs obtenues de iso8859-15 à la valeur finale */
118
paddw_r2r(mm1, mm0);
119
paddw_r2r(mm2, mm0);
120
121
/* division par 256 = 16+16+16+16, puis repackage du pixel final */
122
psrlw_i2r(8, mm0);
123
packuswb_r2r(mm7, mm0);
124
movd_r2m(mm0,
expix2
[loop]);
125
}
126
emms();
127
}
128
129
#else
130
131
int
zoom_filter_mmx_supported
() {
132
return
0;
133
}
134
135
void
zoom_filter_mmx
([[maybe_unused]]
int
prevX
,
136
[[maybe_unused]]
int
prevY
,
137
[[maybe_unused]]
const
unsigned
int
*
expix1
,
138
[[maybe_unused]]
unsigned
int
*
expix2
,
139
[[maybe_unused]]
const
int
*
brutS
,
140
[[maybe_unused]]
const
int
*
brutD
,
141
[[maybe_unused]]
int
buffratio
,
142
[[maybe_unused]]
const
GoomCoefficients
&
precalCoef
)
143
{
144
}
145
146
#endif
147
148
/*
149
* vim:ts=4:sw=4:ai:et:si:sts=4
150
*/
151
precalCoef
GoomCoefficients precalCoef
modif d'optim by Jeko : precalcul des 4 coefs résultant des 2 pos
Definition:
filters.cpp:146
BUFFPOINTNB
static constexpr uint8_t BUFFPOINTNB
Definition:
zoom_filter_mmx.cpp:7
prevX
unsigned int prevX
Definition:
filters.cpp:111
PERTEMASK
static constexpr uint8_t PERTEMASK
Definition:
zoom_filter_mmx.cpp:15
expix1
guint32 * expix1
Definition:
filters.cpp:105
mmx.h
zoom_filter_mmx_supported
int zoom_filter_mmx_supported()
Definition:
zoom_filter_mmx.cpp:23
zoom_filter_mmx
void zoom_filter_mmx(int prevX, int prevY, const unsigned int *expix1, unsigned int *expix2, const int *brutS, const int *brutD, int buffratio, const GoomCoefficients &precalCoef)
Definition:
zoom_filter_mmx.cpp:27
prevY
unsigned int prevY
Definition:
filters.cpp:111
GoomCoefficients
std::array< std::array< int, 16 >, 16 > GoomCoefficients
Definition:
zoom_filters.h:3
buffratio
int buffratio
modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16)
Definition:
filters.cpp:127
coeffs
unsigned int * coeffs
Definition:
filters.cpp:98
zoom_filters.h
PERTEDEC
static constexpr uint8_t PERTEDEC
Definition:
zoom_filter_mmx.cpp:17
brutD
signed int * brutD
Definition:
filters.cpp:101
brutS
signed int * brutS
Definition:
filters.cpp:100
expix2
guint32 * expix2
Definition:
filters.cpp:106
Generated on Mon Nov 25 2024 03:16:13 for MythTV by
1.8.17