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 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 | 84 |
85 void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, | 85 void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, |
86 uint8_t *dst_ptr, | 86 uint8_t *dst_ptr, |
87 int src_pixels_per_line, | 87 int src_pixels_per_line, |
88 int dst_pixels_per_line, | 88 int dst_pixels_per_line, |
89 int rows, | 89 int rows, |
90 int cols, | 90 int cols, |
91 int flimit) { | 91 int flimit) { |
92 uint8_t const *p_src; | 92 uint8_t const *p_src; |
93 uint8_t *p_dst; | 93 uint8_t *p_dst; |
94 int row; | 94 int row, col, i, v, kernel; |
95 int col; | |
96 int i; | |
97 int v; | |
98 int pitch = src_pixels_per_line; | 95 int pitch = src_pixels_per_line; |
99 uint8_t d[8]; | 96 uint8_t d[8]; |
100 (void)dst_pixels_per_line; | 97 (void)dst_pixels_per_line; |
101 | 98 |
102 for (row = 0; row < rows; row++) { | 99 for (row = 0; row < rows; row++) { |
103 /* post_proc_down for one row */ | 100 /* post_proc_down for one row */ |
104 p_src = src_ptr; | 101 p_src = src_ptr; |
105 p_dst = dst_ptr; | 102 p_dst = dst_ptr; |
106 | 103 |
107 for (col = 0; col < cols; col++) { | 104 for (col = 0; col < cols; col++) { |
108 int kernel = 4; | 105 kernel = 4; |
109 int v = p_src[col]; | 106 v = p_src[col]; |
110 | 107 |
111 for (i = -2; i <= 2; i++) { | 108 for (i = -2; i <= 2; i++) { |
112 if (abs(v - p_src[col + i * pitch]) > flimit) | 109 if (abs(v - p_src[col + i * pitch]) > flimit) |
113 goto down_skip_convolve; | 110 goto down_skip_convolve; |
114 | 111 |
115 kernel += kernel5[2 + i] * p_src[col + i * pitch]; | 112 kernel += kernel5[2 + i] * p_src[col + i * pitch]; |
116 } | 113 } |
117 | 114 |
118 v = (kernel >> 3); | 115 v = (kernel >> 3); |
119 down_skip_convolve: | 116 down_skip_convolve: |
120 p_dst[col] = v; | 117 p_dst[col] = v; |
121 } | 118 } |
122 | 119 |
123 /* now post_proc_across */ | 120 /* now post_proc_across */ |
124 p_src = dst_ptr; | 121 p_src = dst_ptr; |
125 p_dst = dst_ptr; | 122 p_dst = dst_ptr; |
126 | 123 |
127 for (i = 0; i < 8; i++) | 124 for (i = 0; i < 8; i++) |
128 d[i] = p_src[i]; | 125 d[i] = p_src[i]; |
129 | 126 |
130 for (col = 0; col < cols; col++) { | 127 for (col = 0; col < cols; col++) { |
131 int kernel = 4; | 128 kernel = 4; |
132 v = p_src[col]; | 129 v = p_src[col]; |
133 | 130 |
134 d[col & 7] = v; | 131 d[col & 7] = v; |
135 | 132 |
136 for (i = -2; i <= 2; i++) { | 133 for (i = -2; i <= 2; i++) { |
137 if (abs(v - p_src[col + i]) > flimit) | 134 if (abs(v - p_src[col + i]) > flimit) |
138 goto across_skip_convolve; | 135 goto across_skip_convolve; |
139 | 136 |
140 kernel += kernel5[2 + i] * p_src[col + i]; | 137 kernel += kernel5[2 + i] * p_src[col + i]; |
141 } | 138 } |
(...skipping 19 matching lines...) Expand all Loading... |
161 #if CONFIG_VP9_HIGHBITDEPTH | 158 #if CONFIG_VP9_HIGHBITDEPTH |
162 void vp9_highbd_post_proc_down_and_across_c(const uint16_t *src_ptr, | 159 void vp9_highbd_post_proc_down_and_across_c(const uint16_t *src_ptr, |
163 uint16_t *dst_ptr, | 160 uint16_t *dst_ptr, |
164 int src_pixels_per_line, | 161 int src_pixels_per_line, |
165 int dst_pixels_per_line, | 162 int dst_pixels_per_line, |
166 int rows, | 163 int rows, |
167 int cols, | 164 int cols, |
168 int flimit) { | 165 int flimit) { |
169 uint16_t const *p_src; | 166 uint16_t const *p_src; |
170 uint16_t *p_dst; | 167 uint16_t *p_dst; |
171 int row; | 168 int row, col, i, v, kernel; |
172 int col; | |
173 int i; | |
174 int v; | |
175 int pitch = src_pixels_per_line; | 169 int pitch = src_pixels_per_line; |
176 uint16_t d[8]; | 170 uint16_t d[8]; |
177 | 171 |
178 for (row = 0; row < rows; row++) { | 172 for (row = 0; row < rows; row++) { |
179 // post_proc_down for one row. | 173 // post_proc_down for one row. |
180 p_src = src_ptr; | 174 p_src = src_ptr; |
181 p_dst = dst_ptr; | 175 p_dst = dst_ptr; |
182 | 176 |
183 for (col = 0; col < cols; col++) { | 177 for (col = 0; col < cols; col++) { |
184 int kernel = 4; | 178 kernel = 4; |
185 int v = p_src[col]; | 179 v = p_src[col]; |
186 | 180 |
187 for (i = -2; i <= 2; i++) { | 181 for (i = -2; i <= 2; i++) { |
188 if (abs(v - p_src[col + i * pitch]) > flimit) | 182 if (abs(v - p_src[col + i * pitch]) > flimit) |
189 goto down_skip_convolve; | 183 goto down_skip_convolve; |
190 | 184 |
191 kernel += kernel5[2 + i] * p_src[col + i * pitch]; | 185 kernel += kernel5[2 + i] * p_src[col + i * pitch]; |
192 } | 186 } |
193 | 187 |
194 v = (kernel >> 3); | 188 v = (kernel >> 3); |
195 | 189 |
196 down_skip_convolve: | 190 down_skip_convolve: |
197 p_dst[col] = v; | 191 p_dst[col] = v; |
198 } | 192 } |
199 | 193 |
200 /* now post_proc_across */ | 194 /* now post_proc_across */ |
201 p_src = dst_ptr; | 195 p_src = dst_ptr; |
202 p_dst = dst_ptr; | 196 p_dst = dst_ptr; |
203 | 197 |
204 for (i = 0; i < 8; i++) | 198 for (i = 0; i < 8; i++) |
205 d[i] = p_src[i]; | 199 d[i] = p_src[i]; |
206 | 200 |
207 for (col = 0; col < cols; col++) { | 201 for (col = 0; col < cols; col++) { |
208 int kernel = 4; | 202 kernel = 4; |
209 v = p_src[col]; | 203 v = p_src[col]; |
210 | 204 |
211 d[col & 7] = v; | 205 d[col & 7] = v; |
212 | 206 |
213 for (i = -2; i <= 2; i++) { | 207 for (i = -2; i <= 2; i++) { |
214 if (abs(v - p_src[col + i]) > flimit) | 208 if (abs(v - p_src[col + i]) > flimit) |
215 goto across_skip_convolve; | 209 goto across_skip_convolve; |
216 | 210 |
217 kernel += kernel5[2 + i] * p_src[col + i]; | 211 kernel += kernel5[2 + i] * p_src[col + i]; |
218 } | 212 } |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 for (i = 0; i < MAX_MB_PLANE; ++i) { | 505 for (i = 0; i < MAX_MB_PLANE; ++i) { |
512 const int src_stride = src_strides[i]; | 506 const int src_stride = src_strides[i]; |
513 const int src_width = src_widths[i] - 4; | 507 const int src_width = src_widths[i] - 4; |
514 const int src_height = src_heights[i] - 4; | 508 const int src_height = src_heights[i] - 4; |
515 const int dst_stride = dst_strides[i]; | 509 const int dst_stride = dst_strides[i]; |
516 | 510 |
517 #if CONFIG_VP9_HIGHBITDEPTH | 511 #if CONFIG_VP9_HIGHBITDEPTH |
518 assert((src->flags & YV12_FLAG_HIGHBITDEPTH) == | 512 assert((src->flags & YV12_FLAG_HIGHBITDEPTH) == |
519 (dst->flags & YV12_FLAG_HIGHBITDEPTH)); | 513 (dst->flags & YV12_FLAG_HIGHBITDEPTH)); |
520 if (src->flags & YV12_FLAG_HIGHBITDEPTH) { | 514 if (src->flags & YV12_FLAG_HIGHBITDEPTH) { |
521 const uint16_t *const src = CONVERT_TO_SHORTPTR(srcs[i] + 2 * src_stride | 515 const uint16_t *const src_plane = CONVERT_TO_SHORTPTR( |
522 + 2); | 516 srcs[i] + 2 * src_stride + 2); |
523 uint16_t *const dst = CONVERT_TO_SHORTPTR(dsts[i] + 2 * dst_stride + 2); | 517 uint16_t *const dst_plane = CONVERT_TO_SHORTPTR( |
524 vp9_highbd_post_proc_down_and_across(src, dst, src_stride, dst_stride, | 518 dsts[i] + 2 * dst_stride + 2); |
525 src_height, src_width, ppl); | 519 vp9_highbd_post_proc_down_and_across(src_plane, dst_plane, src_stride, |
| 520 dst_stride, src_height, src_width, |
| 521 ppl); |
526 } else { | 522 } else { |
527 const uint8_t *const src = srcs[i] + 2 * src_stride + 2; | 523 const uint8_t *const src_plane = srcs[i] + 2 * src_stride + 2; |
528 uint8_t *const dst = dsts[i] + 2 * dst_stride + 2; | 524 uint8_t *const dst_plane = dsts[i] + 2 * dst_stride + 2; |
529 | 525 |
530 vp9_post_proc_down_and_across(src, dst, src_stride, dst_stride, | 526 vp9_post_proc_down_and_across(src_plane, dst_plane, src_stride, |
531 src_height, src_width, ppl); | 527 dst_stride, src_height, src_width, ppl); |
532 } | 528 } |
533 #else | 529 #else |
534 const uint8_t *const src = srcs[i] + 2 * src_stride + 2; | 530 const uint8_t *const src_plane = srcs[i] + 2 * src_stride + 2; |
535 uint8_t *const dst = dsts[i] + 2 * dst_stride + 2; | 531 uint8_t *const dst_plane = dsts[i] + 2 * dst_stride + 2; |
536 vp9_post_proc_down_and_across(src, dst, src_stride, dst_stride, | 532 vp9_post_proc_down_and_across(src_plane, dst_plane, src_stride, dst_stride, |
537 src_height, src_width, ppl); | 533 src_height, src_width, ppl); |
538 #endif | 534 #endif |
539 } | 535 } |
540 } | 536 } |
541 | 537 |
542 static double gaussian(double sigma, double mu, double x) { | 538 static double gaussian(double sigma, double mu, double x) { |
543 return 1 / (sigma * sqrt(2.0 * 3.14159265)) * | 539 return 1 / (sigma * sqrt(2.0 * 3.14159265)) * |
544 (exp(-(x - mu) * (x - mu) / (2 * sigma * sigma))); | 540 (exp(-(x - mu) * (x - mu) / (2 * sigma * sigma))); |
545 } | 541 } |
546 | 542 |
547 static void fillrd(struct postproc_state *state, int q, int a) { | 543 static void fillrd(struct postproc_state *state, int q, int a) { |
548 char char_dist[300]; | 544 char char_dist[300]; |
549 | 545 |
550 double sigma; | 546 double sigma; |
551 int ai = a, qi = q, i; | 547 int ai = a, qi = q, i; |
552 | 548 |
553 vp9_clear_system_state(); | 549 vp9_clear_system_state(); |
554 | 550 |
555 sigma = ai + .5 + .6 * (63 - qi) / 63.0; | 551 sigma = ai + .5 + .6 * (63 - qi) / 63.0; |
556 | 552 |
557 /* set up a lookup table of 256 entries that matches | 553 /* set up a lookup table of 256 entries that matches |
558 * a gaussian distribution with sigma determined by q. | 554 * a gaussian distribution with sigma determined by q. |
559 */ | 555 */ |
560 { | 556 { |
561 double i; | |
562 int next, j; | 557 int next, j; |
563 | 558 |
564 next = 0; | 559 next = 0; |
565 | 560 |
566 for (i = -32; i < 32; i++) { | 561 for (i = -32; i < 32; i++) { |
567 int a = (int)(0.5 + 256 * gaussian(sigma, 0, i)); | 562 int a_i = (int)(0.5 + 256 * gaussian(sigma, 0, i)); |
568 | 563 |
569 if (a) { | 564 if (a_i) { |
570 for (j = 0; j < a; j++) { | 565 for (j = 0; j < a_i; j++) { |
571 char_dist[next + j] = (char) i; | 566 char_dist[next + j] = (char) i; |
572 } | 567 } |
573 | 568 |
574 next = next + j; | 569 next = next + j; |
575 } | 570 } |
576 } | 571 } |
577 | 572 |
578 for (; next < 256; next++) | 573 for (; next < 256; next++) |
579 char_dist[next] = 0; | 574 char_dist[next] = 0; |
580 } | 575 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 | 644 |
650 // Alloc memory for prev_mip in the first frame. | 645 // Alloc memory for prev_mip in the first frame. |
651 if (cm->current_video_frame == 1) { | 646 if (cm->current_video_frame == 1) { |
652 cm->postproc_state.last_base_qindex = cm->base_qindex; | 647 cm->postproc_state.last_base_qindex = cm->base_qindex; |
653 cm->postproc_state.last_frame_valid = 1; | 648 cm->postproc_state.last_frame_valid = 1; |
654 ppstate->prev_mip = vpx_calloc(cm->mi_alloc_size, sizeof(*cm->mip)); | 649 ppstate->prev_mip = vpx_calloc(cm->mi_alloc_size, sizeof(*cm->mip)); |
655 if (!ppstate->prev_mip) { | 650 if (!ppstate->prev_mip) { |
656 return 1; | 651 return 1; |
657 } | 652 } |
658 ppstate->prev_mi = ppstate->prev_mip + cm->mi_stride + 1; | 653 ppstate->prev_mi = ppstate->prev_mip + cm->mi_stride + 1; |
659 vpx_memset(ppstate->prev_mip, 0, | 654 memset(ppstate->prev_mip, 0, |
660 cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip)); | 655 cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip)); |
661 } | 656 } |
662 | 657 |
663 // Allocate post_proc_buffer_int if needed. | 658 // Allocate post_proc_buffer_int if needed. |
664 if ((flags & VP9D_MFQE) && !cm->post_proc_buffer_int.buffer_alloc) { | 659 if ((flags & VP9D_MFQE) && !cm->post_proc_buffer_int.buffer_alloc) { |
665 if ((flags & VP9D_DEMACROBLOCK) || (flags & VP9D_DEBLOCK)) { | 660 if ((flags & VP9D_DEMACROBLOCK) || (flags & VP9D_DEBLOCK)) { |
666 const int width = ALIGN_POWER_OF_TWO(cm->width, 4); | 661 const int width = ALIGN_POWER_OF_TWO(cm->width, 4); |
667 const int height = ALIGN_POWER_OF_TWO(cm->height, 4); | 662 const int height = ALIGN_POWER_OF_TWO(cm->height, 4); |
668 | 663 |
669 if (vp9_alloc_frame_buffer(&cm->post_proc_buffer_int, width, height, | 664 if (vp9_alloc_frame_buffer(&cm->post_proc_buffer_int, width, height, |
670 cm->subsampling_x, cm->subsampling_y, | 665 cm->subsampling_x, cm->subsampling_y, |
671 #if CONFIG_VP9_HIGHBITDEPTH | 666 #if CONFIG_VP9_HIGHBITDEPTH |
672 cm->use_highbitdepth, | 667 cm->use_highbitdepth, |
673 #endif // CONFIG_VP9_HIGHBITDEPTH | 668 #endif // CONFIG_VP9_HIGHBITDEPTH |
674 VP9_ENC_BORDER_IN_PIXELS, | 669 VP9_ENC_BORDER_IN_PIXELS, |
675 cm->byte_alignment) < 0) { | 670 cm->byte_alignment) < 0) { |
676 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 671 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, |
677 "Failed to allocate MFQE framebuffer"); | 672 "Failed to allocate MFQE framebuffer"); |
678 } | 673 } |
679 | 674 |
680 // Ensure that postproc is set to all 0s so that post proc | 675 // Ensure that postproc is set to all 0s so that post proc |
681 // doesn't pull random data in from edge. | 676 // doesn't pull random data in from edge. |
682 vpx_memset(cm->post_proc_buffer_int.buffer_alloc, 128, | 677 memset(cm->post_proc_buffer_int.buffer_alloc, 128, |
683 cm->post_proc_buffer.frame_size); | 678 cm->post_proc_buffer.frame_size); |
684 } | 679 } |
685 } | 680 } |
686 | 681 |
687 if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, cm->width, cm->height, | 682 if (vp9_realloc_frame_buffer(&cm->post_proc_buffer, cm->width, cm->height, |
688 cm->subsampling_x, cm->subsampling_y, | 683 cm->subsampling_x, cm->subsampling_y, |
689 #if CONFIG_VP9_HIGHBITDEPTH | 684 #if CONFIG_VP9_HIGHBITDEPTH |
690 cm->use_highbitdepth, | 685 cm->use_highbitdepth, |
691 #endif | 686 #endif |
692 VP9_DEC_BORDER_IN_PIXELS, cm->byte_alignment, | 687 VP9_DEC_BORDER_IN_PIXELS, cm->byte_alignment, |
693 NULL, NULL, NULL) < 0) | 688 NULL, NULL, NULL) < 0) |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
743 /* handle problem with extending borders */ | 738 /* handle problem with extending borders */ |
744 dest->y_width = cm->width; | 739 dest->y_width = cm->width; |
745 dest->y_height = cm->height; | 740 dest->y_height = cm->height; |
746 dest->uv_width = dest->y_width >> cm->subsampling_x; | 741 dest->uv_width = dest->y_width >> cm->subsampling_x; |
747 dest->uv_height = dest->y_height >> cm->subsampling_y; | 742 dest->uv_height = dest->y_height >> cm->subsampling_y; |
748 | 743 |
749 swap_mi_and_prev_mi(cm); | 744 swap_mi_and_prev_mi(cm); |
750 return 0; | 745 return 0; |
751 } | 746 } |
752 #endif // CONFIG_VP9_POSTPROC | 747 #endif // CONFIG_VP9_POSTPROC |
OLD | NEW |