video-scaler: add support for monochroma formats

Add support for scaling of images with pstride == 1. This can be used
to scale individual planes later.
Rework some of the scaling code to take the pstride as a parameter.
This commit is contained in:
Wim Taymans 2015-01-27 10:04:11 +01:00
parent 3db8879f25
commit ba98d06767
2 changed files with 289 additions and 179 deletions

View file

@ -1312,6 +1312,14 @@ x4 addb ayuv, ayuv2, c128
ldresnearl d1, s1, p1, p2
.function video_orc_resample_h_2tap_u8_lq
.dest 1 d1 guint8
.source 1 s1 guint8
.param 4 p1
.param 4 p2
ldreslinb d1, s1, p1, p2
.function video_orc_resample_h_2tap_4u8_lq
.dest 4 d1 guint32
.source 4 s1 guint32
@ -1321,9 +1329,9 @@ ldresnearl d1, s1, p1, p2
ldreslinl d1, s1, p1, p2
.function video_orc_resample_v_2tap_u8_lq
.source 1 src1 guint32
.source 1 src2 guint32
.dest 1 dest guint32
.source 1 src1 guint8
.source 1 src2 guint8
.dest 1 dest guint8
.param 2 p1 gint16
.temp 1 t
.temp 2 w1
@ -1338,9 +1346,9 @@ convhwb t, w2
addb dest, t, src1
.function video_orc_resample_v_2tap_u16
.source 2 src1 guint64
.source 2 src2 guint64
.dest 2 dest guint64
.source 2 src1 guint16
.source 2 src2 guint16
.dest 2 dest guint16
.param 2 p1 gint16
.temp 4 l1
.temp 4 l2
@ -1357,9 +1365,9 @@ addl l1, l1, l2
convsuslw dest, l1
.function video_orc_resample_v_2tap_u8
.source 1 s1 guint32
.source 1 s2 guint32
.dest 1 d1 guint32
.source 1 s1 guint8
.source 1 s2 guint8
.dest 1 d1 guint8
.param 2 p1 gint16
.temp 1 t
.temp 2 w1
@ -1378,11 +1386,11 @@ addw w2, w2, w1
convsuswb d1, w2
.function video_orc_resample_v_4tap_u8_lq
.source 1 s1 guint32
.source 1 s2 guint32
.source 1 s3 guint32
.source 1 s4 guint32
.dest 1 d1 guint32
.source 1 s1 guint8
.source 1 s2 guint8
.source 1 s3 guint8
.source 1 s4 guint8
.dest 1 d1 guint8
.param 2 p1 gint16
.param 2 p2 gint16
.param 2 p3 gint16
@ -1406,11 +1414,11 @@ shrsw w1, w1, 6
convsuswb d1, w1
.function video_orc_resample_v_4tap_u8
.source 1 s1 guint32
.source 1 s2 guint32
.source 1 s3 guint32
.source 1 s4 guint32
.dest 1 d1 guint32
.source 1 s1 guint8
.source 1 s2 guint8
.source 1 s3 guint8
.source 1 s4 guint8
.dest 1 d1 guint8
.param 2 p1 gint16
.param 2 p2 gint16
.param 2 p3 gint16
@ -1438,10 +1446,10 @@ convsuswb d1, w1
# crashes ORC for now but is potentially faster
#.function video_orc_resample_h_4tap_u8
#.source 1 s1 guint32
#.source 1 s2 guint32
#.source 1 s3 guint32
#.source 1 s4 guint32
#.source 1 s1 guint8
#.source 1 s2 guint8
#.source 1 s3 guint8
#.source 1 s4 guint8
#.source 2 t1 gint16
#.source 2 t2 gint16
#.source 2 t3 gint16
@ -1469,7 +1477,7 @@ convsuswb d1, w1
#convsuswb d1, w1
.function video_orc_resample_h_multaps_u8
.source 1 s guint32
.source 1 s guint8
.source 2 t gint16
.dest 4 d gint32
.temp 2 w1
@ -1479,7 +1487,7 @@ mulswl d, w1, t
.function video_orc_resample_h_muladdtaps_u8
.flags 2d
.source 1 s guint32
.source 1 s guint8
.source 2 t gint16
.dest 4 d gint32
.temp 2 w1
@ -1491,7 +1499,7 @@ addl d, d, t1
.function video_orc_resample_scaletaps_u8
.source 4 s gint32
.dest 1 d guint32
.dest 1 d guint8
.temp 2 w1
.temp 4 t1
@ -1501,9 +1509,9 @@ convsuslw w1, t1
convsuswb d, w1
.function video_orc_resample_h_multaps_u8_lq
.source 1 s guint32
.source 1 s guint8
.source 2 t gint16
.dest 2 d gint32
.dest 2 d gint16
.temp 2 w1
convubw w1, s
@ -1511,9 +1519,9 @@ mullw d, w1, t
.function video_orc_resample_h_muladdtaps_u8_lq
.flags 2d
.source 1 s guint32
.source 1 s guint8
.source 2 t gint16
.dest 2 d gint32
.dest 2 d gint16
.temp 2 w1
convubw w1, s
@ -1521,13 +1529,13 @@ mullw w1, w1, t
addw d, d, w1
.function video_orc_resample_h_multaps3_u8_lq
.source 1 s1 guint32
.source 1 s2 guint32
.source 1 s3 guint32
.source 1 s1 guint8
.source 1 s2 guint8
.source 1 s3 guint8
.source 2 t1 gint16
.source 2 t2 gint16
.source 2 t3 gint16
.dest 2 d gint32
.dest 2 d gint16
.temp 2 w1
.temp 2 w2
@ -1541,13 +1549,13 @@ mullw w2, w2, t3
addw d, w1, w2
.function video_orc_resample_h_muladdtaps3_u8_lq
.source 1 s1 guint32
.source 1 s2 guint32
.source 1 s3 guint32
.source 1 s1 guint8
.source 1 s2 guint8
.source 1 s3 guint8
.source 2 t1 gint16
.source 2 t2 gint16
.source 2 t3 gint16
.dest 2 d gint32
.dest 2 d gint16
.temp 2 w1
.temp 2 w2
@ -1562,14 +1570,14 @@ addw w1, w1, w2
addw d, d, w1
.function video_orc_resample_h_muladdscaletaps3_u8_lq
.source 1 s1 guint32
.source 1 s2 guint32
.source 1 s3 guint32
.source 1 s1 guint8
.source 1 s2 guint8
.source 1 s3 guint8
.source 2 t1 gint16
.source 2 t2 gint16
.source 2 t3 gint16
.source 2 temp gint32
.dest 1 d guint32
.source 2 temp gint16
.dest 1 d guint8
.temp 2 w1
.temp 2 w2
@ -1587,8 +1595,8 @@ shrsw w1, w1, 6
convsuswb d, w1
.function video_orc_resample_scaletaps_u8_lq
.source 2 s gint32
.dest 1 d guint32
.source 2 s gint16
.dest 1 d guint8
.temp 2 w1
addw w1, s, 32
@ -1596,7 +1604,7 @@ shrsw w1, w1, 6
convsuswb d, w1
.function video_orc_resample_h_multaps_u16
.source 2 s guint64
.source 2 s guint16
.source 2 t gint16
.dest 4 d gint32
.temp 4 l1
@ -1608,7 +1616,7 @@ mulll d, l1, l2
.function video_orc_resample_h_muladdtaps_u16
.flags 2d
.source 2 s guint64
.source 2 s guint16
.source 2 t gint16
.dest 4 d gint32
.temp 4 l1
@ -1621,7 +1629,7 @@ addl d, d, l1
.function video_orc_resample_scaletaps_u16
.source 4 s gint32
.dest 2 d guint64
.dest 2 d guint16
.temp 4 t1
addl t1, s, 4095
@ -1629,7 +1637,7 @@ shrsl t1, t1, 12
convsuslw d, t1
.function video_orc_resample_v_multaps_u8
.source 1 s guint32
.source 1 s guint8
.param 2 t gint16
.dest 4 d gint32
.temp 2 w1
@ -1638,7 +1646,7 @@ convubw w1, s
mulswl d, w1, t
.function video_orc_resample_v_muladdtaps_u8
.source 1 s guint32
.source 1 s guint8
.param 2 t gint16
.dest 4 d gint32
.temp 2 w1
@ -1649,7 +1657,7 @@ mulswl t1, w1, t
addl d, d, t1
.function video_orc_resample_v_multaps_u16
.source 2 s guint64
.source 2 s guint16
.param 2 t gint16
.dest 4 d gint32
.temp 4 l1
@ -1658,7 +1666,7 @@ convuwl l1, s
mulll d, l1, t
.function video_orc_resample_v_muladdtaps_u16
.source 2 s guint64
.source 2 s guint16
.param 2 t gint16
.dest 4 d gint32
.temp 4 t1
@ -1670,24 +1678,24 @@ mulll t1, t1, t2
addl d, d, t1
.function video_orc_resample_v_multaps_u8_lq
.source 1 s guint32
.source 1 s guint8
.param 2 t gint16
.dest 2 d gint32
.dest 2 d gint16
.temp 2 w1
convubw w1, s
mullw d, w1, t
.function video_orc_resample_v_multaps4_u8_lq
.source 1 s1 guint32
.source 1 s2 guint32
.source 1 s3 guint32
.source 1 s4 guint32
.source 1 s1 guint8
.source 1 s2 guint8
.source 1 s3 guint8
.source 1 s4 guint8
.param 2 t1 gint16
.param 2 t2 gint16
.param 2 t3 gint16
.param 2 t4 gint16
.dest 2 d gint32
.dest 2 d gint16
.temp 2 w1
.temp 2 w2
@ -1704,9 +1712,9 @@ mullw w2, w2, t4
addw d, w1, w2
.function video_orc_resample_v_muladdtaps_u8_lq
.source 1 s guint32
.source 1 s guint8
.param 2 t gint16
.dest 2 d gint32
.dest 2 d gint16
.temp 2 w1
convubw w1, s
@ -1714,15 +1722,15 @@ mullw w1, w1, t
addw d, d, w1
.function video_orc_resample_v_muladdtaps4_u8_lq
.source 1 s1 guint32
.source 1 s2 guint32
.source 1 s3 guint32
.source 1 s4 guint32
.source 1 s1 guint8
.source 1 s2 guint8
.source 1 s3 guint8
.source 1 s4 guint8
.param 2 t1 gint16
.param 2 t2 gint16
.param 2 t3 gint16
.param 2 t4 gint16
.dest 2 d gint32
.dest 2 d gint16
.temp 2 w1
.temp 2 w2
@ -1740,16 +1748,16 @@ addw w1, w1, w2
addw d, d, w1
.function video_orc_resample_v_muladdscaletaps4_u8_lq
.source 1 s1 guint32
.source 1 s2 guint32
.source 1 s3 guint32
.source 1 s4 guint32
.source 2 temp gint32
.source 1 s1 guint8
.source 1 s2 guint8
.source 1 s3 guint8
.source 1 s4 guint8
.source 2 temp gint16
.param 2 t1 gint16
.param 2 t2 gint16
.param 2 t3 gint16
.param 2 t4 gint16
.dest 1 d guint32
.dest 1 d guint8
.temp 2 w1
.temp 2 w2

View file

@ -44,9 +44,10 @@
#define LQ
typedef void (*GstVideoScalerHFunc) (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width);
gpointer src, gpointer dest, guint dest_offset, guint width, guint pstride);
typedef void (*GstVideoScalerVFunc) (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width);
gpointer srcs[], gpointer dest, guint dest_offset, guint width,
guint pstride);
struct _GstVideoScaler
{
@ -372,9 +373,27 @@ make_s16_taps (GstVideoScaler * scale, gint precision)
}
}
static void
video_scale_h_near_u8 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width, guint pstride)
{
guint8 *s, *d;
guint32 *offset;
d = (guint8 *) dest + dest_offset;
s = (guint8 *) src;
offset = scale->resampler.offset + dest_offset;
{
gint i;
for (i = 0; i < width; i++)
d[i] = s[offset[i]];
}
}
static void
video_scale_h_near_u32 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width)
gpointer src, gpointer dest, guint dest_offset, guint width, guint pstride)
{
guint32 *s, *d, *offset;
@ -398,7 +417,7 @@ video_scale_h_near_u32 (GstVideoScaler * scale,
static void
video_scale_h_near_u64 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width)
gpointer src, gpointer dest, guint dest_offset, guint width, guint pstride)
{
guint64 *s, *d;
gint i;
@ -412,10 +431,21 @@ video_scale_h_near_u64 (GstVideoScaler * scale,
d[i] = s[offset[i]];
}
static void
video_scale_h_2tap_u8 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width, guint pstride)
{
guint8 *s, *d;
d = (guint8 *) dest + dest_offset;
s = (guint8 *) src;
video_orc_resample_h_2tap_u8_lq (d, s, 0, scale->inc, width);
}
static void
video_scale_h_2tap_4u8 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width)
gpointer src, gpointer dest, guint dest_offset, guint width, guint pstride)
{
guint32 *s, *d;
@ -426,15 +456,15 @@ video_scale_h_2tap_4u8 (GstVideoScaler * scale,
}
static void
video_scale_h_ntap_4u8 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width)
video_scale_h_ntap_u8 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width, guint pstride)
{
gint16 *taps;
gint max_taps, count;
guint32 *d, *s;
gint i, max_taps, count;
gpointer d;
guint32 *offset_n;
guint32 *pixels;
gint32 *temp;
guint8 *pixels;
gint16 *temp;
if (scale->taps_s16 == NULL)
#ifdef LQ
@ -446,62 +476,77 @@ video_scale_h_ntap_4u8 (GstVideoScaler * scale,
max_taps = scale->resampler.max_taps;
offset_n = scale->offset_n;
d = (guint32 *) dest + dest_offset;
s = (guint32 *) src;
pixels = (guint8 *) scale->tmpline1;
/* prepare the arrays */
count = width * max_taps;
pixels = (guint32 *) scale->tmpline1;
#if 0
video_orc_resample_h_near_u32 (pixels, s, offset_n, count);
#else
{
gint i;
for (i = 0; i < count; i++)
pixels[i] = s[offset_n[i]];
}
#endif
switch (pstride) {
case 1:
{
guint8 *s = (guint8 *) src;
temp = (gint32 *) scale->tmpline2;
for (i = 0; i < count; i++)
pixels[i] = s[offset_n[i]];
d = (guint8 *) dest + dest_offset;
break;
}
case 4:
{
guint32 *p32 = (guint32 *) pixels;
guint32 *s = (guint32 *) src;
#if 0
video_orc_resample_h_near_u32 (p32, s, offset_n, count);
#else
for (i = 0; i < count; i++)
p32[i] = s[offset_n[i]];
#endif
d = (guint32 *) dest + dest_offset;
break;
}
default:
return;
}
temp = (gint16 *) scale->tmpline2;
taps = scale->taps_s16_4;
count = width * 4;
count = width * pstride;
#ifdef LQ
/* first pixels with first tap to temp */
if (max_taps >= 3) {
video_orc_resample_h_multaps3_u8_lq (temp, pixels, pixels + width,
pixels + width * 2, taps, taps + count, taps + count * 2, count);
video_orc_resample_h_multaps3_u8_lq (temp, pixels, pixels + count,
pixels + count * 2, taps, taps + count, taps + count * 2, count);
max_taps -= 3;
pixels += width * 3;
pixels += count * 3;
taps += count * 3;
} else {
gint first = max_taps % 3;
video_orc_resample_h_multaps_u8_lq (temp, pixels, taps, count);
video_orc_resample_h_muladdtaps_u8_lq (temp, 0, pixels + width, count,
video_orc_resample_h_muladdtaps_u8_lq (temp, 0, pixels + count, count,
taps + count, count * 2, count, first - 1);
max_taps -= first;
pixels += width * first;
pixels += count * first;
taps += count * first;
}
while (max_taps > 3) {
if (max_taps >= 6) {
video_orc_resample_h_muladdtaps3_u8_lq (temp, pixels, pixels + width,
pixels + width * 2, taps, taps + count, taps + count * 2, count);
video_orc_resample_h_muladdtaps3_u8_lq (temp, pixels, pixels + count,
pixels + count * 2, taps, taps + count, taps + count * 2, count);
max_taps -= 3;
pixels += width * 3;
pixels += count * 3;
taps += count * 3;
} else {
video_orc_resample_h_muladdtaps_u8_lq (temp, 0, pixels, count,
taps, count * 2, count, max_taps - 3);
pixels += width * (max_taps - 3);
pixels += count * (max_taps - 3);
taps += count * (max_taps - 3);
max_taps = 3;
}
}
if (max_taps == 3) {
video_orc_resample_h_muladdscaletaps3_u8_lq (d, pixels, pixels + width,
pixels + width * 2, taps, taps + count, taps + count * 2, temp, count);
video_orc_resample_h_muladdscaletaps3_u8_lq (d, pixels, pixels + count,
pixels + count * 2, taps, taps + count, taps + count * 2, temp, count);
} else {
if (max_taps) {
/* add other pixels with other taps to t4 */
@ -515,7 +560,7 @@ video_scale_h_ntap_4u8 (GstVideoScaler * scale,
/* first pixels with first tap to t4 */
video_orc_resample_h_multaps_u8 (temp, pixels, taps, count);
/* add other pixels with other taps to t4 */
video_orc_resample_h_muladdtaps_u8 (temp, 0, pixels + width, count,
video_orc_resample_h_muladdtaps_u8 (temp, 0, pixels + count, count,
taps + count, count * 2, count, max_taps - 1);
/* scale and write final result */
video_orc_resample_scaletaps_u8 (d, temp, count);
@ -523,14 +568,14 @@ video_scale_h_ntap_4u8 (GstVideoScaler * scale,
}
static void
video_scale_h_ntap_4u16 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width)
video_scale_h_ntap_u16 (GstVideoScaler * scale,
gpointer src, gpointer dest, guint dest_offset, guint width, guint pstride)
{
gint16 *taps;
gint i, max_taps, count;
guint64 *d;
gpointer d;
guint32 *offset_n;
guint64 *pixels;
guint16 *pixels;
gint32 *temp;
if (scale->taps_s16 == NULL)
@ -539,49 +584,68 @@ video_scale_h_ntap_4u16 (GstVideoScaler * scale,
max_taps = scale->resampler.max_taps;
offset_n = scale->offset_n;
d = (guint64 *) dest + dest_offset;
pstride /= 2;
pixels = (guint16 *) scale->tmpline1;
/* prepare the arrays FIXME, we can add this into ORC */
count = width * max_taps;
pixels = (guint64 *) scale->tmpline1;
for (i = 0; i < count; i++)
pixels[i] = ((guint64 *) src)[offset_n[i]];
switch (pstride) {
case 1:
{
guint16 *s = (guint16 *) src;
for (i = 0; i < count; i++)
pixels[i] = s[offset_n[i]];
d = (guint16 *) dest + dest_offset;
break;
}
case 4:
{
guint64 *p64 = (guint64 *) pixels;
guint64 *s = (guint64 *) src;
#if 0
video_orc_resample_h_near_u32 (p32, s, offset_n, count);
#else
for (i = 0; i < count; i++)
p64[i] = s[offset_n[i]];
#endif
d = (guint64 *) dest + dest_offset;
break;
}
default:
return;
}
temp = (gint32 *) scale->tmpline2;
taps = scale->taps_s16_4;
count = width * 4;
count = width * pstride;
/* first pixels with first tap to t4 */
video_orc_resample_h_multaps_u16 (temp, pixels, taps, count);
/* add other pixels with other taps to t4 */
video_orc_resample_h_muladdtaps_u16 (temp, 0, pixels + width, count * 2,
video_orc_resample_h_muladdtaps_u16 (temp, 0, pixels + count, count * 2,
taps + count, count * 2, count, max_taps - 1);
/* scale and write final result */
video_orc_resample_scaletaps_u16 (d, temp, count);
}
static void
video_scale_v_near_u32 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width)
video_scale_v_near (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width,
guint pstride)
{
if (dest != srcs[0])
orc_memcpy (dest, srcs[0], 4 * width);
orc_memcpy (dest, srcs[0], pstride * width);
}
static void
video_scale_v_near_u64 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width)
{
if (dest != srcs[0])
orc_memcpy (dest, srcs[0], 8 * width);
}
static void
video_scale_v_2tap_4u8 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width)
video_scale_v_2tap_u8 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width,
guint pstride)
{
gint max_taps, src_inc;
guint32 *s1, *s2, *d;
guint8 *s1, *s2, *d;
gint16 p1;
if (scale->taps_s16 == NULL)
@ -598,29 +662,32 @@ video_scale_v_2tap_4u8 (GstVideoScaler * scale,
else
src_inc = 1;
d = (guint32 *) dest;
s1 = (guint32 *) srcs[0 * src_inc];
s2 = (guint32 *) srcs[1 * src_inc];
d = (guint8 *) dest;
s1 = (guint8 *) srcs[0 * src_inc];
s2 = (guint8 *) srcs[1 * src_inc];
p1 = scale->taps_s16[dest_offset * max_taps + 1];
#ifdef LQ
video_orc_resample_v_2tap_u8_lq (d, s1, s2, p1, width * 4);
video_orc_resample_v_2tap_u8_lq (d, s1, s2, p1, width * pstride);
#else
video_orc_resample_v_2tap_u8 (d, s1, s2, p1, width * 4);
video_orc_resample_v_2tap_u8 (d, s1, s2, p1, width * pstride);
#endif
}
static void
video_scale_v_2tap_4u16 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width)
video_scale_v_2tap_u16 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width,
guint pstride)
{
gint max_taps, src_inc;
guint64 *s1, *s2, *d;
guint16 *s1, *s2, *d;
gint16 p1;
if (scale->taps_s16 == NULL)
make_s16_taps (scale, SCALE_U16);
pstride /= 2;
max_taps = scale->resampler.max_taps;
if (scale->flags & GST_VIDEO_SCALER_FLAG_INTERLACED)
@ -628,12 +695,12 @@ video_scale_v_2tap_4u16 (GstVideoScaler * scale,
else
src_inc = 1;
d = (guint64 *) dest;
s1 = (guint64 *) srcs[0 * src_inc];
s2 = (guint64 *) srcs[1 * src_inc];
d = (guint16 *) dest;
s1 = (guint16 *) srcs[0 * src_inc];
s2 = (guint16 *) srcs[1 * src_inc];
p1 = scale->taps_s16[dest_offset * max_taps + 1];
video_orc_resample_v_2tap_u16 (d, s1, s2, p1, width * 4);
video_orc_resample_v_2tap_u16 (d, s1, s2, p1, width * pstride);
}
#if 0
@ -671,11 +738,12 @@ video_scale_h_4tap_8888 (GstVideoScaler * scale,
#endif
static void
video_scale_v_4tap_4u8 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width)
video_scale_v_4tap_u8 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width,
guint pstride)
{
gint max_taps;
guint32 *s1, *s2, *s3, *s4, *d;
guint8 *s1, *s2, *s3, *s4, *d;
gint p1, p2, p3, p4, src_inc;
gint16 *taps;
@ -694,11 +762,11 @@ video_scale_v_4tap_4u8 (GstVideoScaler * scale,
else
src_inc = 1;
d = (guint32 *) dest;
s1 = (guint32 *) srcs[0 * src_inc];
s2 = (guint32 *) srcs[1 * src_inc];
s3 = (guint32 *) srcs[2 * src_inc];
s4 = (guint32 *) srcs[3 * src_inc];
d = (guint8 *) dest;
s1 = (guint8 *) srcs[0 * src_inc];
s2 = (guint8 *) srcs[1 * src_inc];
s3 = (guint8 *) srcs[2 * src_inc];
s4 = (guint8 *) srcs[3 * src_inc];
p1 = taps[0];
p2 = taps[1];
p3 = taps[2];
@ -706,20 +774,22 @@ video_scale_v_4tap_4u8 (GstVideoScaler * scale,
#ifdef LQ
video_orc_resample_v_4tap_u8_lq (d, s1, s2, s3, s4, p1, p2, p3, p4,
width * 4);
width * pstride);
#else
video_orc_resample_v_4tap_u8 (d, s1, s2, s3, s4, p1, p2, p3, p4, width * 4);
video_orc_resample_v_4tap_u8 (d, s1, s2, s3, s4, p1, p2, p3, p4,
width * pstride);
#endif
}
static void
video_scale_v_ntap_4u8 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width)
video_scale_v_ntap_u8 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width,
guint pstride)
{
gint16 *taps;
gint i, max_taps, count, src_inc;
guint32 *d;
gint32 *temp;
gpointer d;
gint16 *temp;
if (scale->taps_s16 == NULL)
#ifdef LQ
@ -738,8 +808,8 @@ video_scale_v_ntap_4u8 (GstVideoScaler * scale,
else
src_inc = 1;
temp = (gint32 *) scale->tmpline2;
count = width * 4;
temp = (gint16 *) scale->tmpline2;
count = width * pstride;
#ifdef LQ
if (max_taps >= 4) {
@ -800,21 +870,24 @@ video_scale_v_ntap_4u8 (GstVideoScaler * scale,
}
static void
video_scale_v_ntap_4u16 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width)
video_scale_v_ntap_u16 (GstVideoScaler * scale,
gpointer srcs[], gpointer dest, guint dest_offset, guint width,
guint pstride)
{
gint16 *taps;
gint i, max_taps, count, src_inc;
guint64 *d;
gpointer d;
gint32 *temp;
if (scale->taps_s16 == NULL)
make_s16_taps (scale, SCALE_U16);
pstride /= 2;
max_taps = scale->resampler.max_taps;
taps = scale->taps_s16 + (scale->resampler.phase[dest_offset] * max_taps);
d = (guint64 *) dest;
d = (guint16 *) dest;
if (scale->flags & GST_VIDEO_SCALER_FLAG_INTERLACED)
src_inc = 2;
@ -822,7 +895,7 @@ video_scale_v_ntap_4u16 (GstVideoScaler * scale,
src_inc = 1;
temp = (gint32 *) scale->tmpline1;
count = width * 4;
count = width * pstride;
video_orc_resample_v_multaps_u16 (temp, srcs[0], taps[0], count);
for (i = 1; i < max_taps; i++) {
@ -861,12 +934,25 @@ gst_video_scaler_horizontal (GstVideoScaler * scale, GstVideoFormat format,
g_return_if_fail (finfo->n_planes == 1);
pstride = finfo->pixel_stride[0];
g_return_if_fail (pstride == 4 || pstride == 8);
g_return_if_fail (pstride == 1 || pstride == 4 || pstride == 8);
if (scale->tmpwidth < width)
realloc_tmplines (scale, width);
switch (pstride) {
case 1:
switch (scale->resampler.max_taps) {
case 1:
func = video_scale_h_near_u8;
break;
case 2:
func = video_scale_h_2tap_u8;
break;
default:
func = video_scale_h_ntap_u8;
break;
}
break;
case 4:
switch (scale->resampler.max_taps) {
case 1:
@ -876,7 +962,7 @@ gst_video_scaler_horizontal (GstVideoScaler * scale, GstVideoFormat format,
func = video_scale_h_2tap_4u8;
break;
default:
func = video_scale_h_ntap_4u8;
func = video_scale_h_ntap_u8;
break;
}
break;
@ -886,14 +972,14 @@ gst_video_scaler_horizontal (GstVideoScaler * scale, GstVideoFormat format,
func = video_scale_h_near_u64;
break;
default:
func = video_scale_h_ntap_4u16;
func = video_scale_h_ntap_u16;
break;
}
break;
default:
goto no_func;
}
func (scale, src, dest, dest_offset, width);
func (scale, src, dest, dest_offset, width, pstride);
return;
no_func:
@ -934,45 +1020,61 @@ gst_video_scaler_vertical (GstVideoScaler * scale, GstVideoFormat format,
g_return_if_fail (finfo->n_planes == 1);
pstride = finfo->pixel_stride[0];
g_return_if_fail (pstride == 4 || pstride == 8);
g_return_if_fail (pstride == 1 || pstride == 4 || pstride == 8);
if (scale->tmpwidth < width)
realloc_tmplines (scale, width);
switch (pstride) {
case 1:
switch (scale->resampler.max_taps) {
case 1:
func = video_scale_v_near;
break;
case 2:
func = video_scale_v_2tap_u8;
break;
case 4:
func = video_scale_v_4tap_u8;
break;
default:
func = video_scale_v_ntap_u8;
break;
}
break;
case 4:
switch (scale->resampler.max_taps) {
case 1:
func = video_scale_v_near_u32;
func = video_scale_v_near;
break;
case 2:
func = video_scale_v_2tap_4u8;
func = video_scale_v_2tap_u8;
break;
case 4:
func = video_scale_v_4tap_4u8;
func = video_scale_v_4tap_u8;
break;
default:
func = video_scale_v_ntap_4u8;
func = video_scale_v_ntap_u8;
break;
}
break;
case 8:
switch (scale->resampler.max_taps) {
case 1:
func = video_scale_v_near_u64;
func = video_scale_v_near;
break;
case 2:
func = video_scale_v_2tap_4u16;
func = video_scale_v_2tap_u16;
break;
default:
func = video_scale_v_ntap_4u16;
func = video_scale_v_ntap_u16;
break;
}
break;
default:
goto no_func;
}
func (scale, src_lines, dest, dest_offset, width);
func (scale, src_lines, dest, dest_offset, width, pstride);
return;
no_func: