Commit d5413a8e authored by Dmitry Kovalev's avatar Dmitry Kovalev
Browse files

Adding select_txfm_size function + vp9_decode_frame cleanup.

Change-Id: I7594ca84106ee48f83e6fc3098c0de7a28d5a183
parent f12509f6
...@@ -116,6 +116,17 @@ static void set_segment_id(VP9_COMMON *cm, MB_MODE_INFO *mbmi, ...@@ -116,6 +116,17 @@ static void set_segment_id(VP9_COMMON *cm, MB_MODE_INFO *mbmi,
} }
} }
static TX_SIZE select_txfm_size(VP9_COMMON *cm, vp9_reader *r,
int allow_16x16, int allow_32x32) {
TX_SIZE txfm_size = vp9_read(r, cm->prob_tx[0]); // TX_4X4 or >TX_4X4
if (txfm_size != TX_4X4 && allow_16x16) {
txfm_size += vp9_read(r, cm->prob_tx[1]); // TX_8X8 or >TX_8X8
if (txfm_size != TX_8X8 && allow_32x32)
txfm_size += vp9_read(r, cm->prob_tx[2]); // TX_16X16 or >TX_16X16
}
return txfm_size;
}
extern const int vp9_i8x8_block[4]; extern const int vp9_i8x8_block[4];
static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
int mb_row, int mb_col, int mb_row, int mb_col,
...@@ -174,15 +185,11 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, ...@@ -174,15 +185,11 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
} }
if (cm->txfm_mode == TX_MODE_SELECT && if (cm->txfm_mode == TX_MODE_SELECT &&
m->mbmi.mb_skip_coeff == 0 && !m->mbmi.mb_skip_coeff &&
m->mbmi.mode <= I8X8_PRED) { m->mbmi.mode <= I8X8_PRED) {
// FIXME(rbultje) code ternary symbol once all experiments are merged const int allow_16x16 = m->mbmi.mode != I8X8_PRED;
m->mbmi.txfm_size = vp9_read(r, cm->prob_tx[0]); const int allow_32x32 = m->mbmi.sb_type >= BLOCK_SIZE_SB32X32;
if (m->mbmi.txfm_size != TX_4X4 && m->mbmi.mode != I8X8_PRED) { m->mbmi.txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32);
m->mbmi.txfm_size += vp9_read(r, cm->prob_tx[1]);
if (m->mbmi.txfm_size != TX_8X8 && m->mbmi.sb_type >= BLOCK_SIZE_SB32X32)
m->mbmi.txfm_size += vp9_read(r, cm->prob_tx[2]);
}
} else if (cm->txfm_mode >= ALLOW_32X32 && } else if (cm->txfm_mode >= ALLOW_32X32 &&
m->mbmi.sb_type >= BLOCK_SIZE_SB32X32) { m->mbmi.sb_type >= BLOCK_SIZE_SB32X32) {
m->mbmi.txfm_size = TX_32X32; m->mbmi.txfm_size = TX_32X32;
...@@ -195,6 +202,7 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, ...@@ -195,6 +202,7 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
} }
} }
static int read_nmv_component(vp9_reader *r, static int read_nmv_component(vp9_reader *r,
int rv, int rv,
const nmv_component *mvcomp) { const nmv_component *mvcomp) {
...@@ -981,14 +989,9 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, ...@@ -981,14 +989,9 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
((mbmi->ref_frame == INTRA_FRAME && mbmi->mode <= I8X8_PRED) || ((mbmi->ref_frame == INTRA_FRAME && mbmi->mode <= I8X8_PRED) ||
(mbmi->ref_frame != INTRA_FRAME && !(mbmi->mode == SPLITMV && (mbmi->ref_frame != INTRA_FRAME && !(mbmi->mode == SPLITMV &&
mbmi->partitioning == PARTITIONING_4X4)))) { mbmi->partitioning == PARTITIONING_4X4)))) {
// FIXME(rbultje) code ternary symbol once all experiments are merged const int allow_16x16 = mbmi->mode != I8X8_PRED && mbmi->mode != SPLITMV;
mbmi->txfm_size = vp9_read(r, cm->prob_tx[0]); const int allow_32x32 = mbmi->sb_type >= BLOCK_SIZE_SB32X32;
if (mbmi->txfm_size != TX_4X4 && mbmi->mode != I8X8_PRED && mbmi->txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32);
mbmi->mode != SPLITMV) {
mbmi->txfm_size += vp9_read(r, cm->prob_tx[1]);
if (mbmi->sb_type >= BLOCK_SIZE_SB32X32 && mbmi->txfm_size != TX_8X8)
mbmi->txfm_size += vp9_read(r, cm->prob_tx[2]);
}
} else if (mbmi->sb_type >= BLOCK_SIZE_SB32X32 && } else if (mbmi->sb_type >= BLOCK_SIZE_SB32X32 &&
cm->txfm_mode >= ALLOW_32X32) { cm->txfm_mode >= ALLOW_32X32) {
mbmi->txfm_size = TX_32X32; mbmi->txfm_size = TX_32X32;
......
...@@ -771,11 +771,6 @@ static int get_delta_q(vp9_reader *r, int *dq) { ...@@ -771,11 +771,6 @@ static int get_delta_q(vp9_reader *r, int *dq) {
return old_value != *dq; return old_value != *dq;
} }
#ifdef PACKET_TESTING
#include <stdio.h>
FILE *vpxlog = 0;
#endif
static void set_offsets(VP9D_COMP *pbi, BLOCK_SIZE_TYPE bsize, static void set_offsets(VP9D_COMP *pbi, BLOCK_SIZE_TYPE bsize,
int mb_row, int mb_col) { int mb_row, int mb_col) {
const int bh = 1 << mb_height_log2(bsize); const int bh = 1 << mb_height_log2(bsize);
...@@ -1001,7 +996,7 @@ static void read_zpc_probs_common(VP9_COMMON *cm, ...@@ -1001,7 +996,7 @@ static void read_zpc_probs_common(VP9_COMMON *cm,
static void read_zpc_probs(VP9_COMMON *cm, static void read_zpc_probs(VP9_COMMON *cm,
vp9_reader* bc) { vp9_reader* bc) {
read_zpc_probs_common(cm, bc, TX_4X4); read_zpc_probs_common(cm, bc, TX_4X4);
if (cm->txfm_mode != ONLY_4X4) if (cm->txfm_mode > ONLY_4X4)
read_zpc_probs_common(cm, bc, TX_8X8); read_zpc_probs_common(cm, bc, TX_8X8);
if (cm->txfm_mode > ALLOW_8X8) if (cm->txfm_mode > ALLOW_8X8)
read_zpc_probs_common(cm, bc, TX_16X16); read_zpc_probs_common(cm, bc, TX_16X16);
...@@ -1055,7 +1050,7 @@ static void read_coef_probs(VP9D_COMP *pbi, vp9_reader *r) { ...@@ -1055,7 +1050,7 @@ static void read_coef_probs(VP9D_COMP *pbi, vp9_reader *r) {
read_coef_probs_common(pbi, r, fc->coef_probs_4x4, TX_4X4); read_coef_probs_common(pbi, r, fc->coef_probs_4x4, TX_4X4);
if (mode != ONLY_4X4) if (mode > ONLY_4X4)
read_coef_probs_common(pbi, r, fc->coef_probs_8x8, TX_8X8); read_coef_probs_common(pbi, r, fc->coef_probs_8x8, TX_8X8);
if (mode > ALLOW_8X8) if (mode > ALLOW_8X8)
...@@ -1421,7 +1416,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { ...@@ -1421,7 +1416,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
const uint8_t *data = pbi->source; const uint8_t *data = pbi->source;
const uint8_t *data_end = data + pbi->source_sz; const uint8_t *data_end = data + pbi->source_sz;
size_t first_partition_size = 0; size_t first_partition_size = 0;
int i, corrupt_tokens = 0; int i;
// printf("Decoding frame %d\n", pc->current_video_frame); // printf("Decoding frame %d\n", pc->current_video_frame);
...@@ -1571,16 +1566,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { ...@@ -1571,16 +1566,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
} }
#endif #endif
if (0) {
FILE *z = fopen("decodestats.stt", "a");
fprintf(z, "%6d F:%d,R:%d,Q:%d\n",
pc->current_video_frame,
pc->frame_type,
pbi->refresh_frame_flags,
pc->base_qindex);
fclose(z);
}
update_frame_context(pbi); update_frame_context(pbi);
read_coef_probs(pbi, &header_bc); read_coef_probs(pbi, &header_bc);
...@@ -1614,7 +1599,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { ...@@ -1614,7 +1599,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
vp9_decode_mode_mvs_init(pbi, &header_bc); vp9_decode_mode_mvs_init(pbi, &header_bc);
decode_tiles(pbi, data, first_partition_size, &header_bc, &residual_bc); decode_tiles(pbi, data, first_partition_size, &header_bc, &residual_bc);
corrupt_tokens |= xd->corrupted;
// keep track of the last coded dimensions // keep track of the last coded dimensions
pc->last_width = pc->width; pc->last_width = pc->width;
...@@ -1624,7 +1608,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { ...@@ -1624,7 +1608,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
// 1. Check first boolean decoder for errors. // 1. Check first boolean decoder for errors.
// 2. Check the macroblock information // 2. Check the macroblock information
pc->yv12_fb[pc->new_fb_idx].corrupted = vp9_reader_has_error(&header_bc) | pc->yv12_fb[pc->new_fb_idx].corrupted = vp9_reader_has_error(&header_bc) |
corrupt_tokens; xd->corrupted;
if (!pbi->decoded_key_frame) { if (!pbi->decoded_key_frame) {
if (pc->frame_type == KEY_FRAME && !pc->yv12_fb[pc->new_fb_idx].corrupted) if (pc->frame_type == KEY_FRAME && !pc->yv12_fb[pc->new_fb_idx].corrupted)
...@@ -1634,15 +1618,13 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { ...@@ -1634,15 +1618,13 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
"A stream must start with a complete key frame"); "A stream must start with a complete key frame");
} }
// Adaptation
if (!pc->error_resilient_mode && !pc->frame_parallel_decoding_mode) { if (!pc->error_resilient_mode && !pc->frame_parallel_decoding_mode) {
vp9_adapt_coef_probs(pc); vp9_adapt_coef_probs(pc);
#if CONFIG_CODE_ZEROGROUP #if CONFIG_CODE_ZEROGROUP
vp9_adapt_zpc_probs(pc); vp9_adapt_zpc_probs(pc);
#endif #endif
} if (pc->frame_type != KEY_FRAME) {
if (pc->frame_type != KEY_FRAME) {
if (!pc->error_resilient_mode && !pc->frame_parallel_decoding_mode) {
vp9_adapt_mode_probs(pc); vp9_adapt_mode_probs(pc);
vp9_adapt_nmv_probs(pc, xd->allow_high_precision_mv); vp9_adapt_nmv_probs(pc, xd->allow_high_precision_mv);
vp9_adapt_mode_context(&pbi->common); vp9_adapt_mode_context(&pbi->common);
...@@ -1654,16 +1636,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { ...@@ -1654,16 +1636,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
sizeof(pc->fc)); sizeof(pc->fc));
} }
#ifdef PACKET_TESTING
{
FILE *f = fopen("decompressor.VP8", "ab");
unsigned int size = residual_bc.pos + header_bc.pos + 8;
fwrite((void *) &size, 4, 1, f);
fwrite((void *) pbi->Source, size, 1, f);
fclose(f);
}
#endif
*p_data_end = vp9_reader_find_end(&residual_bc); *p_data_end = vp9_reader_find_end(&residual_bc);
return 0; return 0;
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment