Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: source/libvpx/vp8/decoder/threading.c

Issue 3417017: Update libvpx sources to v0.9.2-35-ga8a38bc. ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp8/decoder/onyxd_int.h ('k') | source/libvpx/vp8/decoder/treereader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « source/libvpx/vp8/decoder/onyxd_int.h ('k') | source/libvpx/vp8/decoder/treereader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698