2 * Image Scaling Functions
3 * Copyright (c) 2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
35 #include "vs_fill_borders.h"
36 #include "gstvideoscaleorc.h"
38 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
39 #define READ_UINT32(ptr) GST_READ_UINT32_LE(ptr)
40 #define READ_UINT16(ptr) GST_READ_UINT16_LE(ptr)
42 #define READ_UINT32(ptr) GST_READ_UINT32_BE(ptr)
43 #define READ_UINT16(ptr) GST_READ_UINT16_BE(ptr)
47 vs_fill_borders_RGBA (const VSImage * dest, const uint8_t * val)
50 int top = dest->border_top, bottom = dest->border_bottom;
51 int left = dest->border_left, right = dest->border_right;
52 int width = dest->width;
53 int height = dest->height;
54 int real_width = dest->real_width;
55 int stride = dest->stride;
58 uint32_t v = READ_UINT32 (val);
60 data = dest->real_pixels;
61 for (i = 0; i < top; i++) {
62 orc_splat_u32 ((uint32_t *) data, v, real_width);
68 tmp2 = (left + width) * 4;
69 for (i = 0; i < tmp; i++) {
70 orc_splat_u32 ((uint32_t *) data, v, left);
71 orc_splat_u32 ((uint32_t *) (data + tmp2), v, right);
75 data += stride * height;
78 for (i = 0; i < bottom; i++) {
79 orc_splat_u32 ((uint32_t *) data, v, real_width);
85 _memset_u24 (uint8_t * data, uint8_t val1, uint8_t val2, uint8_t val3,
90 for (i = 0; i < n; i++) {
99 vs_fill_borders_RGB (const VSImage * dest, const uint8_t * val)
102 int top = dest->border_top, bottom = dest->border_bottom;
103 int left = dest->border_left, right = dest->border_right;
104 int width = dest->width;
105 int height = dest->height;
106 int real_width = dest->real_width;
107 int stride = dest->stride;
111 data = dest->real_pixels;
112 for (i = 0; i < top; i++) {
113 _memset_u24 (data, val[0], val[1], val[2], real_width);
119 tmp2 = (left + width) * 3;
120 for (i = 0; i < tmp; i++) {
121 _memset_u24 (data, val[0], val[1], val[2], left);
122 _memset_u24 (data + tmp2, val[0], val[1], val[2], right);
126 data += stride * height;
129 for (i = 0; i < bottom; i++) {
130 _memset_u24 (data, val[0], val[1], val[2], real_width);
136 vs_fill_borders_YUYV (const VSImage * dest, const uint8_t * val)
139 int top = dest->border_top, bottom = dest->border_bottom;
140 int left = dest->border_left, right = dest->border_right;
141 int width = dest->width;
142 int height = dest->height;
143 int real_width = dest->real_width;
144 int stride = dest->stride;
148 data = dest->real_pixels;
149 for (i = 0; i < top; i++) {
150 for (j = 0; j < real_width; j++) {
151 data[2 * j] = val[0];
152 data[2 * j + 1] = (j % 2 == 0) ? val[1] : val[3];
159 tmp2 = (left + width) * 2;
160 for (i = 0; i < tmp; i++) {
161 for (j = 0; j < left; j++) {
162 data[2 * j] = val[0];
163 data[2 * j + 1] = (j % 2 == 0) ? val[1] : val[3];
165 for (j = 0; j < right; j++) {
166 data[tmp2 + 2 * j] = val[0];
167 data[tmp2 + 2 * j + 1] = (j % 2 == 0) ? val[1] : val[3];
172 data += stride * height;
175 for (i = 0; i < bottom; i++) {
176 for (j = 0; j < real_width; j++) {
177 data[2 * j] = val[0];
178 data[2 * j + 1] = (j % 2 == 0) ? val[1] : val[3];
185 vs_fill_borders_UYVY (const VSImage * dest, const uint8_t * val)
188 int top = dest->border_top, bottom = dest->border_bottom;
189 int left = dest->border_left, right = dest->border_right;
190 int width = dest->width;
191 int height = dest->height;
192 int real_width = dest->real_width;
193 int stride = dest->stride;
197 data = dest->real_pixels;
198 for (i = 0; i < top; i++) {
199 for (j = 0; j < real_width; j++) {
200 data[2 * j] = (j % 2 == 0) ? val[0] : val[2];
201 data[2 * j + 1] = val[1];
208 tmp2 = (left + width) * 2;
209 for (i = 0; i < tmp; i++) {
210 for (j = 0; j < left; j++) {
211 data[2 * j] = (j % 2 == 0) ? val[0] : val[2];
212 data[2 * j + 1] = val[1];
214 for (j = 0; j < right; j++) {
215 data[tmp2 + 2 * j] = (j % 2 == 0) ? val[0] : val[2];
216 data[tmp2 + 2 * j + 1] = val[1];
221 data += stride * height;
224 for (i = 0; i < bottom; i++) {
225 for (j = 0; j < real_width; j++) {
226 data[2 * j] = (j % 2 == 0) ? val[0] : val[2];
227 data[2 * j + 1] = val[1];
234 vs_fill_borders_Y (const VSImage * dest, const uint8_t * val)
237 int top = dest->border_top, bottom = dest->border_bottom;
238 int left = dest->border_left, right = dest->border_right;
239 int width = dest->width;
240 int height = dest->height;
241 int real_width = dest->real_width;
242 int stride = dest->stride;
246 data = dest->real_pixels;
247 for (i = 0; i < top; i++) {
248 memset (data, *val, real_width);
255 for (i = 0; i < tmp; i++) {
256 memset (data, *val, left);
257 memset (data + tmp2, *val, right);
261 data += stride * height;
264 for (i = 0; i < bottom; i++) {
265 memset (data, *val, real_width);
271 vs_fill_borders_Y16 (const VSImage * dest, const uint16_t val)
274 int top = dest->border_top, bottom = dest->border_bottom;
275 int left = dest->border_left, right = dest->border_right;
276 int width = dest->width;
277 int height = dest->height;
278 int real_width = dest->real_width;
279 int stride = dest->stride;
283 data = dest->real_pixels;
284 for (i = 0; i < top; i++) {
285 orc_splat_u16 ((uint16_t *) data, val, real_width);
291 tmp2 = (left + width) * 2;
292 for (i = 0; i < tmp; i++) {
293 orc_splat_u16 ((uint16_t *) data, val, left);
294 orc_splat_u16 ((uint16_t *) (data + tmp2), val, right);
298 data += stride * height;
301 for (i = 0; i < bottom; i++) {
302 orc_splat_u16 ((uint16_t *) data, val, real_width);
308 vs_fill_borders_RGB565 (const VSImage * dest, const uint8_t * val)
311 int top = dest->border_top, bottom = dest->border_bottom;
312 int left = dest->border_left, right = dest->border_right;
313 int width = dest->width;
314 int height = dest->height;
315 int real_width = dest->real_width;
316 int stride = dest->stride;
319 uint16_t v = READ_UINT16 (val);
321 data = dest->real_pixels;
322 for (i = 0; i < top; i++) {
323 orc_splat_u16 ((uint16_t *) data, v, real_width);
329 tmp2 = (left + width) * 2;
330 for (i = 0; i < tmp; i++) {
331 orc_splat_u16 ((uint16_t *) data, v, left);
332 orc_splat_u16 ((uint16_t *) (data + tmp2), v, right);
336 data += stride * height;
339 for (i = 0; i < bottom; i++) {
340 orc_splat_u16 ((uint16_t *) data, v, real_width);
346 vs_fill_borders_RGB555 (const VSImage * dest, const uint8_t * val)
349 int top = dest->border_top, bottom = dest->border_bottom;
350 int left = dest->border_left, right = dest->border_right;
351 int width = dest->width;
352 int height = dest->height;
353 int real_width = dest->real_width;
354 int stride = dest->stride;
357 uint16_t v = READ_UINT16 (val);
359 data = dest->real_pixels;
360 for (i = 0; i < top; i++) {
361 orc_splat_u16 ((uint16_t *) data, v, real_width);
367 tmp2 = (left + width) * 2;
368 for (i = 0; i < tmp; i++) {
369 orc_splat_u16 ((uint16_t *) data, v, left);
370 orc_splat_u16 ((uint16_t *) (data + tmp2), v, right);
374 data += stride * height;
377 for (i = 0; i < bottom; i++) {
378 orc_splat_u16 ((uint16_t *) data, v, real_width);
384 vs_fill_borders_AYUV64 (const VSImage * dest, const uint8_t * val)
387 int top = dest->border_top, bottom = dest->border_bottom;
388 int left = dest->border_left, right = dest->border_right;
389 int width = dest->width;
390 int height = dest->height;
391 int real_width = dest->real_width;
392 int stride = dest->stride;
397 v = (((guint32) val[0]) << 8) | (((guint32) val[1]) << 24) |
398 (((guint64) val[2]) << 40) | (((guint64) val[3]) << 56);
400 data = dest->real_pixels;
401 for (i = 0; i < top; i++) {
402 orc_splat_u64 ((uint64_t *) data, v, real_width);
408 tmp2 = (left + width) * 8;
409 for (i = 0; i < tmp; i++) {
410 orc_splat_u64 ((uint64_t *) data, v, left);
411 orc_splat_u64 ((uint64_t *) (data + tmp2), v, right);
415 data += stride * height;
418 for (i = 0; i < bottom; i++) {
419 orc_splat_u64 ((uint64_t *) data, v, real_width);