From ba98d06767af35db71288e428f1864b33876c377 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 27 Jan 2015 10:04:11 +0100 Subject: [PATCH] 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. --- gst-libs/gst/video/video-orc.orc | 152 +++++++------- gst-libs/gst/video/video-scaler.c | 316 ++++++++++++++++++++---------- 2 files changed, 289 insertions(+), 179 deletions(-) diff --git a/gst-libs/gst/video/video-orc.orc b/gst-libs/gst/video/video-orc.orc index 8e4c88560e..e9351ecae4 100644 --- a/gst-libs/gst/video/video-orc.orc +++ b/gst-libs/gst/video/video-orc.orc @@ -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 diff --git a/gst-libs/gst/video/video-scaler.c b/gst-libs/gst/video/video-scaler.c index 274cedbd2d..ea3c8d70a8 100644 --- a/gst-libs/gst/video/video-scaler.c +++ b/gst-libs/gst/video/video-scaler.c @@ -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: