diff options
Diffstat (limited to 'vp8/decoder')
-rw-r--r-- | vp8/decoder/decodemv.c | 51 | ||||
-rw-r--r-- | vp8/decoder/decodframe.c | 161 | ||||
-rw-r--r-- | vp8/decoder/dequantize.c | 217 | ||||
-rw-r--r-- | vp8/decoder/dequantize.h | 66 | ||||
-rw-r--r-- | vp8/decoder/detokenize.c | 445 | ||||
-rw-r--r-- | vp8/decoder/detokenize.h | 3 | ||||
-rw-r--r-- | vp8/decoder/generic/dsystemdependent.c | 20 | ||||
-rw-r--r-- | vp8/decoder/idct_blk.c | 42 | ||||
-rw-r--r-- | vp8/decoder/onyxd_if.c | 63 | ||||
-rw-r--r-- | vp8/decoder/onyxd_int.h | 30 |
10 files changed, 1064 insertions, 34 deletions
diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c index 0a7942d89..f23fd00b4 100644 --- a/vp8/decoder/decodemv.c +++ b/vp8/decoder/decodemv.c @@ -208,11 +208,13 @@ static const unsigned char mbsplit_fill_offset[4][16] = { - static void mb_mode_mv_init(VP8D_COMP *pbi) { vp8_reader *const bc = & pbi->bc; MV_CONTEXT *const mvc = pbi->common.fc.mvc; +#if CONFIG_SEGMENTATION + MACROBLOCKD *const xd = & pbi->mb; +#endif #if CONFIG_ERROR_CONCEALMENT /* Default is that no macroblock is corrupt, therefore we initialize @@ -253,6 +255,9 @@ static void mb_mode_mv_init(VP8D_COMP *pbi) } read_mvcontexts(bc, mvc); +#if CONFIG_SEGMENTATION + xd->temporal_update = vp8_read_bit(bc); +#endif } } @@ -263,7 +268,11 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, vp8_reader *const bc = & pbi->bc; MV_CONTEXT *const mvc = pbi->common.fc.mvc; const int mis = pbi->common.mode_info_stride; - +#if CONFIG_SEGMENTATION + MACROBLOCKD *const xd = & pbi->mb; + int sum; + int index = mb_row * pbi->common.mb_cols + mb_col; +#endif int_mv *const mv = & mbmi->mv; int mb_to_left_edge; int mb_to_right_edge; @@ -274,7 +283,6 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, mb_to_bottom_edge = pbi->mb.mb_to_bottom_edge; mb_to_top_edge -= LEFT_TOP_MARGIN; mb_to_bottom_edge += RIGHT_BOTTOM_MARGIN; - mbmi->need_to_clamp_mvs = 0; /* Distance of Mb to the various image edges. * These specified to 8th pel as they are always compared to MV values that are in 1/8th pel units @@ -289,7 +297,41 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, /* If required read in new segmentation data for this MB */ if (pbi->mb.update_mb_segmentation_map) - vp8_read_mb_features(bc, mbmi, &pbi->mb); + { +#if CONFIG_SEGMENTATION + if (xd->temporal_update) + { + sum = 0; + + if (mb_col != 0) + sum += (mi-1)->mbmi.segment_flag; + if (mb_row != 0) + sum += (mi-pbi->common.mb_cols)->mbmi.segment_flag; + + if (vp8_read(bc, xd->mb_segment_tree_probs[3+sum]) == 0) + { + mbmi->segment_id = pbi->segmentation_map[index]; + mbmi->segment_flag = 0; + } + else + { + vp8_read_mb_features(bc, &mi->mbmi, &pbi->mb); + mbmi->segment_flag = 1; + pbi->segmentation_map[index] = mbmi->segment_id; + } + + } + else + { + vp8_read_mb_features(bc, &mi->mbmi, &pbi->mb); + pbi->segmentation_map[index] = mbmi->segment_id; + } + index++; +#else + vp8_read_mb_features(bc, &mi->mbmi, &pbi->mb); +#endif + } + /* Read the macroblock coeff skip flag if this feature is in use, else default to 0 */ if (pbi->common.mb_no_coeff_skip) @@ -508,4 +550,3 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi) mi++; /* skip left predictor each row */ } } - diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c index 9b35ffd66..c6cea3a52 100644 --- a/vp8/decoder/decodframe.c +++ b/vp8/decoder/decodframe.c @@ -40,6 +40,10 @@ #include <assert.h> #include <stdio.h> +#ifdef DEC_DEBUG +int dec_debug = 0; +#endif + void vp8cx_init_de_quantizer(VP8D_COMP *pbi) { int i; @@ -125,6 +129,16 @@ static void skip_recon_mb(VP8D_COMP *pbi, MACROBLOCKD *xd) vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, xd->dst.y_stride, xd->dst.uv_stride); +#ifdef DEC_DEBUG + if (dec_debug) { + int i, j; + printf("Generating predictors\n"); + for (i=0;i<16;i++) { + for (j=0;j<16;j++) printf("%3d ", xd->dst.y_buffer[i*xd->dst.y_stride+j]); + printf("\n"); + } + } +#endif } } @@ -192,7 +206,28 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, } else { - eobtotal = vp8_decode_mb_tokens(pbi, xd); + +#if CONFIG_T8X8 + for(i = 0; i < 25; i++) + { + xd->block[i].eob = 0; + xd->eobs[i] = 0; + } + if (xd->mode_info_context->mbmi.segment_id >= 2) + eobtotal = vp8_decode_mb_tokens_8x8(pbi, xd); + else +#endif + eobtotal = vp8_decode_mb_tokens(pbi, xd); +#ifdef DEC_DEBUG + if (dec_debug) { + printf("\nTokens (%d)\n", eobtotal); + for (i =0; i<400; i++) { + printf("%3d ", xd->qcoeff[i]); + if (i%16 == 15) printf("\n"); + } + printf("\n"); + } +#endif } /* Perform temporary clamping of the MV to be used for prediction */ @@ -276,10 +311,22 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, } else if (mode == SPLITMV) { - DEQUANT_INVOKE (&pbi->dequant, idct_add_y_block) - (xd->qcoeff, xd->block[0].dequant, - xd->predictor, xd->dst.y_buffer, - xd->dst.y_stride, xd->eobs); +#if CONFIG_T8X8 + if(xd->mode_info_context->mbmi.segment_id >= 2) + { + DEQUANT_INVOKE (&pbi->dequant, idct_add_y_block_8x8) + (xd->qcoeff, xd->block[0].dequant, + xd->predictor, xd->dst.y_buffer, + xd->dst.y_stride, xd->eobs, xd); + } + else +#endif + { + DEQUANT_INVOKE (&pbi->dequant, idct_add_y_block) + (xd->qcoeff, xd->block[0].dequant, + xd->predictor, xd->dst.y_buffer, + xd->dst.y_stride, xd->eobs); + } } else { @@ -288,10 +335,23 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, DEQUANT_INVOKE(&pbi->dequant, block)(b); /* do 2nd order transform on the dc block */ - if (xd->eobs[24] > 1) +#if CONFIG_T8X8 + if(xd->mode_info_context->mbmi.segment_id >= 2) { - IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh16)(&b->dqcoeff[0], b->diff); - ((int *)b->qcoeff)[0] = 0; + DEQUANT_INVOKE(&pbi->dequant, block_8x8)(b); +#ifdef DEC_DEBUG + if (dec_debug) + { + int j; + printf("DQcoeff Haar\n"); + for (j=0;j<16;j++) { + printf("%d ", b->dqcoeff[j]); + } + printf("\n"); + } +#endif + IDCT_INVOKE(RTCD_VTABLE(idct), ihaar2)(&b->dqcoeff[0], b->diff, 8); + ((int *)b->qcoeff)[0] = 0;//2nd order block are set to 0 after inverse transform ((int *)b->qcoeff)[1] = 0; ((int *)b->qcoeff)[2] = 0; ((int *)b->qcoeff)[3] = 0; @@ -299,23 +359,55 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, ((int *)b->qcoeff)[5] = 0; ((int *)b->qcoeff)[6] = 0; ((int *)b->qcoeff)[7] = 0; + DEQUANT_INVOKE (&pbi->dequant, dc_idct_add_y_block_8x8) + (xd->qcoeff, xd->block[0].dequant, + xd->predictor, xd->dst.y_buffer, + xd->dst.y_stride, xd->eobs, xd->block[24].diff, xd); + } + else - { - IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh1)(&b->dqcoeff[0], b->diff); - ((int *)b->qcoeff)[0] = 0; - } +#endif + if (xd->eobs[24] > 1) + { + IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh16)(&b->dqcoeff[0], b->diff); + ((int *)b->qcoeff)[0] = 0; + ((int *)b->qcoeff)[1] = 0; + ((int *)b->qcoeff)[2] = 0; + ((int *)b->qcoeff)[3] = 0; + ((int *)b->qcoeff)[4] = 0; + ((int *)b->qcoeff)[5] = 0; + ((int *)b->qcoeff)[6] = 0; + ((int *)b->qcoeff)[7] = 0; + } + else + { + IDCT_INVOKE(RTCD_VTABLE(idct), iwalsh1)(&b->dqcoeff[0], b->diff); + ((int *)b->qcoeff)[0] = 0; + } + + DEQUANT_INVOKE (&pbi->dequant, dc_idct_add_y_block) + (xd->qcoeff, xd->block[0].dequant, + xd->predictor, xd->dst.y_buffer, + xd->dst.y_stride, xd->eobs, xd->block[24].diff); + } +#if CONFIG_T8X8 + if(xd->mode_info_context->mbmi.segment_id >= 2) + { + DEQUANT_INVOKE (&pbi->dequant, idct_add_uv_block_8x8)// + (xd->qcoeff+16*16, xd->block[16].dequant, + xd->predictor+16*16, xd->dst.u_buffer, xd->dst.v_buffer, + xd->dst.uv_stride, xd->eobs+16, xd);// - DEQUANT_INVOKE (&pbi->dequant, dc_idct_add_y_block) - (xd->qcoeff, xd->block[0].dequant, - xd->predictor, xd->dst.y_buffer, - xd->dst.y_stride, xd->eobs, xd->block[24].diff); } + else +#endif DEQUANT_INVOKE (&pbi->dequant, idct_add_uv_block) (xd->qcoeff+16*16, xd->block[16].dequant, xd->predictor+16*16, xd->dst.u_buffer, xd->dst.v_buffer, xd->dst.uv_stride, xd->eobs+16); + } @@ -423,6 +515,9 @@ decode_mb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mb_row, MACROBLOCKD *xd) vp8_build_uvmvs(xd, pc->full_pixel); +#ifdef DEC_DEBUG + dec_debug = (pc->current_video_frame==5 && mb_row==2 && mb_col==3); +#endif /* if(pc->current_video_frame==0 &&mb_col==1 && mb_row==0) pbi->debugoutput =1; @@ -433,7 +528,6 @@ decode_mb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mb_row, MACROBLOCKD *xd) /* check if the boolean decoder has suffered an error */ xd->corrupted |= vp8dx_bool_error(xd->current_bc); - recon_yoffset += 16; recon_uvoffset += 8; @@ -787,7 +881,6 @@ int vp8_decode_frame(VP8D_COMP *pbi) /* Is segmentation enabled */ xd->segmentation_enabled = (unsigned char)vp8_read_bit(bc); - if (xd->segmentation_enabled) { /* Signal whether or not the segmentation map is being explicitly updated this frame. */ @@ -823,9 +916,12 @@ int vp8_decode_frame(VP8D_COMP *pbi) { /* Which macro block level features are enabled */ vpx_memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs)); - +#if CONFIG_SEGMENTATION /* Read the probs used to decode the segment id for each macro block. */ + for (i = 0; i < MB_FEATURE_TREE_PROBS+3; i++) +#else for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) +#endif { /* If not explicitly set value is defaulted to 255 by memset above */ if (vp8_read_bit(bc)) @@ -991,10 +1087,36 @@ int vp8_decode_frame(VP8D_COMP *pbi) } } } +#if CONFIG_T8X8 + { + // read coef probability tree + + for (i = 0; i < BLOCK_TYPES; i++) + for (j = 0; j < COEF_BANDS; j++) + for (k = 0; k < PREV_COEF_CONTEXTS; k++) + for (l = 0; l < MAX_ENTROPY_TOKENS - 1; l++) + { + + vp8_prob *const p = pc->fc.coef_probs_8x8 [i][j][k] + l; + + if (vp8_read(bc, vp8_coef_update_probs_8x8 [i][j][k][l])) + { + *p = (vp8_prob)vp8_read_literal(bc, 8); + + } + } + } +#endif vpx_memcpy(&xd->pre, &pc->yv12_fb[pc->lst_fb_idx], sizeof(YV12_BUFFER_CONFIG)); vpx_memcpy(&xd->dst, &pc->yv12_fb[pc->new_fb_idx], sizeof(YV12_BUFFER_CONFIG)); +#if CONFIG_SEGMENTATION + // Create the encoder segmentation map and set all entries to 0 + if (!pbi->segmentation_map) + CHECK_MEM_ERROR(pbi->segmentation_map, vpx_calloc((pc->mb_rows * pc->mb_cols), 1)); +#endif + /* set up frame new frame for intra coded blocks */ #if CONFIG_MULTITHREAD if (!(pbi->b_multithreaded_rd) || pc->multi_token_partition == ONE_PARTITION || !(pc->filter_level)) @@ -1088,6 +1210,7 @@ int vp8_decode_frame(VP8D_COMP *pbi) fclose(f); } #endif + //printf("Frame %d Done\n", frame_count++); return 0; } diff --git a/vp8/decoder/dequantize.c b/vp8/decoder/dequantize.c index dd0c13b7d..956acba8f 100644 --- a/vp8/decoder/dequantize.c +++ b/vp8/decoder/dequantize.c @@ -13,13 +13,22 @@ #include "dequantize.h" #include "vp8/common/idct.h" #include "vpx_mem/vpx_mem.h" +#include "onyxd_int.h" extern void vp8_short_idct4x4llm_c(short *input, short *output, int pitch) ; extern void vp8_short_idct4x4llm_1_c(short *input, short *output, int pitch); +#if CONFIG_T8X8 +extern void vp8_short_idct8x8_c(short *input, short *output, int pitch); +extern void vp8_short_idct8x8_1_c(short *input, short *output, int pitch); +#endif +#ifdef DEC_DEBUG +extern int dec_debug; +#endif void vp8_dequantize_b_c(BLOCKD *d) { + int i; short *DQ = d->dqcoeff; short *Q = d->qcoeff; @@ -111,3 +120,211 @@ void vp8_dequant_dc_idct_add_c(short *input, short *dq, unsigned char *pred, pred += pitch; } } + +#if CONFIG_T8X8 +void vp8_dequantize_b_8x8_c(BLOCKD *d)//just for 2x2 haar transform +{ + int i; + short *DQ = d->dqcoeff; + short *Q = d->qcoeff; + short *DQC = d->dequant; + + for (i = 0; i < 16; i++) + { + DQ[i] = (short)(Q[i] * DQC[i]); + } +#ifdef DEC_DEBUG + if (dec_debug) { + int j; + printf("Dequantize 2x2\n"); + for (j=0;j<16;j++) printf("%d ", Q[j]); printf("\n"); + for (j=0;j<16;j++) printf("%d ", DQ[j]); printf("\n"); + } +#endif +} + +void vp8_dequant_idct_add_8x8_c(short *input, short *dq, unsigned char *pred, + unsigned char *dest, int pitch, int stride)//, MACROBLOCKD *xd, short blk_idx +{ + short output[64]; + short *diff_ptr = output; + int r, c, b; + int i; + unsigned char *origdest = dest; + unsigned char *origpred = pred; + +#ifdef DEC_DEBUG + if (dec_debug) { + int j; + printf("Input 8x8\n"); + for (j=0;j<64;j++) { + printf("%d ", input[j]); + if (j%8 == 7) printf("\n"); + } + } +#endif + // recover quantizer for 4 4x4 blocks + for (i = 0; i < 64; i++) + { + input[i]=input[i] * dq[i!=0]; + } +#ifdef DEC_DEBUG + if (dec_debug) { + int j; + printf("Input DQ 8x8\n"); + for (j=0;j<64;j++) { + printf("%d ", input[j]); + if (j%8 == 7) printf("\n"); + } + } +#endif + + // the idct halves ( >> 1) the pitch + vp8_short_idct8x8_c(input, output, 16); +#ifdef DEC_DEBUG + if (dec_debug) { + int j; + printf("Output 8x8\n"); + for (j=0;j<64;j++) { + printf("%d ", output[j]); + if (j%8 == 7) printf("\n"); + } + } +#endif + + vpx_memset(input, 0, 128);// test what should i put here + + for (b = 0; b < 4; b++) + { + for (r = 0; r < 4; r++) + { + for (c = 0; c < 4; c++) + { + int a = diff_ptr[c] + pred[c]; + + if (a < 0) + a = 0; + + if (a > 255) + a = 255; + + dest[c] = (unsigned char) a; + } + + dest += stride; + diff_ptr += 8; + pred += pitch; + } + diff_ptr = output + (b+1) / 2 * 4 * 8 + (b+1) % 2 * 4; + dest = origdest + (b+1) / 2 * 4 * stride + (b+1) % 2 * 4; + pred = origpred + (b+1) / 2 * 4 * pitch + (b+1) % 2 * 4; + } +#ifdef DEC_DEBUG + if (dec_debug) { + int k,j; + printf("Final 8x8\n"); + for (j=0;j<8;j++) { + for (k=0;k<8;k++) { + printf("%d ", origdest[k]); + } + printf("\n"); + origdest+=stride; + } + } +#endif +} + +void vp8_dequant_dc_idct_add_8x8_c(short *input, short *dq, unsigned char *pred, + unsigned char *dest, int pitch, int stride, + int Dc)// Dc for 1st order T in some rear case +{ + short output[64]; + short *diff_ptr = output; + int r, c, b; + int i; + unsigned char *origdest = dest; + unsigned char *origpred = pred; + + input[0] = (short)Dc;//Dc is the reconstructed value, do not need dequantization + //dc value is recovered after dequantization, since dc need not quantization +#ifdef DEC_DEBUG + if (dec_debug) { + int j; + printf("Input 8x8\n"); + for (j=0;j<64;j++) { + printf("%d ", input[j]); + if (j%8 == 7) printf("\n"); + } + } +#endif + for (i = 1; i < 64; i++) + { + input[i] = input[i] * dq[i!=0]; + } + +#ifdef DEC_DEBUG + if (dec_debug) { + int j; + printf("Input DQ 8x8\n"); + for (j=0;j<64;j++) { + printf("%d ", input[j]); + if (j%8 == 7) printf("\n"); + } + } +#endif + + // the idct halves ( >> 1) the pitch + vp8_short_idct8x8_c(input, output,16); +#ifdef DEC_DEBUG + if (dec_debug) { + int j; + printf("Output 8x8\n"); + for (j=0;j<64;j++) { + printf("%d ", output[j]); + if (j%8 == 7) printf("\n"); + } + } +#endif + vpx_memset(input, 0, 128); + + for (b = 0; b < 4; b++) + { + for (r = 0; r < 4; r++) + { + for (c = 0; c < 4; c++) + { + int a = diff_ptr[c] + pred[c]; + + if (a < 0) + a = 0; + + if (a > 255) + a = 255; + + dest[c] = (unsigned char) a; + } + + dest += stride; + diff_ptr += 8; + pred += pitch; + } + diff_ptr = output + (b+1) / 2 * 4 * 8 + (b+1) % 2 * 4; + dest = origdest + (b+1) / 2 * 4 * stride + (b+1) % 2 * 4; + pred = origpred + (b+1) / 2 * 4 * pitch + (b+1) % 2 * 4; + } +#ifdef DEC_DEBUG + if (dec_debug) { + int k,j; + printf("Final 8x8\n"); + for (j=0;j<8;j++) { + for (k=0;k<8;k++) { + printf("%d ", origdest[k]); + } + printf("\n"); + origdest+=stride; + } + } +#endif +} + +#endif diff --git a/vp8/decoder/dequantize.h b/vp8/decoder/dequantize.h index 2e662a593..5ae6f9619 100644 --- a/vp8/decoder/dequantize.h +++ b/vp8/decoder/dequantize.h @@ -42,6 +42,25 @@ unsigned char *pre, unsigned char *dst_u, \ unsigned char *dst_v, int stride, char *eobs) +#if CONFIG_T8X8 +#define prototype_dequant_dc_idct_add_y_block_8x8(sym) \ + void sym(short *q, short *dq, \ + unsigned char *pre, unsigned char *dst, \ + int stride, char *eobs, short *dc, MACROBLOCKD *xd) + +#define prototype_dequant_idct_add_y_block_8x8(sym) \ + void sym(short *q, short *dq, \ + unsigned char *pre, unsigned char *dst, \ + int stride, char *eobs, MACROBLOCKD *xd) + +#define prototype_dequant_idct_add_uv_block_8x8(sym) \ + void sym(short *q, short *dq, \ + unsigned char *pre, unsigned char *dst_u, \ + unsigned char *dst_v, int stride, char *eobs, \ + MACROBLOCKD *xd) + +#endif + #if ARCH_X86 || ARCH_X86_64 #include "x86/dequantize_x86.h" #endif @@ -80,6 +99,38 @@ extern prototype_dequant_idct_add_y_block(vp8_dequant_idct_add_y_block); #endif extern prototype_dequant_idct_add_uv_block(vp8_dequant_idct_add_uv_block); +#if CONFIG_T8X8 +#ifndef vp8_dequant_block_8x8 +#define vp8_dequant_block_8x8 vp8_dequantize_b_8x8_c +#endif +extern prototype_dequant_block(vp8_dequant_block_8x8); + +#ifndef vp8_dequant_idct_add_8x8 +#define vp8_dequant_idct_add_8x8 vp8_dequant_idct_add_8x8_c +#endif +extern prototype_dequant_idct_add(vp8_dequant_idct_add_8x8); + +#ifndef vp8_dequant_dc_idct_add_8x8 +#define vp8_dequant_dc_idct_add_8x8 vp8_dequant_dc_idct_add_8x8_c +#endif +extern prototype_dequant_dc_idct_add(vp8_dequant_dc_idct_add_8x8); + +#ifndef vp8_dequant_dc_idct_add_y_block_8x8 +#define vp8_dequant_dc_idct_add_y_block_8x8 vp8_dequant_dc_idct_add_y_block_8x8_c +#endif +extern prototype_dequant_dc_idct_add_y_block_8x8(vp8_dequant_dc_idct_add_y_block_8x8); + +#ifndef vp8_dequant_idct_add_y_block_8x8 +#define vp8_dequant_idct_add_y_block_8x8 vp8_dequant_idct_add_y_block_8x8_c +#endif +extern prototype_dequant_idct_add_y_block_8x8(vp8_dequant_idct_add_y_block_8x8); + +#ifndef vp8_dequant_idct_add_uv_block_8x8 +#define vp8_dequant_idct_add_uv_block_8x8 vp8_dequant_idct_add_uv_block_8x8_c +#endif +extern prototype_dequant_idct_add_uv_block_8x8(vp8_dequant_idct_add_uv_block_8x8); + +#endif typedef prototype_dequant_block((*vp8_dequant_block_fn_t)); @@ -93,6 +144,13 @@ typedef prototype_dequant_idct_add_y_block((*vp8_dequant_idct_add_y_block_fn_t)) typedef prototype_dequant_idct_add_uv_block((*vp8_dequant_idct_add_uv_block_fn_t)); +#if CONFIG_T8X8 +typedef prototype_dequant_dc_idct_add_y_block_8x8((*vp8_dequant_dc_idct_add_y_block_fn_t_8x8)); + +typedef prototype_dequant_idct_add_y_block_8x8((*vp8_dequant_idct_add_y_block_fn_t_8x8)); + +typedef prototype_dequant_idct_add_uv_block_8x8((*vp8_dequant_idct_add_uv_block_fn_t_8x8)); +#endif typedef struct { vp8_dequant_block_fn_t block; @@ -101,6 +159,14 @@ typedef struct vp8_dequant_dc_idct_add_y_block_fn_t dc_idct_add_y_block; vp8_dequant_idct_add_y_block_fn_t idct_add_y_block; vp8_dequant_idct_add_uv_block_fn_t idct_add_uv_block; +#if CONFIG_T8X8 + vp8_dequant_block_fn_t block_8x8; + vp8_dequant_idct_add_fn_t idct_add_8x8; + vp8_dequant_dc_idct_add_fn_t dc_idct_add_8x8; + vp8_dequant_dc_idct_add_y_block_fn_t_8x8 dc_idct_add_y_block_8x8; + vp8_dequant_idct_add_y_block_fn_t_8x8 idct_add_y_block_8x8; + vp8_dequant_idct_add_uv_block_fn_t_8x8 idct_add_uv_block_8x8; +#endif } vp8_dequant_rtcd_vtable_t; #if CONFIG_RUNTIME_CPU_DETECT diff --git a/vp8/decoder/detokenize.c b/vp8/decoder/detokenize.c index 166be9ef9..6121490eb 100644 --- a/vp8/decoder/detokenize.c +++ b/vp8/decoder/detokenize.c @@ -26,6 +26,18 @@ DECLARE_ALIGNED(16, static const unsigned char, coef_bands_x[16]) = 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 7 * OCB_X }; +#if CONFIG_T8X8 +DECLARE_ALIGNED(64, static const unsigned char, coef_bands_x_8x8[64]) = { + 0 * OCB_X, 1 * OCB_X, 2 * OCB_X, 3 * OCB_X, 5 * OCB_X, 4 * OCB_X, 4 * OCB_X, 5 * OCB_X, + 5 * OCB_X, 3 * OCB_X, 6 * OCB_X, 3 * OCB_X, 5 * OCB_X, 4 * OCB_X, 6 * OCB_X, 6 * OCB_X, + 6 * OCB_X, 5 * OCB_X, 5 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, + 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, + 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, + 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, + 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, + 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, 7 * OCB_X, +}; +#endif #define EOB_CONTEXT_NODE 0 #define ZERO_CONTEXT_NODE 1 #define ONE_CONTEXT_NODE 2 @@ -44,10 +56,26 @@ typedef struct { INT16 min_val; INT16 Length; - UINT8 Probs[12]; + UINT8 Probs[14]; } TOKENEXTRABITS; */ - +#if CONFIG_EXTEND_QRANGE +DECLARE_ALIGNED(16, static const TOKENEXTRABITS, vp8d_token_extra_bits2[MAX_ENTROPY_TOKENS]) = +{ + { 0, -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* ZERO_TOKEN */ + { 1, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* ONE_TOKEN */ + { 2, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* TWO_TOKEN */ + { 3, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* THREE_TOKEN */ + { 4, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* FOUR_TOKEN */ + { 5, 0, { 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* DCT_VAL_CATEGORY1 */ + { 7, 1, { 145, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* DCT_VAL_CATEGORY2 */ + { 11, 2, { 140, 148, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* DCT_VAL_CATEGORY3 */ + { 19, 3, { 135, 140, 155, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* DCT_VAL_CATEGORY4 */ + { 35, 4, { 130, 134, 141, 157, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* DCT_VAL_CATEGORY5 */ + { 67, 12, { 129, 130, 133, 140, 153, 177, 196, 230, 243, 249, 252, 254, 254, 0 } }, /* DCT_VAL_CATEGORY6 */ + { 0, -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* EOB TOKEN */ +}; +#else DECLARE_ALIGNED(16, static const TOKENEXTRABITS, vp8d_token_extra_bits2[MAX_ENTROPY_TOKENS]) = { { 0, -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* ZERO_TOKEN */ @@ -63,6 +91,7 @@ DECLARE_ALIGNED(16, static const TOKENEXTRABITS, vp8d_token_extra_bits2[MAX_ENTR { 67, 10, { 129, 130, 133, 140, 153, 177, 196, 230, 243, 254, 254, 0 } }, /* DCT_VAL_CATEGORY6 */ { 0, -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, /* EOB TOKEN */ }; +#endif void vp8_reset_mb_tokens_context(MACROBLOCKD *x) @@ -149,7 +178,48 @@ DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]); range = range - split; \ NORMALIZE \ } - +#if CONFIG_T8X8 +#define DECODE_AND_LOOP_IF_ZERO_8x8_2(probability,branch) \ + { \ + split = 1 + ((( probability*(range-1) ) ) >> 8); \ + bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \ + FILL \ + if ( value < bigsplit ) \ + { \ + range = split; \ + NORMALIZE \ + Prob = coef_probs; \ + if(c<3) {\ + ++c; \ + Prob += coef_bands_x[c]; \ + goto branch; \ + } goto BLOCK_FINISHED_8x8; /*for malformed input */\ + } \ + value -= bigsplit; \ + range = range - split; \ + NORMALIZE \ + } +#define DECODE_AND_LOOP_IF_ZERO_8X8(probability,branch) \ + { \ + split = 1 + ((( probability*(range-1) ) ) >> 8); \ + bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \ + FILL \ + if ( value < bigsplit ) \ + { \ + range = split; \ + NORMALIZE \ + Prob = coef_probs; \ + if(c<63) {\ + ++c; \ + Prob += coef_bands_x_8x8[c]; \ + goto branch; \ + } goto BLOCK_FINISHED_8x8; /*for malformed input */\ + } \ + value -= bigsplit; \ + range = range - split; \ + NORMALIZE \ + } +#endif #define DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val) \ DECODE_AND_APPLYSIGN(val) \ Prob = coef_probs + (ENTROPY_NODES*2); \ @@ -160,6 +230,26 @@ DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]); qcoeff_ptr [ scan[15] ] = (INT16) v; \ goto BLOCK_FINISHED; +#if CONFIG_T8X8 +#define DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(val) \ + DECODE_AND_APPLYSIGN(val) \ + Prob = coef_probs + (ENTROPY_NODES*2); \ + if(c < 3){\ + qcoeff_ptr [ scan[c] ] = (INT16) v; \ + ++c; \ + goto DO_WHILE_8x8; }\ + qcoeff_ptr [ scan[3] ] = (INT16) v; \ + goto BLOCK_FINISHED_8x8; +#define DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(val) \ + DECODE_AND_APPLYSIGN(val) \ + Prob = coef_probs + (ENTROPY_NODES*2); \ + if(c < 63){\ + qcoeff_ptr [ scan[c] ] = (INT16) v; \ + ++c; \ + goto DO_WHILE_8x8; }\ + qcoeff_ptr [ scan[63] ] = (INT16) v; \ + goto BLOCK_FINISHED_8x8; +#endif #define DECODE_EXTRABIT_AND_ADJUST_VAL(t,bits_count)\ split = 1 + (((range-1) * vp8d_token_extra_bits2[t].Probs[bits_count]) >> 8); \ @@ -177,6 +267,354 @@ DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]); }\ NORMALIZE +#if CONFIG_T8X8 +int vp8_decode_mb_tokens_8x8(VP8D_COMP *dx, MACROBLOCKD *x) +{ + ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)x->above_context; + ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)x->left_context; + const VP8_COMMON *const oc = & dx->common; + + BOOL_DECODER *bc = x->current_bc; + + char *eobs = x->eobs; + + ENTROPY_CONTEXT *a, *a1; + ENTROPY_CONTEXT *l, *l1; + int i; + + int eobtotal = 0; + + register int count; + + const BOOL_DATA *bufptr; + const BOOL_DATA *bufend; + register unsigned int range; + VP8_BD_VALUE value; + const int *scan;// + register unsigned int shift; + UINT32 split; + VP8_BD_VALUE bigsplit; + INT16 *qcoeff_ptr; + + const vp8_prob *coef_probs;// + int type; + int stop; + INT16 val, bits_count; + INT16 c; + INT16 v; + const vp8_prob *Prob;// + + type = 3; + i = 0; + stop = 16; + + scan = vp8_default_zig_zag1d_8x8; + qcoeff_ptr = &x->qcoeff[0]; + + if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV) + { + i = 24; + stop = 24; + type = 1; + qcoeff_ptr += 24*16; + eobtotal -= 4; + scan = vp8_default_zig_zag1d; + } + + bufend = bc->user_buffer_end; + bufptr = bc->user_buffer; + value = bc->value; + count = bc->count; + range = bc->range; + + coef_probs = oc->fc.coef_probs_8x8 [type] [ 0 ] [0]; + +BLOCK_LOOP_8x8: + a = A + vp8_block2above[i]; + l = L + vp8_block2left[i]; + + if(i < 16) + { + a1 = A + vp8_block2above[i+1]; + l1 = L + vp8_block2left[i+4]; + } + else if(i<24) + { + a1 = A + vp8_block2above[i+1]; + l1 = L + vp8_block2left[i+2]; + + } + c = (INT16)(!type); + +// Dest = ((A)!=0) + ((B)!=0); + if(i==24) + { + VP8_COMBINEENTROPYCONTEXTS(v, *a, *l); + } + else + { + VP8_COMBINEENTROPYCONTEXTS_8x8(v, *a, *l, *a1, *l1); + } + + Prob = coef_probs; + Prob += v * ENTROPY_NODES; + +DO_WHILE_8x8: + if(i==24) + Prob += coef_bands_x[c]; + else + Prob += coef_bands_x_8x8[c]; + DECODE_AND_BRANCH_IF_ZERO(Prob[EOB_CONTEXT_NODE], BLOCK_FINISHED_8x8); + +CHECK_0_8x8_: + if (i==24) + { + DECODE_AND_LOOP_IF_ZERO_8x8_2(Prob[ZERO_CONTEXT_NODE], CHECK_0_8x8_); + } + else + { + DECODE_AND_LOOP_IF_ZERO_8X8(Prob[ZERO_CONTEXT_NODE], CHECK_0_8x8_); + } + DECODE_AND_BRANCH_IF_ZERO(Prob[ONE_CONTEXT_NODE], ONE_CONTEXT_NODE_0_8x8_); + DECODE_AND_BRANCH_IF_ZERO(Prob[LOW_VAL_CONTEXT_NODE], LOW_VAL_CONTEXT_NODE_0_8x8_); + DECODE_AND_BRANCH_IF_ZERO(Prob[HIGH_LOW_CONTEXT_NODE], HIGH_LOW_CONTEXT_NODE_0_8x8_); + DECODE_AND_BRANCH_IF_ZERO(Prob[CAT_THREEFOUR_CONTEXT_NODE], CAT_THREEFOUR_CONTEXT_NODE_0_8x8_); + DECODE_AND_BRANCH_IF_ZERO(Prob[CAT_FIVE_CONTEXT_NODE], CAT_FIVE_CONTEXT_NODE_0_8x8_); + val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY6].min_val; + bits_count = vp8d_token_extra_bits2[DCT_VAL_CATEGORY6].Length; + + do + { + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY6, bits_count); + bits_count -- ; + } + while (bits_count >= 0); + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(val); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(val); + } + +CAT_FIVE_CONTEXT_NODE_0_8x8_: + val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY5].min_val; + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 4); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 3); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 2); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 1); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 0); + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(val); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(val); + } + +CAT_THREEFOUR_CONTEXT_NODE_0_8x8_: + DECODE_AND_BRANCH_IF_ZERO(Prob[CAT_THREE_CONTEXT_NODE], CAT_THREE_CONTEXT_NODE_0_8x8_); + val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY4].min_val; + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY4, 3); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY4, 2); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY4, 1); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY4, 0); + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(val); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(val); + } + +CAT_THREE_CONTEXT_NODE_0_8x8_: + val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY3].min_val; + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY3, 2); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY3, 1); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY3, 0); + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(val); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(val); + } + +HIGH_LOW_CONTEXT_NODE_0_8x8_: + DECODE_AND_BRANCH_IF_ZERO(Prob[CAT_ONE_CONTEXT_NODE], CAT_ONE_CONTEXT_NODE_0_8x8_); + + val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY2].min_val; + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY2, 1); + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY2, 0); + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(val); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(val); + } + +CAT_ONE_CONTEXT_NODE_0_8x8_: + val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY1].min_val; + DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY1, 0); + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(val); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(val); + } + +LOW_VAL_CONTEXT_NODE_0_8x8_: + DECODE_AND_BRANCH_IF_ZERO(Prob[TWO_CONTEXT_NODE], TWO_CONTEXT_NODE_0_8x8_); + DECODE_AND_BRANCH_IF_ZERO(Prob[THREE_CONTEXT_NODE], THREE_CONTEXT_NODE_0_8x8_); + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(4); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(4); + } + + +THREE_CONTEXT_NODE_0_8x8_: + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(3); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(3); + } + + +TWO_CONTEXT_NODE_0_8x8_: + if(i==24) + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8_2(2); + } + else + { + DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT_8x8(2); + } + + +ONE_CONTEXT_NODE_0_8x8_: + DECODE_AND_APPLYSIGN(1); + Prob = coef_probs + ENTROPY_NODES; + + if (i==24) + { + if (c < 3)//15 + { + qcoeff_ptr [ scan[c] ] = (INT16) v; + ++c; + goto DO_WHILE_8x8; + } + } + else + { + if (c < 63) + { + qcoeff_ptr [ scan[c] ] = (INT16) v; + ++c; + goto DO_WHILE_8x8; + } + } + + if(i==24) + qcoeff_ptr [ scan[3] ] = (INT16) v;//15 + else + qcoeff_ptr [ scan[63] ] = (INT16) v; + + +BLOCK_FINISHED_8x8: + *a = *l = ((eobs[i] = c) != !type); // any nonzero data? + /*if (i!=24) { + *(A + vp8_block2above[i+1]) = *(A + vp8_block2above[i+2]) = *(A + vp8_block2above[i+3]) = *a; + *(L + vp8_block2left[i+1]) = *(L + vp8_block2left[i+2]) = *(L + vp8_block2left[i+3]) = *l; + }*/ + + if (i!=24) + { + if(i==0) + { + *(A + vp8_block2above[1]) = *(A + vp8_block2above[4]) = *(A + vp8_block2above[5]) = *a; + *(L + vp8_block2left[1]) = *(L + vp8_block2left[4]) = *(L + vp8_block2left[5]) = *l; + } + else if(i==4) + { + *(A + vp8_block2above[2]) = *(A + vp8_block2above[3]) = *(A + vp8_block2above[6]) = *(A + vp8_block2above[7]) = *a; + *(L + vp8_block2left[2]) = *(L + vp8_block2left[3]) = *(L + vp8_block2left[6]) = *(L + vp8_block2left[7]) = *l; + *(A + vp8_block2above[4]) = *(A + vp8_block2above[1]); + *(L + vp8_block2left[4]) = *(L + vp8_block2left[1]); + } + else if(i==8) + { + *(A + vp8_block2above[9]) = *(A + vp8_block2above[12]) = *(A + vp8_block2above[13]) = *a; + *(L + vp8_block2left[9]) = *(L + vp8_block2left[12]) = *(L + vp8_block2left[13]) = *l; + + } + else if(i==12) + { + *(A + vp8_block2above[10]) = *(A + vp8_block2above[11]) = *(A + vp8_block2above[14]) = *(A + vp8_block2above[15]) = *a; + *(L + vp8_block2left[10]) = *(L + vp8_block2left[11]) = *(L + vp8_block2left[14]) = *(L + vp8_block2left[15]) = *l; + *(A + vp8_block2above[12]) = *(A + vp8_block2above[8]); + *(L + vp8_block2left[12]) = *(L + vp8_block2left[8]); + + } + else + { + *(A + vp8_block2above[i+1]) = *(A + vp8_block2above[i+2]) = *(A + vp8_block2above[i+3]) = *a; + *(L + vp8_block2left[i+1]) = *(L + vp8_block2left[i+2]) = *(L + vp8_block2left[i+3]) = *l; + + } + } + + eobtotal += c; + qcoeff_ptr += (i==24 ? 16 : 64); + + i+=4; + + if (i < stop) + goto BLOCK_LOOP_8x8; + + if (i > 24) + { + type = 0; + i = 0; + stop = 16; + coef_probs = oc->fc.coef_probs_8x8 [type] [ 0 ] [0]; + qcoeff_ptr -= (24*16 + 16); + scan = vp8_default_zig_zag1d_8x8; + goto BLOCK_LOOP_8x8; + } + + if (i == 16) + { + type = 2; + coef_probs = oc->fc.coef_probs_8x8 [type] [ 0 ] [0]; + stop = 24; + goto BLOCK_LOOP_8x8; + } + + FILL + bc->user_buffer = bufptr; + bc->value = value; + bc->count = count; + bc->range = range; + + return eobtotal; + +} +#endif int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x) { ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)x->above_context; @@ -366,6 +804,7 @@ BLOCK_FINISHED: bc->value = value; bc->count = count; bc->range = range; + return eobtotal; } diff --git a/vp8/decoder/detokenize.h b/vp8/decoder/detokenize.h index 8640bda4c..c5305bb67 100644 --- a/vp8/decoder/detokenize.h +++ b/vp8/decoder/detokenize.h @@ -16,5 +16,8 @@ void vp8_reset_mb_tokens_context(MACROBLOCKD *x); int vp8_decode_mb_tokens(VP8D_COMP *, MACROBLOCKD *); +#if CONFIG_T8X8 +int vp8_decode_mb_tokens_8x8(VP8D_COMP *, MACROBLOCKD *); +#endif #endif /* DETOKENIZE_H */ diff --git a/vp8/decoder/generic/dsystemdependent.c b/vp8/decoder/generic/dsystemdependent.c index 2406deaaf..fc5fdb39b 100644 --- a/vp8/decoder/generic/dsystemdependent.c +++ b/vp8/decoder/generic/dsystemdependent.c @@ -21,6 +21,17 @@ void vp8_dmachine_specific_config(VP8D_COMP *pbi) /* Pure C: */ #if CONFIG_RUNTIME_CPU_DETECT pbi->mb.rtcd = &pbi->common.rtcd; + +#if CONFIG_T8X8 + + pbi->dequant.block_8x8 = vp8_dequantize_b_8x8_c; + pbi->dequant.idct_add_8x8 = vp8_dequant_idct_add_8x8_c; + pbi->dequant.dc_idct_add_8x8 = vp8_dequant_dc_idct_add_8x8_c; + pbi->dequant.dc_idct_add_y_block_8x8 = vp8_dequant_dc_idct_add_y_block_8x8_c; + pbi->dequant.idct_add_y_block_8x8 = vp8_dequant_idct_add_y_block_8x8_c; + pbi->dequant.idct_add_uv_block_8x8 = vp8_dequant_idct_add_uv_block_8x8_c; + +#endif pbi->dequant.block = vp8_dequantize_b_c; pbi->dequant.idct_add = vp8_dequant_idct_add_c; pbi->dequant.dc_idct_add = vp8_dequant_dc_idct_add_c; @@ -33,7 +44,16 @@ void vp8_dmachine_specific_config(VP8D_COMP *pbi) vp8_arch_x86_decode_init(pbi); #endif + #if ARCH_ARM vp8_arch_arm_decode_init(pbi); #endif + +#if CONFIG_EXTEND_QRANGE + pbi->dequant.idct_add = vp8_dequant_idct_add_c; + pbi->dequant.dc_idct_add = vp8_dequant_dc_idct_add_c; + pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_c; + pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_c; + pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_c; +#endif } diff --git a/vp8/decoder/idct_blk.c b/vp8/decoder/idct_blk.c index df0192354..2015d5255 100644 --- a/vp8/decoder/idct_blk.c +++ b/vp8/decoder/idct_blk.c @@ -122,3 +122,45 @@ void vp8_dequant_idct_add_uv_block_c dstv += 4*stride - 8; } } + +#if CONFIG_T8X8 +void vp8_dequant_dc_idct_add_y_block_8x8_c + (short *q, short *dq, unsigned char *pre, + unsigned char *dst, int stride, char *eobs, short *dc, MACROBLOCKD *xd) +{ + + vp8_dequant_dc_idct_add_8x8_c (q, dq, pre, dst, 16, stride, dc[0]); + vp8_dequant_dc_idct_add_8x8_c (&q[64], dq, pre+8, dst+8, 16, stride, dc[1]); + vp8_dequant_dc_idct_add_8x8_c (&q[128], dq, pre+8*16, dst+8*stride, 16, stride, dc[4]); + vp8_dequant_dc_idct_add_8x8_c (&q[192], dq, pre+8*16+8, dst+8*stride+8, 16, stride, dc[8]); + +} + +void vp8_dequant_idct_add_y_block_8x8_c + (short *q, short *dq, unsigned char *pre, + unsigned char *dst, int stride, char *eobs, MACROBLOCKD *xd) +{ + + + unsigned char *origdest = dst; + unsigned char *origpred = pre; + + vp8_dequant_idct_add_8x8_c (q, dq, pre, dst, 16, stride); + vp8_dequant_idct_add_8x8_c (&q[64], dq, origpred+8, origdest+8, 16, stride); + vp8_dequant_idct_add_8x8_c (&q[128], dq, origpred+8*16, origdest+8*stride, 16, stride); + vp8_dequant_idct_add_8x8_c (&q[192], dq, origpred+8*16+8, origdest+8*stride+8, 16, stride); + +} + +void vp8_dequant_idct_add_uv_block_8x8_c + (short *q, short *dq, unsigned char *pre, + unsigned char *dstu, unsigned char *dstv, int stride, char *eobs, MACROBLOCKD *xd) +{ + vp8_dequant_idct_add_8x8_c (q, dq, pre, dstu, 8, stride); + + q += 64; + pre += 64; + + vp8_dequant_idct_add_8x8_c (q, dq, pre, dstv, 8, stride); +} +#endif diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c index 829a675a7..7c84b6efb 100644 --- a/vp8/decoder/onyxd_if.c +++ b/vp8/decoder/onyxd_if.c @@ -43,6 +43,43 @@ extern void vp8cx_init_de_quantizer(VP8D_COMP *pbi); static int get_free_fb (VP8_COMMON *cm); static void ref_cnt_fb (int *buf, int *idx, int new_idx); +#if CONFIG_DEBUG +void vp8_recon_write_yuv_frame(char *name, YV12_BUFFER_CONFIG *s) +{ + FILE *yuv_file = fopen((char *)name, "ab"); + unsigned char *src = s->y_buffer; + int h = s->y_height; + + do + { + fwrite(src, s->y_width, 1, yuv_file); + src += s->y_stride; + } + while (--h); + + src = s->u_buffer; + h = s->uv_height; + + do + { + fwrite(src, s->uv_width, 1, yuv_file); + src += s->uv_stride; + } + while (--h); + + src = s->v_buffer; + h = s->uv_height; + + do + { + fwrite(src, s->uv_width, 1, yuv_file); + src += s->uv_stride; + } + while (--h); + + fclose(yuv_file); +} +#endif void vp8dx_initialize() { @@ -56,7 +93,6 @@ void vp8dx_initialize() } } - VP8D_PTR vp8dx_create_decompressor(VP8D_CONFIG *oxcf) { VP8D_COMP *pbi = vpx_memalign(32, sizeof(VP8D_COMP)); @@ -107,13 +143,17 @@ VP8D_PTR vp8dx_create_decompressor(VP8D_CONFIG *oxcf) return (VP8D_PTR) pbi; } - void vp8dx_remove_decompressor(VP8D_PTR ptr) { VP8D_COMP *pbi = (VP8D_COMP *) ptr; if (!pbi) return; +#if CONFIG_SEGMENTATION + // Delete sementation map + if (pbi->segmentation_map != 0) + vpx_free(pbi->segmentation_map); +#endif #if CONFIG_MULTITHREAD if (pbi->b_multithreaded_rd) @@ -288,6 +328,22 @@ static int swap_frame_buffers (VP8_COMMON *cm) return err; } +/* +static void vp8_print_yuv_rec_mb(VP8_COMMON *cm, int mb_row, int mb_col) +{ + YV12_BUFFER_CONFIG *s = cm->frame_to_show; + unsigned char *src = s->y_buffer; + int i, j; + + printf("After loop filter\n"); + for (i=0;i<16;i++) { + for (j=0;j<16;j++) + printf("%3d ", src[(mb_row*16+i)*s->y_stride + mb_col*16+j]); + printf("\n"); + } +} +*/ + int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsigned char *source, INT64 time_stamp) { #if HAVE_ARMV7 @@ -455,6 +511,9 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign vp8_yv12_extend_frame_borders_ptr(cm->frame_to_show); } +#if CONFIG_DEBUG + vp8_recon_write_yuv_frame("recon.yuv", cm->frame_to_show); +#endif vp8_clear_system_state(); diff --git a/vp8/decoder/onyxd_int.h b/vp8/decoder/onyxd_int.h index be6ffe6be..6309915ab 100644 --- a/vp8/decoder/onyxd_int.h +++ b/vp8/decoder/onyxd_int.h @@ -21,6 +21,8 @@ #include "ec_types.h" #endif +//#define DEC_DEBUG + typedef struct { int ithread; @@ -42,21 +44,35 @@ typedef struct int size; } DATARATE; +#if CONFIG_EXTEND_QRANGE typedef struct { - INT16 min_val; - INT16 Length; + INT16 min_val; + INT16 Length; + UINT8 Probs[14]; +} TOKENEXTRABITS; +#else +typedef struct +{ + INT16 min_val; + INT16 Length; UINT8 Probs[12]; } TOKENEXTRABITS; - +#endif typedef struct { int const *scan; +#if CONFIG_T8X8 + int const *scan_8x8; +#endif UINT8 const *ptr_block2leftabove; vp8_tree_index const *vp8_coef_tree_ptr; TOKENEXTRABITS const *teb_base_ptr; unsigned char *norm_ptr; UINT8 *ptr_coef_bands_x; +#if CONFIG_T8X8 + UINT8 *ptr_coef_bands_x_8x8; +#endif ENTROPY_CONTEXT_PLANES *A; ENTROPY_CONTEXT_PLANES *L; @@ -65,6 +81,9 @@ typedef struct BOOL_DECODER *current_bc; vp8_prob const *coef_probs[4]; +#if CONFIG_T8X8 + vp8_prob const *coef_probs_8x8[4]; +#endif UINT8 eob[25]; @@ -86,7 +105,9 @@ typedef struct VP8Decompressor const unsigned char *partitions[MAX_PARTITIONS]; unsigned int partition_sizes[MAX_PARTITIONS]; unsigned int num_partitions; - +#if CONFIG_SEGMENTATION + unsigned char *segmentation_map; +#endif #if CONFIG_MULTITHREAD /* variable for threading */ @@ -95,7 +116,6 @@ typedef struct VP8Decompressor int current_mb_col_main; int decoding_thread_count; int allocated_decoding_thread_count; - int mt_baseline_filter_level[MAX_MB_SEGMENTS]; int sync_range; int *mt_current_mb_col; /* Each row remembers its already decoded column. */ |