2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
12 #include "onyxd_int.h"
13 #include "vp8/common/header.h"
14 #include "vp8/common/reconintra.h"
15 #include "vp8/common/reconintra4x4.h"
16 #include "vp8/common/recon.h"
17 #include "vp8/common/reconinter.h"
18 #include "dequantize.h"
19 #include "detokenize.h"
20 #include "vp8/common/invtrans.h"
21 #include "vp8/common/alloccommon.h"
22 #include "vp8/common/entropymode.h"
23 #include "vp8/common/quant_common.h"
24 #include "vpx_scale/vpxscale.h"
25 #include "vpx_scale/yv12extend.h"
26 #include "vp8/common/setupintrarecon.h"
29 #include "vp8/common/extend.h"
30 #include "vpx_mem/vpx_mem.h"
31 #include "vp8/common/idct.h"
32 #include "dequantize.h"
33 #include "vp8/common/predictdc.h"
34 #include "vp8/common/threading.h"
35 #include "decoderthreading.h"
36 #include "dboolhuff.h"
41 void vp8cx_init_de_quantizer(VP8D_COMP
*pbi
)
45 VP8_COMMON
*const pc
= & pbi
->common
;
47 for (Q
= 0; Q
< QINDEX_RANGE
; Q
++)
49 pc
->Y1dequant
[Q
][0] = (short)vp8_dc_quant(Q
, pc
->y1dc_delta_q
);
50 pc
->Y2dequant
[Q
][0] = (short)vp8_dc2quant(Q
, pc
->y2dc_delta_q
);
51 pc
->UVdequant
[Q
][0] = (short)vp8_dc_uv_quant(Q
, pc
->uvdc_delta_q
);
53 /* all the ac values = ; */
54 for (i
= 1; i
< 16; i
++)
56 int rc
= vp8_default_zig_zag1d
[i
];
58 pc
->Y1dequant
[Q
][rc
] = (short)vp8_ac_yquant(Q
);
59 pc
->Y2dequant
[Q
][rc
] = (short)vp8_ac2quant(Q
, pc
->y2ac_delta_q
);
60 pc
->UVdequant
[Q
][rc
] = (short)vp8_ac_uv_quant(Q
, pc
->uvac_delta_q
);
65 void mb_init_dequantizer(VP8D_COMP
*pbi
, MACROBLOCKD
*xd
)
69 MB_MODE_INFO
*mbmi
= &xd
->mode_info_context
->mbmi
;
70 VP8_COMMON
*const pc
= & pbi
->common
;
72 /* Decide whether to use the default or alternate baseline Q value. */
73 if (xd
->segmentation_enabled
)
76 if (xd
->mb_segement_abs_delta
== SEGMENT_ABSDATA
)
77 QIndex
= xd
->segment_feature_data
[MB_LVL_ALT_Q
][mbmi
->segment_id
];
82 QIndex
= pc
->base_qindex
+ xd
->segment_feature_data
[MB_LVL_ALT_Q
][mbmi
->segment_id
];
83 QIndex
= (QIndex
>= 0) ? ((QIndex
<= MAXQ
) ? QIndex
: MAXQ
) : 0; /* Clamp to valid range */
87 QIndex
= pc
->base_qindex
;
89 /* Set up the block level dequant pointers */
90 for (i
= 0; i
< 16; i
++)
92 xd
->block
[i
].dequant
= pc
->Y1dequant
[QIndex
];
95 for (i
= 16; i
< 24; i
++)
97 xd
->block
[i
].dequant
= pc
->UVdequant
[QIndex
];
100 xd
->block
[24].dequant
= pc
->Y2dequant
[QIndex
];
104 #if CONFIG_RUNTIME_CPU_DETECT
105 #define RTCD_VTABLE(x) (&(pbi)->common.rtcd.x)
107 #define RTCD_VTABLE(x) NULL
110 /* skip_recon_mb() is Modified: Instead of writing the result to predictor buffer and then copying it
111 * to dst buffer, we can write the result directly to dst buffer. This eliminates unnecessary copy.
113 static void skip_recon_mb(VP8D_COMP
*pbi
, MACROBLOCKD
*xd
)
115 if (xd
->frame_type
== KEY_FRAME
|| xd
->mode_info_context
->mbmi
.ref_frame
== INTRA_FRAME
)
118 vp8_build_intra_predictors_mbuv_s(xd
);
119 vp8_build_intra_predictors_mby_s_ptr(xd
);
124 vp8_build_inter_predictors_mb_s(xd
);
128 static void clamp_mv_to_umv_border(MV
*mv
, const MACROBLOCKD
*xd
)
130 /* If the MV points so far into the UMV border that no visible pixels
131 * are used for reconstruction, the subpel part of the MV can be
132 * discarded and the MV limited to 16 pixels with equivalent results.
134 * This limit kicks in at 19 pixels for the top and left edges, for
135 * the 16 pixels plus 3 taps right of the central pixel when subpel
136 * filtering. The bottom and right edges use 16 pixels plus 2 pixels
137 * left of the central pixel when filtering.
139 if (mv
->col
< (xd
->mb_to_left_edge
- (19 << 3)))
140 mv
->col
= xd
->mb_to_left_edge
- (16 << 3);
141 else if (mv
->col
> xd
->mb_to_right_edge
+ (18 << 3))
142 mv
->col
= xd
->mb_to_right_edge
+ (16 << 3);
144 if (mv
->row
< (xd
->mb_to_top_edge
- (19 << 3)))
145 mv
->row
= xd
->mb_to_top_edge
- (16 << 3);
146 else if (mv
->row
> xd
->mb_to_bottom_edge
+ (18 << 3))
147 mv
->row
= xd
->mb_to_bottom_edge
+ (16 << 3);
150 /* A version of the above function for chroma block MVs.*/
151 static void clamp_uvmv_to_umv_border(MV
*mv
, const MACROBLOCKD
*xd
)
153 mv
->col
= (2*mv
->col
< (xd
->mb_to_left_edge
- (19 << 3))) ? (xd
->mb_to_left_edge
- (16 << 3)) >> 1 : mv
->col
;
154 mv
->col
= (2*mv
->col
> xd
->mb_to_right_edge
+ (18 << 3)) ? (xd
->mb_to_right_edge
+ (16 << 3)) >> 1 : mv
->col
;
156 mv
->row
= (2*mv
->row
< (xd
->mb_to_top_edge
- (19 << 3))) ? (xd
->mb_to_top_edge
- (16 << 3)) >> 1 : mv
->row
;
157 mv
->row
= (2*mv
->row
> xd
->mb_to_bottom_edge
+ (18 << 3)) ? (xd
->mb_to_bottom_edge
+ (16 << 3)) >> 1 : mv
->row
;
160 void clamp_mvs(MACROBLOCKD
*xd
)
162 if (xd
->mode_info_context
->mbmi
.mode
== SPLITMV
)
167 clamp_mv_to_umv_border(&xd
->block
[i
].bmi
.mv
.as_mv
, xd
);
168 for (i
=16; i
<24; i
++)
169 clamp_uvmv_to_umv_border(&xd
->block
[i
].bmi
.mv
.as_mv
, xd
);
173 clamp_mv_to_umv_border(&xd
->mode_info_context
->mbmi
.mv
.as_mv
, xd
);
174 clamp_uvmv_to_umv_border(&xd
->block
[16].bmi
.mv
.as_mv
, xd
);
179 void vp8_decode_macroblock(VP8D_COMP
*pbi
, MACROBLOCKD
*xd
)
182 int i
, do_clamp
= xd
->mode_info_context
->mbmi
.need_to_clamp_mvs
;
184 if (xd
->mode_info_context
->mbmi
.mb_skip_coeff
)
186 vp8_reset_mb_tokens_context(xd
);
190 eobtotal
= vp8_decode_mb_tokens(pbi
, xd
);
193 /* Perform temporary clamping of the MV to be used for prediction */
199 xd
->mode_info_context
->mbmi
.dc_diff
= 1;
201 if (xd
->mode_info_context
->mbmi
.mode
!= B_PRED
&& xd
->mode_info_context
->mbmi
.mode
!= SPLITMV
&& eobtotal
== 0)
203 xd
->mode_info_context
->mbmi
.dc_diff
= 0;
204 skip_recon_mb(pbi
, xd
);
208 if (xd
->segmentation_enabled
)
209 mb_init_dequantizer(pbi
, xd
);
212 if (xd
->frame_type
== KEY_FRAME
|| xd
->mode_info_context
->mbmi
.ref_frame
== INTRA_FRAME
)
214 vp8_build_intra_predictors_mbuv(xd
);
216 if (xd
->mode_info_context
->mbmi
.mode
!= B_PRED
)
218 vp8_build_intra_predictors_mby_ptr(xd
);
220 vp8_intra_prediction_down_copy(xd
);
225 vp8_build_inter_predictors_mb(xd
);
228 /* dequantization and idct */
229 if (xd
->mode_info_context
->mbmi
.mode
!= B_PRED
&& xd
->mode_info_context
->mbmi
.mode
!= SPLITMV
)
231 BLOCKD
*b
= &xd
->block
[24];
232 DEQUANT_INVOKE(&pbi
->dequant
, block
)(b
);
234 /* do 2nd order transform on the dc block */
235 if (xd
->eobs
[24] > 1)
237 IDCT_INVOKE(RTCD_VTABLE(idct
), iwalsh16
)(&b
->dqcoeff
[0], b
->diff
);
238 ((int *)b
->qcoeff
)[0] = 0;
239 ((int *)b
->qcoeff
)[1] = 0;
240 ((int *)b
->qcoeff
)[2] = 0;
241 ((int *)b
->qcoeff
)[3] = 0;
242 ((int *)b
->qcoeff
)[4] = 0;
243 ((int *)b
->qcoeff
)[5] = 0;
244 ((int *)b
->qcoeff
)[6] = 0;
245 ((int *)b
->qcoeff
)[7] = 0;
249 IDCT_INVOKE(RTCD_VTABLE(idct
), iwalsh1
)(&b
->dqcoeff
[0], b
->diff
);
250 ((int *)b
->qcoeff
)[0] = 0;
253 DEQUANT_INVOKE (&pbi
->dequant
, dc_idct_add_y_block
)
254 (xd
->qcoeff
, xd
->block
[0].dequant
,
255 xd
->predictor
, xd
->dst
.y_buffer
,
256 xd
->dst
.y_stride
, xd
->eobs
, xd
->block
[24].diff
);
258 else if ((xd
->frame_type
== KEY_FRAME
|| xd
->mode_info_context
->mbmi
.ref_frame
== INTRA_FRAME
) && xd
->mode_info_context
->mbmi
.mode
== B_PRED
)
260 for (i
= 0; i
< 16; i
++)
263 BLOCKD
*b
= &xd
->block
[i
];
264 vp8_predict_intra4x4(b
, b
->bmi
.mode
, b
->predictor
);
268 DEQUANT_INVOKE(&pbi
->dequant
, idct_add
)
269 (b
->qcoeff
, b
->dequant
, b
->predictor
,
270 *(b
->base_dst
) + b
->dst
, 16, b
->dst_stride
);
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;
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
);
290 DEQUANT_INVOKE (&pbi
->dequant
, idct_add_uv_block
)
291 (xd
->qcoeff
+16*16, xd
->block
[16].dequant
,
292 xd
->predictor
+16*16, xd
->dst
.u_buffer
, xd
->dst
.v_buffer
,
293 xd
->dst
.uv_stride
, xd
->eobs
+16);
297 static int get_delta_q(vp8_reader
*bc
, int prev
, int *q_update
)
301 if (vp8_read_bit(bc
))
303 ret_val
= vp8_read_literal(bc
, 4);
305 if (vp8_read_bit(bc
))
309 /* Trigger a quantizer update if the delta-q value has changed */
316 #ifdef PACKET_TESTING
323 void vp8_decode_mb_row(VP8D_COMP
*pbi
,
330 int recon_yoffset
, recon_uvoffset
;
332 int ref_fb_idx
= pc
->lst_fb_idx
;
333 int dst_fb_idx
= pc
->new_fb_idx
;
334 int recon_y_stride
= pc
->yv12_fb
[ref_fb_idx
].y_stride
;
335 int recon_uv_stride
= pc
->yv12_fb
[ref_fb_idx
].uv_stride
;
337 vpx_memset(&pc
->left_context
, 0, sizeof(pc
->left_context
));
338 recon_yoffset
= mb_row
* recon_y_stride
* 16;
339 recon_uvoffset
= mb_row
* recon_uv_stride
* 8;
340 /* reset above block coeffs */
342 xd
->above_context
= pc
->above_context
;
343 xd
->up_available
= (mb_row
!= 0);
345 xd
->mb_to_top_edge
= -((mb_row
* 16)) << 3;
346 xd
->mb_to_bottom_edge
= ((pc
->mb_rows
- 1 - mb_row
) * 16) << 3;
348 for (mb_col
= 0; mb_col
< pc
->mb_cols
; mb_col
++)
351 if (xd
->mode_info_context
->mbmi
.mode
== SPLITMV
|| xd
->mode_info_context
->mbmi
.mode
== B_PRED
)
353 for (i
= 0; i
< 16; i
++)
355 BLOCKD
*d
= &xd
->block
[i
];
356 vpx_memcpy(&d
->bmi
, &xd
->mode_info_context
->bmi
[i
], sizeof(B_MODE_INFO
));
360 /* Distance of Mb to the various image edges.
361 * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units
363 xd
->mb_to_left_edge
= -((mb_col
* 16) << 3);
364 xd
->mb_to_right_edge
= ((pc
->mb_cols
- 1 - mb_col
) * 16) << 3;
366 xd
->dst
.y_buffer
= pc
->yv12_fb
[dst_fb_idx
].y_buffer
+ recon_yoffset
;
367 xd
->dst
.u_buffer
= pc
->yv12_fb
[dst_fb_idx
].u_buffer
+ recon_uvoffset
;
368 xd
->dst
.v_buffer
= pc
->yv12_fb
[dst_fb_idx
].v_buffer
+ recon_uvoffset
;
370 xd
->left_available
= (mb_col
!= 0);
372 /* Select the appropriate reference frame for this MB */
373 if (xd
->mode_info_context
->mbmi
.ref_frame
== LAST_FRAME
)
374 ref_fb_idx
= pc
->lst_fb_idx
;
375 else if (xd
->mode_info_context
->mbmi
.ref_frame
== GOLDEN_FRAME
)
376 ref_fb_idx
= pc
->gld_fb_idx
;
378 ref_fb_idx
= pc
->alt_fb_idx
;
380 xd
->pre
.y_buffer
= pc
->yv12_fb
[ref_fb_idx
].y_buffer
+ recon_yoffset
;
381 xd
->pre
.u_buffer
= pc
->yv12_fb
[ref_fb_idx
].u_buffer
+ recon_uvoffset
;
382 xd
->pre
.v_buffer
= pc
->yv12_fb
[ref_fb_idx
].v_buffer
+ recon_uvoffset
;
384 if (xd
->mode_info_context
->mbmi
.ref_frame
!= INTRA_FRAME
)
386 /* propagate errors from reference frames */
387 xd
->corrupted
|= pc
->yv12_fb
[ref_fb_idx
].corrupted
;
390 vp8_build_uvmvs(xd
, pc
->full_pixel
);
393 if(pc->current_video_frame==0 &&mb_col==1 && mb_row==0)
398 vp8_decode_macroblock(pbi
, xd
);
400 /* check if the boolean decoder has suffered an error */
401 xd
->corrupted
|= vp8dx_bool_error(xd
->current_bc
);
406 ++xd
->mode_info_context
; /* next mb */
412 /* adjust to the next row of mbs */
414 &pc
->yv12_fb
[dst_fb_idx
],
415 xd
->dst
.y_buffer
+ 16, xd
->dst
.u_buffer
+ 8, xd
->dst
.v_buffer
+ 8
418 ++xd
->mode_info_context
; /* skip prediction column */
422 static unsigned int read_partition_size(const unsigned char *cx_size
)
424 const unsigned int size
=
425 cx_size
[0] + (cx_size
[1] << 8) + (cx_size
[2] << 16);
430 static void setup_token_decoder(VP8D_COMP
*pbi
,
431 const unsigned char *cx_data
)
435 VP8_COMMON
*pc
= &pbi
->common
;
436 const unsigned char *user_data_end
= pbi
->Source
+ pbi
->source_sz
;
437 vp8_reader
*bool_decoder
;
438 const unsigned char *partition
;
440 /* Parse number of token partitions to use */
441 pc
->multi_token_partition
= (TOKEN_PARTITION
)vp8_read_literal(&pbi
->bc
, 2);
442 num_part
= 1 << pc
->multi_token_partition
;
444 /* Set up pointers to the first partition */
446 bool_decoder
= &pbi
->bc2
;
450 CHECK_MEM_ERROR(pbi
->mbc
, vpx_malloc(num_part
* sizeof(vp8_reader
)));
451 bool_decoder
= pbi
->mbc
;
452 partition
+= 3 * (num_part
- 1);
455 for (i
= 0; i
< num_part
; i
++)
457 const unsigned char *partition_size_ptr
= cx_data
+ i
* 3;
458 ptrdiff_t partition_size
;
460 /* Calculate the length of this partition. The last partition
463 if (i
< num_part
- 1)
465 partition_size
= read_partition_size(partition_size_ptr
);
469 partition_size
= user_data_end
- partition
;
472 if (partition
+ partition_size
> user_data_end
473 || partition
+ partition_size
< partition
)
474 vpx_internal_error(&pc
->error
, VPX_CODEC_CORRUPT_FRAME
,
475 "Truncated packet or corrupt partition "
478 if (vp8dx_start_decode(bool_decoder
, partition
, partition_size
))
479 vpx_internal_error(&pc
->error
, VPX_CODEC_MEM_ERROR
,
480 "Failed to allocate bool decoder %d", i
+ 1);
482 /* Advance to the next partition */
483 partition
+= partition_size
;
487 #if CONFIG_MULTITHREAD
488 /* Clamp number of decoder threads */
489 if (pbi
->decoding_thread_count
> num_part
- 1)
490 pbi
->decoding_thread_count
= num_part
- 1;
495 static void stop_token_decoder(VP8D_COMP
*pbi
)
497 VP8_COMMON
*pc
= &pbi
->common
;
499 if (pc
->multi_token_partition
!= ONE_PARTITION
)
503 static void init_frame(VP8D_COMP
*pbi
)
505 VP8_COMMON
*const pc
= & pbi
->common
;
506 MACROBLOCKD
*const xd
= & pbi
->mb
;
508 if (pc
->frame_type
== KEY_FRAME
)
510 /* Various keyframe initializations */
511 vpx_memcpy(pc
->fc
.mvc
, vp8_default_mv_context
, sizeof(vp8_default_mv_context
));
513 vp8_init_mbmode_probs(pc
);
515 vp8_default_coef_probs(pc
);
516 vp8_kf_default_bmode_probs(pc
->kf_bmode_prob
);
518 /* reset the segment feature data to 0 with delta coding (Default state). */
519 vpx_memset(xd
->segment_feature_data
, 0, sizeof(xd
->segment_feature_data
));
520 xd
->mb_segement_abs_delta
= SEGMENT_DELTADATA
;
522 /* reset the mode ref deltasa for loop filter */
523 vpx_memset(xd
->ref_lf_deltas
, 0, sizeof(xd
->ref_lf_deltas
));
524 vpx_memset(xd
->mode_lf_deltas
, 0, sizeof(xd
->mode_lf_deltas
));
526 /* All buffers are implicitly updated on key frames. */
527 pc
->refresh_golden_frame
= 1;
528 pc
->refresh_alt_ref_frame
= 1;
529 pc
->copy_buffer_to_gf
= 0;
530 pc
->copy_buffer_to_arf
= 0;
532 /* Note that Golden and Altref modes cannot be used on a key frame so
533 * ref_frame_sign_bias[] is undefined and meaningless
535 pc
->ref_frame_sign_bias
[GOLDEN_FRAME
] = 0;
536 pc
->ref_frame_sign_bias
[ALTREF_FRAME
] = 0;
540 if (!pc
->use_bilinear_mc_filter
)
541 pc
->mcomp_filter_type
= SIXTAP
;
543 pc
->mcomp_filter_type
= BILINEAR
;
545 /* To enable choice of different interploation filters */
546 if (pc
->mcomp_filter_type
== SIXTAP
)
548 xd
->subpixel_predict
= SUBPIX_INVOKE(RTCD_VTABLE(subpix
), sixtap4x4
);
549 xd
->subpixel_predict8x4
= SUBPIX_INVOKE(RTCD_VTABLE(subpix
), sixtap8x4
);
550 xd
->subpixel_predict8x8
= SUBPIX_INVOKE(RTCD_VTABLE(subpix
), sixtap8x8
);
551 xd
->subpixel_predict16x16
= SUBPIX_INVOKE(RTCD_VTABLE(subpix
), sixtap16x16
);
555 xd
->subpixel_predict
= SUBPIX_INVOKE(RTCD_VTABLE(subpix
), bilinear4x4
);
556 xd
->subpixel_predict8x4
= SUBPIX_INVOKE(RTCD_VTABLE(subpix
), bilinear8x4
);
557 xd
->subpixel_predict8x8
= SUBPIX_INVOKE(RTCD_VTABLE(subpix
), bilinear8x8
);
558 xd
->subpixel_predict16x16
= SUBPIX_INVOKE(RTCD_VTABLE(subpix
), bilinear16x16
);
562 xd
->left_context
= &pc
->left_context
;
563 xd
->mode_info_context
= pc
->mi
;
564 xd
->frame_type
= pc
->frame_type
;
565 xd
->mode_info_context
->mbmi
.mode
= DC_PRED
;
566 xd
->mode_info_stride
= pc
->mode_info_stride
;
567 xd
->corrupted
= 0; /* init without corruption */
570 int vp8_decode_frame(VP8D_COMP
*pbi
)
572 vp8_reader
*const bc
= & pbi
->bc
;
573 VP8_COMMON
*const pc
= & pbi
->common
;
574 MACROBLOCKD
*const xd
= & pbi
->mb
;
575 const unsigned char *data
= (const unsigned char *)pbi
->Source
;
576 const unsigned char *const data_end
= data
+ pbi
->source_sz
;
577 ptrdiff_t first_partition_length_in_bytes
;
581 const int *const mb_feature_data_bits
= vp8_mb_feature_data_bits
;
583 /* start with no corruption of current frame */
585 pc
->yv12_fb
[pc
->new_fb_idx
].corrupted
= 0;
587 if (data_end
- data
< 3)
588 vpx_internal_error(&pc
->error
, VPX_CODEC_CORRUPT_FRAME
,
590 pc
->frame_type
= (FRAME_TYPE
)(data
[0] & 1);
591 pc
->version
= (data
[0] >> 1) & 7;
592 pc
->show_frame
= (data
[0] >> 4) & 1;
593 first_partition_length_in_bytes
=
594 (data
[0] | (data
[1] << 8) | (data
[2] << 16)) >> 5;
597 if (data
+ first_partition_length_in_bytes
> data_end
598 || data
+ first_partition_length_in_bytes
< data
)
599 vpx_internal_error(&pc
->error
, VPX_CODEC_CORRUPT_FRAME
,
600 "Truncated packet or corrupt partition 0 length");
601 vp8_setup_version(pc
);
603 if (pc
->frame_type
== KEY_FRAME
)
605 const int Width
= pc
->Width
;
606 const int Height
= pc
->Height
;
608 /* vet via sync code */
609 if (data
[0] != 0x9d || data
[1] != 0x01 || data
[2] != 0x2a)
610 vpx_internal_error(&pc
->error
, VPX_CODEC_UNSUP_BITSTREAM
,
611 "Invalid frame sync code");
613 pc
->Width
= (data
[3] | (data
[4] << 8)) & 0x3fff;
614 pc
->horiz_scale
= data
[4] >> 6;
615 pc
->Height
= (data
[5] | (data
[6] << 8)) & 0x3fff;
616 pc
->vert_scale
= data
[6] >> 6;
619 if (Width
!= pc
->Width
|| Height
!= pc
->Height
)
621 int prev_mb_rows
= pc
->mb_rows
;
626 vpx_internal_error(&pc
->error
, VPX_CODEC_CORRUPT_FRAME
,
627 "Invalid frame width");
633 vpx_internal_error(&pc
->error
, VPX_CODEC_CORRUPT_FRAME
,
634 "Invalid frame height");
637 if (vp8_alloc_frame_buffers(pc
, pc
->Width
, pc
->Height
))
638 vpx_internal_error(&pc
->error
, VPX_CODEC_MEM_ERROR
,
639 "Failed to allocate frame buffers");
641 #if CONFIG_MULTITHREAD
642 if (pbi
->b_multithreaded_rd
)
643 vp8mt_alloc_temp_buffers(pbi
, pc
->Width
, prev_mb_rows
);
648 if (pc
->Width
== 0 || pc
->Height
== 0)
655 if (vp8dx_start_decode(bc
, data
, data_end
- data
))
656 vpx_internal_error(&pc
->error
, VPX_CODEC_MEM_ERROR
,
657 "Failed to allocate bool decoder 0");
658 if (pc
->frame_type
== KEY_FRAME
) {
659 pc
->clr_type
= (YUV_TYPE
)vp8_read_bit(bc
);
660 pc
->clamp_type
= (CLAMP_TYPE
)vp8_read_bit(bc
);
663 /* Is segmentation enabled */
664 xd
->segmentation_enabled
= (unsigned char)vp8_read_bit(bc
);
666 if (xd
->segmentation_enabled
)
668 /* Signal whether or not the segmentation map is being explicitly updated this frame. */
669 xd
->update_mb_segmentation_map
= (unsigned char)vp8_read_bit(bc
);
670 xd
->update_mb_segmentation_data
= (unsigned char)vp8_read_bit(bc
);
672 if (xd
->update_mb_segmentation_data
)
674 xd
->mb_segement_abs_delta
= (unsigned char)vp8_read_bit(bc
);
676 vpx_memset(xd
->segment_feature_data
, 0, sizeof(xd
->segment_feature_data
));
678 /* For each segmentation feature (Quant and loop filter level) */
679 for (i
= 0; i
< MB_LVL_MAX
; i
++)
681 for (j
= 0; j
< MAX_MB_SEGMENTS
; j
++)
683 /* Frame level data */
684 if (vp8_read_bit(bc
))
686 xd
->segment_feature_data
[i
][j
] = (signed char)vp8_read_literal(bc
, mb_feature_data_bits
[i
]);
688 if (vp8_read_bit(bc
))
689 xd
->segment_feature_data
[i
][j
] = -xd
->segment_feature_data
[i
][j
];
692 xd
->segment_feature_data
[i
][j
] = 0;
697 if (xd
->update_mb_segmentation_map
)
699 /* Which macro block level features are enabled */
700 vpx_memset(xd
->mb_segment_tree_probs
, 255, sizeof(xd
->mb_segment_tree_probs
));
702 /* Read the probs used to decode the segment id for each macro block. */
703 for (i
= 0; i
< MB_FEATURE_TREE_PROBS
; i
++)
705 /* If not explicitly set value is defaulted to 255 by memset above */
706 if (vp8_read_bit(bc
))
707 xd
->mb_segment_tree_probs
[i
] = (vp8_prob
)vp8_read_literal(bc
, 8);
712 /* Read the loop filter level and type */
713 pc
->filter_type
= (LOOPFILTERTYPE
) vp8_read_bit(bc
);
714 pc
->filter_level
= vp8_read_literal(bc
, 6);
715 pc
->sharpness_level
= vp8_read_literal(bc
, 3);
717 /* Read in loop filter deltas applied at the MB level based on mode or ref frame. */
718 xd
->mode_ref_lf_delta_update
= 0;
719 xd
->mode_ref_lf_delta_enabled
= (unsigned char)vp8_read_bit(bc
);
721 if (xd
->mode_ref_lf_delta_enabled
)
723 /* Do the deltas need to be updated */
724 xd
->mode_ref_lf_delta_update
= (unsigned char)vp8_read_bit(bc
);
726 if (xd
->mode_ref_lf_delta_update
)
729 for (i
= 0; i
< MAX_REF_LF_DELTAS
; i
++)
731 if (vp8_read_bit(bc
))
733 /*sign = vp8_read_bit( bc );*/
734 xd
->ref_lf_deltas
[i
] = (signed char)vp8_read_literal(bc
, 6);
736 if (vp8_read_bit(bc
)) /* Apply sign */
737 xd
->ref_lf_deltas
[i
] = xd
->ref_lf_deltas
[i
] * -1;
742 for (i
= 0; i
< MAX_MODE_LF_DELTAS
; i
++)
744 if (vp8_read_bit(bc
))
746 /*sign = vp8_read_bit( bc );*/
747 xd
->mode_lf_deltas
[i
] = (signed char)vp8_read_literal(bc
, 6);
749 if (vp8_read_bit(bc
)) /* Apply sign */
750 xd
->mode_lf_deltas
[i
] = xd
->mode_lf_deltas
[i
] * -1;
756 setup_token_decoder(pbi
, data
+ first_partition_length_in_bytes
);
757 xd
->current_bc
= &pbi
->bc2
;
759 /* Read the default quantizers. */
763 Q
= vp8_read_literal(bc
, 7); /* AC 1st order Q = default */
766 pc
->y1dc_delta_q
= get_delta_q(bc
, pc
->y1dc_delta_q
, &q_update
);
767 pc
->y2dc_delta_q
= get_delta_q(bc
, pc
->y2dc_delta_q
, &q_update
);
768 pc
->y2ac_delta_q
= get_delta_q(bc
, pc
->y2ac_delta_q
, &q_update
);
769 pc
->uvdc_delta_q
= get_delta_q(bc
, pc
->uvdc_delta_q
, &q_update
);
770 pc
->uvac_delta_q
= get_delta_q(bc
, pc
->uvac_delta_q
, &q_update
);
773 vp8cx_init_de_quantizer(pbi
);
775 /* MB level dequantizer setup */
776 mb_init_dequantizer(pbi
, &pbi
->mb
);
779 /* Determine if the golden frame or ARF buffer should be updated and how.
780 * For all non key frames the GF and ARF refresh flags and sign bias
781 * flags must be set explicitly.
783 if (pc
->frame_type
!= KEY_FRAME
)
785 /* Should the GF or ARF be updated from the current frame */
786 pc
->refresh_golden_frame
= vp8_read_bit(bc
);
787 pc
->refresh_alt_ref_frame
= vp8_read_bit(bc
);
789 /* Buffer to buffer copy flags. */
790 pc
->copy_buffer_to_gf
= 0;
792 if (!pc
->refresh_golden_frame
)
793 pc
->copy_buffer_to_gf
= vp8_read_literal(bc
, 2);
795 pc
->copy_buffer_to_arf
= 0;
797 if (!pc
->refresh_alt_ref_frame
)
798 pc
->copy_buffer_to_arf
= vp8_read_literal(bc
, 2);
800 pc
->ref_frame_sign_bias
[GOLDEN_FRAME
] = vp8_read_bit(bc
);
801 pc
->ref_frame_sign_bias
[ALTREF_FRAME
] = vp8_read_bit(bc
);
804 pc
->refresh_entropy_probs
= vp8_read_bit(bc
);
805 if (pc
->refresh_entropy_probs
== 0)
807 vpx_memcpy(&pc
->lfc
, &pc
->fc
, sizeof(pc
->fc
));
810 pc
->refresh_last_frame
= pc
->frame_type
== KEY_FRAME
|| vp8_read_bit(bc
);
814 FILE *z
= fopen("decodestats.stt", "a");
815 fprintf(z
, "%6d F:%d,G:%d,A:%d,L:%d,Q:%d\n",
816 pc
->current_video_frame
,
818 pc
->refresh_golden_frame
,
819 pc
->refresh_alt_ref_frame
,
820 pc
->refresh_last_frame
,
827 /* read coef probability tree */
829 for (i
= 0; i
< BLOCK_TYPES
; i
++)
830 for (j
= 0; j
< COEF_BANDS
; j
++)
831 for (k
= 0; k
< PREV_COEF_CONTEXTS
; k
++)
832 for (l
= 0; l
< MAX_ENTROPY_TOKENS
- 1; l
++)
835 vp8_prob
*const p
= pc
->fc
.coef_probs
[i
][j
][k
] + l
;
837 if (vp8_read(bc
, vp8_coef_update_probs
[i
][j
][k
][l
]))
839 *p
= (vp8_prob
)vp8_read_literal(bc
, 8);
845 vpx_memcpy(&xd
->pre
, &pc
->yv12_fb
[pc
->lst_fb_idx
], sizeof(YV12_BUFFER_CONFIG
));
846 vpx_memcpy(&xd
->dst
, &pc
->yv12_fb
[pc
->new_fb_idx
], sizeof(YV12_BUFFER_CONFIG
));
848 /* set up frame new frame for intra coded blocks */
849 #if CONFIG_MULTITHREAD
850 if (!(pbi
->b_multithreaded_rd
) || pc
->multi_token_partition
== ONE_PARTITION
|| !(pc
->filter_level
))
852 vp8_setup_intra_recon(&pc
->yv12_fb
[pc
->new_fb_idx
]);
854 vp8_setup_block_dptrs(xd
);
856 vp8_build_block_doffsets(xd
);
858 /* clear out the coeff buffer */
859 vpx_memset(xd
->qcoeff
, 0, sizeof(xd
->qcoeff
));
861 /* Read the mb_no_coeff_skip flag */
862 pc
->mb_no_coeff_skip
= (int)vp8_read_bit(bc
);
865 vp8_decode_mode_mvs(pbi
);
867 vpx_memset(pc
->above_context
, 0, sizeof(ENTROPY_CONTEXT_PLANES
) * pc
->mb_cols
);
869 vpx_memcpy(&xd
->block
[0].bmi
, &xd
->mode_info_context
->bmi
[0], sizeof(B_MODE_INFO
));
871 #if CONFIG_MULTITHREAD
872 if (pbi
->b_multithreaded_rd
&& pc
->multi_token_partition
!= ONE_PARTITION
)
874 vp8mt_decode_mb_rows(pbi
, xd
);
875 if(pbi
->common
.filter_level
)
877 /*vp8_mt_loop_filter_frame(pbi);*/ /*cm, &pbi->mb, cm->filter_level);*/
879 pc
->last_frame_type
= pc
->frame_type
;
880 pc
->last_filter_type
= pc
->filter_type
;
881 pc
->last_sharpness_level
= pc
->sharpness_level
;
883 vp8_yv12_extend_frame_borders_ptr(&pc
->yv12_fb
[pc
->new_fb_idx
]); /*cm->frame_to_show);*/
889 int num_part
= 1 << pc
->multi_token_partition
;
891 /* Decode the individual macro block */
892 for (mb_row
= 0; mb_row
< pc
->mb_rows
; mb_row
++)
897 xd
->current_bc
= & pbi
->mbc
[ibc
];
904 vp8_decode_mb_row(pbi
, pc
, mb_row
, xd
);
909 stop_token_decoder(pbi
);
911 /* Collect information about decoder corruption. */
912 /* 1. Check first boolean decoder for errors. */
913 pc
->yv12_fb
[pc
->new_fb_idx
].corrupted
=
914 vp8dx_bool_error(bc
);
915 /* 2. Check the macroblock information */
916 pc
->yv12_fb
[pc
->new_fb_idx
].corrupted
|=
919 /* vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes \n",bc->pos+pbi->bc2.pos); */
921 /* If this was a kf or Gf note the Q used */
922 if ((pc
->frame_type
== KEY_FRAME
) ||
923 pc
->refresh_golden_frame
|| pc
->refresh_alt_ref_frame
)
925 pc
->last_kf_gf_q
= pc
->base_qindex
;
928 if (pc
->refresh_entropy_probs
== 0)
930 vpx_memcpy(&pc
->fc
, &pc
->lfc
, sizeof(pc
->fc
));
933 #ifdef PACKET_TESTING
935 FILE *f
= fopen("decompressor.VP8", "ab");
936 unsigned int size
= pbi
->bc2
.pos
+ pbi
->bc
.pos
+ 8;
937 fwrite((void *) &size
, 4, 1, f
);
938 fwrite((void *) pbi
->Source
, size
, 1, f
);