blob: 0ada244841945c35b94e756e46b665bce1fea741 [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu9c01aa12016-09-01 14:32:49 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu9c01aa12016-09-01 14:32:49 -07004 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
12#include <assert.h>
13
Yaowu Xuf883b422016-08-30 14:01:10 -070014#include "aom/aom_integer.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070015#include "aom_ports/mem.h"
16#include "aom_dsp/blend.h"
Yaowu Xuf883b422016-08-30 14:01:10 -070017#include "aom_dsp/aom_dsp_common.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070018
Yaowu Xuf883b422016-08-30 14:01:10 -070019#include "./aom_dsp_rtcd.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070020
Angie Chiang7b517092017-07-20 17:31:28 -070021// Blending with alpha mask. Mask values come from the range [0, 64],
22// as described for AOM_BLEND_A64 in aom_dsp/blend.h. src0 or src1 can
23// be the same as dst, or dst can be different from both sources.
24
25void aom_blend_a64_d32_mask_c(int32_t *dst, uint32_t dst_stride,
26 const int32_t *src0, uint32_t src0_stride,
27 const int32_t *src1, uint32_t src1_stride,
28 const uint8_t *mask, uint32_t mask_stride, int h,
29 int w, int subh, int subw) {
30 int i, j;
31
32 assert(IMPLIES(src0 == dst, src0_stride == dst_stride));
33 assert(IMPLIES(src1 == dst, src1_stride == dst_stride));
34
35 assert(h >= 1);
36 assert(w >= 1);
37 assert(IS_POWER_OF_TWO(h));
38 assert(IS_POWER_OF_TWO(w));
39
40 if (subw == 0 && subh == 0) {
41 for (i = 0; i < h; ++i) {
42 for (j = 0; j < w; ++j) {
Hui Suc9c78b52017-11-17 14:21:32 -080043 const int64_t m = mask[i * mask_stride + j];
44 dst[i * dst_stride + j] = (int32_t)AOM_BLEND_A64(
45 m, src0[i * src0_stride + j], src1[i * src1_stride + j]);
Angie Chiang7b517092017-07-20 17:31:28 -070046 }
47 }
48 } else if (subw == 1 && subh == 1) {
49 for (i = 0; i < h; ++i) {
50 for (j = 0; j < w; ++j) {
Hui Suc9c78b52017-11-17 14:21:32 -080051 const int64_t m = ROUND_POWER_OF_TWO(
Angie Chiang7b517092017-07-20 17:31:28 -070052 mask[(2 * i) * mask_stride + (2 * j)] +
53 mask[(2 * i + 1) * mask_stride + (2 * j)] +
54 mask[(2 * i) * mask_stride + (2 * j + 1)] +
55 mask[(2 * i + 1) * mask_stride + (2 * j + 1)],
56 2);
Hui Suc9c78b52017-11-17 14:21:32 -080057 dst[i * dst_stride + j] = (int32_t)AOM_BLEND_A64(
58 m, src0[i * src0_stride + j], src1[i * src1_stride + j]);
Angie Chiang7b517092017-07-20 17:31:28 -070059 }
60 }
61 } else if (subw == 1 && subh == 0) {
62 for (i = 0; i < h; ++i) {
63 for (j = 0; j < w; ++j) {
Hui Suc9c78b52017-11-17 14:21:32 -080064 const int64_t m = AOM_BLEND_AVG(mask[i * mask_stride + (2 * j)],
65 mask[i * mask_stride + (2 * j + 1)]);
66 dst[i * dst_stride + j] = (int32_t)AOM_BLEND_A64(
67 m, src0[i * src0_stride + j], src1[i * src1_stride + j]);
Angie Chiang7b517092017-07-20 17:31:28 -070068 }
69 }
70 } else {
71 for (i = 0; i < h; ++i) {
72 for (j = 0; j < w; ++j) {
Hui Suc9c78b52017-11-17 14:21:32 -080073 const int64_t m = AOM_BLEND_AVG(mask[(2 * i) * mask_stride + j],
74 mask[(2 * i + 1) * mask_stride + j]);
75 dst[i * dst_stride + j] = (int32_t)AOM_BLEND_A64(
76 m, src0[i * src0_stride + j], src1[i * src1_stride + j]);
Angie Chiang7b517092017-07-20 17:31:28 -070077 }
78 }
79 }
80}
Angie Chiang7b517092017-07-20 17:31:28 -070081
Yaowu Xuc27fc142016-08-22 16:08:15 -070082// Blending with alpha mask. Mask values come from the range [0, 64],
Yaowu Xu9c01aa12016-09-01 14:32:49 -070083// as described for AOM_BLEND_A64 in aom_dsp/blend.h. src0 or src1 can
Yaowu Xuc27fc142016-08-22 16:08:15 -070084// be the same as dst, or dst can be different from both sources.
85
Yaowu Xuf883b422016-08-30 14:01:10 -070086void aom_blend_a64_mask_c(uint8_t *dst, uint32_t dst_stride,
Yaowu Xuc27fc142016-08-22 16:08:15 -070087 const uint8_t *src0, uint32_t src0_stride,
88 const uint8_t *src1, uint32_t src1_stride,
89 const uint8_t *mask, uint32_t mask_stride, int h,
90 int w, int subh, int subw) {
91 int i, j;
92
93 assert(IMPLIES(src0 == dst, src0_stride == dst_stride));
94 assert(IMPLIES(src1 == dst, src1_stride == dst_stride));
95
96 assert(h >= 1);
97 assert(w >= 1);
98 assert(IS_POWER_OF_TWO(h));
99 assert(IS_POWER_OF_TWO(w));
100
101 if (subw == 0 && subh == 0) {
102 for (i = 0; i < h; ++i) {
103 for (j = 0; j < w; ++j) {
104 const int m = mask[i * mask_stride + j];
Yaowu Xuf883b422016-08-30 14:01:10 -0700105 dst[i * dst_stride + j] = AOM_BLEND_A64(m, src0[i * src0_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700106 src1[i * src1_stride + j]);
107 }
108 }
109 } else if (subw == 1 && subh == 1) {
110 for (i = 0; i < h; ++i) {
111 for (j = 0; j < w; ++j) {
112 const int m = ROUND_POWER_OF_TWO(
113 mask[(2 * i) * mask_stride + (2 * j)] +
114 mask[(2 * i + 1) * mask_stride + (2 * j)] +
115 mask[(2 * i) * mask_stride + (2 * j + 1)] +
116 mask[(2 * i + 1) * mask_stride + (2 * j + 1)],
117 2);
Yaowu Xuf883b422016-08-30 14:01:10 -0700118 dst[i * dst_stride + j] = AOM_BLEND_A64(m, src0[i * src0_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700119 src1[i * src1_stride + j]);
120 }
121 }
122 } else if (subw == 1 && subh == 0) {
123 for (i = 0; i < h; ++i) {
124 for (j = 0; j < w; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700125 const int m = AOM_BLEND_AVG(mask[i * mask_stride + (2 * j)],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700126 mask[i * mask_stride + (2 * j + 1)]);
Yaowu Xuf883b422016-08-30 14:01:10 -0700127 dst[i * dst_stride + j] = AOM_BLEND_A64(m, src0[i * src0_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700128 src1[i * src1_stride + j]);
129 }
130 }
131 } else {
132 for (i = 0; i < h; ++i) {
133 for (j = 0; j < w; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700134 const int m = AOM_BLEND_AVG(mask[(2 * i) * mask_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700135 mask[(2 * i + 1) * mask_stride + j]);
Yaowu Xuf883b422016-08-30 14:01:10 -0700136 dst[i * dst_stride + j] = AOM_BLEND_A64(m, src0[i * src0_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700137 src1[i * src1_stride + j]);
138 }
139 }
140 }
141}
142
Yaowu Xuf883b422016-08-30 14:01:10 -0700143void aom_highbd_blend_a64_mask_c(uint8_t *dst_8, uint32_t dst_stride,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700144 const uint8_t *src0_8, uint32_t src0_stride,
145 const uint8_t *src1_8, uint32_t src1_stride,
146 const uint8_t *mask, uint32_t mask_stride,
147 int h, int w, int subh, int subw, int bd) {
148 int i, j;
149 uint16_t *dst = CONVERT_TO_SHORTPTR(dst_8);
150 const uint16_t *src0 = CONVERT_TO_SHORTPTR(src0_8);
151 const uint16_t *src1 = CONVERT_TO_SHORTPTR(src1_8);
Yaowu Xu9c01aa12016-09-01 14:32:49 -0700152 (void)bd;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700153
154 assert(IMPLIES(src0 == dst, src0_stride == dst_stride));
155 assert(IMPLIES(src1 == dst, src1_stride == dst_stride));
156
157 assert(h >= 1);
158 assert(w >= 1);
159 assert(IS_POWER_OF_TWO(h));
160 assert(IS_POWER_OF_TWO(w));
161
162 assert(bd == 8 || bd == 10 || bd == 12);
163
164 if (subw == 0 && subh == 0) {
165 for (i = 0; i < h; ++i) {
166 for (j = 0; j < w; ++j) {
167 const int m = mask[i * mask_stride + j];
Yaowu Xuf883b422016-08-30 14:01:10 -0700168 dst[i * dst_stride + j] = AOM_BLEND_A64(m, src0[i * src0_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700169 src1[i * src1_stride + j]);
170 }
171 }
172 } else if (subw == 1 && subh == 1) {
173 for (i = 0; i < h; ++i) {
174 for (j = 0; j < w; ++j) {
175 const int m = ROUND_POWER_OF_TWO(
176 mask[(2 * i) * mask_stride + (2 * j)] +
177 mask[(2 * i + 1) * mask_stride + (2 * j)] +
178 mask[(2 * i) * mask_stride + (2 * j + 1)] +
179 mask[(2 * i + 1) * mask_stride + (2 * j + 1)],
180 2);
Yaowu Xuf883b422016-08-30 14:01:10 -0700181 dst[i * dst_stride + j] = AOM_BLEND_A64(m, src0[i * src0_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700182 src1[i * src1_stride + j]);
183 }
184 }
185 } else if (subw == 1 && subh == 0) {
186 for (i = 0; i < h; ++i) {
187 for (j = 0; j < w; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700188 const int m = AOM_BLEND_AVG(mask[i * mask_stride + (2 * j)],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700189 mask[i * mask_stride + (2 * j + 1)]);
Yaowu Xuf883b422016-08-30 14:01:10 -0700190 dst[i * dst_stride + j] = AOM_BLEND_A64(m, src0[i * src0_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700191 src1[i * src1_stride + j]);
192 }
193 }
194 } else {
195 for (i = 0; i < h; ++i) {
196 for (j = 0; j < w; ++j) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700197 const int m = AOM_BLEND_AVG(mask[(2 * i) * mask_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700198 mask[(2 * i + 1) * mask_stride + j]);
Yaowu Xuf883b422016-08-30 14:01:10 -0700199 dst[i * dst_stride + j] = AOM_BLEND_A64(m, src0[i * src0_stride + j],
Yaowu Xuc27fc142016-08-22 16:08:15 -0700200 src1[i * src1_stride + j]);
201 }
202 }
203 }
204}