OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 BLOCK_SIZE bs, | 183 BLOCK_SIZE bs, |
184 int increase_denoising, | 184 int increase_denoising, |
185 int mi_row, | 185 int mi_row, |
186 int mi_col) { | 186 int mi_col) { |
187 int mv_col, mv_row; | 187 int mv_col, mv_row; |
188 int sse_diff = denoiser->zero_mv_sse - denoiser->best_sse; | 188 int sse_diff = denoiser->zero_mv_sse - denoiser->best_sse; |
189 MV_REFERENCE_FRAME frame; | 189 MV_REFERENCE_FRAME frame; |
190 MACROBLOCKD *filter_mbd = &mb->e_mbd; | 190 MACROBLOCKD *filter_mbd = &mb->e_mbd; |
191 MB_MODE_INFO *mbmi = &filter_mbd->mi[0]->mbmi; | 191 MB_MODE_INFO *mbmi = &filter_mbd->mi[0]->mbmi; |
192 | 192 |
| 193 MB_MODE_INFO saved_mbmi; |
| 194 int i, j; |
| 195 struct buf_2d saved_dst[MAX_MB_PLANE]; |
| 196 struct buf_2d saved_pre[MAX_MB_PLANE][2]; // 2 pre buffers |
| 197 |
193 // We will restore these after motion compensation. | 198 // We will restore these after motion compensation. |
194 MB_MODE_INFO saved_mbmi = *mbmi; | 199 saved_mbmi = *mbmi; |
195 struct buf_2d saved_dst = filter_mbd->plane[0].dst; | 200 for (i = 0; i < MAX_MB_PLANE; ++i) { |
196 struct buf_2d saved_pre[2]; | 201 for (j = 0; j < 2; ++j) { |
197 saved_pre[0] = filter_mbd->plane[0].pre[0]; | 202 saved_pre[i][j] = filter_mbd->plane[i].pre[j]; |
198 saved_pre[1] = filter_mbd->plane[0].pre[1]; | 203 } |
| 204 saved_dst[i] = filter_mbd->plane[i].dst; |
| 205 } |
199 | 206 |
200 mv_col = denoiser->best_sse_mv.as_mv.col; | 207 mv_col = denoiser->best_sse_mv.as_mv.col; |
201 mv_row = denoiser->best_sse_mv.as_mv.row; | 208 mv_row = denoiser->best_sse_mv.as_mv.row; |
202 | 209 |
203 frame = denoiser->best_reference_frame; | 210 frame = denoiser->best_reference_frame; |
204 | 211 |
205 // If the best reference frame uses inter-prediction and there is enough of a | 212 // If the best reference frame uses inter-prediction and there is enough of a |
206 // difference in sum-squared-error, use it. | 213 // difference in sum-squared-error, use it. |
207 if (frame != INTRA_FRAME && | 214 if (frame != INTRA_FRAME && |
208 sse_diff > sse_diff_thresh(bs, increase_denoising, mv_row, mv_col)) { | 215 sse_diff > sse_diff_thresh(bs, increase_denoising, mv_row, mv_col)) { |
209 mbmi->ref_frame[0] = denoiser->best_reference_frame; | 216 mbmi->ref_frame[0] = denoiser->best_reference_frame; |
210 mbmi->mode = denoiser->best_sse_inter_mode; | 217 mbmi->mode = denoiser->best_sse_inter_mode; |
211 mbmi->mv[0] = denoiser->best_sse_mv; | 218 mbmi->mv[0] = denoiser->best_sse_mv; |
212 } else { | 219 } else { |
213 // Otherwise, use the zero reference frame. | 220 // Otherwise, use the zero reference frame. |
214 frame = denoiser->best_zeromv_reference_frame; | 221 frame = denoiser->best_zeromv_reference_frame; |
215 | 222 |
216 mbmi->ref_frame[0] = denoiser->best_zeromv_reference_frame; | 223 mbmi->ref_frame[0] = denoiser->best_zeromv_reference_frame; |
217 mbmi->mode = ZEROMV; | 224 mbmi->mode = ZEROMV; |
218 mbmi->mv[0].as_int = 0; | 225 mbmi->mv[0].as_int = 0; |
219 | 226 |
220 denoiser->best_sse_inter_mode = ZEROMV; | 227 denoiser->best_sse_inter_mode = ZEROMV; |
221 denoiser->best_sse_mv.as_int = 0; | 228 denoiser->best_sse_mv.as_int = 0; |
222 denoiser->best_sse = denoiser->zero_mv_sse; | 229 denoiser->best_sse = denoiser->zero_mv_sse; |
223 } | 230 } |
224 | 231 |
225 // Set the pointers in the MACROBLOCKD to point to the buffers in the denoiser | 232 // Set the pointers in the MACROBLOCKD to point to the buffers in the denoiser |
226 // struct. | 233 // struct. |
227 filter_mbd->plane[0].pre[0].buf = | 234 for (j = 0; j < 2; ++j) { |
228 block_start(denoiser->running_avg_y[frame].y_buffer, | 235 filter_mbd->plane[0].pre[j].buf = |
229 denoiser->running_avg_y[frame].y_stride, | 236 block_start(denoiser->running_avg_y[frame].y_buffer, |
230 mi_row, mi_col); | 237 denoiser->running_avg_y[frame].y_stride, |
231 filter_mbd->plane[0].pre[0].stride = denoiser->running_avg_y[frame].y_stride; | 238 mi_row, mi_col); |
232 | 239 filter_mbd->plane[0].pre[j].stride = |
233 filter_mbd->plane[1].pre[0].buf = | 240 denoiser->running_avg_y[frame].y_stride; |
234 block_start(denoiser->running_avg_y[frame].u_buffer, | 241 filter_mbd->plane[1].pre[j].buf = |
235 denoiser->running_avg_y[frame].uv_stride, | 242 block_start(denoiser->running_avg_y[frame].u_buffer, |
236 mi_row, mi_col); | 243 denoiser->running_avg_y[frame].uv_stride, |
237 filter_mbd->plane[1].pre[0].stride = denoiser->running_avg_y[frame].uv_stride; | 244 mi_row, mi_col); |
238 | 245 filter_mbd->plane[1].pre[j].stride = |
239 filter_mbd->plane[2].pre[0].buf = | 246 denoiser->running_avg_y[frame].uv_stride; |
240 block_start(denoiser->running_avg_y[frame].v_buffer, | 247 filter_mbd->plane[2].pre[j].buf = |
241 denoiser->running_avg_y[frame].uv_stride, | 248 block_start(denoiser->running_avg_y[frame].v_buffer, |
242 mi_row, mi_col); | 249 denoiser->running_avg_y[frame].uv_stride, |
243 filter_mbd->plane[2].pre[0].stride = denoiser->running_avg_y[frame].uv_stride; | 250 mi_row, mi_col); |
244 | 251 filter_mbd->plane[2].pre[j].stride = |
245 filter_mbd->plane[0].pre[1].buf = | 252 denoiser->running_avg_y[frame].uv_stride; |
246 block_start(denoiser->running_avg_y[frame].y_buffer, | 253 } |
247 denoiser->running_avg_y[frame].y_stride, | |
248 mi_row, mi_col); | |
249 filter_mbd->plane[0].pre[1].stride = denoiser->running_avg_y[frame].y_stride; | |
250 | |
251 filter_mbd->plane[1].pre[1].buf = | |
252 block_start(denoiser->running_avg_y[frame].u_buffer, | |
253 denoiser->running_avg_y[frame].uv_stride, | |
254 mi_row, mi_col); | |
255 filter_mbd->plane[1].pre[1].stride = denoiser->running_avg_y[frame].uv_stride; | |
256 | |
257 filter_mbd->plane[2].pre[1].buf = | |
258 block_start(denoiser->running_avg_y[frame].v_buffer, | |
259 denoiser->running_avg_y[frame].uv_stride, | |
260 mi_row, mi_col); | |
261 filter_mbd->plane[2].pre[1].stride = denoiser->running_avg_y[frame].uv_stride; | |
262 | |
263 filter_mbd->plane[0].dst.buf = | 254 filter_mbd->plane[0].dst.buf = |
264 block_start(denoiser->mc_running_avg_y.y_buffer, | 255 block_start(denoiser->mc_running_avg_y.y_buffer, |
265 denoiser->mc_running_avg_y.y_stride, | 256 denoiser->mc_running_avg_y.y_stride, |
266 mi_row, mi_col); | 257 mi_row, mi_col); |
267 filter_mbd->plane[0].dst.stride = denoiser->mc_running_avg_y.y_stride; | 258 filter_mbd->plane[0].dst.stride = denoiser->mc_running_avg_y.y_stride; |
268 | |
269 filter_mbd->plane[1].dst.buf = | 259 filter_mbd->plane[1].dst.buf = |
270 block_start(denoiser->mc_running_avg_y.u_buffer, | 260 block_start(denoiser->mc_running_avg_y.u_buffer, |
271 denoiser->mc_running_avg_y.uv_stride, | 261 denoiser->mc_running_avg_y.uv_stride, |
272 mi_row, mi_col); | 262 mi_row, mi_col); |
273 filter_mbd->plane[1].dst.stride = denoiser->mc_running_avg_y.y_stride; | 263 filter_mbd->plane[1].dst.stride = denoiser->mc_running_avg_y.uv_stride; |
274 | |
275 filter_mbd->plane[2].dst.buf = | 264 filter_mbd->plane[2].dst.buf = |
276 block_start(denoiser->mc_running_avg_y.v_buffer, | 265 block_start(denoiser->mc_running_avg_y.v_buffer, |
277 denoiser->mc_running_avg_y.uv_stride, | 266 denoiser->mc_running_avg_y.uv_stride, |
278 mi_row, mi_col); | 267 mi_row, mi_col); |
279 filter_mbd->plane[2].dst.stride = denoiser->mc_running_avg_y.y_stride; | 268 filter_mbd->plane[2].dst.stride = denoiser->mc_running_avg_y.uv_stride; |
280 | 269 |
281 vp9_build_inter_predictors_sby(filter_mbd, mv_row, mv_col, bs); | 270 vp9_build_inter_predictors_sby(filter_mbd, mv_row, mv_col, bs); |
282 | 271 |
283 // Restore everything to its original state | 272 // Restore everything to its original state |
284 filter_mbd->plane[0].pre[0] = saved_pre[0]; | |
285 filter_mbd->plane[0].pre[1] = saved_pre[1]; | |
286 filter_mbd->plane[0].dst = saved_dst; | |
287 *mbmi = saved_mbmi; | 273 *mbmi = saved_mbmi; |
| 274 for (i = 0; i < MAX_MB_PLANE; ++i) { |
| 275 for (j = 0; j < 2; ++j) { |
| 276 filter_mbd->plane[i].pre[j] = saved_pre[i][j]; |
| 277 } |
| 278 filter_mbd->plane[i].dst = saved_dst[i]; |
| 279 } |
288 | 280 |
289 mv_row = denoiser->best_sse_mv.as_mv.row; | 281 mv_row = denoiser->best_sse_mv.as_mv.row; |
290 mv_col = denoiser->best_sse_mv.as_mv.col; | 282 mv_col = denoiser->best_sse_mv.as_mv.col; |
291 | 283 |
292 if (denoiser->best_sse > sse_thresh(bs, increase_denoising)) { | 284 if (denoiser->best_sse > sse_thresh(bs, increase_denoising)) { |
293 return COPY_BLOCK; | 285 return COPY_BLOCK; |
294 } | 286 } |
295 if (mv_row * mv_row + mv_col * mv_col > | 287 if (mv_row * mv_row + mv_col * mv_col > |
296 8 * noise_motion_thresh(bs, increase_denoising)) { | 288 8 * noise_motion_thresh(bs, increase_denoising)) { |
297 return COPY_BLOCK; | 289 return COPY_BLOCK; |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 for (r = 0; r < yuv->uv_height / 2; ++r) { | 440 for (r = 0; r < yuv->uv_height / 2; ++r) { |
449 for (c = 0; c < yuv->uv_width / 2; ++c) { | 441 for (c = 0; c < yuv->uv_width / 2; ++c) { |
450 u[c] = UINT8_MAX / 2; | 442 u[c] = UINT8_MAX / 2; |
451 v[c] = UINT8_MAX / 2; | 443 v[c] = UINT8_MAX / 2; |
452 } | 444 } |
453 u += yuv->uv_stride + yuv->uv_width / 2; | 445 u += yuv->uv_stride + yuv->uv_width / 2; |
454 v += yuv->uv_stride + yuv->uv_width / 2; | 446 v += yuv->uv_stride + yuv->uv_width / 2; |
455 } | 447 } |
456 } | 448 } |
457 #endif | 449 #endif |
OLD | NEW |