| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <stdio.h> | 11 #include "./vpx_config.h" |
| 12 | 12 |
| 13 #include "./vpx_config.h" | |
| 14 #include "vp9_rtcd.h" | |
| 15 #include "vp9/common/vp9_reconintra.h" | |
| 16 #include "vp9/common/vp9_onyxc_int.h" | |
| 17 #include "vpx_mem/vpx_mem.h" | 13 #include "vpx_mem/vpx_mem.h" |
| 18 #include "vpx_ports/vpx_once.h" | 14 #include "vpx_ports/vpx_once.h" |
| 19 | 15 |
| 16 #include "vp9_rtcd.h" |
| 17 |
| 18 #include "vp9/common/vp9_reconintra.h" |
| 19 #include "vp9/common/vp9_onyxc_int.h" |
| 20 |
| 20 const TX_TYPE mode2txfm_map[MB_MODE_COUNT] = { | 21 const TX_TYPE mode2txfm_map[MB_MODE_COUNT] = { |
| 21 DCT_DCT, // DC | 22 DCT_DCT, // DC |
| 22 ADST_DCT, // V | 23 ADST_DCT, // V |
| 23 DCT_ADST, // H | 24 DCT_ADST, // H |
| 24 DCT_DCT, // D45 | 25 DCT_DCT, // D45 |
| 25 ADST_ADST, // D135 | 26 ADST_ADST, // D135 |
| 26 ADST_DCT, // D117 | 27 ADST_DCT, // D117 |
| 27 DCT_ADST, // D153 | 28 DCT_ADST, // D153 |
| 28 DCT_ADST, // D27 | 29 DCT_ADST, // D207 |
| 29 ADST_DCT, // D63 | 30 ADST_DCT, // D63 |
| 30 ADST_ADST, // TM | 31 ADST_ADST, // TM |
| 31 DCT_DCT, // NEARESTMV | 32 DCT_DCT, // NEARESTMV |
| 32 DCT_DCT, // NEARMV | 33 DCT_DCT, // NEARMV |
| 33 DCT_DCT, // ZEROMV | 34 DCT_DCT, // ZEROMV |
| 34 DCT_DCT // NEWMV | 35 DCT_DCT // NEWMV |
| 35 }; | 36 }; |
| 36 | 37 |
| 37 #define intra_pred_sized(type, size) \ | 38 #define intra_pred_sized(type, size) \ |
| 38 void vp9_##type##_predictor_##size##x##size##_c(uint8_t *pred_ptr, \ | 39 void vp9_##type##_predictor_##size##x##size##_c(uint8_t *dst, \ |
| 39 ptrdiff_t stride, \ | 40 ptrdiff_t stride, \ |
| 40 uint8_t *above_row, \ | 41 const uint8_t *above, \ |
| 41 uint8_t *left_col) { \ | 42 const uint8_t *left) { \ |
| 42 type##_predictor(pred_ptr, stride, size, above_row, left_col); \ | 43 type##_predictor(dst, stride, size, above, left); \ |
| 43 } | 44 } |
| 45 |
| 44 #define intra_pred_allsizes(type) \ | 46 #define intra_pred_allsizes(type) \ |
| 45 intra_pred_sized(type, 4) \ | 47 intra_pred_sized(type, 4) \ |
| 46 intra_pred_sized(type, 8) \ | 48 intra_pred_sized(type, 8) \ |
| 47 intra_pred_sized(type, 16) \ | 49 intra_pred_sized(type, 16) \ |
| 48 intra_pred_sized(type, 32) | 50 intra_pred_sized(type, 32) |
| 49 | 51 |
| 50 static INLINE void d27_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 52 static INLINE void d207_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 51 uint8_t *above_row, uint8_t *left_col) { | 53 const uint8_t *above, const uint8_t *left) { |
| 52 int r, c; | 54 int r, c; |
| 55 |
| 53 // first column | 56 // first column |
| 54 for (r = 0; r < bs - 1; ++r) { | 57 for (r = 0; r < bs - 1; ++r) |
| 55 pred_ptr[r * stride] = ROUND_POWER_OF_TWO(left_col[r] + | 58 dst[r * stride] = ROUND_POWER_OF_TWO(left[r] + left[r + 1], 1); |
| 56 left_col[r + 1], 1); | 59 dst[(bs - 1) * stride] = left[bs - 1]; |
| 57 } | 60 dst++; |
| 58 pred_ptr[(bs - 1) * stride] = left_col[bs - 1]; | 61 |
| 59 pred_ptr++; | |
| 60 // second column | 62 // second column |
| 61 for (r = 0; r < bs - 2; ++r) { | 63 for (r = 0; r < bs - 2; ++r) |
| 62 pred_ptr[r * stride] = ROUND_POWER_OF_TWO(left_col[r] + | 64 dst[r * stride] = ROUND_POWER_OF_TWO(left[r] + left[r + 1] * 2 + |
| 63 left_col[r + 1] * 2 + | 65 left[r + 2], 2); |
| 64 left_col[r + 2], 2); | 66 dst[(bs - 2) * stride] = ROUND_POWER_OF_TWO(left[bs - 2] + |
| 65 } | 67 left[bs - 1] * 3, 2); |
| 66 pred_ptr[(bs - 2) * stride] = ROUND_POWER_OF_TWO(left_col[bs - 2] + | 68 dst[(bs - 1) * stride] = left[bs - 1]; |
| 67 left_col[bs - 1] * 3, | 69 dst++; |
| 68 2); | |
| 69 pred_ptr[(bs - 1) * stride] = left_col[bs - 1]; | |
| 70 pred_ptr++; | |
| 71 | 70 |
| 72 // rest of last row | 71 // rest of last row |
| 73 for (c = 0; c < bs - 2; ++c) { | 72 for (c = 0; c < bs - 2; ++c) |
| 74 pred_ptr[(bs - 1) * stride + c] = left_col[bs - 1]; | 73 dst[(bs - 1) * stride + c] = left[bs - 1]; |
| 75 } | 74 |
| 76 | 75 for (r = bs - 2; r >= 0; --r) |
| 77 for (r = bs - 2; r >= 0; --r) { | 76 for (c = 0; c < bs - 2; ++c) |
| 78 for (c = 0; c < bs - 2; ++c) { | 77 dst[r * stride + c] = dst[(r + 1) * stride + c - 2]; |
| 79 pred_ptr[r * stride + c] = pred_ptr[(r + 1) * stride + c - 2]; | 78 } |
| 80 } | 79 intra_pred_allsizes(d207) |
| 81 } | 80 |
| 82 } | 81 static INLINE void d63_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 83 intra_pred_allsizes(d27) | 82 const uint8_t *above, const uint8_t *left) { |
| 84 | |
| 85 static INLINE void d63_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | |
| 86 uint8_t *above_row, uint8_t *left_col) { | |
| 87 int r, c; | 83 int r, c; |
| 88 for (r = 0; r < bs; ++r) { | 84 for (r = 0; r < bs; ++r) { |
| 89 for (c = 0; c < bs; ++c) { | 85 for (c = 0; c < bs; ++c) |
| 90 if (r & 1) { | 86 dst[c] = r & 1 ? ROUND_POWER_OF_TWO(above[r/2 + c] + |
| 91 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[r/2 + c] + | 87 above[r/2 + c + 1] * 2 + |
| 92 above_row[r/2 + c + 1] * 2 + | 88 above[r/2 + c + 2], 2) |
| 93 above_row[r/2 + c + 2], 2); | 89 : ROUND_POWER_OF_TWO(above[r/2 + c] + |
| 94 } else { | 90 above[r/2 + c + 1], 1); |
| 95 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[r/2 + c] + | 91 dst += stride; |
| 96 above_row[r/2+ c + 1], 1); | |
| 97 } | |
| 98 } | |
| 99 pred_ptr += stride; | |
| 100 } | 92 } |
| 101 } | 93 } |
| 102 intra_pred_allsizes(d63) | 94 intra_pred_allsizes(d63) |
| 103 | 95 |
| 104 static INLINE void d45_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 96 static INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 105 uint8_t *above_row, uint8_t *left_col) { | 97 const uint8_t *above, const uint8_t *left) { |
| 106 int r, c; | 98 int r, c; |
| 107 for (r = 0; r < bs; ++r) { | 99 for (r = 0; r < bs; ++r) { |
| 108 for (c = 0; c < bs; ++c) { | 100 for (c = 0; c < bs; ++c) |
| 109 if (r + c + 2 < bs * 2) | 101 dst[c] = r + c + 2 < bs * 2 ? ROUND_POWER_OF_TWO(above[r + c] + |
| 110 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[r + c] + | 102 above[r + c + 1] * 2 + |
| 111 above_row[r + c + 1] * 2 + | 103 above[r + c + 2], 2) |
| 112 above_row[r + c + 2], 2); | 104 : above[bs * 2 - 1]; |
| 113 else | 105 dst += stride; |
| 114 pred_ptr[c] = above_row[bs * 2 - 1]; | |
| 115 } | |
| 116 pred_ptr += stride; | |
| 117 } | 106 } |
| 118 } | 107 } |
| 119 intra_pred_allsizes(d45) | 108 intra_pred_allsizes(d45) |
| 120 | 109 |
| 121 static INLINE void d117_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 110 static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 122 uint8_t *above_row, uint8_t *left_col) { | 111 const uint8_t *above, const uint8_t *left) { |
| 123 int r, c; | 112 int r, c; |
| 113 |
| 124 // first row | 114 // first row |
| 125 for (c = 0; c < bs; c++) | 115 for (c = 0; c < bs; c++) |
| 126 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[c - 1] + above_row[c], 1); | 116 dst[c] = ROUND_POWER_OF_TWO(above[c - 1] + above[c], 1); |
| 127 pred_ptr += stride; | 117 dst += stride; |
| 128 | 118 |
| 129 // second row | 119 // second row |
| 130 pred_ptr[0] = ROUND_POWER_OF_TWO(left_col[0] + | 120 dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2); |
| 131 above_row[-1] * 2 + | |
| 132 above_row[0], 2); | |
| 133 for (c = 1; c < bs; c++) | 121 for (c = 1; c < bs; c++) |
| 134 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[c - 2] + | 122 dst[c] = ROUND_POWER_OF_TWO(above[c - 2] + above[c - 1] * 2 + above[c], 2); |
| 135 above_row[c - 1] * 2 + | 123 dst += stride; |
| 136 above_row[c], 2); | |
| 137 pred_ptr += stride; | |
| 138 | 124 |
| 139 // the rest of first col | 125 // the rest of first col |
| 140 pred_ptr[0] = ROUND_POWER_OF_TWO(above_row[-1] + | 126 dst[0] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2); |
| 141 left_col[0] * 2 + | |
| 142 left_col[1], 2); | |
| 143 for (r = 3; r < bs; ++r) | 127 for (r = 3; r < bs; ++r) |
| 144 pred_ptr[(r-2) * stride] = ROUND_POWER_OF_TWO(left_col[r - 3] + | 128 dst[(r - 2) * stride] = ROUND_POWER_OF_TWO(left[r - 3] + left[r - 2] * 2 + |
| 145 left_col[r - 2] * 2 + | 129 left[r - 1], 2); |
| 146 left_col[r - 1], 2); | 130 |
| 147 // the rest of the block | 131 // the rest of the block |
| 148 for (r = 2; r < bs; ++r) { | 132 for (r = 2; r < bs; ++r) { |
| 149 for (c = 1; c < bs; c++) | 133 for (c = 1; c < bs; c++) |
| 150 pred_ptr[c] = pred_ptr[-2 * stride + c - 1]; | 134 dst[c] = dst[-2 * stride + c - 1]; |
| 151 pred_ptr += stride; | 135 dst += stride; |
| 152 } | 136 } |
| 153 } | 137 } |
| 154 intra_pred_allsizes(d117) | 138 intra_pred_allsizes(d117) |
| 155 | 139 |
| 156 static INLINE void d135_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 140 static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 157 uint8_t *above_row, uint8_t *left_col) { | 141 const uint8_t *above, const uint8_t *left) { |
| 158 int r, c; | 142 int r, c; |
| 159 pred_ptr[0] = ROUND_POWER_OF_TWO(left_col[0] + | 143 dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2); |
| 160 above_row[-1] * 2 + | |
| 161 above_row[0], 2); | |
| 162 for (c = 1; c < bs; c++) | 144 for (c = 1; c < bs; c++) |
| 163 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[c - 2] + | 145 dst[c] = ROUND_POWER_OF_TWO(above[c - 2] + above[c - 1] * 2 + above[c], 2); |
| 164 above_row[c - 1] * 2 + | 146 |
| 165 above_row[c], 2); | 147 dst[stride] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2); |
| 166 | |
| 167 pred_ptr[stride] = ROUND_POWER_OF_TWO(above_row[-1] + | |
| 168 left_col[0] * 2 + | |
| 169 left_col[1], 2); | |
| 170 for (r = 2; r < bs; ++r) | 148 for (r = 2; r < bs; ++r) |
| 171 pred_ptr[r * stride] = ROUND_POWER_OF_TWO(left_col[r - 2] + | 149 dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 2] + left[r - 1] * 2 + |
| 172 left_col[r - 1] * 2 + | 150 left[r], 2); |
| 173 left_col[r], 2); | 151 |
| 174 | 152 dst += stride; |
| 175 pred_ptr += stride; | |
| 176 for (r = 1; r < bs; ++r) { | 153 for (r = 1; r < bs; ++r) { |
| 177 for (c = 1; c < bs; c++) | 154 for (c = 1; c < bs; c++) |
| 178 pred_ptr[c] = pred_ptr[-stride + c - 1]; | 155 dst[c] = dst[-stride + c - 1]; |
| 179 pred_ptr += stride; | 156 dst += stride; |
| 180 } | 157 } |
| 181 } | 158 } |
| 182 intra_pred_allsizes(d135) | 159 intra_pred_allsizes(d135) |
| 183 | 160 |
| 184 static INLINE void d153_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 161 static INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 185 uint8_t *above_row, uint8_t *left_col) { | 162 const uint8_t *above, const uint8_t *left) { |
| 186 int r, c; | 163 int r, c; |
| 187 pred_ptr[0] = ROUND_POWER_OF_TWO(above_row[-1] + left_col[0], 1); | 164 dst[0] = ROUND_POWER_OF_TWO(above[-1] + left[0], 1); |
| 188 for (r = 1; r < bs; r++) | 165 for (r = 1; r < bs; r++) |
| 189 pred_ptr[r * stride] = | 166 dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 1] + left[r], 1); |
| 190 ROUND_POWER_OF_TWO(left_col[r - 1] + left_col[r], 1); | 167 dst++; |
| 191 pred_ptr++; | 168 |
| 192 | 169 dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2); |
| 193 pred_ptr[0] = ROUND_POWER_OF_TWO(left_col[0] + | 170 dst[stride] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2); |
| 194 above_row[-1] * 2 + | |
| 195 above_row[0], 2); | |
| 196 pred_ptr[stride] = ROUND_POWER_OF_TWO(above_row[-1] + | |
| 197 left_col[0] * 2 + | |
| 198 left_col[1], 2); | |
| 199 for (r = 2; r < bs; r++) | 171 for (r = 2; r < bs; r++) |
| 200 pred_ptr[r * stride] = ROUND_POWER_OF_TWO(left_col[r - 2] + | 172 dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 2] + left[r - 1] * 2 + |
| 201 left_col[r - 1] * 2 + | 173 left[r], 2); |
| 202 left_col[r], 2); | 174 dst++; |
| 203 pred_ptr++; | |
| 204 | 175 |
| 205 for (c = 0; c < bs - 2; c++) | 176 for (c = 0; c < bs - 2; c++) |
| 206 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[c - 1] + | 177 dst[c] = ROUND_POWER_OF_TWO(above[c - 1] + above[c] * 2 + above[c + 1], 2); |
| 207 above_row[c] * 2 + | 178 dst += stride; |
| 208 above_row[c + 1], 2); | 179 |
| 209 pred_ptr += stride; | |
| 210 for (r = 1; r < bs; ++r) { | 180 for (r = 1; r < bs; ++r) { |
| 211 for (c = 0; c < bs - 2; c++) | 181 for (c = 0; c < bs - 2; c++) |
| 212 pred_ptr[c] = pred_ptr[-stride + c - 2]; | 182 dst[c] = dst[-stride + c - 2]; |
| 213 pred_ptr += stride; | 183 dst += stride; |
| 214 } | 184 } |
| 215 } | 185 } |
| 216 intra_pred_allsizes(d153) | 186 intra_pred_allsizes(d153) |
| 217 | 187 |
| 218 static INLINE void v_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 188 static INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 219 uint8_t *above_row, uint8_t *left_col) { | 189 const uint8_t *above, const uint8_t *left) { |
| 220 int r; | 190 int r; |
| 221 | 191 |
| 222 for (r = 0; r < bs; r++) { | 192 for (r = 0; r < bs; r++) { |
| 223 vpx_memcpy(pred_ptr, above_row, bs); | 193 vpx_memcpy(dst, above, bs); |
| 224 pred_ptr += stride; | 194 dst += stride; |
| 225 } | 195 } |
| 226 } | 196 } |
| 227 intra_pred_allsizes(v) | 197 intra_pred_allsizes(v) |
| 228 | 198 |
| 229 static INLINE void h_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 199 static INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 230 uint8_t *above_row, uint8_t *left_col) { | 200 const uint8_t *above, const uint8_t *left) { |
| 231 int r; | 201 int r; |
| 232 | 202 |
| 233 for (r = 0; r < bs; r++) { | 203 for (r = 0; r < bs; r++) { |
| 234 vpx_memset(pred_ptr, left_col[r], bs); | 204 vpx_memset(dst, left[r], bs); |
| 235 pred_ptr += stride; | 205 dst += stride; |
| 236 } | 206 } |
| 237 } | 207 } |
| 238 intra_pred_allsizes(h) | 208 intra_pred_allsizes(h) |
| 239 | 209 |
| 240 static INLINE void tm_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 210 static INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 241 uint8_t *above_row, uint8_t *left_col) { | 211 const uint8_t *above, const uint8_t *left) { |
| 242 int r, c; | 212 int r, c; |
| 243 int ytop_left = above_row[-1]; | 213 int ytop_left = above[-1]; |
| 244 | 214 |
| 245 for (r = 0; r < bs; r++) { | 215 for (r = 0; r < bs; r++) { |
| 246 for (c = 0; c < bs; c++) | 216 for (c = 0; c < bs; c++) |
| 247 pred_ptr[c] = clip_pixel(left_col[r] + above_row[c] - ytop_left); | 217 dst[c] = clip_pixel(left[r] + above[c] - ytop_left); |
| 248 pred_ptr += stride; | 218 dst += stride; |
| 249 } | 219 } |
| 250 } | 220 } |
| 251 intra_pred_allsizes(tm) | 221 intra_pred_allsizes(tm) |
| 252 | 222 |
| 253 static INLINE void dc_128_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 223 static INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 254 uint8_t *above_row, uint8_t *left_col) { | 224 const uint8_t *above, const uint8_t *left) { |
| 255 int r; | 225 int r; |
| 256 | 226 |
| 257 for (r = 0; r < bs; r++) { | 227 for (r = 0; r < bs; r++) { |
| 258 vpx_memset(pred_ptr, 128, bs); | 228 vpx_memset(dst, 128, bs); |
| 259 pred_ptr += stride; | 229 dst += stride; |
| 260 } | 230 } |
| 261 } | 231 } |
| 262 intra_pred_allsizes(dc_128) | 232 intra_pred_allsizes(dc_128) |
| 263 | 233 |
| 264 static INLINE void dc_left_predictor(uint8_t *pred_ptr, ptrdiff_t stride, | 234 static INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 265 int bs, | 235 const uint8_t *above, |
| 266 uint8_t *above_row, uint8_t *left_col) { | 236 const uint8_t *left) { |
| 267 int i, r; | 237 int i, r, expected_dc, sum = 0; |
| 268 int expected_dc = 128; | |
| 269 int average = 0; | |
| 270 const int count = bs; | |
| 271 | 238 |
| 272 for (i = 0; i < bs; i++) | 239 for (i = 0; i < bs; i++) |
| 273 average += left_col[i]; | 240 sum += left[i]; |
| 274 expected_dc = (average + (count >> 1)) / count; | 241 expected_dc = (sum + (bs >> 1)) / bs; |
| 275 | 242 |
| 276 for (r = 0; r < bs; r++) { | 243 for (r = 0; r < bs; r++) { |
| 277 vpx_memset(pred_ptr, expected_dc, bs); | 244 vpx_memset(dst, expected_dc, bs); |
| 278 pred_ptr += stride; | 245 dst += stride; |
| 279 } | 246 } |
| 280 } | 247 } |
| 281 intra_pred_allsizes(dc_left) | 248 intra_pred_allsizes(dc_left) |
| 282 | 249 |
| 283 static INLINE void dc_top_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 250 static INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 284 uint8_t *above_row, uint8_t *left_col) { | 251 const uint8_t *above, const uint8_t *left) { |
| 285 int i, r; | 252 int i, r, expected_dc, sum = 0; |
| 286 int expected_dc = 128; | |
| 287 int average = 0; | |
| 288 const int count = bs; | |
| 289 | 253 |
| 290 for (i = 0; i < bs; i++) | 254 for (i = 0; i < bs; i++) |
| 291 average += above_row[i]; | 255 sum += above[i]; |
| 292 expected_dc = (average + (count >> 1)) / count; | 256 expected_dc = (sum + (bs >> 1)) / bs; |
| 293 | 257 |
| 294 for (r = 0; r < bs; r++) { | 258 for (r = 0; r < bs; r++) { |
| 295 vpx_memset(pred_ptr, expected_dc, bs); | 259 vpx_memset(dst, expected_dc, bs); |
| 296 pred_ptr += stride; | 260 dst += stride; |
| 297 } | 261 } |
| 298 } | 262 } |
| 299 intra_pred_allsizes(dc_top) | 263 intra_pred_allsizes(dc_top) |
| 300 | 264 |
| 301 static INLINE void dc_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 265 static INLINE void dc_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
| 302 uint8_t *above_row, uint8_t *left_col) { | 266 const uint8_t *above, const uint8_t *left) { |
| 303 int i, r; | 267 int i, r, expected_dc, sum = 0; |
| 304 int expected_dc = 128; | |
| 305 int average = 0; | |
| 306 const int count = 2 * bs; | 268 const int count = 2 * bs; |
| 307 | 269 |
| 308 for (i = 0; i < bs; i++) | 270 for (i = 0; i < bs; i++) { |
| 309 average += above_row[i]; | 271 sum += above[i]; |
| 310 for (i = 0; i < bs; i++) | 272 sum += left[i]; |
| 311 average += left_col[i]; | 273 } |
| 312 expected_dc = (average + (count >> 1)) / count; | 274 |
| 313 | 275 expected_dc = (sum + (count >> 1)) / count; |
| 314 for (r = 0; r < bs; r++) { | 276 |
| 315 vpx_memset(pred_ptr, expected_dc, bs); | 277 for (r = 0; r < bs; r++) { |
| 316 pred_ptr += stride; | 278 vpx_memset(dst, expected_dc, bs); |
| 279 dst += stride; |
| 317 } | 280 } |
| 318 } | 281 } |
| 319 intra_pred_allsizes(dc) | 282 intra_pred_allsizes(dc) |
| 320 #undef intra_pred_allsizes | 283 #undef intra_pred_allsizes |
| 321 | 284 |
| 322 typedef void (*intra_pred_fn)(uint8_t *pred_ptr, ptrdiff_t stride, | 285 typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride, |
| 323 uint8_t *above_row, uint8_t *left_col); | 286 const uint8_t *above, const uint8_t *left); |
| 324 | 287 |
| 325 static intra_pred_fn pred[VP9_INTRA_MODES][4]; | 288 static intra_pred_fn pred[INTRA_MODES][4]; |
| 326 static intra_pred_fn dc_pred[2][2][4]; | 289 static intra_pred_fn dc_pred[2][2][4]; |
| 327 | 290 |
| 328 static void init_intra_pred_fn_ptrs(void) { | 291 static void init_intra_pred_fn_ptrs(void) { |
| 329 #define intra_pred_allsizes(l, type) \ | 292 #define intra_pred_allsizes(l, type) \ |
| 330 l[0] = vp9_##type##_predictor_4x4; \ | 293 l[0] = vp9_##type##_predictor_4x4; \ |
| 331 l[1] = vp9_##type##_predictor_8x8; \ | 294 l[1] = vp9_##type##_predictor_8x8; \ |
| 332 l[2] = vp9_##type##_predictor_16x16; \ | 295 l[2] = vp9_##type##_predictor_16x16; \ |
| 333 l[3] = vp9_##type##_predictor_32x32 | 296 l[3] = vp9_##type##_predictor_32x32 |
| 334 | 297 |
| 335 intra_pred_allsizes(pred[V_PRED], v); | 298 intra_pred_allsizes(pred[V_PRED], v); |
| 336 intra_pred_allsizes(pred[H_PRED], h); | 299 intra_pred_allsizes(pred[H_PRED], h); |
| 337 intra_pred_allsizes(pred[D27_PRED], d27); | 300 intra_pred_allsizes(pred[D207_PRED], d207); |
| 338 intra_pred_allsizes(pred[D45_PRED], d45); | 301 intra_pred_allsizes(pred[D45_PRED], d45); |
| 339 intra_pred_allsizes(pred[D63_PRED], d63); | 302 intra_pred_allsizes(pred[D63_PRED], d63); |
| 340 intra_pred_allsizes(pred[D117_PRED], d117); | 303 intra_pred_allsizes(pred[D117_PRED], d117); |
| 341 intra_pred_allsizes(pred[D135_PRED], d135); | 304 intra_pred_allsizes(pred[D135_PRED], d135); |
| 342 intra_pred_allsizes(pred[D153_PRED], d153); | 305 intra_pred_allsizes(pred[D153_PRED], d153); |
| 343 intra_pred_allsizes(pred[TM_PRED], tm); | 306 intra_pred_allsizes(pred[TM_PRED], tm); |
| 344 | 307 |
| 345 intra_pred_allsizes(dc_pred[0][0], dc_128); | 308 intra_pred_allsizes(dc_pred[0][0], dc_128); |
| 346 intra_pred_allsizes(dc_pred[0][1], dc_top); | 309 intra_pred_allsizes(dc_pred[0][1], dc_top); |
| 347 intra_pred_allsizes(dc_pred[1][0], dc_left); | 310 intra_pred_allsizes(dc_pred[1][0], dc_left); |
| 348 intra_pred_allsizes(dc_pred[1][1], dc); | 311 intra_pred_allsizes(dc_pred[1][1], dc); |
| 349 | 312 |
| 350 #undef intra_pred_allsizes | 313 #undef intra_pred_allsizes |
| 351 } | 314 } |
| 352 | 315 |
| 353 static void build_intra_predictors(uint8_t *src, int src_stride, | 316 static void build_intra_predictors(const uint8_t *ref, int ref_stride, |
| 354 uint8_t *pred_ptr, int stride, | 317 uint8_t *dst, int dst_stride, |
| 355 MB_PREDICTION_MODE mode, TX_SIZE txsz, | 318 MB_PREDICTION_MODE mode, TX_SIZE tx_size, |
| 356 int up_available, int left_available, | 319 int up_available, int left_available, |
| 357 int right_available) { | 320 int right_available) { |
| 358 int i; | 321 int i; |
| 359 DECLARE_ALIGNED_ARRAY(16, uint8_t, left_col, 64); | 322 DECLARE_ALIGNED_ARRAY(16, uint8_t, left_col, 64); |
| 360 DECLARE_ALIGNED_ARRAY(16, uint8_t, yabove_data, 128 + 16); | 323 DECLARE_ALIGNED_ARRAY(16, uint8_t, above_data, 128 + 16); |
| 361 uint8_t *above_row = yabove_data + 16; | 324 uint8_t *above_row = above_data + 16; |
| 362 const int bs = 4 << txsz; | 325 const uint8_t *const_above_row = above_row; |
| 326 const int bs = 4 << tx_size; |
| 363 | 327 |
| 364 // 127 127 127 .. 127 127 127 127 127 127 | 328 // 127 127 127 .. 127 127 127 127 127 127 |
| 365 // 129 A B .. Y Z | 329 // 129 A B .. Y Z |
| 366 // 129 C D .. W X | 330 // 129 C D .. W X |
| 367 // 129 E F .. U V | 331 // 129 E F .. U V |
| 368 // 129 G H .. S T T T T T | 332 // 129 G H .. S T T T T T |
| 369 // .. | 333 // .. |
| 370 | 334 |
| 371 once(init_intra_pred_fn_ptrs); | 335 once(init_intra_pred_fn_ptrs); |
| 336 |
| 337 // left |
| 372 if (left_available) { | 338 if (left_available) { |
| 373 for (i = 0; i < bs; i++) | 339 for (i = 0; i < bs; i++) |
| 374 left_col[i] = src[i * src_stride - 1]; | 340 left_col[i] = ref[i * ref_stride - 1]; |
| 375 } else { | 341 } else { |
| 376 vpx_memset(left_col, 129, bs); | 342 vpx_memset(left_col, 129, bs); |
| 377 } | 343 } |
| 378 | 344 |
| 345 // above |
| 379 if (up_available) { | 346 if (up_available) { |
| 380 uint8_t *above_ptr = src - src_stride; | 347 const uint8_t *above_ref = ref - ref_stride; |
| 381 if (bs == 4 && right_available && left_available) { | 348 if (bs == 4 && right_available && left_available) { |
| 382 above_row = above_ptr; | 349 const_above_row = above_ref; |
| 383 } else { | 350 } else { |
| 384 vpx_memcpy(above_row, above_ptr, bs); | 351 vpx_memcpy(above_row, above_ref, bs); |
| 385 if (bs == 4 && right_available) | 352 if (bs == 4 && right_available) |
| 386 vpx_memcpy(above_row + bs, above_ptr + bs, bs); | 353 vpx_memcpy(above_row + bs, above_ref + bs, bs); |
| 387 else | 354 else |
| 388 vpx_memset(above_row + bs, above_row[bs - 1], bs); | 355 vpx_memset(above_row + bs, above_row[bs - 1], bs); |
| 389 above_row[-1] = left_available ? above_ptr[-1] : 129; | 356 above_row[-1] = left_available ? above_ref[-1] : 129; |
| 390 } | 357 } |
| 391 } else { | 358 } else { |
| 392 vpx_memset(above_row, 127, bs * 2); | 359 vpx_memset(above_row, 127, bs * 2); |
| 393 above_row[-1] = 127; | 360 above_row[-1] = 127; |
| 394 } | 361 } |
| 395 | 362 |
| 363 // predict |
| 396 if (mode == DC_PRED) { | 364 if (mode == DC_PRED) { |
| 397 dc_pred[left_available][up_available][txsz](pred_ptr, stride, | 365 dc_pred[left_available][up_available][tx_size](dst, dst_stride, |
| 398 above_row, left_col); | 366 const_above_row, left_col); |
| 399 } else { | 367 } else { |
| 400 pred[mode][txsz](pred_ptr, stride, above_row, left_col); | 368 pred[mode][tx_size](dst, dst_stride, const_above_row, left_col); |
| 401 } | 369 } |
| 402 } | 370 } |
| 403 | 371 |
| 404 void vp9_predict_intra_block(MACROBLOCKD *xd, | 372 void vp9_predict_intra_block(MACROBLOCKD *xd, int block_idx, int bwl_in, |
| 405 int block_idx, | 373 TX_SIZE tx_size, int mode, |
| 406 int bwl_in, | 374 const uint8_t *ref, int ref_stride, |
| 407 TX_SIZE tx_size, | 375 uint8_t *dst, int dst_stride) { |
| 408 int mode, | |
| 409 uint8_t *reference, int ref_stride, | |
| 410 uint8_t *predictor, int pre_stride) { | |
| 411 const int bwl = bwl_in - tx_size; | 376 const int bwl = bwl_in - tx_size; |
| 412 const int wmask = (1 << bwl) - 1; | 377 const int wmask = (1 << bwl) - 1; |
| 413 const int have_top = (block_idx >> bwl) || xd->up_available; | 378 const int have_top = (block_idx >> bwl) || xd->up_available; |
| 414 const int have_left = (block_idx & wmask) || xd->left_available; | 379 const int have_left = (block_idx & wmask) || xd->left_available; |
| 415 const int have_right = ((block_idx & wmask) != wmask); | 380 const int have_right = ((block_idx & wmask) != wmask); |
| 416 | 381 |
| 417 assert(bwl >= 0); | 382 assert(bwl >= 0); |
| 418 build_intra_predictors(reference, ref_stride, | 383 build_intra_predictors(ref, ref_stride, dst, dst_stride, mode, tx_size, |
| 419 predictor, pre_stride, | 384 have_top, have_left, have_right); |
| 420 mode, | |
| 421 tx_size, | |
| 422 have_top, have_left, | |
| 423 have_right); | |
| 424 } | 385 } |
| OLD | NEW |