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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 | 53 |
54 mbd->mode_info_context = pc->mi + pc->mode_info_stride * (i + 1); | 54 mbd->mode_info_context = pc->mi + pc->mode_info_stride * (i + 1); |
55 mbd->mode_info_stride = pc->mode_info_stride; | 55 mbd->mode_info_stride = pc->mode_info_stride; |
56 | 56 |
57 mbd->frame_type = pc->frame_type; | 57 mbd->frame_type = pc->frame_type; |
58 mbd->pre = xd->pre; | 58 mbd->pre = xd->pre; |
59 mbd->dst = xd->dst; | 59 mbd->dst = xd->dst; |
60 | 60 |
61 mbd->segmentation_enabled = xd->segmentation_enabled; | 61 mbd->segmentation_enabled = xd->segmentation_enabled; |
62 mbd->mb_segement_abs_delta = xd->mb_segement_abs_delta; | 62 mbd->mb_segement_abs_delta = xd->mb_segement_abs_delta; |
63 vpx_memcpy(mbd->segment_feature_data, xd->segment_feature_data, sizeof(x
d->segment_feature_data)); | 63 memcpy(mbd->segment_feature_data, xd->segment_feature_data, sizeof(xd->s
egment_feature_data)); |
64 | 64 |
65 /*signed char ref_lf_deltas[MAX_REF_LF_DELTAS];*/ | 65 /*signed char ref_lf_deltas[MAX_REF_LF_DELTAS];*/ |
66 vpx_memcpy(mbd->ref_lf_deltas, xd->ref_lf_deltas, sizeof(xd->ref_lf_delt
as)); | 66 memcpy(mbd->ref_lf_deltas, xd->ref_lf_deltas, sizeof(xd->ref_lf_deltas))
; |
67 /*signed char mode_lf_deltas[MAX_MODE_LF_DELTAS];*/ | 67 /*signed char mode_lf_deltas[MAX_MODE_LF_DELTAS];*/ |
68 vpx_memcpy(mbd->mode_lf_deltas, xd->mode_lf_deltas, sizeof(xd->mode_lf_d
eltas)); | 68 memcpy(mbd->mode_lf_deltas, xd->mode_lf_deltas, sizeof(xd->mode_lf_delta
s)); |
69 /*unsigned char mode_ref_lf_delta_enabled; | 69 /*unsigned char mode_ref_lf_delta_enabled; |
70 unsigned char mode_ref_lf_delta_update;*/ | 70 unsigned char mode_ref_lf_delta_update;*/ |
71 mbd->mode_ref_lf_delta_enabled = xd->mode_ref_lf_delta_enabled; | 71 mbd->mode_ref_lf_delta_enabled = xd->mode_ref_lf_delta_enabled; |
72 mbd->mode_ref_lf_delta_update = xd->mode_ref_lf_delta_update; | 72 mbd->mode_ref_lf_delta_update = xd->mode_ref_lf_delta_update; |
73 | 73 |
74 mbd->current_bc = &pbi->mbc[0]; | 74 mbd->current_bc = &pbi->mbc[0]; |
75 | 75 |
76 vpx_memcpy(mbd->dequant_y1_dc, xd->dequant_y1_dc, sizeof(xd->dequant_y1_
dc)); | 76 memcpy(mbd->dequant_y1_dc, xd->dequant_y1_dc, sizeof(xd->dequant_y1_dc))
; |
77 vpx_memcpy(mbd->dequant_y1, xd->dequant_y1, sizeof(xd->dequant_y1)); | 77 memcpy(mbd->dequant_y1, xd->dequant_y1, sizeof(xd->dequant_y1)); |
78 vpx_memcpy(mbd->dequant_y2, xd->dequant_y2, sizeof(xd->dequant_y2)); | 78 memcpy(mbd->dequant_y2, xd->dequant_y2, sizeof(xd->dequant_y2)); |
79 vpx_memcpy(mbd->dequant_uv, xd->dequant_uv, sizeof(xd->dequant_uv)); | 79 memcpy(mbd->dequant_uv, xd->dequant_uv, sizeof(xd->dequant_uv)); |
80 | 80 |
81 mbd->fullpixel_mask = 0xffffffff; | 81 mbd->fullpixel_mask = 0xffffffff; |
82 | 82 |
83 if (pc->full_pixel) | 83 if (pc->full_pixel) |
84 mbd->fullpixel_mask = 0xfffffff8; | 84 mbd->fullpixel_mask = 0xfffffff8; |
85 | 85 |
86 } | 86 } |
87 | 87 |
88 for (i = 0; i < pc->mb_rows; i++) | 88 for (i = 0; i < pc->mb_rows; i++) |
89 pbi->mt_current_mb_col[i] = -1; | 89 pbi->mt_current_mb_col[i] = -1; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 throw_residual = (!pbi->independent_partitions && | 130 throw_residual = (!pbi->independent_partitions && |
131 pbi->frame_corrupt_residual); | 131 pbi->frame_corrupt_residual); |
132 throw_residual = (throw_residual || vp8dx_bool_error(xd->current_bc)); | 132 throw_residual = (throw_residual || vp8dx_bool_error(xd->current_bc)); |
133 | 133 |
134 if ((mb_idx >= pbi->mvs_corrupt_from_mb || throw_residual)) | 134 if ((mb_idx >= pbi->mvs_corrupt_from_mb || throw_residual)) |
135 { | 135 { |
136 /* MB with corrupt residuals or corrupt mode/motion vectors. | 136 /* MB with corrupt residuals or corrupt mode/motion vectors. |
137 * Better to use the predictor as reconstruction. | 137 * Better to use the predictor as reconstruction. |
138 */ | 138 */ |
139 pbi->frame_corrupt_residual = 1; | 139 pbi->frame_corrupt_residual = 1; |
140 vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); | 140 memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); |
141 vp8_conceal_corrupt_mb(xd); | 141 vp8_conceal_corrupt_mb(xd); |
142 | 142 |
143 | 143 |
144 corruption_detected = 1; | 144 corruption_detected = 1; |
145 | 145 |
146 /* force idct to be skipped for B_PRED and use the | 146 /* force idct to be skipped for B_PRED and use the |
147 * prediction only for reconstruction | 147 * prediction only for reconstruction |
148 * */ | 148 * */ |
149 vpx_memset(xd->eobs, 0, 25); | 149 memset(xd->eobs, 0, 25); |
150 } | 150 } |
151 } | 151 } |
152 #endif | 152 #endif |
153 | 153 |
154 /* do prediction */ | 154 /* do prediction */ |
155 if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) | 155 if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) |
156 { | 156 { |
157 vp8_build_intra_predictors_mbuv_s(xd, | 157 vp8_build_intra_predictors_mbuv_s(xd, |
158 xd->recon_above[1], | 158 xd->recon_above[1], |
159 xd->recon_above[2], | 159 xd->recon_above[2], |
(...skipping 12 matching lines...) Expand all Loading... |
172 xd->dst.y_buffer, | 172 xd->dst.y_buffer, |
173 xd->dst.y_stride); | 173 xd->dst.y_stride); |
174 } | 174 } |
175 else | 175 else |
176 { | 176 { |
177 short *DQC = xd->dequant_y1; | 177 short *DQC = xd->dequant_y1; |
178 int dst_stride = xd->dst.y_stride; | 178 int dst_stride = xd->dst.y_stride; |
179 | 179 |
180 /* clear out residual eob info */ | 180 /* clear out residual eob info */ |
181 if(xd->mode_info_context->mbmi.mb_skip_coeff) | 181 if(xd->mode_info_context->mbmi.mb_skip_coeff) |
182 vpx_memset(xd->eobs, 0, 25); | 182 memset(xd->eobs, 0, 25); |
183 | 183 |
184 intra_prediction_down_copy(xd, xd->recon_above[0] + 16); | 184 intra_prediction_down_copy(xd, xd->recon_above[0] + 16); |
185 | 185 |
186 for (i = 0; i < 16; i++) | 186 for (i = 0; i < 16; i++) |
187 { | 187 { |
188 BLOCKD *b = &xd->block[i]; | 188 BLOCKD *b = &xd->block[i]; |
189 unsigned char *dst = xd->dst.y_buffer + b->offset; | 189 unsigned char *dst = xd->dst.y_buffer + b->offset; |
190 B_PREDICTION_MODE b_mode = | 190 B_PREDICTION_MODE b_mode = |
191 xd->mode_info_context->bmi[i].as_mode; | 191 xd->mode_info_context->bmi[i].as_mode; |
192 unsigned char *Above; | 192 unsigned char *Above; |
(...skipping 29 matching lines...) Expand all Loading... |
222 if (xd->eobs[i] ) | 222 if (xd->eobs[i] ) |
223 { | 223 { |
224 if (xd->eobs[i] > 1) | 224 if (xd->eobs[i] > 1) |
225 { | 225 { |
226 vp8_dequant_idct_add(b->qcoeff, DQC, dst, dst_stride); | 226 vp8_dequant_idct_add(b->qcoeff, DQC, dst, dst_stride); |
227 } | 227 } |
228 else | 228 else |
229 { | 229 { |
230 vp8_dc_only_idct_add(b->qcoeff[0] * DQC[0], | 230 vp8_dc_only_idct_add(b->qcoeff[0] * DQC[0], |
231 dst, dst_stride, dst, dst_stride); | 231 dst, dst_stride, dst, dst_stride); |
232 vpx_memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); | 232 memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); |
233 } | 233 } |
234 } | 234 } |
235 } | 235 } |
236 } | 236 } |
237 } | 237 } |
238 else | 238 else |
239 { | 239 { |
240 vp8_build_inter_predictors_mb(xd); | 240 vp8_build_inter_predictors_mb(xd); |
241 } | 241 } |
242 | 242 |
(...skipping 16 matching lines...) Expand all Loading... |
259 { | 259 { |
260 BLOCKD *b = &xd->block[24]; | 260 BLOCKD *b = &xd->block[24]; |
261 | 261 |
262 /* do 2nd order transform on the dc block */ | 262 /* do 2nd order transform on the dc block */ |
263 if (xd->eobs[24] > 1) | 263 if (xd->eobs[24] > 1) |
264 { | 264 { |
265 vp8_dequantize_b(b, xd->dequant_y2); | 265 vp8_dequantize_b(b, xd->dequant_y2); |
266 | 266 |
267 vp8_short_inv_walsh4x4(&b->dqcoeff[0], | 267 vp8_short_inv_walsh4x4(&b->dqcoeff[0], |
268 xd->qcoeff); | 268 xd->qcoeff); |
269 vpx_memset(b->qcoeff, 0, 16 * sizeof(b->qcoeff[0])); | 269 memset(b->qcoeff, 0, 16 * sizeof(b->qcoeff[0])); |
270 } | 270 } |
271 else | 271 else |
272 { | 272 { |
273 b->dqcoeff[0] = b->qcoeff[0] * xd->dequant_y2[0]; | 273 b->dqcoeff[0] = b->qcoeff[0] * xd->dequant_y2[0]; |
274 vp8_short_inv_walsh4x4_1(&b->dqcoeff[0], | 274 vp8_short_inv_walsh4x4_1(&b->dqcoeff[0], |
275 xd->qcoeff); | 275 xd->qcoeff); |
276 vpx_memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); | 276 memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); |
277 } | 277 } |
278 | 278 |
279 /* override the dc dequant constant in order to preserve the | 279 /* override the dc dequant constant in order to preserve the |
280 * dc components | 280 * dc components |
281 */ | 281 */ |
282 DQC = xd->dequant_y1_dc; | 282 DQC = xd->dequant_y1_dc; |
283 } | 283 } |
284 | 284 |
285 vp8_dequant_idct_add_y_block | 285 vp8_dequant_idct_add_y_block |
286 (xd->qcoeff, DQC, | 286 (xd->qcoeff, DQC, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 else | 353 else |
354 last_row_current_mb_col = &first_row_no_sync_above; | 354 last_row_current_mb_col = &first_row_no_sync_above; |
355 | 355 |
356 current_mb_col = &pbi->mt_current_mb_col[mb_row]; | 356 current_mb_col = &pbi->mt_current_mb_col[mb_row]; |
357 | 357 |
358 recon_yoffset = mb_row * recon_y_stride * 16; | 358 recon_yoffset = mb_row * recon_y_stride * 16; |
359 recon_uvoffset = mb_row * recon_uv_stride * 8; | 359 recon_uvoffset = mb_row * recon_uv_stride * 8; |
360 | 360 |
361 /* reset contexts */ | 361 /* reset contexts */ |
362 xd->above_context = pc->above_context; | 362 xd->above_context = pc->above_context; |
363 vpx_memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); | 363 memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); |
364 | 364 |
365 xd->left_available = 0; | 365 xd->left_available = 0; |
366 | 366 |
367 xd->mb_to_top_edge = -((mb_row * 16)) << 3; | 367 xd->mb_to_top_edge = -((mb_row * 16)) << 3; |
368 xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; | 368 xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; |
369 | 369 |
370 if (pbi->common.filter_level) | 370 if (pbi->common.filter_level) |
371 { | 371 { |
372 xd->recon_above[0] = pbi->mt_yabove_row[mb_row] + 0*16 +32; | 372 xd->recon_above[0] = pbi->mt_yabove_row[mb_row] + 0*16 +32; |
373 xd->recon_above[1] = pbi->mt_uabove_row[mb_row] + 0*8 +16; | 373 xd->recon_above[1] = pbi->mt_uabove_row[mb_row] + 0*8 +16; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 | 492 |
493 const int mode_index = lfi_n->mode_lf_lut[xd->mode_info_context->
mbmi.mode]; | 493 const int mode_index = lfi_n->mode_lf_lut[xd->mode_info_context->
mbmi.mode]; |
494 const int seg = xd->mode_info_context->mbmi.segment_id; | 494 const int seg = xd->mode_info_context->mbmi.segment_id; |
495 const int ref_frame = xd->mode_info_context->mbmi.ref_frame; | 495 const int ref_frame = xd->mode_info_context->mbmi.ref_frame; |
496 | 496 |
497 filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; | 497 filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; |
498 | 498 |
499 if( mb_row != pc->mb_rows-1 ) | 499 if( mb_row != pc->mb_rows-1 ) |
500 { | 500 { |
501 /* Save decoded MB last row data for next-row decoding */ | 501 /* Save decoded MB last row data for next-row decoding */ |
502 vpx_memcpy((pbi->mt_yabove_row[mb_row + 1] + 32 + mb_col*16),
(xd->dst.y_buffer + 15 * recon_y_stride), 16); | 502 memcpy((pbi->mt_yabove_row[mb_row + 1] + 32 + mb_col*16), (xd
->dst.y_buffer + 15 * recon_y_stride), 16); |
503 vpx_memcpy((pbi->mt_uabove_row[mb_row + 1] + 16 + mb_col*8),
(xd->dst.u_buffer + 7 * recon_uv_stride), 8); | 503 memcpy((pbi->mt_uabove_row[mb_row + 1] + 16 + mb_col*8), (xd-
>dst.u_buffer + 7 * recon_uv_stride), 8); |
504 vpx_memcpy((pbi->mt_vabove_row[mb_row + 1] + 16 + mb_col*8),
(xd->dst.v_buffer + 7 * recon_uv_stride), 8); | 504 memcpy((pbi->mt_vabove_row[mb_row + 1] + 16 + mb_col*8), (xd-
>dst.v_buffer + 7 * recon_uv_stride), 8); |
505 } | 505 } |
506 | 506 |
507 /* save left_col for next MB decoding */ | 507 /* save left_col for next MB decoding */ |
508 if(mb_col != pc->mb_cols-1) | 508 if(mb_col != pc->mb_cols-1) |
509 { | 509 { |
510 MODE_INFO *next = xd->mode_info_context +1; | 510 MODE_INFO *next = xd->mode_info_context +1; |
511 | 511 |
512 if (next->mbmi.ref_frame == INTRA_FRAME) | 512 if (next->mbmi.ref_frame == INTRA_FRAME) |
513 { | 513 { |
514 for (i = 0; i < 16; i++) | 514 for (i = 0; i < 16; i++) |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 VP8_COMMON *pc = &pbi->common; | 869 VP8_COMMON *pc = &pbi->common; |
870 unsigned int i; | 870 unsigned int i; |
871 int j; | 871 int j; |
872 | 872 |
873 int filter_level = pc->filter_level; | 873 int filter_level = pc->filter_level; |
874 YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; | 874 YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; |
875 | 875 |
876 if (filter_level) | 876 if (filter_level) |
877 { | 877 { |
878 /* Set above_row buffer to 127 for decoding first MB row */ | 878 /* Set above_row buffer to 127 for decoding first MB row */ |
879 vpx_memset(pbi->mt_yabove_row[0] + VP8BORDERINPIXELS-1, 127, yv12_fb_new
->y_width + 5); | 879 memset(pbi->mt_yabove_row[0] + VP8BORDERINPIXELS-1, 127, yv12_fb_new->y_
width + 5); |
880 vpx_memset(pbi->mt_uabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (yv12_
fb_new->y_width>>1) +5); | 880 memset(pbi->mt_uabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (yv12_fb_n
ew->y_width>>1) +5); |
881 vpx_memset(pbi->mt_vabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (yv12_
fb_new->y_width>>1) +5); | 881 memset(pbi->mt_vabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (yv12_fb_n
ew->y_width>>1) +5); |
882 | 882 |
883 for (j=1; j<pc->mb_rows; j++) | 883 for (j=1; j<pc->mb_rows; j++) |
884 { | 884 { |
885 vpx_memset(pbi->mt_yabove_row[j] + VP8BORDERINPIXELS-1, (unsigned ch
ar)129, 1); | 885 memset(pbi->mt_yabove_row[j] + VP8BORDERINPIXELS-1, (unsigned char)1
29, 1); |
886 vpx_memset(pbi->mt_uabove_row[j] + (VP8BORDERINPIXELS>>1)-1, (unsign
ed char)129, 1); | 886 memset(pbi->mt_uabove_row[j] + (VP8BORDERINPIXELS>>1)-1, (unsigned c
har)129, 1); |
887 vpx_memset(pbi->mt_vabove_row[j] + (VP8BORDERINPIXELS>>1)-1, (unsign
ed char)129, 1); | 887 memset(pbi->mt_vabove_row[j] + (VP8BORDERINPIXELS>>1)-1, (unsigned c
har)129, 1); |
888 } | 888 } |
889 | 889 |
890 /* Set left_col to 129 initially */ | 890 /* Set left_col to 129 initially */ |
891 for (j=0; j<pc->mb_rows; j++) | 891 for (j=0; j<pc->mb_rows; j++) |
892 { | 892 { |
893 vpx_memset(pbi->mt_yleft_col[j], (unsigned char)129, 16); | 893 memset(pbi->mt_yleft_col[j], (unsigned char)129, 16); |
894 vpx_memset(pbi->mt_uleft_col[j], (unsigned char)129, 8); | 894 memset(pbi->mt_uleft_col[j], (unsigned char)129, 8); |
895 vpx_memset(pbi->mt_vleft_col[j], (unsigned char)129, 8); | 895 memset(pbi->mt_vleft_col[j], (unsigned char)129, 8); |
896 } | 896 } |
897 | 897 |
898 /* Initialize the loop filter for this frame. */ | 898 /* Initialize the loop filter for this frame. */ |
899 vp8_loop_filter_frame_init(pc, &pbi->mb, filter_level); | 899 vp8_loop_filter_frame_init(pc, &pbi->mb, filter_level); |
900 } | 900 } |
901 else | 901 else |
902 vp8_setup_intra_recon_top_line(yv12_fb_new); | 902 vp8_setup_intra_recon_top_line(yv12_fb_new); |
903 | 903 |
904 setup_decoding_thread_data(pbi, xd, pbi->mb_row_di, pbi->decoding_thread_cou
nt); | 904 setup_decoding_thread_data(pbi, xd, pbi->mb_row_di, pbi->decoding_thread_cou
nt); |
905 | 905 |
906 for (i = 0; i < pbi->decoding_thread_count; i++) | 906 for (i = 0; i < pbi->decoding_thread_count; i++) |
907 sem_post(&pbi->h_event_start_decoding[i]); | 907 sem_post(&pbi->h_event_start_decoding[i]); |
908 | 908 |
909 mt_decode_mb_rows(pbi, xd, 0); | 909 mt_decode_mb_rows(pbi, xd, 0); |
910 | 910 |
911 sem_wait(&pbi->h_event_end_decoding); /* add back for each frame */ | 911 sem_wait(&pbi->h_event_end_decoding); /* add back for each frame */ |
912 } | 912 } |
OLD | NEW |