From 07892531256d4cce9ee2f0e18f0234e5b4752bf2 Mon Sep 17 00:00:00 2001 From: Paul Wilkins Date: Wed, 9 Nov 2011 14:05:28 +0000 Subject: [PATCH] T8x8 experiment merge. For ease of testing and merging experiments I have removed in line code in encode_frame() that assigns MBs to be t8x8 or t4x4 coded segments and have moved the decision point and segment setup to the init_seg_features0 test function. Keeping everything in one place helps make sure for now that experiments using segmentation are not fighting each other. Also made sure mode selection code can't choose 4x4 modes if t8x8 is selected. Patch2: In init_seg_features() add checks for SEG_LVL_TRANSFORM active. Change-Id: Ia1767edd99b78510011d4251539f9bc325842e3a --- vp8/encoder/encodeframe.c | 33 +++--------------------------- vp8/encoder/onyx_if.c | 51 +++++++++++++++++++++++++++++------------------ vp8/encoder/pickinter.c | 6 ++++++ vp8/encoder/rdopt.c | 6 ++++++ 4 files changed, 47 insertions(+), 49 deletions(-) diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c index 031e63a..b24b396 100644 --- a/vp8/encoder/encodeframe.c +++ b/vp8/encoder/encodeframe.c @@ -674,25 +674,19 @@ void encode_mb_row(VP8_COMP *cpi, vp8_activity_masking(cpi, x); // Is segmentation enabled - // MB level adjutment to quantizer if (xd->segmentation_enabled) { - // Code to set segment id in xd->mbmi.segment_id for current MB (with range checking) -#if CONFIG_T8X8 - // Reset segment_id to 0 or 1 so that the default transform mode is 4x4 - if (cpi->segmentation_map[map_index+mb_col] <= 3) - xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[map_index+mb_col]&1; -#else + // Code to set segment id in xd->mbmi.segment_id if (cpi->segmentation_map[map_index+mb_col] <= 3) xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[map_index+mb_col]; -#endif else xd->mode_info_context->mbmi.segment_id = 0; vp8cx_mb_init_quantizer(cpi, x); } else - xd->mode_info_context->mbmi.segment_id = 0; // Set to Segment 0 by default + // Set to Segment 0 by default + xd->mode_info_context->mbmi.segment_id = 0; x->active_ptr = cpi->active_map + map_index + mb_col; @@ -1522,10 +1516,6 @@ int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) { int rate; -#if CONFIG_T8X8 - if (x->e_mbd.segmentation_enabled) - x->e_mbd.update_mb_segmentation_map = 1; -#endif if (cpi->sf.RD && cpi->compressor_speed != 2) vp8_rd_pick_intra_mode(cpi, x, &rate); else @@ -1549,10 +1539,6 @@ int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x); else { -#if CONFIG_T8X8 - if (x->e_mbd.segmentation_enabled) - x->e_mbd.mode_info_context->mbmi.segment_id |= (vp8_8x8_selection_intra(x) << 1); -#endif vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x); } #if CONFIG_I8X8 @@ -1729,11 +1715,6 @@ int vp8cx_encode_inter_macroblock cpi->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame]++; } -#if CONFIG_T8X8 - if (xd->segmentation_enabled) - x->e_mbd.update_mb_segmentation_map = 1; -#endif - if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) { if (xd->mode_info_context->mbmi.mode == B_PRED) @@ -1743,10 +1724,6 @@ int vp8cx_encode_inter_macroblock } else { -#if CONFIG_T8X8 - if (xd->segmentation_enabled) - *segment_id |= (vp8_8x8_selection_intra(x) << 1); -#endif vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x); vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x); } @@ -1756,10 +1733,6 @@ int vp8cx_encode_inter_macroblock else { int ref_fb_idx; -#if CONFIG_T8X8 - if (xd->segmentation_enabled) - *segment_id |= (vp8_8x8_selection_inter(x) << 1); -#endif if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) ref_fb_idx = cpi->common.lst_fb_idx; diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 05cb424..c98c980 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -488,19 +488,6 @@ static void init_seg_features(VP8_COMP *cpi) return; } -#if CONFIG_T8X8 - // TODO - // For now 8x8TX mode just set segments up for 8x8 and 4x4 modes and exit. - enable_segfeature(xd, 0, SEG_LVL_TRANSFORM); - set_segdata( xd, 0, SEG_LVL_TRANSFORM, TX_4X4 ); - enable_segfeature(xd, 2, SEG_LVL_TRANSFORM); - set_segdata( xd, 2, SEG_LVL_TRANSFORM, TX_8X8 ); - - // Turn on segmentation - vp8_enable_segmentation((VP8_PTR)cpi); - return; -#endif - // Disable and clear down for KF if ( cm->frame_type == KEY_FRAME ) { @@ -547,6 +534,16 @@ static void init_seg_features(VP8_COMP *cpi) // Where relevant assume segment data is delta data xd->mb_segement_abs_delta = SEGMENT_DELTADATA; + +#if CONFIG_T8X8 + // 8x8TX test code. + // This assignment does not necessarily make sense but is + // just to test the mechanism for now. + enable_segfeature(xd, 0, SEG_LVL_TRANSFORM); + set_segdata( xd, 0, SEG_LVL_TRANSFORM, TX_4X4 ); + enable_segfeature(xd, 1, SEG_LVL_TRANSFORM); + set_segdata( xd, 1, SEG_LVL_TRANSFORM, TX_8X8 ); +#endif } } @@ -577,8 +574,13 @@ static void init_seg_features(VP8_COMP *cpi) set_segdata( xd, 1, SEG_LVL_MODE, ZEROMV ); enable_segfeature(xd, 1, SEG_LVL_MODE); - set_segdata( xd, 1, SEG_LVL_EOB, 0 ); - enable_segfeature(xd, 1, SEG_LVL_EOB); + if ( !segfeature_active( xd, 1, SEG_LVL_TRANSFORM ) || + get_seg_tx_type( xd, 1 ) == TX_4X4 ) + { + // EOB segment coding not fixed for 8x8 yet + set_segdata( xd, 1, SEG_LVL_EOB, 0 ); + enable_segfeature(xd, 1, SEG_LVL_EOB); + } } } @@ -617,10 +619,21 @@ static void init_seg_features(VP8_COMP *cpi) // Skip all MBs if high Q if ( high_q ) { - enable_segfeature(xd, 0, SEG_LVL_EOB); - enable_segfeature(xd, 1, SEG_LVL_EOB); - set_segdata( xd, 0, SEG_LVL_EOB, 0 ); - set_segdata( xd, 1, SEG_LVL_EOB, 0 ); + // EOB segment coding not fixed for 8x8 yet + if ( !segfeature_active( xd, 0, SEG_LVL_TRANSFORM ) || + get_seg_tx_type( xd, 0 ) == TX_4X4 ) + { + enable_segfeature(xd, 0, SEG_LVL_EOB); + set_segdata( xd, 0, SEG_LVL_EOB, 0 ); + } + + // EOB segment coding not fixed for 8x8 yet + if ( !segfeature_active( xd, 1, SEG_LVL_TRANSFORM ) || + get_seg_tx_type( xd, 1 ) == TX_4X4 ) + { + enable_segfeature(xd, 1, SEG_LVL_EOB); + set_segdata( xd, 1, SEG_LVL_EOB, 0 ); + } } // Enable data udpate diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c index 71c2a14..4d8c0b9 100644 --- a/vp8/encoder/pickinter.c +++ b/vp8/encoder/pickinter.c @@ -539,6 +539,12 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, { continue; } + // No 4x4 modes if segment flagged as 8x8 + else if ( ( get_seg_tx_type( xd, segment_id ) == TX_8X8 ) && + ( (this_mode == B_PRED) || (this_mode == SPLITMV) ) ) + { + continue; + } //#if !CONFIG_SEGFEATURES // Disable this drop out case if either the mode or ref frame // segment level feature is enabled for this segment. This is to diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index 3941474..688451f 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -2146,6 +2146,12 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int { continue; } + // No 4x4 modes if segment flagged as 8x8 + else if ( ( get_seg_tx_type( xd, segment_id ) == TX_8X8 ) && + ( (this_mode == B_PRED) || (this_mode == SPLITMV) ) ) + { + continue; + } //#if !CONFIG_SEGFEATURES // Disable this drop out case if either the mode or ref frame // segment level feature is enabled for this segment. This is to -- 2.7.4