| 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 |