Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
external
libvpx
Commits
b8094425
Commit
b8094425
authored
Oct 03, 2017
by
Linfeng Zhang
Browse files
Update vp9_scale_and_extend_frame_ssse3()
Change-Id: I22622faebfcc36f7a4d1f37e3800ae8ab87c8cd4
parent
9a71811d
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
175 additions
and
168 deletions
+175
-168
test/vp9_scale_test.cc
test/vp9_scale_test.cc
+14
-6
vp9/encoder/x86/vp9_frame_scale_ssse3.c
vp9/encoder/x86/vp9_frame_scale_ssse3.c
+161
-162
No files found.
test/vp9_scale_test.cc
View file @
b8094425
...
...
@@ -48,17 +48,19 @@ class ScaleTest : public VpxScaleBase,
}
void
RunTest
()
{
static
const
int
kNumSizesToTest
=
4
;
static
const
int
kNumSizesToTest
=
20
;
static
const
int
kNumScaleFactorsToTest
=
4
;
static
const
int
kWidthsToTest
[]
=
{
16
,
32
,
48
,
64
};
static
const
int
kHeightsToTest
[]
=
{
16
,
20
,
24
,
28
};
static
const
int
kSizesToTest
[]
=
{
2
,
4
,
6
,
8
,
10
,
12
,
14
,
16
,
18
,
20
,
22
,
24
,
26
,
28
,
30
,
32
,
34
,
68
,
128
,
134
};
static
const
int
kScaleFactors
[]
=
{
1
,
2
,
3
,
4
};
for
(
INTERP_FILTER
filter_type
=
0
;
filter_type
<
4
;
++
filter_type
)
{
for
(
int
phase_scaler
=
0
;
phase_scaler
<
16
;
++
phase_scaler
)
{
for
(
int
h
=
0
;
h
<
kNumSizesToTest
;
++
h
)
{
const
int
src_height
=
k
Height
sToTest
[
h
];
const
int
src_height
=
k
Size
sToTest
[
h
];
for
(
int
w
=
0
;
w
<
kNumSizesToTest
;
++
w
)
{
const
int
src_width
=
k
Width
sToTest
[
w
];
const
int
src_width
=
k
Size
sToTest
[
w
];
for
(
int
sf_up_idx
=
0
;
sf_up_idx
<
kNumScaleFactorsToTest
;
++
sf_up_idx
)
{
const
int
sf_up
=
kScaleFactors
[
sf_up_idx
];
...
...
@@ -71,7 +73,13 @@ class ScaleTest : public VpxScaleBase,
continue
;
}
// I420 frame width and height must be even.
if
(
dst_width
&
1
||
dst_height
&
1
)
{
if
(
!
dst_width
||
!
dst_height
||
dst_width
&
1
||
dst_height
&
1
)
{
continue
;
}
// vpx_convolve8_c() has restriction on the step which cannot
// exceed 64 (ratio 1 to 4).
if
(
src_width
>
4
*
dst_width
||
src_height
>
4
*
dst_height
)
{
continue
;
}
ASSERT_NO_FATAL_FAILURE
(
ResetScaleImages
(
...
...
vp9/encoder/x86/vp9_frame_scale_ssse3.c
View file @
b8094425
...
...
@@ -13,158 +13,147 @@
#include "./vp9_rtcd.h"
#include "./vpx_dsp_rtcd.h"
#include "./vpx_scale_rtcd.h"
#include "vpx_dsp/x86/convolve_ssse3.h"
#include "vpx_dsp/x86/mem_sse2.h"
#include "vpx_scale/yv12config.h"
static
void
downsample_2_to_1_ssse3
(
const
uint8_t
*
src
,
ptrdiff_t
src_stride
,
uint8_t
*
dst
,
ptrdiff_t
dst_stride
,
int
w
,
int
h
)
{
static
void
scale_plane_2_to_1_phase_0
(
const
uint8_t
*
src
,
const
ptrdiff_t
src_stride
,
uint8_t
*
dst
,
const
ptrdiff_t
dst_stride
,
const
int
dst_w
,
const
int
dst_h
)
{
const
__m128i
mask
=
_mm_set1_epi16
(
0x00FF
);
const
int
max_width
=
w
&
~
15
;
int
y
;
for
(
y
=
0
;
y
<
h
;
++
y
)
{
int
x
;
for
(
x
=
0
;
x
<
max_width
;
x
+=
16
)
{
const
__m128i
a
=
_mm_loadu_si128
((
const
__m128i
*
)(
src
+
x
*
2
+
0
));
const
__m128i
b
=
_mm_loadu_si128
((
const
__m128i
*
)(
src
+
x
*
2
+
16
));
const
int
max_width
=
(
dst_w
+
15
)
&
~
15
;
int
y
=
dst_h
;
do
{
int
x
=
max_width
;
do
{
const
__m128i
a
=
_mm_loadu_si128
((
const
__m128i
*
)(
src
+
0
));
const
__m128i
b
=
_mm_loadu_si128
((
const
__m128i
*
)(
src
+
16
));
const
__m128i
a_and
=
_mm_and_si128
(
a
,
mask
);
const
__m128i
b_and
=
_mm_and_si128
(
b
,
mask
);
const
__m128i
c
=
_mm_packus_epi16
(
a_and
,
b_and
);
_mm_storeu_si128
((
__m128i
*
)(
dst
+
x
),
c
);
}
for
(;
x
<
w
;
++
x
)
dst
[
x
]
=
src
[
x
*
2
];
src
+=
src_stride
*
2
;
dst
+=
dst_stride
;
}
_mm_storeu_si128
((
__m128i
*
)
dst
,
c
);
src
+=
32
;
dst
+=
16
;
x
-=
16
;
}
while
(
x
);
src
+=
2
*
(
src_stride
-
max_width
);
dst
+=
dst_stride
-
max_width
;
}
while
(
--
y
);
}
static
INLINE
__m128i
filter
(
const
__m128i
*
const
a
,
const
__m128i
*
const
b
,
const
__m128i
*
const
c
,
const
__m128i
*
const
d
,
const
__m128i
*
const
e
,
const
__m128i
*
const
f
,
const
__m128i
*
const
g
,
const
__m128i
*
const
h
)
{
// TODO(linfengz): hard coded coefficients should be replaced with general
// coefficients
// reading.
const
__m128i
coeffs_ab
=
_mm_set_epi8
(
6
,
-
1
,
6
,
-
1
,
6
,
-
1
,
6
,
-
1
,
6
,
-
1
,
6
,
-
1
,
6
,
-
1
,
6
,
-
1
);
const
__m128i
coeffs_cd
=
_mm_set_epi8
(
78
,
-
19
,
78
,
-
19
,
78
,
-
19
,
78
,
-
19
,
78
,
-
19
,
78
,
-
19
,
78
,
-
19
,
78
,
-
19
);
const
__m128i
const64_x16
=
_mm_set1_epi16
(
64
);
const
__m128i
ab
=
_mm_unpacklo_epi8
(
*
a
,
*
b
);
const
__m128i
cd
=
_mm_unpacklo_epi8
(
*
c
,
*
d
);
const
__m128i
fe
=
_mm_unpacklo_epi8
(
*
f
,
*
e
);
const
__m128i
hg
=
_mm_unpacklo_epi8
(
*
h
,
*
g
);
const
__m128i
ab_terms
=
_mm_maddubs_epi16
(
ab
,
coeffs_ab
);
const
__m128i
cd_terms
=
_mm_maddubs_epi16
(
cd
,
coeffs_cd
);
const
__m128i
fe_terms
=
_mm_maddubs_epi16
(
fe
,
coeffs_cd
);
const
__m128i
hg_terms
=
_mm_maddubs_epi16
(
hg
,
coeffs_ab
);
// can not overflow
const
__m128i
abcd_terms
=
_mm_add_epi16
(
ab_terms
,
cd_terms
);
// can not overflow
const
__m128i
fehg_terms
=
_mm_add_epi16
(
fe_terms
,
hg_terms
);
// can overflow, use saturating add
const
__m128i
terms
=
_mm_adds_epi16
(
abcd_terms
,
fehg_terms
);
const
__m128i
round
=
_mm_adds_epi16
(
terms
,
const64_x16
);
const
__m128i
shift
=
_mm_srai_epi16
(
round
,
7
);
return
_mm_packus_epi16
(
shift
,
shift
);
static
INLINE
__m128i
scale_1_to_2_phase_0_kernel
(
const
__m128i
*
const
s
,
const
__m128i
*
const
f
)
{
__m128i
ss
[
4
],
temp
;
ss
[
0
]
=
_mm_unpacklo_epi8
(
s
[
0
],
s
[
1
]);
ss
[
1
]
=
_mm_unpacklo_epi8
(
s
[
2
],
s
[
3
]);
ss
[
2
]
=
_mm_unpacklo_epi8
(
s
[
4
],
s
[
5
]);
ss
[
3
]
=
_mm_unpacklo_epi8
(
s
[
6
],
s
[
7
]);
temp
=
convolve8_8_ssse3
(
ss
,
f
);
return
_mm_packus_epi16
(
temp
,
temp
);
}
static
void
eight_tap_row_ssse3
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
int
w
)
{
const
int
max_width
=
w
&
~
7
;
int
x
=
0
;
for
(;
x
<
max_width
;
x
+=
8
)
{
const
__m128i
a
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
0
));
const
__m128i
b
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
1
));
const
__m128i
c
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
2
));
const
__m128i
d
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
3
));
const
__m128i
e
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
4
));
const
__m128i
f
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
5
));
const
__m128i
g
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
6
));
const
__m128i
h
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
7
));
const
__m128i
pack
=
filter
(
&
a
,
&
b
,
&
c
,
&
d
,
&
e
,
&
f
,
&
g
,
&
h
);
_mm_storel_epi64
((
__m128i
*
)(
dst
+
x
),
pack
);
}
// Only calculate odd columns since even columns are just src pixels' copies.
static
void
scale_1_to_2_phase_0_row
(
const
uint8_t
*
src
,
uint8_t
*
dst
,
const
int
w
,
const
__m128i
*
const
f
)
{
int
x
=
w
;
do
{
__m128i
s
[
8
],
temp
;
s
[
0
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
0
));
s
[
1
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
1
));
s
[
2
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
2
));
s
[
3
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
3
));
s
[
4
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
4
));
s
[
5
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
5
));
s
[
6
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
6
));
s
[
7
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
7
));
temp
=
scale_1_to_2_phase_0_kernel
(
s
,
f
);
_mm_storel_epi64
((
__m128i
*
)
dst
,
temp
);
src
+=
8
;
dst
+=
8
;
x
-=
8
;
}
while
(
x
);
}
static
void
upsample_1_to_2_ssse3
(
const
uint8_t
*
src
,
ptrdiff_t
src_stride
,
uint8_t
*
dst
,
ptrdiff_t
dst_stride
,
int
dst_w
,
int
dst_h
)
{
dst_w
/=
2
;
dst_h
/=
2
;
{
DECLARE_ALIGNED
(
16
,
uint8_t
,
tmp
[
1920
*
8
]);
uint8_t
*
tmp0
=
tmp
+
dst_w
*
0
;
uint8_t
*
tmp1
=
tmp
+
dst_w
*
1
;
uint8_t
*
tmp2
=
tmp
+
dst_w
*
2
;
uint8_t
*
tmp3
=
tmp
+
dst_w
*
3
;
uint8_t
*
tmp4
=
tmp
+
dst_w
*
4
;
uint8_t
*
tmp5
=
tmp
+
dst_w
*
5
;
uint8_t
*
tmp6
=
tmp
+
dst_w
*
6
;
uint8_t
*
tmp7
=
tmp
+
dst_w
*
7
;
uint8_t
*
tmp8
=
NULL
;
const
int
max_width
=
dst_w
&
~
7
;
int
y
;
eight_tap_row_ssse3
(
src
-
src_stride
*
3
-
3
,
tmp0
,
dst_w
);
eight_tap_row_ssse3
(
src
-
src_stride
*
2
-
3
,
tmp1
,
dst_w
);
eight_tap_row_ssse3
(
src
-
src_stride
*
1
-
3
,
tmp2
,
dst_w
);
eight_tap_row_ssse3
(
src
+
src_stride
*
0
-
3
,
tmp3
,
dst_w
);
eight_tap_row_ssse3
(
src
+
src_stride
*
1
-
3
,
tmp4
,
dst_w
);
eight_tap_row_ssse3
(
src
+
src_stride
*
2
-
3
,
tmp5
,
dst_w
);
eight_tap_row_ssse3
(
src
+
src_stride
*
3
-
3
,
tmp6
,
dst_w
);
for
(
y
=
0
;
y
<
dst_h
;
y
++
)
{
int
x
;
eight_tap_row_ssse3
(
src
+
src_stride
*
4
-
3
,
tmp7
,
dst_w
);
for
(
x
=
0
;
x
<
max_width
;
x
+=
8
)
{
const
__m128i
A
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
));
const
__m128i
B
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp3
+
x
));
const
__m128i
AB
=
_mm_unpacklo_epi8
(
A
,
B
);
__m128i
C
,
D
,
CD
;
_mm_storeu_si128
((
__m128i
*
)(
dst
+
x
*
2
),
AB
);
{
const
__m128i
a
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
-
src_stride
*
3
));
const
__m128i
b
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
-
src_stride
*
2
));
const
__m128i
c
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
-
src_stride
*
1
));
const
__m128i
d
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
src_stride
*
0
));
const
__m128i
e
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
src_stride
*
1
));
const
__m128i
f
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
src_stride
*
2
));
const
__m128i
g
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
src_stride
*
3
));
const
__m128i
h
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
+
src_stride
*
4
));
C
=
filter
(
&
a
,
&
b
,
&
c
,
&
d
,
&
e
,
&
f
,
&
g
,
&
h
);
}
{
const
__m128i
a
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp0
+
x
));
const
__m128i
b
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp1
+
x
));
const
__m128i
c
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp2
+
x
));
const
__m128i
d
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp3
+
x
));
const
__m128i
e
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp4
+
x
));
const
__m128i
f
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp5
+
x
));
const
__m128i
g
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp6
+
x
));
const
__m128i
h
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp7
+
x
));
D
=
filter
(
&
a
,
&
b
,
&
c
,
&
d
,
&
e
,
&
f
,
&
g
,
&
h
);
}
CD
=
_mm_unpacklo_epi8
(
C
,
D
);
_mm_storeu_si128
((
__m128i
*
)(
dst
+
x
*
2
+
dst_stride
),
CD
);
}
src
+=
src_stride
;
dst
+=
dst_stride
*
2
;
tmp8
=
tmp0
;
tmp0
=
tmp1
;
tmp1
=
tmp2
;
tmp2
=
tmp3
;
tmp3
=
tmp4
;
tmp4
=
tmp5
;
tmp5
=
tmp6
;
tmp6
=
tmp7
;
tmp7
=
tmp8
;
static
void
scale_plane_1_to_2_phase_0
(
const
uint8_t
*
src
,
const
ptrdiff_t
src_stride
,
uint8_t
*
dst
,
const
ptrdiff_t
dst_stride
,
const
int
src_w
,
const
int
src_h
,
const
int16_t
*
const
coef
,
uint8_t
*
const
temp_buffer
)
{
int
max_width
;
int
y
;
uint8_t
*
tmp
[
9
];
__m128i
f
[
4
];
max_width
=
(
src_w
+
7
)
&
~
7
;
tmp
[
0
]
=
temp_buffer
+
0
*
max_width
;
tmp
[
1
]
=
temp_buffer
+
1
*
max_width
;
tmp
[
2
]
=
temp_buffer
+
2
*
max_width
;
tmp
[
3
]
=
temp_buffer
+
3
*
max_width
;
tmp
[
4
]
=
temp_buffer
+
4
*
max_width
;
tmp
[
5
]
=
temp_buffer
+
5
*
max_width
;
tmp
[
6
]
=
temp_buffer
+
6
*
max_width
;
tmp
[
7
]
=
temp_buffer
+
7
*
max_width
;
shuffle_filter_ssse3
(
coef
,
f
);
scale_1_to_2_phase_0_row
(
src
-
3
*
src_stride
-
3
,
tmp
[
0
],
max_width
,
f
);
scale_1_to_2_phase_0_row
(
src
-
2
*
src_stride
-
3
,
tmp
[
1
],
max_width
,
f
);
scale_1_to_2_phase_0_row
(
src
-
1
*
src_stride
-
3
,
tmp
[
2
],
max_width
,
f
);
scale_1_to_2_phase_0_row
(
src
+
0
*
src_stride
-
3
,
tmp
[
3
],
max_width
,
f
);
scale_1_to_2_phase_0_row
(
src
+
1
*
src_stride
-
3
,
tmp
[
4
],
max_width
,
f
);
scale_1_to_2_phase_0_row
(
src
+
2
*
src_stride
-
3
,
tmp
[
5
],
max_width
,
f
);
scale_1_to_2_phase_0_row
(
src
+
3
*
src_stride
-
3
,
tmp
[
6
],
max_width
,
f
);
y
=
src_h
;
do
{
int
x
;
scale_1_to_2_phase_0_row
(
src
+
4
*
src_stride
-
3
,
tmp
[
7
],
max_width
,
f
);
for
(
x
=
0
;
x
<
max_width
;
x
+=
8
)
{
__m128i
s
[
8
],
C
,
D
,
CD
;
// Even rows
const
__m128i
a
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src
+
x
));
const
__m128i
b
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
3
]
+
x
));
const
__m128i
ab
=
_mm_unpacklo_epi8
(
a
,
b
);
_mm_storeu_si128
((
__m128i
*
)(
dst
+
2
*
x
),
ab
);
// Odd rows
// Even columns
load_8bit_8x8
(
src
+
x
-
3
*
src_stride
,
src_stride
,
s
);
C
=
scale_1_to_2_phase_0_kernel
(
s
,
f
);
// Odd columns
s
[
0
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
0
]
+
x
));
s
[
1
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
1
]
+
x
));
s
[
2
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
2
]
+
x
));
s
[
3
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
3
]
+
x
));
s
[
4
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
4
]
+
x
));
s
[
5
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
5
]
+
x
));
s
[
6
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
6
]
+
x
));
s
[
7
]
=
_mm_loadl_epi64
((
const
__m128i
*
)(
tmp
[
7
]
+
x
));
D
=
scale_1_to_2_phase_0_kernel
(
s
,
f
);
CD
=
_mm_unpacklo_epi8
(
C
,
D
);
_mm_storeu_si128
((
__m128i
*
)(
dst
+
dst_stride
+
2
*
x
),
CD
);
}
}
src
+=
src_stride
;
dst
+=
2
*
dst_stride
;
tmp
[
8
]
=
tmp
[
0
];
tmp
[
0
]
=
tmp
[
1
];
tmp
[
1
]
=
tmp
[
2
];
tmp
[
2
]
=
tmp
[
3
];
tmp
[
3
]
=
tmp
[
4
];
tmp
[
4
]
=
tmp
[
5
];
tmp
[
5
]
=
tmp
[
6
];
tmp
[
6
]
=
tmp
[
7
];
tmp
[
7
]
=
tmp
[
8
];
}
while
(
--
y
);
}
void
vp9_scale_and_extend_frame_ssse3
(
const
YV12_BUFFER_CONFIG
*
src
,
...
...
@@ -174,33 +163,43 @@ void vp9_scale_and_extend_frame_ssse3(const YV12_BUFFER_CONFIG *src,
const
int
src_h
=
src
->
y_crop_height
;
const
int
dst_w
=
dst
->
y_crop_width
;
const
int
dst_h
=
dst
->
y_crop_height
;
const
int
dst_uv_w
=
dst_w
/
2
;
const
int
dst_uv_h
=
dst_h
/
2
;
int
scaled
=
0
;
if
(
dst_w
*
2
==
src_w
&&
dst_h
*
2
==
src_h
&&
phase_scaler
==
0
)
{
downsample_2_to_1_ssse3
(
src
->
y_buffer
,
src
->
y_stride
,
dst
->
y_buffer
,
dst
->
y_stride
,
dst_w
,
dst_h
);
downsample_2_to_1_ssse3
(
src
->
u_buffer
,
src
->
uv_stride
,
dst
->
u_buffer
,
dst
->
uv_stride
,
dst_uv_w
,
dst_uv_h
);
downsample_2_to_1_ssse3
(
src
->
v_buffer
,
src
->
uv_stride
,
dst
->
v_buffer
,
dst
->
uv_stride
,
dst_uv_w
,
dst_uv_h
);
vpx_extend_frame_borders
(
dst
);
}
else
if
(
dst_w
==
src_w
*
2
&&
dst_h
==
src_h
*
2
&&
filter_type
==
0
&&
phase_scaler
==
0
)
{
// The upsample() supports widths up to 1920 * 2. If greater, fall back
// to vp9_scale_and_extend_frame_c().
if
(
dst_w
/
2
<=
1920
)
{
upsample_1_to_2_ssse3
(
src
->
y_buffer
,
src
->
y_stride
,
dst
->
y_buffer
,
dst
->
y_stride
,
dst_w
,
dst_h
);
upsample_1_to_2_ssse3
(
src
->
u_buffer
,
src
->
uv_stride
,
dst
->
u_buffer
,
dst
->
uv_stride
,
dst_uv_w
,
dst_uv_h
);
upsample_1_to_2_ssse3
(
src
->
v_buffer
,
src
->
uv_stride
,
dst
->
v_buffer
,
dst
->
uv_stride
,
dst_uv_w
,
dst_uv_h
);
vpx_extend_frame_borders
(
dst
);
}
else
{
vp9_scale_and_extend_frame_c
(
src
,
dst
,
filter_type
,
phase_scaler
);
// 2 to 1
const
int
dst_uv_w
=
dst_w
/
2
;
const
int
dst_uv_h
=
dst_h
/
2
;
scaled
=
1
;
scale_plane_2_to_1_phase_0
(
src
->
y_buffer
,
src
->
y_stride
,
dst
->
y_buffer
,
dst
->
y_stride
,
dst_w
,
dst_h
);
scale_plane_2_to_1_phase_0
(
src
->
u_buffer
,
src
->
uv_stride
,
dst
->
u_buffer
,
dst
->
uv_stride
,
dst_uv_w
,
dst_uv_h
);
scale_plane_2_to_1_phase_0
(
src
->
v_buffer
,
src
->
uv_stride
,
dst
->
v_buffer
,
dst
->
uv_stride
,
dst_uv_w
,
dst_uv_h
);
}
else
if
(
dst_w
==
src_w
*
2
&&
dst_h
==
src_h
*
2
&&
phase_scaler
==
0
)
{
// 1 to 2
uint8_t
*
const
temp_buffer
=
(
uint8_t
*
)
malloc
(
8
*
((
src_w
+
7
)
&
~
7
));
if
(
temp_buffer
)
{
scaled
=
1
;
scale_plane_1_to_2_phase_0
(
src
->
y_buffer
,
src
->
y_stride
,
dst
->
y_buffer
,
dst
->
y_stride
,
src_w
,
src_h
,
vp9_filter_kernels
[
filter_type
][
8
],
temp_buffer
);
scale_plane_1_to_2_phase_0
(
src
->
u_buffer
,
src
->
uv_stride
,
dst
->
u_buffer
,
dst
->
uv_stride
,
src_w
/
2
,
src_h
/
2
,
vp9_filter_kernels
[
filter_type
][
8
],
temp_buffer
);
scale_plane_1_to_2_phase_0
(
src
->
v_buffer
,
src
->
uv_stride
,
dst
->
v_buffer
,
dst
->
uv_stride
,
src_w
/
2
,
src_h
/
2
,
vp9_filter_kernels
[
filter_type
][
8
],
temp_buffer
);
free
(
temp_buffer
);
}
}
if
(
scaled
)
{
vpx_extend_frame_borders
(
dst
);
}
else
{
// Call c version for all other scaling ratios.
vp9_scale_and_extend_frame_c
(
src
,
dst
,
filter_type
,
phase_scaler
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment