| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 | 11 |
| 12 #include "onyxd_int.h" | 12 #include "onyxd_int.h" |
| 13 #include "vp8/common/header.h" | 13 #include "vp8/common/header.h" |
| 14 #include "vp8/common/reconintra.h" | 14 #include "vp8/common/reconintra.h" |
| 15 #include "vp8/common/reconintra4x4.h" | 15 #include "vp8/common/reconintra4x4.h" |
| 16 #include "vp8/common/recon.h" | 16 #include "vp8/common/recon.h" |
| 17 #include "vp8/common/reconinter.h" | 17 #include "vp8/common/reconinter.h" |
| 18 #include "dequantize.h" | 18 #include "dequantize.h" |
| 19 #include "detokenize.h" | 19 #include "detokenize.h" |
| 20 #include "vp8/common/invtrans.h" | 20 #include "vp8/common/invtrans.h" |
| 21 #include "vp8/common/alloccommon.h" | 21 #include "vp8/common/alloccommon.h" |
| 22 #include "vp8/common/entropymode.h" | 22 #include "vp8/common/entropymode.h" |
| 23 #include "vp8/common/quant_common.h" | 23 #include "vp8/common/quant_common.h" |
| 24 #include "vpx_scale/vpxscale.h" | 24 #include "vpx_scale/vpxscale.h" |
| 25 #include "vpx_scale/yv12extend.h" | 25 #include "vpx_scale/yv12extend.h" |
| 26 #include "vp8/common/setupintrarecon.h" | 26 #include "vp8/common/setupintrarecon.h" |
| 27 | 27 |
| 28 #include "decodemv.h" | 28 #include "decodemv.h" |
| 29 #include "vp8/common/extend.h" | 29 #include "vp8/common/extend.h" |
| 30 #if CONFIG_ERROR_CONCEALMENT |
| 31 #include "error_concealment.h" |
| 32 #endif |
| 30 #include "vpx_mem/vpx_mem.h" | 33 #include "vpx_mem/vpx_mem.h" |
| 31 #include "vp8/common/idct.h" | 34 #include "vp8/common/idct.h" |
| 32 #include "dequantize.h" | 35 #include "dequantize.h" |
| 33 #include "vp8/common/threading.h" | 36 #include "vp8/common/threading.h" |
| 34 #include "decoderthreading.h" | 37 #include "decoderthreading.h" |
| 35 #include "dboolhuff.h" | 38 #include "dboolhuff.h" |
| 36 | 39 |
| 37 #include <assert.h> | 40 #include <assert.h> |
| 38 #include <stdio.h> | 41 #include <stdio.h> |
| 39 | 42 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 #define RTCD_VTABLE(x) (&(pbi)->common.rtcd.x) | 107 #define RTCD_VTABLE(x) (&(pbi)->common.rtcd.x) |
| 105 #else | 108 #else |
| 106 #define RTCD_VTABLE(x) NULL | 109 #define RTCD_VTABLE(x) NULL |
| 107 #endif | 110 #endif |
| 108 | 111 |
| 109 /* skip_recon_mb() is Modified: Instead of writing the result to predictor buffe
r and then copying it | 112 /* skip_recon_mb() is Modified: Instead of writing the result to predictor buffe
r and then copying it |
| 110 * to dst buffer, we can write the result directly to dst buffer. This eliminat
es unnecessary copy. | 113 * to dst buffer, we can write the result directly to dst buffer. This eliminat
es unnecessary copy. |
| 111 */ | 114 */ |
| 112 static void skip_recon_mb(VP8D_COMP *pbi, MACROBLOCKD *xd) | 115 static void skip_recon_mb(VP8D_COMP *pbi, MACROBLOCKD *xd) |
| 113 { | 116 { |
| 114 if (xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_frame =
= INTRA_FRAME) | 117 if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) |
| 115 { | 118 { |
| 116 | 119 RECON_INVOKE(&pbi->common.rtcd.recon, build_intra_predictors_mbuv_s)(xd)
; |
| 117 vp8_build_intra_predictors_mbuv_s(xd); | |
| 118 RECON_INVOKE(&pbi->common.rtcd.recon, | 120 RECON_INVOKE(&pbi->common.rtcd.recon, |
| 119 build_intra_predictors_mby_s)(xd); | 121 build_intra_predictors_mby_s)(xd); |
| 120 } | 122 } |
| 121 else | 123 else |
| 122 { | 124 { |
| 123 vp8_build_inter_predictors_mb_s(xd); | 125 vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer, |
| 126 xd->dst.u_buffer, xd->dst.v_buffer, |
| 127 xd->dst.y_stride, xd->dst.uv_stride); |
| 124 } | 128 } |
| 125 } | 129 } |
| 126 | 130 |
| 127 static void clamp_mv_to_umv_border(MV *mv, const MACROBLOCKD *xd) | 131 static void clamp_mv_to_umv_border(MV *mv, const MACROBLOCKD *xd) |
| 128 { | 132 { |
| 129 /* If the MV points so far into the UMV border that no visible pixels | 133 /* If the MV points so far into the UMV border that no visible pixels |
| 130 * are used for reconstruction, the subpel part of the MV can be | 134 * are used for reconstruction, the subpel part of the MV can be |
| 131 * discarded and the MV limited to 16 pixels with equivalent results. | 135 * discarded and the MV limited to 16 pixels with equivalent results. |
| 132 * | 136 * |
| 133 * This limit kicks in at 19 pixels for the top and left edges, for | 137 * This limit kicks in at 19 pixels for the top and left edges, for |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 clamp_uvmv_to_umv_border(&xd->block[i].bmi.mv.as_mv, xd); | 172 clamp_uvmv_to_umv_border(&xd->block[i].bmi.mv.as_mv, xd); |
| 169 } | 173 } |
| 170 else | 174 else |
| 171 { | 175 { |
| 172 clamp_mv_to_umv_border(&xd->mode_info_context->mbmi.mv.as_mv, xd); | 176 clamp_mv_to_umv_border(&xd->mode_info_context->mbmi.mv.as_mv, xd); |
| 173 clamp_uvmv_to_umv_border(&xd->block[16].bmi.mv.as_mv, xd); | 177 clamp_uvmv_to_umv_border(&xd->block[16].bmi.mv.as_mv, xd); |
| 174 } | 178 } |
| 175 | 179 |
| 176 } | 180 } |
| 177 | 181 |
| 178 static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd) | 182 static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, |
| 183 unsigned int mb_idx) |
| 179 { | 184 { |
| 180 int eobtotal = 0; | 185 int eobtotal = 0; |
| 181 int i, do_clamp = xd->mode_info_context->mbmi.need_to_clamp_mvs; | 186 int throw_residual = 0; |
| 187 MB_PREDICTION_MODE mode; |
| 188 int i; |
| 182 | 189 |
| 183 if (xd->mode_info_context->mbmi.mb_skip_coeff) | 190 if (xd->mode_info_context->mbmi.mb_skip_coeff) |
| 184 { | 191 { |
| 185 vp8_reset_mb_tokens_context(xd); | 192 vp8_reset_mb_tokens_context(xd); |
| 186 } | 193 } |
| 187 else | 194 else |
| 188 { | 195 { |
| 189 eobtotal = vp8_decode_mb_tokens(pbi, xd); | 196 eobtotal = vp8_decode_mb_tokens(pbi, xd); |
| 190 } | 197 } |
| 191 | 198 |
| 192 /* Perform temporary clamping of the MV to be used for prediction */ | 199 /* Perform temporary clamping of the MV to be used for prediction */ |
| 193 if (do_clamp) | 200 if (xd->mode_info_context->mbmi.need_to_clamp_mvs) |
| 194 { | 201 { |
| 195 clamp_mvs(xd); | 202 clamp_mvs(xd); |
| 196 } | 203 } |
| 197 | 204 |
| 198 xd->mode_info_context->mbmi.dc_diff = 1; | 205 mode = xd->mode_info_context->mbmi.mode; |
| 199 | 206 |
| 200 if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbm
i.mode != SPLITMV && eobtotal == 0) | 207 if (eobtotal == 0 && mode != B_PRED && mode != SPLITMV && |
| 208 !vp8dx_bool_error(xd->current_bc)) |
| 201 { | 209 { |
| 202 xd->mode_info_context->mbmi.dc_diff = 0; | 210 /* Special case: Force the loopfilter to skip when eobtotal and |
| 211 * mb_skip_coeff are zero. |
| 212 * */ |
| 213 xd->mode_info_context->mbmi.mb_skip_coeff = 1; |
| 214 |
| 203 skip_recon_mb(pbi, xd); | 215 skip_recon_mb(pbi, xd); |
| 204 return; | 216 return; |
| 205 } | 217 } |
| 206 | 218 |
| 207 if (xd->segmentation_enabled) | 219 if (xd->segmentation_enabled) |
| 208 mb_init_dequantizer(pbi, xd); | 220 mb_init_dequantizer(pbi, xd); |
| 209 | 221 |
| 210 /* do prediction */ | 222 /* do prediction */ |
| 211 if (xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_frame =
= INTRA_FRAME) | 223 if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) |
| 212 { | 224 { |
| 213 vp8_build_intra_predictors_mbuv(xd); | 225 RECON_INVOKE(&pbi->common.rtcd.recon, build_intra_predictors_mbuv)(xd); |
| 214 | 226 |
| 215 if (xd->mode_info_context->mbmi.mode != B_PRED) | 227 if (mode != B_PRED) |
| 216 { | 228 { |
| 217 RECON_INVOKE(&pbi->common.rtcd.recon, | 229 RECON_INVOKE(&pbi->common.rtcd.recon, |
| 218 build_intra_predictors_mby)(xd); | 230 build_intra_predictors_mby)(xd); |
| 219 } else { | 231 } else { |
| 220 vp8_intra_prediction_down_copy(xd); | 232 vp8_intra_prediction_down_copy(xd); |
| 221 } | 233 } |
| 222 } | 234 } |
| 223 else | 235 else |
| 224 { | 236 { |
| 225 vp8_build_inter_predictors_mb(xd); | 237 vp8_build_inter_predictors_mb(xd); |
| 226 } | 238 } |
| 227 | 239 |
| 240 /* When we have independent partitions we can apply residual even |
| 241 * though other partitions within the frame are corrupt. |
| 242 */ |
| 243 throw_residual = (!pbi->independent_partitions && |
| 244 pbi->frame_corrupt_residual); |
| 245 throw_residual = (throw_residual || vp8dx_bool_error(xd->current_bc)); |
| 246 |
| 247 #if CONFIG_ERROR_CONCEALMENT |
| 248 if (pbi->ec_active && |
| 249 (mb_idx >= pbi->mvs_corrupt_from_mb || throw_residual)) |
| 250 { |
| 251 /* MB with corrupt residuals or corrupt mode/motion vectors. |
| 252 * Better to use the predictor as reconstruction. |
| 253 */ |
| 254 pbi->frame_corrupt_residual = 1; |
| 255 vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); |
| 256 vp8_conceal_corrupt_mb(xd); |
| 257 return; |
| 258 } |
| 259 #endif |
| 260 |
| 228 /* dequantization and idct */ | 261 /* dequantization and idct */ |
| 229 if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbm
i.mode != SPLITMV) | 262 if (mode == B_PRED) |
| 263 { |
| 264 for (i = 0; i < 16; i++) |
| 265 { |
| 266 BLOCKD *b = &xd->block[i]; |
| 267 RECON_INVOKE(RTCD_VTABLE(recon), intra4x4_predict) |
| 268 (b, b->bmi.as_mode, b->predictor); |
| 269 |
| 270 if (xd->eobs[i] > 1) |
| 271 { |
| 272 DEQUANT_INVOKE(&pbi->dequant, idct_add) |
| 273 (b->qcoeff, b->dequant, b->predictor, |
| 274 *(b->base_dst) + b->dst, 16, b->dst_stride); |
| 275 } |
| 276 else |
| 277 { |
| 278 IDCT_INVOKE(RTCD_VTABLE(idct), idct1_scalar_add) |
| 279 (b->qcoeff[0] * b->dequant[0], b->predictor, |
| 280 *(b->base_dst) + b->dst, 16, b->dst_stride); |
| 281 ((int *)b->qcoeff)[0] = 0; |
| 282 } |
| 283 } |
| 284 |
| 285 } |
| 286 else if (mode == SPLITMV) |
| 287 { |
| 288 DEQUANT_INVOKE (&pbi->dequant, idct_add_y_block) |
| 289 (xd->qcoeff, xd->block[0].dequant, |
| 290 xd->predictor, xd->dst.y_buffer, |
| 291 xd->dst.y_stride, xd->eobs); |
| 292 } |
| 293 else |
| 230 { | 294 { |
| 231 BLOCKD *b = &xd->block[24]; | 295 BLOCKD *b = &xd->block[24]; |
| 296 |
| 232 DEQUANT_INVOKE(&pbi->dequant, block)(b); | 297 DEQUANT_INVOKE(&pbi->dequant, block)(b); |
| 233 | 298 |
| 234 /* do 2nd order transform on the dc block */ | 299 /* do 2nd order transform on the dc block */ |
| 235 if (xd->eobs[24] > 1) | 300 if (xd->eobs[24] > 1) |
| 236 { | 301 { |
| 237 IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh16)(&b->dqcoeff[0], b->diff); | 302 IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh16)(&b->dqcoeff[0], b->diff); |
| 238 ((int *)b->qcoeff)[0] = 0; | 303 ((int *)b->qcoeff)[0] = 0; |
| 239 ((int *)b->qcoeff)[1] = 0; | 304 ((int *)b->qcoeff)[1] = 0; |
| 240 ((int *)b->qcoeff)[2] = 0; | 305 ((int *)b->qcoeff)[2] = 0; |
| 241 ((int *)b->qcoeff)[3] = 0; | 306 ((int *)b->qcoeff)[3] = 0; |
| 242 ((int *)b->qcoeff)[4] = 0; | 307 ((int *)b->qcoeff)[4] = 0; |
| 243 ((int *)b->qcoeff)[5] = 0; | 308 ((int *)b->qcoeff)[5] = 0; |
| 244 ((int *)b->qcoeff)[6] = 0; | 309 ((int *)b->qcoeff)[6] = 0; |
| 245 ((int *)b->qcoeff)[7] = 0; | 310 ((int *)b->qcoeff)[7] = 0; |
| 246 } | 311 } |
| 247 else | 312 else |
| 248 { | 313 { |
| 249 IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh1)(&b->dqcoeff[0], b->diff); | 314 IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh1)(&b->dqcoeff[0], b->diff); |
| 250 ((int *)b->qcoeff)[0] = 0; | 315 ((int *)b->qcoeff)[0] = 0; |
| 251 } | 316 } |
| 252 | 317 |
| 253 DEQUANT_INVOKE (&pbi->dequant, dc_idct_add_y_block) | 318 DEQUANT_INVOKE (&pbi->dequant, dc_idct_add_y_block) |
| 254 (xd->qcoeff, xd->block[0].dequant, | 319 (xd->qcoeff, xd->block[0].dequant, |
| 255 xd->predictor, xd->dst.y_buffer, | 320 xd->predictor, xd->dst.y_buffer, |
| 256 xd->dst.y_stride, xd->eobs, xd->block[24].diff); | 321 xd->dst.y_stride, xd->eobs, xd->block[24].diff); |
| 257 } | 322 } |
| 258 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) | |
| 259 { | |
| 260 for (i = 0; i < 16; i++) | |
| 261 { | |
| 262 | |
| 263 BLOCKD *b = &xd->block[i]; | |
| 264 vp8_predict_intra4x4(b, b->bmi.mode, b->predictor); | |
| 265 | |
| 266 if (xd->eobs[i] > 1) | |
| 267 { | |
| 268 DEQUANT_INVOKE(&pbi->dequant, idct_add) | |
| 269 (b->qcoeff, b->dequant, b->predictor, | |
| 270 *(b->base_dst) + b->dst, 16, b->dst_stride); | |
| 271 } | |
| 272 else | |
| 273 { | |
| 274 IDCT_INVOKE(RTCD_VTABLE(idct), idct1_scalar_add) | |
| 275 (b->qcoeff[0] * b->dequant[0], b->predictor, | |
| 276 *(b->base_dst) + b->dst, 16, b->dst_stride); | |
| 277 ((int *)b->qcoeff)[0] = 0; | |
| 278 } | |
| 279 } | |
| 280 | |
| 281 } | |
| 282 else | |
| 283 { | |
| 284 DEQUANT_INVOKE (&pbi->dequant, idct_add_y_block) | |
| 285 (xd->qcoeff, xd->block[0].dequant, | |
| 286 xd->predictor, xd->dst.y_buffer, | |
| 287 xd->dst.y_stride, xd->eobs); | |
| 288 } | |
| 289 | 323 |
| 290 DEQUANT_INVOKE (&pbi->dequant, idct_add_uv_block) | 324 DEQUANT_INVOKE (&pbi->dequant, idct_add_uv_block) |
| 291 (xd->qcoeff+16*16, xd->block[16].dequant, | 325 (xd->qcoeff+16*16, xd->block[16].dequant, |
| 292 xd->predictor+16*16, xd->dst.u_buffer, xd->dst.v_buffer, | 326 xd->predictor+16*16, xd->dst.u_buffer, xd->dst.v_buffer, |
| 293 xd->dst.uv_stride, xd->eobs+16); | 327 xd->dst.uv_stride, xd->eobs+16); |
| 294 } | 328 } |
| 295 | 329 |
| 296 | 330 |
| 297 static int get_delta_q(vp8_reader *bc, int prev, int *q_update) | 331 static int get_delta_q(vp8_reader *bc, int prev, int *q_update) |
| 298 { | 332 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 316 #ifdef PACKET_TESTING | 350 #ifdef PACKET_TESTING |
| 317 #include <stdio.h> | 351 #include <stdio.h> |
| 318 FILE *vpxlog = 0; | 352 FILE *vpxlog = 0; |
| 319 #endif | 353 #endif |
| 320 | 354 |
| 321 | 355 |
| 322 | 356 |
| 323 static void | 357 static void |
| 324 decode_mb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mb_row, MACROBLOCKD *xd) | 358 decode_mb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mb_row, MACROBLOCKD *xd) |
| 325 { | 359 { |
| 326 | |
| 327 int i; | |
| 328 int recon_yoffset, recon_uvoffset; | 360 int recon_yoffset, recon_uvoffset; |
| 329 int mb_col; | 361 int mb_col; |
| 330 int ref_fb_idx = pc->lst_fb_idx; | 362 int ref_fb_idx = pc->lst_fb_idx; |
| 331 int dst_fb_idx = pc->new_fb_idx; | 363 int dst_fb_idx = pc->new_fb_idx; |
| 332 int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; | 364 int recon_y_stride = pc->yv12_fb[ref_fb_idx].y_stride; |
| 333 int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; | 365 int recon_uv_stride = pc->yv12_fb[ref_fb_idx].uv_stride; |
| 334 | 366 |
| 335 vpx_memset(&pc->left_context, 0, sizeof(pc->left_context)); | 367 vpx_memset(&pc->left_context, 0, sizeof(pc->left_context)); |
| 336 recon_yoffset = mb_row * recon_y_stride * 16; | 368 recon_yoffset = mb_row * recon_y_stride * 16; |
| 337 recon_uvoffset = mb_row * recon_uv_stride * 8; | 369 recon_uvoffset = mb_row * recon_uv_stride * 8; |
| 338 /* reset above block coeffs */ | 370 /* reset above block coeffs */ |
| 339 | 371 |
| 340 xd->above_context = pc->above_context; | 372 xd->above_context = pc->above_context; |
| 341 xd->up_available = (mb_row != 0); | 373 xd->up_available = (mb_row != 0); |
| 342 | 374 |
| 343 xd->mb_to_top_edge = -((mb_row * 16)) << 3; | 375 xd->mb_to_top_edge = -((mb_row * 16)) << 3; |
| 344 xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; | 376 xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; |
| 345 | 377 |
| 346 for (mb_col = 0; mb_col < pc->mb_cols; mb_col++) | 378 for (mb_col = 0; mb_col < pc->mb_cols; mb_col++) |
| 347 { | 379 { |
| 348 | |
| 349 if (xd->mode_info_context->mbmi.mode == SPLITMV || xd->mode_info_context
->mbmi.mode == B_PRED) | |
| 350 { | |
| 351 for (i = 0; i < 16; i++) | |
| 352 { | |
| 353 BLOCKD *d = &xd->block[i]; | |
| 354 vpx_memcpy(&d->bmi, &xd->mode_info_context->bmi[i], sizeof(B_MOD
E_INFO)); | |
| 355 } | |
| 356 } | |
| 357 | |
| 358 /* Distance of Mb to the various image edges. | 380 /* Distance of Mb to the various image edges. |
| 359 * These are specified to 8th pel as they are always compared to values
that are in 1/8th pel units | 381 * These are specified to 8th pel as they are always compared to values |
| 382 * that are in 1/8th pel units |
| 360 */ | 383 */ |
| 361 xd->mb_to_left_edge = -((mb_col * 16) << 3); | 384 xd->mb_to_left_edge = -((mb_col * 16) << 3); |
| 362 xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; | 385 xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; |
| 363 | 386 |
| 387 #if CONFIG_ERROR_CONCEALMENT |
| 388 { |
| 389 int corrupt_residual = (!pbi->independent_partitions && |
| 390 pbi->frame_corrupt_residual) || |
| 391 vp8dx_bool_error(xd->current_bc); |
| 392 if (pbi->ec_active && |
| 393 xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME && |
| 394 corrupt_residual) |
| 395 { |
| 396 /* We have an intra block with corrupt coefficients, better to |
| 397 * conceal with an inter block. Interpolate MVs from neighboring |
| 398 * MBs. |
| 399 * |
| 400 * Note that for the first mb with corrupt residual in a frame, |
| 401 * we might not discover that before decoding the residual. That |
| 402 * happens after this check, and therefore no inter concealment |
| 403 * will be done. |
| 404 */ |
| 405 vp8_interpolate_motion(xd, |
| 406 mb_row, mb_col, |
| 407 pc->mb_rows, pc->mb_cols, |
| 408 pc->mode_info_stride); |
| 409 } |
| 410 } |
| 411 #endif |
| 412 |
| 413 update_blockd_bmi(xd); |
| 414 |
| 364 xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; | 415 xd->dst.y_buffer = pc->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset; |
| 365 xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; | 416 xd->dst.u_buffer = pc->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset; |
| 366 xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset; | 417 xd->dst.v_buffer = pc->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset; |
| 367 | 418 |
| 368 xd->left_available = (mb_col != 0); | 419 xd->left_available = (mb_col != 0); |
| 369 | 420 |
| 370 /* Select the appropriate reference frame for this MB */ | 421 /* Select the appropriate reference frame for this MB */ |
| 371 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) | 422 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) |
| 372 ref_fb_idx = pc->lst_fb_idx; | 423 ref_fb_idx = pc->lst_fb_idx; |
| 373 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) | 424 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 386 } | 437 } |
| 387 | 438 |
| 388 vp8_build_uvmvs(xd, pc->full_pixel); | 439 vp8_build_uvmvs(xd, pc->full_pixel); |
| 389 | 440 |
| 390 /* | 441 /* |
| 391 if(pc->current_video_frame==0 &&mb_col==1 && mb_row==0) | 442 if(pc->current_video_frame==0 &&mb_col==1 && mb_row==0) |
| 392 pbi->debugoutput =1; | 443 pbi->debugoutput =1; |
| 393 else | 444 else |
| 394 pbi->debugoutput =0; | 445 pbi->debugoutput =0; |
| 395 */ | 446 */ |
| 396 decode_macroblock(pbi, xd); | 447 decode_macroblock(pbi, xd, mb_row * pc->mb_cols + mb_col); |
| 397 | 448 |
| 398 /* check if the boolean decoder has suffered an error */ | 449 /* check if the boolean decoder has suffered an error */ |
| 399 xd->corrupted |= vp8dx_bool_error(xd->current_bc); | 450 xd->corrupted |= vp8dx_bool_error(xd->current_bc); |
| 400 | 451 |
| 401 recon_yoffset += 16; | 452 recon_yoffset += 16; |
| 402 recon_uvoffset += 8; | 453 recon_uvoffset += 8; |
| 403 | 454 |
| 404 ++xd->mode_info_context; /* next mb */ | 455 ++xd->mode_info_context; /* next mb */ |
| 405 | 456 |
| 406 xd->above_context++; | 457 xd->above_context++; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 417 } | 468 } |
| 418 | 469 |
| 419 | 470 |
| 420 static unsigned int read_partition_size(const unsigned char *cx_size) | 471 static unsigned int read_partition_size(const unsigned char *cx_size) |
| 421 { | 472 { |
| 422 const unsigned int size = | 473 const unsigned int size = |
| 423 cx_size[0] + (cx_size[1] << 8) + (cx_size[2] << 16); | 474 cx_size[0] + (cx_size[1] << 8) + (cx_size[2] << 16); |
| 424 return size; | 475 return size; |
| 425 } | 476 } |
| 426 | 477 |
| 478 static void setup_token_decoder_partition_input(VP8D_COMP *pbi) |
| 479 { |
| 480 vp8_reader *bool_decoder = &pbi->bc2; |
| 481 int part_idx = 1; |
| 482 |
| 483 TOKEN_PARTITION multi_token_partition = |
| 484 (TOKEN_PARTITION)vp8_read_literal(&pbi->bc, 2); |
| 485 assert(vp8dx_bool_error(&pbi->bc) || |
| 486 multi_token_partition == pbi->common.multi_token_partition); |
| 487 if (pbi->num_partitions > 2) |
| 488 { |
| 489 CHECK_MEM_ERROR(pbi->mbc, vpx_malloc((pbi->num_partitions - 1) * |
| 490 sizeof(vp8_reader))); |
| 491 bool_decoder = pbi->mbc; |
| 492 } |
| 493 |
| 494 for (; part_idx < pbi->num_partitions; ++part_idx) |
| 495 { |
| 496 if (vp8dx_start_decode(bool_decoder, |
| 497 pbi->partitions[part_idx], |
| 498 pbi->partition_sizes[part_idx])) |
| 499 vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR, |
| 500 "Failed to allocate bool decoder %d", |
| 501 part_idx); |
| 502 |
| 503 bool_decoder++; |
| 504 } |
| 505 |
| 506 #if CONFIG_MULTITHREAD |
| 507 /* Clamp number of decoder threads */ |
| 508 if (pbi->decoding_thread_count > pbi->num_partitions - 1) |
| 509 pbi->decoding_thread_count = pbi->num_partitions - 1; |
| 510 #endif |
| 511 } |
| 512 |
| 513 |
| 514 static int read_is_valid(const unsigned char *start, |
| 515 size_t len, |
| 516 const unsigned char *end) |
| 517 { |
| 518 return (start + len > start && start + len <= end); |
| 519 } |
| 520 |
| 427 | 521 |
| 428 static void setup_token_decoder(VP8D_COMP *pbi, | 522 static void setup_token_decoder(VP8D_COMP *pbi, |
| 429 const unsigned char *cx_data) | 523 const unsigned char *cx_data) |
| 430 { | 524 { |
| 431 int num_part; | 525 int num_part; |
| 432 int i; | 526 int i; |
| 433 VP8_COMMON *pc = &pbi->common; | 527 VP8_COMMON *pc = &pbi->common; |
| 434 const unsigned char *user_data_end = pbi->Source + pbi->source_sz; | 528 const unsigned char *user_data_end = pbi->Source + pbi->source_sz; |
| 435 vp8_reader *bool_decoder; | 529 vp8_reader *bool_decoder; |
| 436 const unsigned char *partition; | 530 const unsigned char *partition; |
| 437 | 531 |
| 438 /* Parse number of token partitions to use */ | 532 /* Parse number of token partitions to use */ |
| 439 pc->multi_token_partition = (TOKEN_PARTITION)vp8_read_literal(&pbi->bc, 2); | 533 const TOKEN_PARTITION multi_token_partition = |
| 534 (TOKEN_PARTITION)vp8_read_literal(&pbi->bc, 2); |
| 535 /* Only update the multi_token_partition field if we are sure the value |
| 536 * is correct. */ |
| 537 if (!pbi->ec_active || !vp8dx_bool_error(&pbi->bc)) |
| 538 pc->multi_token_partition = multi_token_partition; |
| 539 |
| 440 num_part = 1 << pc->multi_token_partition; | 540 num_part = 1 << pc->multi_token_partition; |
| 441 | 541 |
| 442 /* Set up pointers to the first partition */ | 542 /* Set up pointers to the first partition */ |
| 443 partition = cx_data; | 543 partition = cx_data; |
| 444 bool_decoder = &pbi->bc2; | 544 bool_decoder = &pbi->bc2; |
| 445 | 545 |
| 446 if (num_part > 1) | 546 if (num_part > 1) |
| 447 { | 547 { |
| 448 CHECK_MEM_ERROR(pbi->mbc, vpx_malloc(num_part * sizeof(vp8_reader))); | 548 CHECK_MEM_ERROR(pbi->mbc, vpx_malloc(num_part * sizeof(vp8_reader))); |
| 449 bool_decoder = pbi->mbc; | 549 bool_decoder = pbi->mbc; |
| 450 partition += 3 * (num_part - 1); | 550 partition += 3 * (num_part - 1); |
| 451 } | 551 } |
| 452 | 552 |
| 453 for (i = 0; i < num_part; i++) | 553 for (i = 0; i < num_part; i++) |
| 454 { | 554 { |
| 455 const unsigned char *partition_size_ptr = cx_data + i * 3; | 555 const unsigned char *partition_size_ptr = cx_data + i * 3; |
| 456 ptrdiff_t partition_size; | 556 ptrdiff_t partition_size, bytes_left; |
| 557 |
| 558 bytes_left = user_data_end - partition; |
| 457 | 559 |
| 458 /* Calculate the length of this partition. The last partition | 560 /* Calculate the length of this partition. The last partition |
| 459 * size is implicit. | 561 * size is implicit. If the partition size can't be read, then |
| 562 * either use the remaining data in the buffer (for EC mode) |
| 563 * or throw an error. |
| 460 */ | 564 */ |
| 461 if (i < num_part - 1) | 565 if (i < num_part - 1) |
| 462 { | 566 { |
| 463 partition_size = read_partition_size(partition_size_ptr); | 567 if (read_is_valid(partition_size_ptr, 3, user_data_end)) |
| 568 partition_size = read_partition_size(partition_size_ptr); |
| 569 else if (pbi->ec_active) |
| 570 partition_size = bytes_left; |
| 571 else |
| 572 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, |
| 573 "Truncated partition size data"); |
| 464 } | 574 } |
| 465 else | 575 else |
| 576 partition_size = bytes_left; |
| 577 |
| 578 /* Validate the calculated partition length. If the buffer |
| 579 * described by the partition can't be fully read, then restrict |
| 580 * it to the portion that can be (for EC mode) or throw an error. |
| 581 */ |
| 582 if (!read_is_valid(partition, partition_size, user_data_end)) |
| 466 { | 583 { |
| 467 partition_size = user_data_end - partition; | 584 if (pbi->ec_active) |
| 585 partition_size = bytes_left; |
| 586 else |
| 587 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, |
| 588 "Truncated packet or corrupt partition " |
| 589 "%d length", i + 1); |
| 468 } | 590 } |
| 469 | 591 |
| 470 if (partition + partition_size > user_data_end | |
| 471 || partition + partition_size < partition) | |
| 472 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, | |
| 473 "Truncated packet or corrupt partition " | |
| 474 "%d length", i + 1); | |
| 475 | |
| 476 if (vp8dx_start_decode(bool_decoder, partition, partition_size)) | 592 if (vp8dx_start_decode(bool_decoder, partition, partition_size)) |
| 477 vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, | 593 vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, |
| 478 "Failed to allocate bool decoder %d", i + 1); | 594 "Failed to allocate bool decoder %d", i + 1); |
| 479 | 595 |
| 480 /* Advance to the next partition */ | 596 /* Advance to the next partition */ |
| 481 partition += partition_size; | 597 partition += partition_size; |
| 482 bool_decoder++; | 598 bool_decoder++; |
| 483 } | 599 } |
| 484 | 600 |
| 485 #if CONFIG_MULTITHREAD | 601 #if CONFIG_MULTITHREAD |
| 486 /* Clamp number of decoder threads */ | 602 /* Clamp number of decoder threads */ |
| 487 if (pbi->decoding_thread_count > num_part - 1) | 603 if (pbi->decoding_thread_count > num_part - 1) |
| 488 pbi->decoding_thread_count = num_part - 1; | 604 pbi->decoding_thread_count = num_part - 1; |
| 489 #endif | 605 #endif |
| 490 } | 606 } |
| 491 | 607 |
| 492 | 608 |
| 493 static void stop_token_decoder(VP8D_COMP *pbi) | 609 static void stop_token_decoder(VP8D_COMP *pbi) |
| 494 { | 610 { |
| 495 VP8_COMMON *pc = &pbi->common; | 611 VP8_COMMON *pc = &pbi->common; |
| 496 | 612 |
| 497 if (pc->multi_token_partition != ONE_PARTITION) | 613 if (pc->multi_token_partition != ONE_PARTITION) |
| 614 { |
| 498 vpx_free(pbi->mbc); | 615 vpx_free(pbi->mbc); |
| 616 pbi->mbc = NULL; |
| 617 } |
| 499 } | 618 } |
| 500 | 619 |
| 501 static void init_frame(VP8D_COMP *pbi) | 620 static void init_frame(VP8D_COMP *pbi) |
| 502 { | 621 { |
| 503 VP8_COMMON *const pc = & pbi->common; | 622 VP8_COMMON *const pc = & pbi->common; |
| 504 MACROBLOCKD *const xd = & pbi->mb; | 623 MACROBLOCKD *const xd = & pbi->mb; |
| 505 | 624 |
| 506 if (pc->frame_type == KEY_FRAME) | 625 if (pc->frame_type == KEY_FRAME) |
| 507 { | 626 { |
| 508 /* Various keyframe initializations */ | 627 /* Various keyframe initializations */ |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 xd->subpixel_predict8x8 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), sixta
p8x8); | 667 xd->subpixel_predict8x8 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), sixta
p8x8); |
| 549 xd->subpixel_predict16x16 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), sixta
p16x16); | 668 xd->subpixel_predict16x16 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), sixta
p16x16); |
| 550 } | 669 } |
| 551 else | 670 else |
| 552 { | 671 { |
| 553 xd->subpixel_predict = SUBPIX_INVOKE(RTCD_VTABLE(subpix), bilin
ear4x4); | 672 xd->subpixel_predict = SUBPIX_INVOKE(RTCD_VTABLE(subpix), bilin
ear4x4); |
| 554 xd->subpixel_predict8x4 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), bilin
ear8x4); | 673 xd->subpixel_predict8x4 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), bilin
ear8x4); |
| 555 xd->subpixel_predict8x8 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), bilin
ear8x8); | 674 xd->subpixel_predict8x8 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), bilin
ear8x8); |
| 556 xd->subpixel_predict16x16 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), bilin
ear16x16); | 675 xd->subpixel_predict16x16 = SUBPIX_INVOKE(RTCD_VTABLE(subpix), bilin
ear16x16); |
| 557 } | 676 } |
| 677 |
| 678 if (pbi->decoded_key_frame && pbi->ec_enabled && !pbi->ec_active) |
| 679 pbi->ec_active = 1; |
| 558 } | 680 } |
| 559 | 681 |
| 560 xd->left_context = &pc->left_context; | 682 xd->left_context = &pc->left_context; |
| 561 xd->mode_info_context = pc->mi; | 683 xd->mode_info_context = pc->mi; |
| 562 xd->frame_type = pc->frame_type; | 684 xd->frame_type = pc->frame_type; |
| 563 xd->mode_info_context->mbmi.mode = DC_PRED; | 685 xd->mode_info_context->mbmi.mode = DC_PRED; |
| 564 xd->mode_info_stride = pc->mode_info_stride; | 686 xd->mode_info_stride = pc->mode_info_stride; |
| 565 xd->corrupted = 0; /* init without corruption */ | 687 xd->corrupted = 0; /* init without corruption */ |
| 566 } | 688 } |
| 567 | 689 |
| 568 int vp8_decode_frame(VP8D_COMP *pbi) | 690 int vp8_decode_frame(VP8D_COMP *pbi) |
| 569 { | 691 { |
| 570 vp8_reader *const bc = & pbi->bc; | 692 vp8_reader *const bc = & pbi->bc; |
| 571 VP8_COMMON *const pc = & pbi->common; | 693 VP8_COMMON *const pc = & pbi->common; |
| 572 MACROBLOCKD *const xd = & pbi->mb; | 694 MACROBLOCKD *const xd = & pbi->mb; |
| 573 const unsigned char *data = (const unsigned char *)pbi->Source; | 695 const unsigned char *data = (const unsigned char *)pbi->Source; |
| 574 const unsigned char *const data_end = data + pbi->source_sz; | 696 const unsigned char *data_end = data + pbi->source_sz; |
| 575 ptrdiff_t first_partition_length_in_bytes; | 697 ptrdiff_t first_partition_length_in_bytes; |
| 576 | 698 |
| 577 int mb_row; | 699 int mb_row; |
| 578 int i, j, k, l; | 700 int i, j, k, l; |
| 579 const int *const mb_feature_data_bits = vp8_mb_feature_data_bits; | 701 const int *const mb_feature_data_bits = vp8_mb_feature_data_bits; |
| 702 int corrupt_tokens = 0; |
| 703 int prev_independent_partitions = pbi->independent_partitions; |
| 704 |
| 705 if (pbi->input_partition) |
| 706 { |
| 707 data = pbi->partitions[0]; |
| 708 data_end = data + pbi->partition_sizes[0]; |
| 709 } |
| 580 | 710 |
| 581 /* start with no corruption of current frame */ | 711 /* start with no corruption of current frame */ |
| 582 xd->corrupted = 0; | 712 xd->corrupted = 0; |
| 583 pc->yv12_fb[pc->new_fb_idx].corrupted = 0; | 713 pc->yv12_fb[pc->new_fb_idx].corrupted = 0; |
| 584 | 714 |
| 585 if (data_end - data < 3) | 715 if (data_end - data < 3) |
| 586 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, | 716 { |
| 587 "Truncated packet"); | 717 if (pbi->ec_active) |
| 588 pc->frame_type = (FRAME_TYPE)(data[0] & 1); | 718 { |
| 589 pc->version = (data[0] >> 1) & 7; | 719 /* Declare the missing frame as an inter frame since it will |
| 590 pc->show_frame = (data[0] >> 4) & 1; | 720 be handled as an inter frame when we have estimated its |
| 591 first_partition_length_in_bytes = | 721 motion vectors. */ |
| 592 (data[0] | (data[1] << 8) | (data[2] << 16)) >> 5; | 722 pc->frame_type = INTER_FRAME; |
| 593 data += 3; | 723 pc->version = 0; |
| 724 pc->show_frame = 1; |
| 725 first_partition_length_in_bytes = 0; |
| 726 } |
| 727 else |
| 728 { |
| 729 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, |
| 730 "Truncated packet"); |
| 731 } |
| 732 } |
| 733 else |
| 734 { |
| 735 pc->frame_type = (FRAME_TYPE)(data[0] & 1); |
| 736 pc->version = (data[0] >> 1) & 7; |
| 737 pc->show_frame = (data[0] >> 4) & 1; |
| 738 first_partition_length_in_bytes = |
| 739 (data[0] | (data[1] << 8) | (data[2] << 16)) >> 5; |
| 740 data += 3; |
| 594 | 741 |
| 595 if (data + first_partition_length_in_bytes > data_end | 742 if (!pbi->ec_active && (data + first_partition_length_in_bytes > data_en
d |
| 596 || data + first_partition_length_in_bytes < data) | 743 || data + first_partition_length_in_bytes < data)) |
| 597 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, | 744 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, |
| 598 "Truncated packet or corrupt partition 0 length"); | 745 "Truncated packet or corrupt partition 0 length")
; |
| 599 vp8_setup_version(pc); | 746 vp8_setup_version(pc); |
| 600 | 747 |
| 601 if (pc->frame_type == KEY_FRAME) | 748 if (pc->frame_type == KEY_FRAME) |
| 602 { | 749 { |
| 603 const int Width = pc->Width; | 750 const int Width = pc->Width; |
| 604 const int Height = pc->Height; | 751 const int Height = pc->Height; |
| 605 | 752 |
| 606 /* vet via sync code */ | 753 /* vet via sync code */ |
| 607 if (data[0] != 0x9d || data[1] != 0x01 || data[2] != 0x2a) | 754 /* When error concealment is enabled we should only check the sync |
| 608 vpx_internal_error(&pc->error, VPX_CODEC_UNSUP_BITSTREAM, | 755 * code if we have enough bits available |
| 609 "Invalid frame sync code"); | 756 */ |
| 610 | 757 if (!pbi->ec_active || data + 3 < data_end) |
| 611 pc->Width = (data[3] | (data[4] << 8)) & 0x3fff; | |
| 612 pc->horiz_scale = data[4] >> 6; | |
| 613 pc->Height = (data[5] | (data[6] << 8)) & 0x3fff; | |
| 614 pc->vert_scale = data[6] >> 6; | |
| 615 data += 7; | |
| 616 | |
| 617 if (Width != pc->Width || Height != pc->Height) | |
| 618 { | |
| 619 int prev_mb_rows = pc->mb_rows; | |
| 620 | |
| 621 if (pc->Width <= 0) | |
| 622 { | 758 { |
| 623 pc->Width = Width; | 759 if (data[0] != 0x9d || data[1] != 0x01 || data[2] != 0x2a) |
| 624 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, | 760 vpx_internal_error(&pc->error, VPX_CODEC_UNSUP_BITSTREAM, |
| 625 "Invalid frame width"); | 761 "Invalid frame sync code"); |
| 626 } | 762 } |
| 627 | 763 |
| 628 if (pc->Height <= 0) | 764 /* If error concealment is enabled we should only parse the new size |
| 765 * if we have enough data. Otherwise we will end up with the wrong |
| 766 * size. |
| 767 */ |
| 768 if (!pbi->ec_active || data + 6 < data_end) |
| 629 { | 769 { |
| 630 pc->Height = Height; | 770 pc->Width = (data[3] | (data[4] << 8)) & 0x3fff; |
| 631 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, | 771 pc->horiz_scale = data[4] >> 6; |
| 632 "Invalid frame height"); | 772 pc->Height = (data[5] | (data[6] << 8)) & 0x3fff; |
| 773 pc->vert_scale = data[6] >> 6; |
| 633 } | 774 } |
| 775 data += 7; |
| 634 | 776 |
| 635 if (vp8_alloc_frame_buffers(pc, pc->Width, pc->Height)) | 777 if (Width != pc->Width || Height != pc->Height) |
| 636 vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, | 778 { |
| 637 "Failed to allocate frame buffers"); | 779 int prev_mb_rows = pc->mb_rows; |
| 780 |
| 781 if (pc->Width <= 0) |
| 782 { |
| 783 pc->Width = Width; |
| 784 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, |
| 785 "Invalid frame width"); |
| 786 } |
| 787 |
| 788 if (pc->Height <= 0) |
| 789 { |
| 790 pc->Height = Height; |
| 791 vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, |
| 792 "Invalid frame height"); |
| 793 } |
| 794 |
| 795 if (vp8_alloc_frame_buffers(pc, pc->Width, pc->Height)) |
| 796 vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, |
| 797 "Failed to allocate frame buffers"); |
| 798 |
| 799 #if CONFIG_ERROR_CONCEALMENT |
| 800 pbi->overlaps = NULL; |
| 801 if (pbi->ec_enabled) |
| 802 { |
| 803 if (vp8_alloc_overlap_lists(pbi)) |
| 804 vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, |
| 805 "Failed to allocate overlap lists " |
| 806 "for error concealment"); |
| 807 } |
| 808 #endif |
| 638 | 809 |
| 639 #if CONFIG_MULTITHREAD | 810 #if CONFIG_MULTITHREAD |
| 640 if (pbi->b_multithreaded_rd) | 811 if (pbi->b_multithreaded_rd) |
| 641 vp8mt_alloc_temp_buffers(pbi, pc->Width, prev_mb_rows); | 812 vp8mt_alloc_temp_buffers(pbi, pc->Width, prev_mb_rows); |
| 642 #endif | 813 #endif |
| 814 } |
| 643 } | 815 } |
| 644 } | 816 } |
| 645 | 817 |
| 646 if (pc->Width == 0 || pc->Height == 0) | 818 if (pc->Width == 0 || pc->Height == 0) |
| 647 { | 819 { |
| 648 return -1; | 820 return -1; |
| 649 } | 821 } |
| 650 | 822 |
| 651 init_frame(pbi); | 823 init_frame(pbi); |
| 652 | 824 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 /*sign = vp8_read_bit( bc );*/ | 916 /*sign = vp8_read_bit( bc );*/ |
| 745 xd->mode_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6)
; | 917 xd->mode_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6)
; |
| 746 | 918 |
| 747 if (vp8_read_bit(bc)) /* Apply sign */ | 919 if (vp8_read_bit(bc)) /* Apply sign */ |
| 748 xd->mode_lf_deltas[i] = xd->mode_lf_deltas[i] * -1; | 920 xd->mode_lf_deltas[i] = xd->mode_lf_deltas[i] * -1; |
| 749 } | 921 } |
| 750 } | 922 } |
| 751 } | 923 } |
| 752 } | 924 } |
| 753 | 925 |
| 754 setup_token_decoder(pbi, data + first_partition_length_in_bytes); | 926 if (pbi->input_partition) |
| 927 { |
| 928 setup_token_decoder_partition_input(pbi); |
| 929 } |
| 930 else |
| 931 { |
| 932 setup_token_decoder(pbi, data + first_partition_length_in_bytes); |
| 933 } |
| 755 xd->current_bc = &pbi->bc2; | 934 xd->current_bc = &pbi->bc2; |
| 756 | 935 |
| 757 /* Read the default quantizers. */ | 936 /* Read the default quantizers. */ |
| 758 { | 937 { |
| 759 int Q, q_update; | 938 int Q, q_update; |
| 760 | 939 |
| 761 Q = vp8_read_literal(bc, 7); /* AC 1st order Q = default */ | 940 Q = vp8_read_literal(bc, 7); /* AC 1st order Q = default */ |
| 762 pc->base_qindex = Q; | 941 pc->base_qindex = Q; |
| 763 q_update = 0; | 942 q_update = 0; |
| 764 pc->y1dc_delta_q = get_delta_q(bc, pc->y1dc_delta_q, &q_update); | 943 pc->y1dc_delta_q = get_delta_q(bc, pc->y1dc_delta_q, &q_update); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 775 } | 954 } |
| 776 | 955 |
| 777 /* Determine if the golden frame or ARF buffer should be updated and how. | 956 /* Determine if the golden frame or ARF buffer should be updated and how. |
| 778 * For all non key frames the GF and ARF refresh flags and sign bias | 957 * For all non key frames the GF and ARF refresh flags and sign bias |
| 779 * flags must be set explicitly. | 958 * flags must be set explicitly. |
| 780 */ | 959 */ |
| 781 if (pc->frame_type != KEY_FRAME) | 960 if (pc->frame_type != KEY_FRAME) |
| 782 { | 961 { |
| 783 /* Should the GF or ARF be updated from the current frame */ | 962 /* Should the GF or ARF be updated from the current frame */ |
| 784 pc->refresh_golden_frame = vp8_read_bit(bc); | 963 pc->refresh_golden_frame = vp8_read_bit(bc); |
| 964 #if CONFIG_ERROR_CONCEALMENT |
| 965 /* Assume we shouldn't refresh golden if the bit is missing */ |
| 966 xd->corrupted |= vp8dx_bool_error(bc); |
| 967 if (pbi->ec_active && xd->corrupted) |
| 968 pc->refresh_golden_frame = 0; |
| 969 #endif |
| 970 |
| 785 pc->refresh_alt_ref_frame = vp8_read_bit(bc); | 971 pc->refresh_alt_ref_frame = vp8_read_bit(bc); |
| 972 #if CONFIG_ERROR_CONCEALMENT |
| 973 /* Assume we shouldn't refresh altref if the bit is missing */ |
| 974 xd->corrupted |= vp8dx_bool_error(bc); |
| 975 if (pbi->ec_active && xd->corrupted) |
| 976 pc->refresh_alt_ref_frame = 0; |
| 977 #endif |
| 786 | 978 |
| 787 /* Buffer to buffer copy flags. */ | 979 /* Buffer to buffer copy flags. */ |
| 788 pc->copy_buffer_to_gf = 0; | 980 pc->copy_buffer_to_gf = 0; |
| 789 | 981 |
| 790 if (!pc->refresh_golden_frame) | 982 if (!pc->refresh_golden_frame) |
| 791 pc->copy_buffer_to_gf = vp8_read_literal(bc, 2); | 983 pc->copy_buffer_to_gf = vp8_read_literal(bc, 2); |
| 792 | 984 |
| 793 pc->copy_buffer_to_arf = 0; | 985 pc->copy_buffer_to_arf = 0; |
| 794 | 986 |
| 795 if (!pc->refresh_alt_ref_frame) | 987 if (!pc->refresh_alt_ref_frame) |
| 796 pc->copy_buffer_to_arf = vp8_read_literal(bc, 2); | 988 pc->copy_buffer_to_arf = vp8_read_literal(bc, 2); |
| 797 | 989 |
| 798 pc->ref_frame_sign_bias[GOLDEN_FRAME] = vp8_read_bit(bc); | 990 pc->ref_frame_sign_bias[GOLDEN_FRAME] = vp8_read_bit(bc); |
| 799 pc->ref_frame_sign_bias[ALTREF_FRAME] = vp8_read_bit(bc); | 991 pc->ref_frame_sign_bias[ALTREF_FRAME] = vp8_read_bit(bc); |
| 800 } | 992 } |
| 801 | 993 |
| 802 pc->refresh_entropy_probs = vp8_read_bit(bc); | 994 pc->refresh_entropy_probs = vp8_read_bit(bc); |
| 803 if (pc->refresh_entropy_probs == 0) | 995 if (pc->refresh_entropy_probs == 0) |
| 804 { | 996 { |
| 805 vpx_memcpy(&pc->lfc, &pc->fc, sizeof(pc->fc)); | 997 vpx_memcpy(&pc->lfc, &pc->fc, sizeof(pc->fc)); |
| 806 } | 998 } |
| 807 | 999 |
| 808 pc->refresh_last_frame = pc->frame_type == KEY_FRAME || vp8_read_bit(bc); | 1000 pc->refresh_last_frame = pc->frame_type == KEY_FRAME || vp8_read_bit(bc); |
| 809 | 1001 |
| 1002 #if CONFIG_ERROR_CONCEALMENT |
| 1003 /* Assume we should refresh the last frame if the bit is missing */ |
| 1004 xd->corrupted |= vp8dx_bool_error(bc); |
| 1005 if (pbi->ec_active && xd->corrupted) |
| 1006 pc->refresh_last_frame = 1; |
| 1007 #endif |
| 1008 |
| 810 if (0) | 1009 if (0) |
| 811 { | 1010 { |
| 812 FILE *z = fopen("decodestats.stt", "a"); | 1011 FILE *z = fopen("decodestats.stt", "a"); |
| 813 fprintf(z, "%6d F:%d,G:%d,A:%d,L:%d,Q:%d\n", | 1012 fprintf(z, "%6d F:%d,G:%d,A:%d,L:%d,Q:%d\n", |
| 814 pc->current_video_frame, | 1013 pc->current_video_frame, |
| 815 pc->frame_type, | 1014 pc->frame_type, |
| 816 pc->refresh_golden_frame, | 1015 pc->refresh_golden_frame, |
| 817 pc->refresh_alt_ref_frame, | 1016 pc->refresh_alt_ref_frame, |
| 818 pc->refresh_last_frame, | 1017 pc->refresh_last_frame, |
| 819 pc->base_qindex); | 1018 pc->base_qindex); |
| 820 fclose(z); | 1019 fclose(z); |
| 821 } | 1020 } |
| 822 | 1021 |
| 1022 { |
| 1023 pbi->independent_partitions = 1; |
| 823 | 1024 |
| 824 { | |
| 825 /* read coef probability tree */ | 1025 /* read coef probability tree */ |
| 826 | |
| 827 for (i = 0; i < BLOCK_TYPES; i++) | 1026 for (i = 0; i < BLOCK_TYPES; i++) |
| 828 for (j = 0; j < COEF_BANDS; j++) | 1027 for (j = 0; j < COEF_BANDS; j++) |
| 829 for (k = 0; k < PREV_COEF_CONTEXTS; k++) | 1028 for (k = 0; k < PREV_COEF_CONTEXTS; k++) |
| 830 for (l = 0; l < MAX_ENTROPY_TOKENS - 1; l++) | 1029 for (l = 0; l < ENTROPY_NODES; l++) |
| 831 { | 1030 { |
| 832 | 1031 |
| 833 vp8_prob *const p = pc->fc.coef_probs [i][j][k] + l; | 1032 vp8_prob *const p = pc->fc.coef_probs [i][j][k] + l; |
| 834 | 1033 |
| 835 if (vp8_read(bc, vp8_coef_update_probs [i][j][k][l])) | 1034 if (vp8_read(bc, vp8_coef_update_probs [i][j][k][l])) |
| 836 { | 1035 { |
| 837 *p = (vp8_prob)vp8_read_literal(bc, 8); | 1036 *p = (vp8_prob)vp8_read_literal(bc, 8); |
| 838 | 1037 |
| 839 } | 1038 } |
| 1039 if (k > 0 && *p != pc->fc.coef_probs[i][j][k-1][l]) |
| 1040 pbi->independent_partitions = 0; |
| 1041 |
| 840 } | 1042 } |
| 841 } | 1043 } |
| 842 | 1044 |
| 843 vpx_memcpy(&xd->pre, &pc->yv12_fb[pc->lst_fb_idx], sizeof(YV12_BUFFER_CONFIG
)); | 1045 vpx_memcpy(&xd->pre, &pc->yv12_fb[pc->lst_fb_idx], sizeof(YV12_BUFFER_CONFIG
)); |
| 844 vpx_memcpy(&xd->dst, &pc->yv12_fb[pc->new_fb_idx], sizeof(YV12_BUFFER_CONFIG
)); | 1046 vpx_memcpy(&xd->dst, &pc->yv12_fb[pc->new_fb_idx], sizeof(YV12_BUFFER_CONFIG
)); |
| 845 | 1047 |
| 846 /* set up frame new frame for intra coded blocks */ | 1048 /* set up frame new frame for intra coded blocks */ |
| 847 #if CONFIG_MULTITHREAD | 1049 #if CONFIG_MULTITHREAD |
| 848 if (!(pbi->b_multithreaded_rd) || pc->multi_token_partition == ONE_PARTITION
|| !(pc->filter_level)) | 1050 if (!(pbi->b_multithreaded_rd) || pc->multi_token_partition == ONE_PARTITION
|| !(pc->filter_level)) |
| 849 #endif | 1051 #endif |
| 850 vp8_setup_intra_recon(&pc->yv12_fb[pc->new_fb_idx]); | 1052 vp8_setup_intra_recon(&pc->yv12_fb[pc->new_fb_idx]); |
| 851 | 1053 |
| 852 vp8_setup_block_dptrs(xd); | 1054 vp8_setup_block_dptrs(xd); |
| 853 | 1055 |
| 854 vp8_build_block_doffsets(xd); | 1056 vp8_build_block_doffsets(xd); |
| 855 | 1057 |
| 856 /* clear out the coeff buffer */ | 1058 /* clear out the coeff buffer */ |
| 857 vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); | 1059 vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); |
| 858 | 1060 |
| 859 /* Read the mb_no_coeff_skip flag */ | 1061 /* Read the mb_no_coeff_skip flag */ |
| 860 pc->mb_no_coeff_skip = (int)vp8_read_bit(bc); | 1062 pc->mb_no_coeff_skip = (int)vp8_read_bit(bc); |
| 861 | 1063 |
| 862 | 1064 |
| 863 vp8_decode_mode_mvs(pbi); | 1065 vp8_decode_mode_mvs(pbi); |
| 864 | 1066 |
| 1067 #if CONFIG_ERROR_CONCEALMENT |
| 1068 if (pbi->ec_active && |
| 1069 pbi->mvs_corrupt_from_mb < (unsigned int)pc->mb_cols * pc->mb_rows) |
| 1070 { |
| 1071 /* Motion vectors are missing in this frame. We will try to estimate |
| 1072 * them and then continue decoding the frame as usual */ |
| 1073 vp8_estimate_missing_mvs(pbi); |
| 1074 } |
| 1075 #endif |
| 1076 |
| 865 vpx_memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_col
s); | 1077 vpx_memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_col
s); |
| 866 | 1078 |
| 867 vpx_memcpy(&xd->block[0].bmi, &xd->mode_info_context->bmi[0], sizeof(B_MODE_
INFO)); | |
| 868 | |
| 869 #if CONFIG_MULTITHREAD | 1079 #if CONFIG_MULTITHREAD |
| 870 if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION) | 1080 if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION) |
| 871 { | 1081 { |
| 1082 int i; |
| 1083 pbi->frame_corrupt_residual = 0; |
| 872 vp8mt_decode_mb_rows(pbi, xd); | 1084 vp8mt_decode_mb_rows(pbi, xd); |
| 873 if(pbi->common.filter_level) | |
| 874 { | |
| 875 /*vp8_mt_loop_filter_frame(pbi);*/ /*cm, &pbi->mb, cm->filter_level)
;*/ | |
| 876 | |
| 877 pc->last_frame_type = pc->frame_type; | |
| 878 pc->last_filter_type = pc->filter_type; | |
| 879 pc->last_sharpness_level = pc->sharpness_level; | |
| 880 } | |
| 881 vp8_yv12_extend_frame_borders_ptr(&pc->yv12_fb[pc->new_fb_idx]); /*cm
->frame_to_show);*/ | 1085 vp8_yv12_extend_frame_borders_ptr(&pc->yv12_fb[pc->new_fb_idx]); /*cm
->frame_to_show);*/ |
| 1086 for (i = 0; i < pbi->decoding_thread_count; ++i) |
| 1087 corrupt_tokens |= pbi->mb_row_di[i].mbd.corrupted; |
| 882 } | 1088 } |
| 883 else | 1089 else |
| 884 #endif | 1090 #endif |
| 885 { | 1091 { |
| 886 int ibc = 0; | 1092 int ibc = 0; |
| 887 int num_part = 1 << pc->multi_token_partition; | 1093 int num_part = 1 << pc->multi_token_partition; |
| 1094 pbi->frame_corrupt_residual = 0; |
| 888 | 1095 |
| 889 /* Decode the individual macro block */ | 1096 /* Decode the individual macro block */ |
| 890 for (mb_row = 0; mb_row < pc->mb_rows; mb_row++) | 1097 for (mb_row = 0; mb_row < pc->mb_rows; mb_row++) |
| 891 { | 1098 { |
| 892 | 1099 |
| 893 if (num_part > 1) | 1100 if (num_part > 1) |
| 894 { | 1101 { |
| 895 xd->current_bc = & pbi->mbc[ibc]; | 1102 xd->current_bc = & pbi->mbc[ibc]; |
| 896 ibc++; | 1103 ibc++; |
| 897 | 1104 |
| 898 if (ibc == num_part) | 1105 if (ibc == num_part) |
| 899 ibc = 0; | 1106 ibc = 0; |
| 900 } | 1107 } |
| 901 | 1108 |
| 902 decode_mb_row(pbi, pc, mb_row, xd); | 1109 decode_mb_row(pbi, pc, mb_row, xd); |
| 903 } | 1110 } |
| 1111 corrupt_tokens |= xd->corrupted; |
| 904 } | 1112 } |
| 905 | 1113 |
| 906 | |
| 907 stop_token_decoder(pbi); | 1114 stop_token_decoder(pbi); |
| 908 | 1115 |
| 909 /* Collect information about decoder corruption. */ | 1116 /* Collect information about decoder corruption. */ |
| 910 /* 1. Check first boolean decoder for errors. */ | 1117 /* 1. Check first boolean decoder for errors. */ |
| 911 pc->yv12_fb[pc->new_fb_idx].corrupted = | 1118 pc->yv12_fb[pc->new_fb_idx].corrupted = vp8dx_bool_error(bc); |
| 912 vp8dx_bool_error(bc); | |
| 913 /* 2. Check the macroblock information */ | 1119 /* 2. Check the macroblock information */ |
| 914 pc->yv12_fb[pc->new_fb_idx].corrupted |= | 1120 pc->yv12_fb[pc->new_fb_idx].corrupted |= corrupt_tokens; |
| 915 xd->corrupted; | 1121 |
| 1122 if (!pbi->decoded_key_frame) |
| 1123 { |
| 1124 if (pc->frame_type == KEY_FRAME && |
| 1125 !pc->yv12_fb[pc->new_fb_idx].corrupted) |
| 1126 pbi->decoded_key_frame = 1; |
| 1127 else |
| 1128 vpx_internal_error(&pbi->common.error, VPX_CODEC_CORRUPT_FRAME, |
| 1129 "A stream must start with a complete key frame"); |
| 1130 } |
| 916 | 1131 |
| 917 /* vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes \n",bc->pos+pbi->
bc2.pos); */ | 1132 /* vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes \n",bc->pos+pbi->
bc2.pos); */ |
| 918 | 1133 |
| 919 /* If this was a kf or Gf note the Q used */ | 1134 /* If this was a kf or Gf note the Q used */ |
| 920 if ((pc->frame_type == KEY_FRAME) || | 1135 if ((pc->frame_type == KEY_FRAME) || |
| 921 pc->refresh_golden_frame || pc->refresh_alt_ref_frame) | 1136 pc->refresh_golden_frame || pc->refresh_alt_ref_frame) |
| 922 { | 1137 { |
| 923 pc->last_kf_gf_q = pc->base_qindex; | 1138 pc->last_kf_gf_q = pc->base_qindex; |
| 924 } | 1139 } |
| 925 | 1140 |
| 926 if (pc->refresh_entropy_probs == 0) | 1141 if (pc->refresh_entropy_probs == 0) |
| 927 { | 1142 { |
| 928 vpx_memcpy(&pc->fc, &pc->lfc, sizeof(pc->fc)); | 1143 vpx_memcpy(&pc->fc, &pc->lfc, sizeof(pc->fc)); |
| 1144 pbi->independent_partitions = prev_independent_partitions; |
| 929 } | 1145 } |
| 930 | 1146 |
| 931 #ifdef PACKET_TESTING | 1147 #ifdef PACKET_TESTING |
| 932 { | 1148 { |
| 933 FILE *f = fopen("decompressor.VP8", "ab"); | 1149 FILE *f = fopen("decompressor.VP8", "ab"); |
| 934 unsigned int size = pbi->bc2.pos + pbi->bc.pos + 8; | 1150 unsigned int size = pbi->bc2.pos + pbi->bc.pos + 8; |
| 935 fwrite((void *) &size, 4, 1, f); | 1151 fwrite((void *) &size, 4, 1, f); |
| 936 fwrite((void *) pbi->Source, size, 1, f); | 1152 fwrite((void *) pbi->Source, size, 1, f); |
| 937 fclose(f); | 1153 fclose(f); |
| 938 } | 1154 } |
| 939 #endif | 1155 #endif |
| 940 | 1156 |
| 941 return 0; | 1157 return 0; |
| 942 } | 1158 } |
| OLD | NEW |