OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The VP8 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 | 11 |
12 #ifndef WIN32 | 12 #ifndef WIN32 |
13 # include <unistd.h> | 13 # include <unistd.h> |
14 #endif | 14 #endif |
15 #ifdef __APPLE__ | 15 #ifdef __APPLE__ |
16 #include <mach/mach_init.h> | 16 #include <mach/mach_init.h> |
17 #endif | 17 #endif |
18 #include "onyxd_int.h" | 18 #include "onyxd_int.h" |
19 #include "vpx_mem/vpx_mem.h" | 19 #include "vpx_mem/vpx_mem.h" |
20 #include "threading.h" | 20 #include "threading.h" |
21 | 21 |
22 #include "loopfilter.h" | 22 #include "loopfilter.h" |
23 #include "extend.h" | 23 #include "extend.h" |
24 #include "vpx_ports/vpx_timer.h" | 24 #include "vpx_ports/vpx_timer.h" |
| 25 #include "detokenize.h" |
| 26 #include "reconinter.h" |
| 27 #include "reconintra_mt.h" |
25 | 28 |
26 #define MAX_ROWS 256 | 29 extern void mb_init_dequantizer(VP8D_COMP *pbi, MACROBLOCKD *xd); |
| 30 extern void clamp_mvs(MACROBLOCKD *xd); |
| 31 extern void vp8_build_uvmvs(MACROBLOCKD *x, int fullpixel); |
27 | 32 |
28 extern void vp8_decode_mb_row(VP8D_COMP *pbi, | 33 #if CONFIG_RUNTIME_CPU_DETECT |
29 VP8_COMMON *pc, | 34 #define RTCD_VTABLE(x) (&(pbi)->common.rtcd.x) |
30 int mb_row, | 35 #else |
31 MACROBLOCKD *xd); | 36 #define RTCD_VTABLE(x) NULL |
32 | 37 #endif |
33 extern void vp8_build_uvmvs(MACROBLOCKD *x, int fullpixel); | |
34 extern void vp8_decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd); | |
35 | |
36 void vp8_thread_loop_filter(VP8D_COMP *pbi, MB_ROW_DEC *mbrd, int ithread); | |
37 | 38 |
38 void vp8_setup_decoding_thread_data(VP8D_COMP *pbi, MACROBLOCKD *xd, MB_ROW_DEC
*mbrd, int count) | 39 void vp8_setup_decoding_thread_data(VP8D_COMP *pbi, MACROBLOCKD *xd, MB_ROW_DEC
*mbrd, int count) |
39 { | 40 { |
40 #if CONFIG_MULTITHREAD | 41 #if CONFIG_MULTITHREAD |
41 VP8_COMMON *const pc = & pbi->common; | 42 VP8_COMMON *const pc = & pbi->common; |
42 int i, j; | 43 int i, j; |
43 | 44 |
44 for (i = 0; i < count; i++) | 45 for (i = 0; i < count; i++) |
45 { | 46 { |
46 MACROBLOCKD *mbd = &mbrd[i].mbd; | 47 MACROBLOCKD *mbd = &mbrd[i].mbd; |
(...skipping 14 matching lines...) Expand all Loading... |
61 | 62 |
62 mbd->pre = pc->yv12_fb[pc->lst_fb_idx]; | 63 mbd->pre = pc->yv12_fb[pc->lst_fb_idx]; |
63 mbd->dst = pc->yv12_fb[pc->new_fb_idx]; | 64 mbd->dst = pc->yv12_fb[pc->new_fb_idx]; |
64 | 65 |
65 vp8_setup_block_dptrs(mbd); | 66 vp8_setup_block_dptrs(mbd); |
66 vp8_build_block_doffsets(mbd); | 67 vp8_build_block_doffsets(mbd); |
67 mbd->segmentation_enabled = xd->segmentation_enabled; | 68 mbd->segmentation_enabled = xd->segmentation_enabled; |
68 mbd->mb_segement_abs_delta = xd->mb_segement_abs_delta; | 69 mbd->mb_segement_abs_delta = xd->mb_segement_abs_delta; |
69 vpx_memcpy(mbd->segment_feature_data, xd->segment_feature_data, sizeof(x
d->segment_feature_data)); | 70 vpx_memcpy(mbd->segment_feature_data, xd->segment_feature_data, sizeof(x
d->segment_feature_data)); |
70 | 71 |
| 72 //signed char ref_lf_deltas[MAX_REF_LF_DELTAS]; |
| 73 vpx_memcpy(mbd->ref_lf_deltas, xd->ref_lf_deltas, sizeof(xd->ref_lf_delt
as)); |
| 74 //signed char mode_lf_deltas[MAX_MODE_LF_DELTAS]; |
| 75 vpx_memcpy(mbd->mode_lf_deltas, xd->mode_lf_deltas, sizeof(xd->mode_lf_d
eltas)); |
| 76 //unsigned char mode_ref_lf_delta_enabled; |
| 77 //unsigned char mode_ref_lf_delta_update; |
| 78 mbd->mode_ref_lf_delta_enabled = xd->mode_ref_lf_delta_enabled; |
| 79 mbd->mode_ref_lf_delta_update = xd->mode_ref_lf_delta_update; |
| 80 |
71 mbd->current_bc = &pbi->bc2; | 81 mbd->current_bc = &pbi->bc2; |
72 | 82 |
73 for (j = 0; j < 25; j++) | 83 for (j = 0; j < 25; j++) |
74 { | 84 { |
75 mbd->block[j].dequant = xd->block[j].dequant; | 85 mbd->block[j].dequant = xd->block[j].dequant; |
76 } | 86 } |
77 } | 87 } |
78 | 88 |
79 for (i=0; i< pc->mb_rows; i++) | 89 for (i=0; i< pc->mb_rows; i++) |
80 pbi->current_mb_col[i]=-1; | 90 pbi->mt_current_mb_col[i]=-1; |
81 #else | 91 #else |
82 (void) pbi; | 92 (void) pbi; |
83 (void) xd; | 93 (void) xd; |
84 (void) mbrd; | 94 (void) mbrd; |
85 (void) count; | 95 (void) count; |
86 #endif | 96 #endif |
87 } | 97 } |
88 | 98 |
89 void vp8_setup_loop_filter_thread_data(VP8D_COMP *pbi, MACROBLOCKD *xd, MB_ROW_D
EC *mbrd, int count) | 99 |
| 100 void vp8mt_decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int mb
_col) |
90 { | 101 { |
91 #if CONFIG_MULTITHREAD | 102 #if CONFIG_MULTITHREAD |
92 VP8_COMMON *const pc = & pbi->common; | 103 int eobtotal = 0; |
93 int i, j; | 104 int i, do_clamp = xd->mode_info_context->mbmi.need_to_clamp_mvs; |
| 105 VP8_COMMON *pc = &pbi->common; |
94 | 106 |
95 for (i = 0; i < count; i++) | 107 if (xd->mode_info_context->mbmi.mb_skip_coeff) |
96 { | 108 { |
97 MACROBLOCKD *mbd = &mbrd[i].mbd; | 109 vp8_reset_mb_tokens_context(xd); |
98 //#if CONFIG_RUNTIME_CPU_DETECT | 110 } |
99 // mbd->rtcd = xd->rtcd; | 111 else |
100 //#endif | 112 { |
101 | 113 eobtotal = vp8_decode_mb_tokens(pbi, xd); |
102 //mbd->subpixel_predict = xd->subpixel_predict; | |
103 //mbd->subpixel_predict8x4 = xd->subpixel_predict8x4; | |
104 //mbd->subpixel_predict8x8 = xd->subpixel_predict8x8; | |
105 //mbd->subpixel_predict16x16 = xd->subpixel_predict16x16; | |
106 | |
107 mbd->mode_info_context = pc->mi + pc->mode_info_stride * (i + 1); | |
108 mbd->mode_info_stride = pc->mode_info_stride; | |
109 | |
110 //mbd->frame_type = pc->frame_type; | |
111 //mbd->frames_since_golden = pc->frames_since_golden; | |
112 //mbd->frames_till_alt_ref_frame = pc->frames_till_alt_ref_frame; | |
113 | |
114 //mbd->pre = pc->yv12_fb[pc->lst_fb_idx]; | |
115 //mbd->dst = pc->yv12_fb[pc->new_fb_idx]; | |
116 | |
117 //vp8_setup_block_dptrs(mbd); | |
118 //vp8_build_block_doffsets(mbd); | |
119 mbd->segmentation_enabled = xd->segmentation_enabled; // | |
120 mbd->mb_segement_abs_delta = xd->mb_segement_abs_delta; // | |
121 vpx_memcpy(mbd->segment_feature_data, xd->segment_feature_data, sizeof(x
d->segment_feature_data)); // | |
122 | |
123 //signed char ref_lf_deltas[MAX_REF_LF_DELTAS]; | |
124 vpx_memcpy(mbd->ref_lf_deltas, xd->ref_lf_deltas, sizeof(xd->ref_lf_delt
as)); | |
125 //signed char mode_lf_deltas[MAX_MODE_LF_DELTAS]; | |
126 vpx_memcpy(mbd->mode_lf_deltas, xd->mode_lf_deltas, sizeof(xd->mode_lf_d
eltas)); | |
127 //unsigned char mode_ref_lf_delta_enabled; | |
128 //unsigned char mode_ref_lf_delta_update; | |
129 mbd->mode_ref_lf_delta_enabled = xd->mode_ref_lf_delta_enabled; | |
130 mbd->mode_ref_lf_delta_update = xd->mode_ref_lf_delta_update; | |
131 | |
132 //mbd->mbmi.mode = DC_PRED; | |
133 //mbd->mbmi.uv_mode = DC_PRED; | |
134 //mbd->current_bc = &pbi->bc2; | |
135 | |
136 //for (j = 0; j < 25; j++) | |
137 //{ | |
138 // mbd->block[j].dequant = xd->block[j].dequant; | |
139 //} | |
140 } | 114 } |
141 | 115 |
142 for (i=0; i< pc->mb_rows; i++) | 116 // Perform temporary clamping of the MV to be used for prediction |
143 pbi->current_mb_col[i]=-1; | 117 if (do_clamp) |
| 118 { |
| 119 clamp_mvs(xd); |
| 120 } |
| 121 |
| 122 xd->mode_info_context->mbmi.dc_diff = 1; |
| 123 |
| 124 if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbm
i.mode != SPLITMV && eobtotal == 0) |
| 125 { |
| 126 xd->mode_info_context->mbmi.dc_diff = 0; |
| 127 |
| 128 //mt_skip_recon_mb(pbi, xd, mb_row, mb_col); |
| 129 if (xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_fra
me == INTRA_FRAME) |
| 130 { |
| 131 vp8mt_build_intra_predictors_mbuv_s(pbi, xd, mb_row, mb_col); |
| 132 vp8mt_build_intra_predictors_mby_s(pbi, xd, mb_row, mb_col); |
| 133 } |
| 134 else |
| 135 { |
| 136 vp8_build_inter_predictors_mb_s(xd); |
| 137 } |
| 138 return; |
| 139 } |
| 140 |
| 141 if (xd->segmentation_enabled) |
| 142 mb_init_dequantizer(pbi, xd); |
| 143 |
| 144 // do prediction |
| 145 if (xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_frame =
= INTRA_FRAME) |
| 146 { |
| 147 vp8mt_build_intra_predictors_mbuv(pbi, xd, mb_row, mb_col); |
| 148 |
| 149 if (xd->mode_info_context->mbmi.mode != B_PRED) |
| 150 { |
| 151 vp8mt_build_intra_predictors_mby(pbi, xd, mb_row, mb_col); |
| 152 } else { |
| 153 vp8mt_intra_prediction_down_copy(pbi, xd, mb_row, mb_col); |
| 154 } |
| 155 } |
| 156 else |
| 157 { |
| 158 vp8_build_inter_predictors_mb(xd); |
| 159 } |
| 160 |
| 161 // dequantization and idct |
| 162 if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbm
i.mode != SPLITMV) |
| 163 { |
| 164 BLOCKD *b = &xd->block[24]; |
| 165 DEQUANT_INVOKE(&pbi->dequant, block)(b); |
| 166 |
| 167 // do 2nd order transform on the dc block |
| 168 if (xd->eobs[24] > 1) |
| 169 { |
| 170 IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh16)(&b->dqcoeff[0], b->diff); |
| 171 ((int *)b->qcoeff)[0] = 0; |
| 172 ((int *)b->qcoeff)[1] = 0; |
| 173 ((int *)b->qcoeff)[2] = 0; |
| 174 ((int *)b->qcoeff)[3] = 0; |
| 175 ((int *)b->qcoeff)[4] = 0; |
| 176 ((int *)b->qcoeff)[5] = 0; |
| 177 ((int *)b->qcoeff)[6] = 0; |
| 178 ((int *)b->qcoeff)[7] = 0; |
| 179 } |
| 180 else |
| 181 { |
| 182 IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh1)(&b->dqcoeff[0], b->diff); |
| 183 ((int *)b->qcoeff)[0] = 0; |
| 184 } |
| 185 |
| 186 DEQUANT_INVOKE (&pbi->dequant, dc_idct_add_y_block) |
| 187 (xd->qcoeff, &xd->block[0].dequant[0][0], |
| 188 xd->predictor, xd->dst.y_buffer, |
| 189 xd->dst.y_stride, xd->eobs, xd->block[24].diff); |
| 190 } |
| 191 else if ((xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_f
rame == INTRA_FRAME) && xd->mode_info_context->mbmi.mode == B_PRED) |
| 192 { |
| 193 for (i = 0; i < 16; i++) |
| 194 { |
| 195 BLOCKD *b = &xd->block[i]; |
| 196 vp8mt_predict_intra4x4(pbi, xd, b->bmi.mode, b->predictor, mb_row, m
b_col, i); |
| 197 |
| 198 if (xd->eobs[i] > 1) |
| 199 { |
| 200 DEQUANT_INVOKE(&pbi->dequant, idct_add) |
| 201 (b->qcoeff, &b->dequant[0][0], b->predictor, |
| 202 *(b->base_dst) + b->dst, 16, b->dst_stride); |
| 203 } |
| 204 else |
| 205 { |
| 206 IDCT_INVOKE(RTCD_VTABLE(idct), idct1_scalar_add) |
| 207 (b->qcoeff[0] * b->dequant[0][0], b->predictor, |
| 208 *(b->base_dst) + b->dst, 16, b->dst_stride); |
| 209 ((int *)b->qcoeff)[0] = 0; |
| 210 } |
| 211 } |
| 212 } |
| 213 else |
| 214 { |
| 215 DEQUANT_INVOKE (&pbi->dequant, idct_add_y_block) |
| 216 (xd->qcoeff, &xd->block[0].dequant[0][0], |
| 217 xd->predictor, xd->dst.y_buffer, |
| 218 xd->dst.y_stride, xd->eobs); |
| 219 } |
| 220 |
| 221 DEQUANT_INVOKE (&pbi->dequant, idct_add_uv_block) |
| 222 (xd->qcoeff+16*16, &xd->block[16].dequant[0][0], |
| 223 xd->predictor+16*16, xd->dst.u_buffer, xd->dst.v_buffer, |
| 224 xd->dst.uv_stride, xd->eobs+16); |
144 #else | 225 #else |
145 (void) pbi; | 226 (void) pbi; |
146 (void) xd; | 227 (void) xd; |
147 (void) mbrd; | 228 (void) mb_row; |
148 (void) count; | 229 (void) mb_col; |
149 #endif | 230 #endif |
150 } | 231 } |
151 | 232 |
| 233 |
152 THREAD_FUNCTION vp8_thread_decoding_proc(void *p_data) | 234 THREAD_FUNCTION vp8_thread_decoding_proc(void *p_data) |
153 { | 235 { |
154 #if CONFIG_MULTITHREAD | 236 #if CONFIG_MULTITHREAD |
155 int ithread = ((DECODETHREAD_DATA *)p_data)->ithread; | 237 int ithread = ((DECODETHREAD_DATA *)p_data)->ithread; |
156 VP8D_COMP *pbi = (VP8D_COMP *)(((DECODETHREAD_DATA *)p_data)->ptr1); | 238 VP8D_COMP *pbi = (VP8D_COMP *)(((DECODETHREAD_DATA *)p_data)->ptr1); |
157 MB_ROW_DEC *mbrd = (MB_ROW_DEC *)(((DECODETHREAD_DATA *)p_data)->ptr2); | 239 MB_ROW_DEC *mbrd = (MB_ROW_DEC *)(((DECODETHREAD_DATA *)p_data)->ptr2); |
158 ENTROPY_CONTEXT_PLANES mb_row_left_context; | 240 ENTROPY_CONTEXT_PLANES mb_row_left_context; |
159 | 241 |
160 while (1) | 242 while (1) |
161 { | 243 { |
162 int current_filter_level = 0; | |
163 | |
164 if (pbi->b_multithreaded_rd == 0) | 244 if (pbi->b_multithreaded_rd == 0) |
165 break; | 245 break; |
166 | 246 |
167 //if(WaitForSingleObject(pbi->h_event_start_decoding[ithread], INFINITE)
== WAIT_OBJECT_0) | 247 //if(WaitForSingleObject(pbi->h_event_start_decoding[ithread], INFINITE)
== WAIT_OBJECT_0) |
168 if (sem_wait(&pbi->h_event_start_decoding[ithread]) == 0) | 248 if (sem_wait(&pbi->h_event_start_decoding[ithread]) == 0) |
169 { | 249 { |
170 if (pbi->b_multithreaded_rd == 0) | 250 if (pbi->b_multithreaded_rd == 0) |
171 break; | 251 break; |
172 else | 252 else |
173 { | 253 { |
174 VP8_COMMON *pc = &pbi->common; | 254 VP8_COMMON *pc = &pbi->common; |
175 MACROBLOCKD *xd = &mbrd->mbd; | 255 MACROBLOCKD *xd = &mbrd->mbd; |
176 | 256 |
177 int mb_row; | 257 int mb_row; |
178 int num_part = 1 << pbi->common.multi_token_partition; | 258 int num_part = 1 << pbi->common.multi_token_partition; |
179 volatile int *last_row_current_mb_col; | 259 volatile int *last_row_current_mb_col; |
180 | 260 |
181 for (mb_row = ithread+1; mb_row < pc->mb_rows; mb_row += (pbi->d
ecoding_thread_count + 1)) | 261 for (mb_row = ithread+1; mb_row < pc->mb_rows; mb_row += (pbi->d
ecoding_thread_count + 1)) |
182 { | 262 { |
183 int i; | 263 int i; |
184 int recon_yoffset, recon_uvoffset; | 264 int recon_yoffset, recon_uvoffset; |
185 int mb_col; | 265 int mb_col; |
186 int ref_fb_idx = pc->lst_fb_idx; | 266 int ref_fb_idx = pc->lst_fb_idx; |
187 int dst_fb_idx = pc->new_fb_idx; | 267 int dst_fb_idx = pc->new_fb_idx; |
188 int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; | 268 int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; |
189 int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; | 269 int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; |
190 | 270 |
| 271 int filter_level; |
| 272 loop_filter_info *lfi = pc->lf_info; |
| 273 int alt_flt_enabled = xd->segmentation_enabled; |
| 274 int Segment; |
| 275 |
191 pbi->mb_row_di[ithread].mb_row = mb_row; | 276 pbi->mb_row_di[ithread].mb_row = mb_row; |
192 pbi->mb_row_di[ithread].mbd.current_bc = &pbi->mbc[mb_row%n
um_part]; | 277 pbi->mb_row_di[ithread].mbd.current_bc = &pbi->mbc[mb_row%n
um_part]; |
193 | 278 |
194 last_row_current_mb_col = &pbi->current_mb_col[mb_row -1]; | 279 last_row_current_mb_col = &pbi->mt_current_mb_col[mb_row -1]
; |
195 | 280 |
196 recon_yoffset = mb_row * recon_y_stride * 16; | 281 recon_yoffset = mb_row * recon_y_stride * 16; |
197 recon_uvoffset = mb_row * recon_uv_stride * 8; | 282 recon_uvoffset = mb_row * recon_uv_stride * 8; |
198 // reset above block coeffs | 283 // reset above block coeffs |
199 | 284 |
200 xd->above_context = pc->above_context; | 285 xd->above_context = pc->above_context; |
201 xd->left_context = &mb_row_left_context; | 286 xd->left_context = &mb_row_left_context; |
202 vpx_memset(&mb_row_left_context, 0, sizeof(mb_row_left_conte
xt)); | 287 vpx_memset(&mb_row_left_context, 0, sizeof(mb_row_left_conte
xt)); |
203 xd->up_available = (mb_row != 0); | 288 xd->up_available = (mb_row != 0); |
204 | 289 |
(...skipping 13 matching lines...) Expand all Loading... |
218 | 303 |
219 if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->m
ode_info_context->mbmi.mode == B_PRED) | 304 if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->m
ode_info_context->mbmi.mode == B_PRED) |
220 { | 305 { |
221 for (i = 0; i < 16; i++) | 306 for (i = 0; i < 16; i++) |
222 { | 307 { |
223 BLOCKD *d = &xd->block[i]; | 308 BLOCKD *d = &xd->block[i]; |
224 vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[
i], sizeof(B_MODE_INFO)); | 309 vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[
i], sizeof(B_MODE_INFO)); |
225 } | 310 } |
226 } | 311 } |
227 | 312 |
| 313 if(pbi->common.filter_level) |
| 314 { |
| 315 //update loopfilter info |
| 316 Segment = (alt_flt_enabled) ? xd->mode_info_context-
>mbmi.segment_id : 0; |
| 317 filter_level = pbi->mt_baseline_filter_level[Segment
]; |
| 318 // Distance of Mb to the various image edges. |
| 319 // These specified to 8th pel as they are always com
pared to values that are in 1/8th pel units |
| 320 // Apply any context driven MB level adjustment |
| 321 vp8_adjust_mb_lf_value(xd, &filter_level); |
| 322 } |
| 323 |
228 // Distance of Mb to the various image edges. | 324 // Distance of Mb to the various image edges. |
229 // These specified to 8th pel as they are always compare
d to values that are in 1/8th pel units | 325 // These specified to 8th pel as they are always compare
d to values that are in 1/8th pel units |
230 xd->mb_to_left_edge = -((mb_col * 16) << 3); | 326 xd->mb_to_left_edge = -((mb_col * 16) << 3); |
231 xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16)
<< 3; | 327 xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16)
<< 3; |
232 | 328 |
233 xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + re
con_yoffset; | 329 xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + re
con_yoffset; |
234 xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + re
con_uvoffset; | 330 xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + re
con_uvoffset; |
235 xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + re
con_uvoffset; | 331 xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + re
con_uvoffset; |
236 | 332 |
237 xd->left_available = (mb_col != 0); | 333 xd->left_available = (mb_col != 0); |
238 | 334 |
239 // Select the appropriate reference frame for this MB | 335 // Select the appropriate reference frame for this MB |
240 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) | 336 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) |
241 ref_fb_idx = pc->lst_fb_idx; | 337 ref_fb_idx = pc->lst_fb_idx; |
242 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN
_FRAME) | 338 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN
_FRAME) |
243 ref_fb_idx = pc->gld_fb_idx; | 339 ref_fb_idx = pc->gld_fb_idx; |
244 else | 340 else |
245 ref_fb_idx = pc->alt_fb_idx; | 341 ref_fb_idx = pc->alt_fb_idx; |
246 | 342 |
247 xd->pre.y_buffer = pc->yv12_fb[ref_fb_idx].y_buffer + re
con_yoffset; | 343 xd->pre.y_buffer = pc->yv12_fb[ref_fb_idx].y_buffer + re
con_yoffset; |
248 xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + re
con_uvoffset; | 344 xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + re
con_uvoffset; |
249 xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + re
con_uvoffset; | 345 xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + re
con_uvoffset; |
250 | 346 |
251 vp8_build_uvmvs(xd, pc->full_pixel); | 347 vp8_build_uvmvs(xd, pc->full_pixel); |
| 348 vp8mt_decode_macroblock(pbi, xd, mb_row, mb_col); |
252 | 349 |
253 vp8_decode_macroblock(pbi, xd); | 350 if (pbi->common.filter_level) |
| 351 { |
| 352 if( mb_row != pc->mb_rows-1 ) |
| 353 { |
| 354 //Save decoded MB last row data for next-row dec
oding |
| 355 vpx_memcpy((pbi->mt_yabove_row[mb_row + 1] + 32
+ mb_col*16), (xd->dst.y_buffer + 15 * recon_y_stride), 16); |
| 356 vpx_memcpy((pbi->mt_uabove_row[mb_row + 1] + 16
+ mb_col*8), (xd->dst.u_buffer + 7 * recon_uv_stride), 8); |
| 357 vpx_memcpy((pbi->mt_vabove_row[mb_row + 1] + 16
+ mb_col*8), (xd->dst.v_buffer + 7 * recon_uv_stride), 8); |
| 358 } |
| 359 |
| 360 //save left_col for next MB decoding |
| 361 if(mb_col != pc->mb_cols-1) |
| 362 { |
| 363 MODE_INFO *next = xd->mode_info_context +1; |
| 364 |
| 365 if (xd->frame_type == KEY_FRAME || next->mbmi.
ref_frame == INTRA_FRAME) |
| 366 { |
| 367 for (i = 0; i < 16; i++) |
| 368 pbi->mt_yleft_col[mb_row][i] = xd->dst.y
_buffer [i* recon_y_stride + 15]; |
| 369 for (i = 0; i < 8; i++) |
| 370 { |
| 371 pbi->mt_uleft_col[mb_row][i] = xd->dst.u
_buffer [i* recon_uv_stride + 7]; |
| 372 pbi->mt_vleft_col[mb_row][i] = xd->dst.v
_buffer [i* recon_uv_stride + 7]; |
| 373 } |
| 374 } |
| 375 } |
| 376 |
| 377 // loopfilter on this macroblock. |
| 378 if (filter_level) |
| 379 { |
| 380 if (mb_col > 0) |
| 381 pc->lf_mbv(xd->dst.y_buffer, xd->dst.u_buffe
r, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->si
mpler_lpf); |
| 382 |
| 383 if (xd->mode_info_context->mbmi.dc_diff > 0) |
| 384 pc->lf_bv(xd->dst.y_buffer, xd->dst.u_buffer
, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->sim
pler_lpf); |
| 385 |
| 386 // don't apply across umv border |
| 387 if (mb_row > 0) |
| 388 pc->lf_mbh(xd->dst.y_buffer, xd->dst.u_buffe
r, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->si
mpler_lpf); |
| 389 |
| 390 if (xd->mode_info_context->mbmi.dc_diff > 0) |
| 391 pc->lf_bh(xd->dst.y_buffer, xd->dst.u_buffer
, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->sim
pler_lpf); |
| 392 } |
| 393 } |
254 | 394 |
255 recon_yoffset += 16; | 395 recon_yoffset += 16; |
256 recon_uvoffset += 8; | 396 recon_uvoffset += 8; |
257 | 397 |
258 ++xd->mode_info_context; /* next mb */ | 398 ++xd->mode_info_context; /* next mb */ |
259 | 399 |
260 xd->above_context++; | 400 xd->above_context++; |
261 | 401 |
262 //pbi->mb_row_di[ithread].current_mb_col = mb_col; | 402 //pbi->mb_row_di[ithread].current_mb_col = mb_col; |
263 pbi->current_mb_col[mb_row] = mb_col; | 403 pbi->mt_current_mb_col[mb_row] = mb_col; |
264 } | 404 } |
265 | 405 |
266 // adjust to the next row of mbs | 406 // adjust to the next row of mbs |
267 vp8_extend_mb_row( | 407 if (pbi->common.filter_level) |
268 &pc->yv12_fb[dst_fb_idx], | 408 { |
269 xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffe
r + 8 | 409 if(mb_row != pc->mb_rows-1) |
270 ); | 410 { |
| 411 int lasty = pc->yv12_fb[ref_fb_idx].y_width + VP8BOR
DERINPIXELS; |
| 412 int lastuv = (pc->yv12_fb[ref_fb_idx].y_width>>1) +
(VP8BORDERINPIXELS>>1); |
| 413 |
| 414 for (i = 0; i < 4; i++) |
| 415 { |
| 416 pbi->mt_yabove_row[mb_row +1][lasty + i] = pbi->
mt_yabove_row[mb_row +1][lasty -1]; |
| 417 pbi->mt_uabove_row[mb_row +1][lastuv + i] = pbi-
>mt_uabove_row[mb_row +1][lastuv -1]; |
| 418 pbi->mt_vabove_row[mb_row +1][lastuv + i] = pbi-
>mt_vabove_row[mb_row +1][lastuv -1]; |
| 419 } |
| 420 } |
| 421 } else |
| 422 vp8_extend_mb_row(&pc->yv12_fb[dst_fb_idx], xd->dst.y_bu
ffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); |
271 | 423 |
272 ++xd->mode_info_context; /* skip prediction column */ | 424 ++xd->mode_info_context; /* skip prediction column */ |
273 | 425 |
274 // since we have multithread | 426 // since we have multithread |
275 xd->mode_info_context += xd->mode_info_stride * pbi->decodin
g_thread_count; | 427 xd->mode_info_context += xd->mode_info_stride * pbi->decodin
g_thread_count; |
276 | |
277 pbi->last_mb_row_decoded = mb_row; | |
278 | |
279 } | 428 } |
280 } | 429 } |
281 } | 430 } |
282 | |
283 // If |pbi->common.filter_level| is 0 the value can change in-between | |
284 // the sem_post and the check to call vp8_thread_loop_filter. | |
285 current_filter_level = pbi->common.filter_level; | |
286 | |
287 // add this to each frame | 431 // add this to each frame |
288 if ((mbrd->mb_row == pbi->common.mb_rows-1) || ((mbrd->mb_row == pbi->co
mmon.mb_rows-2) && (pbi->common.mb_rows % (pbi->decoding_thread_count+1))==1)) | 432 if ((mbrd->mb_row == pbi->common.mb_rows-1) || ((mbrd->mb_row == pbi->co
mmon.mb_rows-2) && (pbi->common.mb_rows % (pbi->decoding_thread_count+1))==1)) |
289 { | 433 { |
290 //SetEvent(pbi->h_event_end_decoding); | 434 //SetEvent(pbi->h_event_end_decoding); |
291 sem_post(&pbi->h_event_end_decoding); | 435 sem_post(&pbi->h_event_end_decoding); |
292 } | 436 } |
293 | |
294 if ((pbi->b_multithreaded_lf) && (current_filter_level)) | |
295 vp8_thread_loop_filter(pbi, mbrd, ithread); | |
296 | |
297 } | 437 } |
298 #else | 438 #else |
299 (void) p_data; | 439 (void) p_data; |
300 #endif | 440 #endif |
301 | 441 |
302 return 0 ; | 442 return 0 ; |
303 } | 443 } |
304 | 444 |
305 | 445 |
306 void vp8_thread_loop_filter(VP8D_COMP *pbi, MB_ROW_DEC *mbrd, int ithread) | |
307 { | |
308 #if CONFIG_MULTITHREAD | |
309 | |
310 if (sem_wait(&pbi->h_event_start_lpf[ithread]) == 0) | |
311 { | |
312 // if (pbi->b_multithreaded_lf == 0) // we're shutting down ???? | |
313 // break; | |
314 // else | |
315 { | |
316 VP8_COMMON *cm = &pbi->common; | |
317 MACROBLOCKD *mbd = &mbrd->mbd; | |
318 int default_filt_lvl = pbi->common.filter_level; | |
319 | |
320 YV12_BUFFER_CONFIG *post = cm->frame_to_show; | |
321 loop_filter_info *lfi = cm->lf_info; | |
322 //int frame_type = cm->frame_type; | |
323 | |
324 int mb_row; | |
325 int mb_col; | |
326 | |
327 int filter_level; | |
328 int alt_flt_enabled = mbd->segmentation_enabled; | |
329 | |
330 int i; | |
331 unsigned char *y_ptr, *u_ptr, *v_ptr; | |
332 | |
333 volatile int *last_row_current_mb_col; | |
334 | |
335 // Set up the buffer pointers | |
336 y_ptr = post->y_buffer + post->y_stride * 16 * (ithread +1); | |
337 u_ptr = post->u_buffer + post->uv_stride * 8 * (ithread +1); | |
338 v_ptr = post->v_buffer + post->uv_stride * 8 * (ithread +1); | |
339 | |
340 // vp8_filter each macro block | |
341 for (mb_row = ithread+1; mb_row < cm->mb_rows; mb_row+= (pbi->de
coding_thread_count + 1)) | |
342 { | |
343 last_row_current_mb_col = &pbi->current_mb_col[mb_row -1]; | |
344 | |
345 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) | |
346 { | |
347 int Segment = (alt_flt_enabled) ? mbd->mode_info_context
->mbmi.segment_id : 0; | |
348 | |
349 if ((mb_col & 7) == 0) | |
350 { | |
351 while (mb_col > (*last_row_current_mb_col-8) && *las
t_row_current_mb_col != cm->mb_cols - 1) | |
352 { | |
353 x86_pause_hint(); | |
354 thread_sleep(0); | |
355 } | |
356 } | |
357 | |
358 filter_level = pbi->mt_baseline_filter_level[Segment]; | |
359 | |
360 // Apply any context driven MB level adjustment | |
361 vp8_adjust_mb_lf_value(mbd, &filter_level); | |
362 | |
363 if (filter_level) | |
364 { | |
365 if (mb_col > 0) | |
366 cm->lf_mbv(y_ptr, u_ptr, v_ptr, post->y_stride,
post->uv_stride, &lfi[filter_level], cm->simpler_lpf); | |
367 | |
368 if (mbd->mode_info_context->mbmi.dc_diff > 0) | |
369 cm->lf_bv(y_ptr, u_ptr, v_ptr, post->y_stride, p
ost->uv_stride, &lfi[filter_level], cm->simpler_lpf); | |
370 | |
371 // don't apply across umv border | |
372 if (mb_row > 0) | |
373 cm->lf_mbh(y_ptr, u_ptr, v_ptr, post->y_stride,
post->uv_stride, &lfi[filter_level], cm->simpler_lpf); | |
374 | |
375 if (mbd->mode_info_context->mbmi.dc_diff > 0) | |
376 cm->lf_bh(y_ptr, u_ptr, v_ptr, post->y_stride, p
ost->uv_stride, &lfi[filter_level], cm->simpler_lpf); | |
377 } | |
378 | |
379 y_ptr += 16; | |
380 u_ptr += 8; | |
381 v_ptr += 8; | |
382 | |
383 mbd->mode_info_context++; // step to next MB | |
384 pbi->current_mb_col[mb_row] = mb_col; | |
385 } | |
386 | |
387 mbd->mode_info_context++; // Skip border mb | |
388 | |
389 y_ptr += post->y_stride * 16 * (pbi->decoding_thread_count
+ 1) - post->y_width; | |
390 u_ptr += post->uv_stride * 8 * (pbi->decoding_thread_count
+ 1) - post->uv_width; | |
391 v_ptr += post->uv_stride * 8 * (pbi->decoding_thread_count
+ 1) - post->uv_width; | |
392 | |
393 mbd->mode_info_context += pbi->decoding_thread_count * mbd->
mode_info_stride; // Skip border mb | |
394 } | |
395 } | |
396 } | |
397 | |
398 // add this to each frame | |
399 if ((mbrd->mb_row == pbi->common.mb_rows-1) || ((mbrd->mb_row == pbi->co
mmon.mb_rows-2) && (pbi->common.mb_rows % (pbi->decoding_thread_count+1))==1)) | |
400 { | |
401 sem_post(&pbi->h_event_end_lpf); | |
402 } | |
403 #else | |
404 (void) pbi; | |
405 #endif | |
406 } | |
407 | |
408 void vp8_decoder_create_threads(VP8D_COMP *pbi) | 446 void vp8_decoder_create_threads(VP8D_COMP *pbi) |
409 { | 447 { |
410 #if CONFIG_MULTITHREAD | 448 #if CONFIG_MULTITHREAD |
411 int core_count = 0; | 449 int core_count = 0; |
412 int ithread; | 450 int ithread; |
| 451 int i; |
413 | 452 |
414 pbi->b_multithreaded_rd = 0; | 453 pbi->b_multithreaded_rd = 0; |
415 pbi->b_multithreaded_lf = 0; | |
416 pbi->allocated_decoding_thread_count = 0; | 454 pbi->allocated_decoding_thread_count = 0; |
417 core_count = (pbi->max_threads > 16) ? 16 : pbi->max_threads; | 455 core_count = (pbi->max_threads > 16) ? 16 : pbi->max_threads; |
418 | 456 |
419 if (core_count > 1) | 457 if (core_count > 1) |
420 { | 458 { |
421 pbi->b_multithreaded_rd = 1; | 459 pbi->b_multithreaded_rd = 1; |
422 pbi->b_multithreaded_lf = 1; // this can be merged with pbi->b_multithr
eaded_rd ? | |
423 pbi->decoding_thread_count = core_count -1; | 460 pbi->decoding_thread_count = core_count -1; |
424 | 461 |
425 CHECK_MEM_ERROR(pbi->h_decoding_thread, vpx_malloc(sizeof(pthread_t) * p
bi->decoding_thread_count)); | 462 CHECK_MEM_ERROR(pbi->h_decoding_thread, vpx_malloc(sizeof(pthread_t) * p
bi->decoding_thread_count)); |
426 CHECK_MEM_ERROR(pbi->h_event_start_decoding, vpx_malloc(sizeof(sem_t) *
pbi->decoding_thread_count)); | 463 CHECK_MEM_ERROR(pbi->h_event_start_decoding, vpx_malloc(sizeof(sem_t) *
pbi->decoding_thread_count)); |
427 CHECK_MEM_ERROR(pbi->mb_row_di, vpx_memalign(32, sizeof(MB_ROW_DEC) * pb
i->decoding_thread_count)); | 464 CHECK_MEM_ERROR(pbi->mb_row_di, vpx_memalign(32, sizeof(MB_ROW_DEC) * pb
i->decoding_thread_count)); |
428 vpx_memset(pbi->mb_row_di, 0, sizeof(MB_ROW_DEC) * pbi->decoding_thread_
count); | 465 vpx_memset(pbi->mb_row_di, 0, sizeof(MB_ROW_DEC) * pbi->decoding_thread_
count); |
429 CHECK_MEM_ERROR(pbi->de_thread_data, vpx_malloc(sizeof(DECODETHREAD_DATA
) * pbi->decoding_thread_count)); | 466 CHECK_MEM_ERROR(pbi->de_thread_data, vpx_malloc(sizeof(DECODETHREAD_DATA
) * pbi->decoding_thread_count)); |
430 | 467 |
431 CHECK_MEM_ERROR(pbi->current_mb_col, vpx_malloc(sizeof(int) * MAX_ROWS))
; // pc->mb_rows)); | |
432 CHECK_MEM_ERROR(pbi->h_event_start_lpf, vpx_malloc(sizeof(sem_t) * pbi->
decoding_thread_count)); | |
433 | |
434 for (ithread = 0; ithread < pbi->decoding_thread_count; ithread++) | 468 for (ithread = 0; ithread < pbi->decoding_thread_count; ithread++) |
435 { | 469 { |
436 sem_init(&pbi->h_event_start_decoding[ithread], 0, 0); | 470 sem_init(&pbi->h_event_start_decoding[ithread], 0, 0); |
437 sem_init(&pbi->h_event_start_lpf[ithread], 0, 0); | |
438 | 471 |
439 pbi->de_thread_data[ithread].ithread = ithread; | 472 pbi->de_thread_data[ithread].ithread = ithread; |
440 pbi->de_thread_data[ithread].ptr1 = (void *)pbi; | 473 pbi->de_thread_data[ithread].ptr1 = (void *)pbi; |
441 pbi->de_thread_data[ithread].ptr2 = (void *) &pbi->mb_row_di[ith
read]; | 474 pbi->de_thread_data[ithread].ptr2 = (void *) &pbi->mb_row_di[ith
read]; |
442 | 475 |
443 pthread_create(&pbi->h_decoding_thread[ithread], 0, vp8_thread_decod
ing_proc, (&pbi->de_thread_data[ithread])); | 476 pthread_create(&pbi->h_decoding_thread[ithread], 0, vp8_thread_decod
ing_proc, (&pbi->de_thread_data[ithread])); |
444 } | 477 } |
445 | 478 |
446 sem_init(&pbi->h_event_end_decoding, 0, 0); | 479 sem_init(&pbi->h_event_end_decoding, 0, 0); |
447 sem_init(&pbi->h_event_end_lpf, 0, 0); | |
448 | 480 |
449 pbi->allocated_decoding_thread_count = pbi->decoding_thread_count; | 481 pbi->allocated_decoding_thread_count = pbi->decoding_thread_count; |
450 } | 482 } |
451 | 483 |
452 #else | 484 #else |
453 (void) pbi; | 485 (void) pbi; |
454 #endif | 486 #endif |
455 } | 487 } |
456 | 488 |
| 489 |
| 490 void vp8mt_de_alloc_temp_buffers(VP8D_COMP *pbi, int mb_rows) |
| 491 { |
| 492 #if CONFIG_MULTITHREAD |
| 493 VP8_COMMON *const pc = & pbi->common; |
| 494 int i; |
| 495 |
| 496 if (pbi->b_multithreaded_rd) |
| 497 { |
| 498 if (pbi->mt_current_mb_col) |
| 499 { |
| 500 vpx_free(pbi->mt_current_mb_col); |
| 501 pbi->mt_current_mb_col = NULL ; |
| 502 } |
| 503 |
| 504 // Free above_row buffers. |
| 505 if (pbi->mt_yabove_row) |
| 506 { |
| 507 for (i=0; i< mb_rows; i++) |
| 508 { |
| 509 if (pbi->mt_yabove_row[i]) |
| 510 { |
| 511 vpx_free(pbi->mt_yabove_row[i]); |
| 512 pbi->mt_yabove_row[i] = NULL ; |
| 513 } |
| 514 } |
| 515 vpx_free(pbi->mt_yabove_row); |
| 516 pbi->mt_yabove_row = NULL ; |
| 517 } |
| 518 |
| 519 if (pbi->mt_uabove_row) |
| 520 { |
| 521 for (i=0; i< mb_rows; i++) |
| 522 { |
| 523 if (pbi->mt_uabove_row[i]) |
| 524 { |
| 525 vpx_free(pbi->mt_uabove_row[i]); |
| 526 pbi->mt_uabove_row[i] = NULL ; |
| 527 } |
| 528 } |
| 529 vpx_free(pbi->mt_uabove_row); |
| 530 pbi->mt_uabove_row = NULL ; |
| 531 } |
| 532 |
| 533 if (pbi->mt_vabove_row) |
| 534 { |
| 535 for (i=0; i< mb_rows; i++) |
| 536 { |
| 537 if (pbi->mt_vabove_row[i]) |
| 538 { |
| 539 vpx_free(pbi->mt_vabove_row[i]); |
| 540 pbi->mt_vabove_row[i] = NULL ; |
| 541 } |
| 542 } |
| 543 vpx_free(pbi->mt_vabove_row); |
| 544 pbi->mt_vabove_row = NULL ; |
| 545 } |
| 546 |
| 547 // Free left_col buffers. |
| 548 if (pbi->mt_yleft_col) |
| 549 { |
| 550 for (i=0; i< mb_rows; i++) |
| 551 { |
| 552 if (pbi->mt_yleft_col[i]) |
| 553 { |
| 554 vpx_free(pbi->mt_yleft_col[i]); |
| 555 pbi->mt_yleft_col[i] = NULL ; |
| 556 } |
| 557 } |
| 558 vpx_free(pbi->mt_yleft_col); |
| 559 pbi->mt_yleft_col = NULL ; |
| 560 } |
| 561 |
| 562 if (pbi->mt_uleft_col) |
| 563 { |
| 564 for (i=0; i< mb_rows; i++) |
| 565 { |
| 566 if (pbi->mt_uleft_col[i]) |
| 567 { |
| 568 vpx_free(pbi->mt_uleft_col[i]); |
| 569 pbi->mt_uleft_col[i] = NULL ; |
| 570 } |
| 571 } |
| 572 vpx_free(pbi->mt_uleft_col); |
| 573 pbi->mt_uleft_col = NULL ; |
| 574 } |
| 575 |
| 576 if (pbi->mt_vleft_col) |
| 577 { |
| 578 for (i=0; i< mb_rows; i++) |
| 579 { |
| 580 if (pbi->mt_vleft_col[i]) |
| 581 { |
| 582 vpx_free(pbi->mt_vleft_col[i]); |
| 583 pbi->mt_vleft_col[i] = NULL ; |
| 584 } |
| 585 } |
| 586 vpx_free(pbi->mt_vleft_col); |
| 587 pbi->mt_vleft_col = NULL ; |
| 588 } |
| 589 } |
| 590 #else |
| 591 (void) pbi; |
| 592 #endif |
| 593 } |
| 594 |
| 595 |
| 596 int vp8mt_alloc_temp_buffers(VP8D_COMP *pbi, int width, int prev_mb_rows) |
| 597 { |
| 598 #if CONFIG_MULTITHREAD |
| 599 VP8_COMMON *const pc = & pbi->common; |
| 600 int i; |
| 601 int uv_width; |
| 602 |
| 603 if (pbi->b_multithreaded_rd) |
| 604 { |
| 605 vp8mt_de_alloc_temp_buffers(pbi, prev_mb_rows); |
| 606 |
| 607 // our internal buffers are always multiples of 16 |
| 608 if ((width & 0xf) != 0) |
| 609 width += 16 - (width & 0xf); |
| 610 |
| 611 uv_width = width >>1; |
| 612 |
| 613 // Allocate an int for each mb row. |
| 614 CHECK_MEM_ERROR(pbi->mt_current_mb_col, vpx_malloc(sizeof(int) * pc->mb_
rows)); |
| 615 |
| 616 // Allocate memory for above_row buffers. |
| 617 CHECK_MEM_ERROR(pbi->mt_yabove_row, vpx_malloc(sizeof(unsigned char *) *
pc->mb_rows)); |
| 618 for (i=0; i< pc->mb_rows; i++) |
| 619 CHECK_MEM_ERROR(pbi->mt_yabove_row[i], vpx_calloc(sizeof(unsigned ch
ar) * (width + (VP8BORDERINPIXELS<<1)), 1)); |
| 620 |
| 621 CHECK_MEM_ERROR(pbi->mt_uabove_row, vpx_malloc(sizeof(unsigned char *) *
pc->mb_rows)); |
| 622 for (i=0; i< pc->mb_rows; i++) |
| 623 CHECK_MEM_ERROR(pbi->mt_uabove_row[i], vpx_calloc(sizeof(unsigned ch
ar) * (uv_width + VP8BORDERINPIXELS), 1)); |
| 624 |
| 625 CHECK_MEM_ERROR(pbi->mt_vabove_row, vpx_malloc(sizeof(unsigned char *) *
pc->mb_rows)); |
| 626 for (i=0; i< pc->mb_rows; i++) |
| 627 CHECK_MEM_ERROR(pbi->mt_vabove_row[i], vpx_calloc(sizeof(unsigned ch
ar) * (uv_width + VP8BORDERINPIXELS), 1)); |
| 628 |
| 629 // Allocate memory for left_col buffers. |
| 630 CHECK_MEM_ERROR(pbi->mt_yleft_col, vpx_malloc(sizeof(unsigned char *) *
pc->mb_rows)); |
| 631 for (i=0; i< pc->mb_rows; i++) |
| 632 CHECK_MEM_ERROR(pbi->mt_yleft_col[i], vpx_calloc(sizeof(unsigned cha
r) * 16, 1)); |
| 633 |
| 634 CHECK_MEM_ERROR(pbi->mt_uleft_col, vpx_malloc(sizeof(unsigned char *) *
pc->mb_rows)); |
| 635 for (i=0; i< pc->mb_rows; i++) |
| 636 CHECK_MEM_ERROR(pbi->mt_uleft_col[i], vpx_calloc(sizeof(unsigned cha
r) * 8, 1)); |
| 637 |
| 638 CHECK_MEM_ERROR(pbi->mt_vleft_col, vpx_malloc(sizeof(unsigned char *) *
pc->mb_rows)); |
| 639 for (i=0; i< pc->mb_rows; i++) |
| 640 CHECK_MEM_ERROR(pbi->mt_vleft_col[i], vpx_calloc(sizeof(unsigned cha
r) * 8, 1)); |
| 641 } |
| 642 return 0; |
| 643 #else |
| 644 (void) pbi; |
| 645 (void) width; |
| 646 #endif |
| 647 } |
| 648 |
| 649 |
457 void vp8_decoder_remove_threads(VP8D_COMP *pbi) | 650 void vp8_decoder_remove_threads(VP8D_COMP *pbi) |
458 { | 651 { |
459 #if CONFIG_MULTITHREAD | 652 #if CONFIG_MULTITHREAD |
460 | 653 |
461 if (pbi->b_multithreaded_lf) | |
462 { | |
463 int i; | |
464 pbi->b_multithreaded_lf = 0; | |
465 | |
466 for (i = 0; i < pbi->allocated_decoding_thread_count; i++) | |
467 sem_destroy(&pbi->h_event_start_lpf[i]); | |
468 | |
469 sem_destroy(&pbi->h_event_end_lpf); | |
470 } | |
471 | |
472 //shutdown MB Decoding thread; | 654 //shutdown MB Decoding thread; |
473 if (pbi->b_multithreaded_rd) | 655 if (pbi->b_multithreaded_rd) |
474 { | 656 { |
475 int i; | 657 int i; |
476 | 658 |
477 pbi->b_multithreaded_rd = 0; | 659 pbi->b_multithreaded_rd = 0; |
478 | 660 |
479 // allow all threads to exit | 661 // allow all threads to exit |
480 for (i = 0; i < pbi->allocated_decoding_thread_count; i++) | 662 for (i = 0; i < pbi->allocated_decoding_thread_count; i++) |
481 { | 663 { |
(...skipping 13 matching lines...) Expand all Loading... |
495 vpx_free(pbi->h_decoding_thread); | 677 vpx_free(pbi->h_decoding_thread); |
496 pbi->h_decoding_thread = NULL; | 678 pbi->h_decoding_thread = NULL; |
497 } | 679 } |
498 | 680 |
499 if (pbi->h_event_start_decoding) | 681 if (pbi->h_event_start_decoding) |
500 { | 682 { |
501 vpx_free(pbi->h_event_start_decoding); | 683 vpx_free(pbi->h_event_start_decoding); |
502 pbi->h_event_start_decoding = NULL; | 684 pbi->h_event_start_decoding = NULL; |
503 } | 685 } |
504 | 686 |
505 if (pbi->h_event_start_lpf) | |
506 { | |
507 vpx_free(pbi->h_event_start_lpf); | |
508 pbi->h_event_start_lpf = NULL; | |
509 } | |
510 | |
511 if (pbi->mb_row_di) | 687 if (pbi->mb_row_di) |
512 { | 688 { |
513 vpx_free(pbi->mb_row_di); | 689 vpx_free(pbi->mb_row_di); |
514 pbi->mb_row_di = NULL ; | 690 pbi->mb_row_di = NULL ; |
515 } | 691 } |
516 | 692 |
517 if (pbi->de_thread_data) | 693 if (pbi->de_thread_data) |
518 { | 694 { |
519 vpx_free(pbi->de_thread_data); | 695 vpx_free(pbi->de_thread_data); |
520 pbi->de_thread_data = NULL; | 696 pbi->de_thread_data = NULL; |
521 } | 697 } |
522 | |
523 if (pbi->current_mb_col) | |
524 { | |
525 vpx_free(pbi->current_mb_col); | |
526 pbi->current_mb_col = NULL ; | |
527 } | |
528 } | 698 } |
529 #else | 699 #else |
530 (void) pbi; | 700 (void) pbi; |
531 #endif | 701 #endif |
532 } | 702 } |
533 | 703 |
534 | 704 |
535 void vp8_start_lfthread(VP8D_COMP *pbi) | 705 void vp8mt_lpf_init( VP8D_COMP *pbi, int default_filt_lvl) |
536 { | 706 { |
537 #if CONFIG_MULTITHREAD | 707 #if CONFIG_MULTITHREAD |
538 /* | 708 VP8_COMMON *cm = &pbi->common; |
539 memcpy(&pbi->lpfmb, &pbi->mb, sizeof(pbi->mb)); | 709 MACROBLOCKD *mbd = &pbi->mb; |
540 pbi->last_mb_row_decoded = 0; | 710 //YV12_BUFFER_CONFIG *post = &cm->new_frame; //frame_to_show; |
541 sem_post(&pbi->h_event_start_lpf); | 711 loop_filter_info *lfi = cm->lf_info; |
542 */ | 712 int frame_type = cm->frame_type; |
543 (void) pbi; | 713 |
| 714 //int mb_row; |
| 715 //int mb_col; |
| 716 //int baseline_filter_level[MAX_MB_SEGMENTS]; |
| 717 int filter_level; |
| 718 int alt_flt_enabled = mbd->segmentation_enabled; |
| 719 |
| 720 int i; |
| 721 //unsigned char *y_ptr, *u_ptr, *v_ptr; |
| 722 |
| 723 // Note the baseline filter values for each segment |
| 724 if (alt_flt_enabled) |
| 725 { |
| 726 for (i = 0; i < MAX_MB_SEGMENTS; i++) |
| 727 { |
| 728 // Abs value |
| 729 if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA) |
| 730 pbi->mt_baseline_filter_level[i] = mbd->segment_feature_data[MB_
LVL_ALT_LF][i]; |
| 731 // Delta Value |
| 732 else |
| 733 { |
| 734 pbi->mt_baseline_filter_level[i] = default_filt_lvl + mbd->segme
nt_feature_data[MB_LVL_ALT_LF][i]; |
| 735 pbi->mt_baseline_filter_level[i] = (pbi->mt_baseline_filter_leve
l[i] >= 0) ? ((pbi->mt_baseline_filter_level[i] <= MAX_LOOP_FILTER) ? pbi->mt_ba
seline_filter_level[i] : MAX_LOOP_FILTER) : 0; // Clamp to valid range |
| 736 } |
| 737 } |
| 738 } |
| 739 else |
| 740 { |
| 741 for (i = 0; i < MAX_MB_SEGMENTS; i++) |
| 742 pbi->mt_baseline_filter_level[i] = default_filt_lvl; |
| 743 } |
| 744 |
| 745 // Initialize the loop filter for this frame. |
| 746 if ((cm->last_filter_type != cm->filter_type) || (cm->last_sharpness_level !
= cm->sharpness_level)) |
| 747 vp8_init_loop_filter(cm); |
| 748 else if (frame_type != cm->last_frame_type) |
| 749 vp8_frame_init_loop_filter(lfi, frame_type); |
544 #else | 750 #else |
545 (void) pbi; | 751 (void) pbi; |
546 #endif | 752 (void) default_filt_lvl; |
547 } | |
548 | |
549 void vp8_stop_lfthread(VP8D_COMP *pbi) | |
550 { | |
551 #if CONFIG_MULTITHREAD | |
552 /* | |
553 struct vpx_usec_timer timer; | |
554 | |
555 vpx_usec_timer_start(&timer); | |
556 | |
557 sem_wait(&pbi->h_event_end_lpf); | |
558 | |
559 vpx_usec_timer_mark(&timer); | |
560 pbi->time_loop_filtering += vpx_usec_timer_elapsed(&timer); | |
561 */ | |
562 (void) pbi; | |
563 #else | |
564 (void) pbi; | |
565 #endif | 753 #endif |
566 } | 754 } |
567 | 755 |
568 | 756 |
569 void vp8_mtdecode_mb_rows(VP8D_COMP *pbi, | 757 void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd) |
570 MACROBLOCKD *xd) | |
571 { | 758 { |
572 #if CONFIG_MULTITHREAD | 759 #if CONFIG_MULTITHREAD |
573 int mb_row; | 760 int mb_row; |
574 VP8_COMMON *pc = &pbi->common; | 761 VP8_COMMON *pc = &pbi->common; |
575 | 762 |
576 int ibc = 0; | 763 int ibc = 0; |
577 int num_part = 1 << pbi->common.multi_token_partition; | 764 int num_part = 1 << pbi->common.multi_token_partition; |
578 int i; | 765 int i, j; |
579 volatile int *last_row_current_mb_col = NULL; | 766 volatile int *last_row_current_mb_col = NULL; |
580 | 767 |
| 768 int filter_level; |
| 769 loop_filter_info *lfi = pc->lf_info; |
| 770 int alt_flt_enabled = xd->segmentation_enabled; |
| 771 int Segment; |
| 772 |
| 773 if(pbi->common.filter_level) |
| 774 { |
| 775 //Set above_row buffer to 127 for decoding first MB row |
| 776 vpx_memset(pbi->mt_yabove_row[0] + VP8BORDERINPIXELS-1, 127, pc->yv12_fb
[pc->lst_fb_idx].y_width + 5); |
| 777 vpx_memset(pbi->mt_uabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (pc->y
v12_fb[pc->lst_fb_idx].y_width>>1) +5); |
| 778 vpx_memset(pbi->mt_vabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (pc->y
v12_fb[pc->lst_fb_idx].y_width>>1) +5); |
| 779 |
| 780 for (i=1; i<pc->mb_rows; i++) |
| 781 { |
| 782 vpx_memset(pbi->mt_yabove_row[i] + VP8BORDERINPIXELS-1, (unsigned ch
ar)129, 1); |
| 783 vpx_memset(pbi->mt_uabove_row[i] + (VP8BORDERINPIXELS>>1)-1, (unsign
ed char)129, 1); |
| 784 vpx_memset(pbi->mt_vabove_row[i] + (VP8BORDERINPIXELS>>1)-1, (unsign
ed char)129, 1); |
| 785 } |
| 786 |
| 787 //Set left_col to 129 initially |
| 788 for (i=0; i<pc->mb_rows; i++) |
| 789 { |
| 790 vpx_memset(pbi->mt_yleft_col[i], (unsigned char)129, 16); |
| 791 vpx_memset(pbi->mt_uleft_col[i], (unsigned char)129, 8); |
| 792 vpx_memset(pbi->mt_vleft_col[i], (unsigned char)129, 8); |
| 793 } |
| 794 vp8mt_lpf_init(pbi, pc->filter_level); |
| 795 } |
| 796 |
581 vp8_setup_decoding_thread_data(pbi, xd, pbi->mb_row_di, pbi->decoding_thread
_count); | 797 vp8_setup_decoding_thread_data(pbi, xd, pbi->mb_row_di, pbi->decoding_thread
_count); |
582 | 798 |
583 for (i = 0; i < pbi->decoding_thread_count; i++) | 799 for (i = 0; i < pbi->decoding_thread_count; i++) |
584 sem_post(&pbi->h_event_start_decoding[i]); | 800 sem_post(&pbi->h_event_start_decoding[i]); |
585 | 801 |
586 for (mb_row = 0; mb_row < pc->mb_rows; mb_row += (pbi->decoding_thread_count
+ 1)) | 802 for (mb_row = 0; mb_row < pc->mb_rows; mb_row += (pbi->decoding_thread_count
+ 1)) |
587 { | 803 { |
588 int i; | 804 int i; |
589 | 805 |
590 xd->current_bc = &pbi->mbc[mb_row%num_part]; | 806 xd->current_bc = &pbi->mbc[mb_row%num_part]; |
591 | 807 |
592 //vp8_decode_mb_row(pbi, pc, mb_row, xd); | 808 //vp8_decode_mb_row(pbi, pc, mb_row, xd); |
593 { | 809 { |
594 int i; | 810 int i; |
595 int recon_yoffset, recon_uvoffset; | 811 int recon_yoffset, recon_uvoffset; |
596 int mb_col; | 812 int mb_col; |
597 int ref_fb_idx = pc->lst_fb_idx; | 813 int ref_fb_idx = pc->lst_fb_idx; |
598 int dst_fb_idx = pc->new_fb_idx; | 814 int dst_fb_idx = pc->new_fb_idx; |
599 int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; | 815 int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; |
600 int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; | 816 int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; |
601 | 817 |
602 // volatile int *last_row_current_mb_col = NULL; | 818 // volatile int *last_row_current_mb_col = NULL; |
603 if (mb_row > 0) | 819 if (mb_row > 0) |
604 last_row_current_mb_col = &pbi->current_mb_col[mb_row -1]; | 820 last_row_current_mb_col = &pbi->mt_current_mb_col[mb_row -1]; |
605 | 821 |
606 vpx_memset(&pc->left_context, 0, sizeof(pc->left_context)); | 822 vpx_memset(&pc->left_context, 0, sizeof(pc->left_context)); |
607 recon_yoffset = mb_row * recon_y_stride * 16; | 823 recon_yoffset = mb_row * recon_y_stride * 16; |
608 recon_uvoffset = mb_row * recon_uv_stride * 8; | 824 recon_uvoffset = mb_row * recon_uv_stride * 8; |
609 // reset above block coeffs | 825 // reset above block coeffs |
610 | 826 |
611 xd->above_context = pc->above_context; | 827 xd->above_context = pc->above_context; |
612 xd->up_available = (mb_row != 0); | 828 xd->up_available = (mb_row != 0); |
613 | 829 |
614 xd->mb_to_top_edge = -((mb_row * 16)) << 3; | 830 xd->mb_to_top_edge = -((mb_row * 16)) << 3; |
(...skipping 11 matching lines...) Expand all Loading... |
626 | 842 |
627 if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info
_context->mbmi.mode == B_PRED) | 843 if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info
_context->mbmi.mode == B_PRED) |
628 { | 844 { |
629 for (i = 0; i < 16; i++) | 845 for (i = 0; i < 16; i++) |
630 { | 846 { |
631 BLOCKD *d = &xd->block[i]; | 847 BLOCKD *d = &xd->block[i]; |
632 vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[i], size
of(B_MODE_INFO)); | 848 vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[i], size
of(B_MODE_INFO)); |
633 } | 849 } |
634 } | 850 } |
635 | 851 |
| 852 if(pbi->common.filter_level) |
| 853 { |
| 854 //update loopfilter info |
| 855 Segment = (alt_flt_enabled) ? xd->mode_info_context->mbmi.se
gment_id : 0; |
| 856 filter_level = pbi->mt_baseline_filter_level[Segment]; |
| 857 // Distance of Mb to the various image edges. |
| 858 // These specified to 8th pel as they are always compared to
values that are in 1/8th pel units |
| 859 // Apply any context driven MB level adjustment |
| 860 vp8_adjust_mb_lf_value(xd, &filter_level); |
| 861 } |
| 862 |
636 // Distance of Mb to the various image edges. | 863 // Distance of Mb to the various image edges. |
637 // These specified to 8th pel as they are always compared to val
ues that are in 1/8th pel units | 864 // These specified to 8th pel as they are always compared to val
ues that are in 1/8th pel units |
638 xd->mb_to_left_edge = -((mb_col * 16) << 3); | 865 xd->mb_to_left_edge = -((mb_col * 16) << 3); |
639 xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; | 866 xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; |
640 | 867 |
641 xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoff
set; | 868 xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoff
set; |
642 xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvof
fset; | 869 xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvof
fset; |
643 xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvof
fset; | 870 xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvof
fset; |
644 | 871 |
645 xd->left_available = (mb_col != 0); | 872 xd->left_available = (mb_col != 0); |
646 | 873 |
647 // Select the appropriate reference frame for this MB | 874 // Select the appropriate reference frame for this MB |
648 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) | 875 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) |
649 ref_fb_idx = pc->lst_fb_idx; | 876 ref_fb_idx = pc->lst_fb_idx; |
650 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) | 877 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) |
651 ref_fb_idx = pc->gld_fb_idx; | 878 ref_fb_idx = pc->gld_fb_idx; |
652 else | 879 else |
653 ref_fb_idx = pc->alt_fb_idx; | 880 ref_fb_idx = pc->alt_fb_idx; |
654 | 881 |
655 xd->pre.y_buffer = pc->yv12_fb[ref_fb_idx].y_buffer + recon_yoff
set; | 882 xd->pre.y_buffer = pc->yv12_fb[ref_fb_idx].y_buffer + recon_yoff
set; |
656 xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + recon_uvof
fset; | 883 xd->pre.u_buffer = pc->yv12_fb[ref_fb_idx].u_buffer + recon_uvof
fset; |
657 xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + recon_uvof
fset; | 884 xd->pre.v_buffer = pc->yv12_fb[ref_fb_idx].v_buffer + recon_uvof
fset; |
658 | 885 |
659 vp8_build_uvmvs(xd, pc->full_pixel); | 886 vp8_build_uvmvs(xd, pc->full_pixel); |
| 887 vp8mt_decode_macroblock(pbi, xd, mb_row, mb_col); |
660 | 888 |
661 vp8_decode_macroblock(pbi, xd); | 889 if (pbi->common.filter_level) |
| 890 { |
| 891 //Save decoded MB last row data for next-row decoding |
| 892 if(mb_row != pc->mb_rows-1) |
| 893 { |
| 894 vpx_memcpy((pbi->mt_yabove_row[mb_row +1] + 32 + mb_col*
16), (xd->dst.y_buffer + 15 * recon_y_stride), 16); |
| 895 vpx_memcpy((pbi->mt_uabove_row[mb_row +1] + 16 + mb_col*
8), (xd->dst.u_buffer + 7 * recon_uv_stride), 8); |
| 896 vpx_memcpy((pbi->mt_vabove_row[mb_row +1] + 16 + mb_col*
8), (xd->dst.v_buffer + 7 * recon_uv_stride), 8); |
| 897 } |
| 898 |
| 899 //save left_col for next MB decoding |
| 900 if(mb_col != pc->mb_cols-1) |
| 901 { |
| 902 MODE_INFO *next = xd->mode_info_context +1; |
| 903 |
| 904 if (xd->frame_type == KEY_FRAME || next->mbmi.ref_fram
e == INTRA_FRAME) |
| 905 { |
| 906 for (i = 0; i < 16; i++) |
| 907 pbi->mt_yleft_col[mb_row][i] = xd->dst.y_buffer
[i* recon_y_stride + 15]; |
| 908 for (i = 0; i < 8; i++) |
| 909 { |
| 910 pbi->mt_uleft_col[mb_row][i] = xd->dst.u_buffer
[i* recon_uv_stride + 7]; |
| 911 pbi->mt_vleft_col[mb_row][i] = xd->dst.v_buffer
[i* recon_uv_stride + 7]; |
| 912 } |
| 913 } |
| 914 } |
| 915 |
| 916 // loopfilter on this macroblock. |
| 917 if (filter_level) |
| 918 { |
| 919 if (mb_col > 0) |
| 920 pc->lf_mbv(xd->dst.y_buffer, xd->dst.u_buffer, xd->d
st.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lp
f); |
| 921 |
| 922 if (xd->mode_info_context->mbmi.dc_diff > 0) |
| 923 pc->lf_bv(xd->dst.y_buffer, xd->dst.u_buffer, xd->ds
t.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf
); |
| 924 |
| 925 // don't apply across umv border |
| 926 if (mb_row > 0) |
| 927 pc->lf_mbh(xd->dst.y_buffer, xd->dst.u_buffer, xd->d
st.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lp
f); |
| 928 |
| 929 if (xd->mode_info_context->mbmi.dc_diff > 0) |
| 930 pc->lf_bh(xd->dst.y_buffer, xd->dst.u_buffer, xd->ds
t.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf
); |
| 931 } |
| 932 } |
662 | 933 |
663 recon_yoffset += 16; | 934 recon_yoffset += 16; |
664 recon_uvoffset += 8; | 935 recon_uvoffset += 8; |
665 | 936 |
666 ++xd->mode_info_context; /* next mb */ | 937 ++xd->mode_info_context; /* next mb */ |
667 | 938 |
668 xd->above_context++; | 939 xd->above_context++; |
669 | 940 |
670 //pbi->current_mb_col_main = mb_col; | 941 pbi->mt_current_mb_col[mb_row] = mb_col; |
671 pbi->current_mb_col[mb_row] = mb_col; | |
672 } | 942 } |
673 | 943 |
674 // adjust to the next row of mbs | 944 // adjust to the next row of mbs |
675 vp8_extend_mb_row( | 945 if (pbi->common.filter_level) |
676 &pc->yv12_fb[dst_fb_idx], | 946 { |
677 xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer +
8 | 947 if(mb_row != pc->mb_rows-1) |
678 ); | 948 { |
| 949 int lasty = pc->yv12_fb[ref_fb_idx].y_width + VP8BORDERINPIX
ELS; |
| 950 int lastuv = (pc->yv12_fb[ref_fb_idx].y_width>>1) + (VP8BORD
ERINPIXELS>>1); |
| 951 |
| 952 for (i = 0; i < 4; i++) |
| 953 { |
| 954 pbi->mt_yabove_row[mb_row +1][lasty + i] = pbi->mt_yabov
e_row[mb_row +1][lasty -1]; |
| 955 pbi->mt_uabove_row[mb_row +1][lastuv + i] = pbi->mt_uabo
ve_row[mb_row +1][lastuv -1]; |
| 956 pbi->mt_vabove_row[mb_row +1][lastuv + i] = pbi->mt_vabo
ve_row[mb_row +1][lastuv -1]; |
| 957 } |
| 958 } |
| 959 }else |
| 960 vp8_extend_mb_row(&pc->yv12_fb[dst_fb_idx], xd->dst.y_buffer + 1
6, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); |
679 | 961 |
680 ++xd->mode_info_context; /* skip prediction column */ | 962 ++xd->mode_info_context; /* skip prediction column */ |
681 | |
682 pbi->last_mb_row_decoded = mb_row; | |
683 } | 963 } |
684 xd->mode_info_context += xd->mode_info_stride * pbi->decoding_thread_cou
nt; | 964 xd->mode_info_context += xd->mode_info_stride * pbi->decoding_thread_cou
nt; |
685 } | 965 } |
686 | 966 |
687 sem_wait(&pbi->h_event_end_decoding); // add back for each frame | 967 sem_wait(&pbi->h_event_end_decoding); // add back for each frame |
688 #else | 968 #else |
689 (void) pbi; | 969 (void) pbi; |
690 (void) xd; | 970 (void) xd; |
691 #endif | 971 #endif |
692 } | 972 } |
693 | |
694 | |
695 void vp8_mt_loop_filter_frame( VP8D_COMP *pbi) | |
696 { | |
697 #if CONFIG_MULTITHREAD | |
698 VP8_COMMON *cm = &pbi->common; | |
699 MACROBLOCKD *mbd = &pbi->mb; | |
700 int default_filt_lvl = pbi->common.filter_level; | |
701 | |
702 YV12_BUFFER_CONFIG *post = cm->frame_to_show; | |
703 loop_filter_info *lfi = cm->lf_info; | |
704 int frame_type = cm->frame_type; | |
705 | |
706 int mb_row; | |
707 int mb_col; | |
708 | |
709 int filter_level; | |
710 int alt_flt_enabled = mbd->segmentation_enabled; | |
711 | |
712 int i; | |
713 unsigned char *y_ptr, *u_ptr, *v_ptr; | |
714 | |
715 volatile int *last_row_current_mb_col=NULL; | |
716 | |
717 vp8_setup_loop_filter_thread_data(pbi, mbd, pbi->mb_row_di, pbi->decoding_th
read_count); | |
718 | |
719 mbd->mode_info_context = cm->mi; // Point at base of Mb MODE_INFO l
ist | |
720 | |
721 // Note the baseline filter values for each segment | |
722 if (alt_flt_enabled) | |
723 { | |
724 for (i = 0; i < MAX_MB_SEGMENTS; i++) | |
725 { | |
726 // Abs value | |
727 if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA) | |
728 pbi->mt_baseline_filter_level[i] = mbd->segment_feature_data[MB_
LVL_ALT_LF][i]; | |
729 // Delta Value | |
730 else | |
731 { | |
732 pbi->mt_baseline_filter_level[i] = default_filt_lvl + mbd->segme
nt_feature_data[MB_LVL_ALT_LF][i]; | |
733 pbi->mt_baseline_filter_level[i] = (pbi->mt_baseline_filter_leve
l[i] >= 0) ? ((pbi->mt_baseline_filter_level[i] <= MAX_LOOP_FILTER) ? pbi->mt_ba
seline_filter_level[i] : MAX_LOOP_FILTER) : 0; // Clamp to valid range | |
734 } | |
735 } | |
736 } | |
737 else | |
738 { | |
739 for (i = 0; i < MAX_MB_SEGMENTS; i++) | |
740 pbi->mt_baseline_filter_level[i] = default_filt_lvl; | |
741 } | |
742 | |
743 // Initialize the loop filter for this frame. | |
744 if ((cm->last_filter_type != cm->filter_type) || (cm->last_sharpness_level !
= cm->sharpness_level)) | |
745 vp8_init_loop_filter(cm); | |
746 else if (frame_type != cm->last_frame_type) | |
747 vp8_frame_init_loop_filter(lfi, frame_type); | |
748 | |
749 for (i = 0; i < pbi->decoding_thread_count; i++) | |
750 sem_post(&pbi->h_event_start_lpf[i]); | |
751 // sem_post(&pbi->h_event_start_lpf); | |
752 | |
753 // Set up the buffer pointers | |
754 y_ptr = post->y_buffer; | |
755 u_ptr = post->u_buffer; | |
756 v_ptr = post->v_buffer; | |
757 | |
758 // vp8_filter each macro block | |
759 for (mb_row = 0; mb_row < cm->mb_rows; mb_row+= (pbi->decoding_thread_count
+ 1)) | |
760 { | |
761 if (mb_row > 0) | |
762 last_row_current_mb_col = &pbi->current_mb_col[mb_row -1]; | |
763 | |
764 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) | |
765 { | |
766 int Segment = (alt_flt_enabled) ? mbd->mode_info_context->mbmi.segme
nt_id : 0; | |
767 | |
768 if ( mb_row > 0 && (mb_col & 7) == 0){ | |
769 // if ( mb_row > 0 ){ | |
770 while (mb_col > (*last_row_current_mb_col-8) && *last_row_curren
t_mb_col != cm->mb_cols - 1) | |
771 { | |
772 x86_pause_hint(); | |
773 thread_sleep(0); | |
774 } | |
775 } | |
776 | |
777 filter_level = pbi->mt_baseline_filter_level[Segment]; | |
778 | |
779 // Distance of Mb to the various image edges. | |
780 // These specified to 8th pel as they are always compared to values
that are in 1/8th pel units | |
781 // Apply any context driven MB level adjustment | |
782 vp8_adjust_mb_lf_value(mbd, &filter_level); | |
783 | |
784 if (filter_level) | |
785 { | |
786 if (mb_col > 0) | |
787 cm->lf_mbv(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_str
ide, &lfi[filter_level], cm->simpler_lpf); | |
788 | |
789 if (mbd->mode_info_context->mbmi.dc_diff > 0) | |
790 cm->lf_bv(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stri
de, &lfi[filter_level], cm->simpler_lpf); | |
791 | |
792 // don't apply across umv border | |
793 if (mb_row > 0) | |
794 cm->lf_mbh(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_str
ide, &lfi[filter_level], cm->simpler_lpf); | |
795 | |
796 if (mbd->mode_info_context->mbmi.dc_diff > 0) | |
797 cm->lf_bh(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stri
de, &lfi[filter_level], cm->simpler_lpf); | |
798 } | |
799 | |
800 y_ptr += 16; | |
801 u_ptr += 8; | |
802 v_ptr += 8; | |
803 | |
804 mbd->mode_info_context++; // step to next MB | |
805 pbi->current_mb_col[mb_row] = mb_col; | |
806 } | |
807 mbd->mode_info_context++; // Skip border mb | |
808 | |
809 //update for multi-thread | |
810 y_ptr += post->y_stride * 16 * (pbi->decoding_thread_count + 1) - post-
>y_width; | |
811 u_ptr += post->uv_stride * 8 * (pbi->decoding_thread_count + 1) - post-
>uv_width; | |
812 v_ptr += post->uv_stride * 8 * (pbi->decoding_thread_count + 1) - post-
>uv_width; | |
813 mbd->mode_info_context += pbi->decoding_thread_count * mbd->mode_info_st
ride; | |
814 } | |
815 | |
816 sem_wait(&pbi->h_event_end_lpf); | |
817 #else | |
818 (void) pbi; | |
819 #endif | |
820 } | |
OLD | NEW |