Commit c9130bdb authored by Paul Wilkins's avatar Paul Wilkins
Browse files

Segmentation experiment:

Added last_segmentation_map[] structure
to keep track of what we had before when
doing temporal prediction. With this change
the existing code does once again appear to
be giving a decodable bitstream for both
temporal and standard prediction modes.
However, it is still somewhat messy and
confused and there is no option to take
advantage of spatial prediction so it could
do with further work.

Some housekeeping / clean out.

Change-Id: I368258243f82127b81d8dffa7ada615208513b47
parent bf25d4ad
......@@ -28,10 +28,6 @@
//#if CONFIG_SEGFEATURES
#include "vp8/common/seg_common.h"
#if CONFIG_SEGMENTATION
static int segment_cost = 0;
#endif
const int vp8cx_base_skip_false_prob[128] =
{
255, 255, 255, 255, 255, 255, 255, 255,
......@@ -837,39 +833,24 @@ static void write_mb_segid(vp8_writer *w,
case 0:
vp8_write(w, 0, x->mb_segment_tree_probs[0]);
vp8_write(w, 0, x->mb_segment_tree_probs[1]);
#if CONFIG_SEGMENTATION
segment_cost += vp8_cost_zero(x->mb_segment_tree_probs[0]) + vp8_cost_zero(x->mb_segment_tree_probs[1]);
#endif
break;
case 1:
vp8_write(w, 0, x->mb_segment_tree_probs[0]);
vp8_write(w, 1, x->mb_segment_tree_probs[1]);
#if CONFIG_SEGMENTATION
segment_cost += vp8_cost_zero(x->mb_segment_tree_probs[0]) + vp8_cost_one(x->mb_segment_tree_probs[1]);
#endif
break;
case 2:
vp8_write(w, 1, x->mb_segment_tree_probs[0]);
vp8_write(w, 0, x->mb_segment_tree_probs[2]);
#if CONFIG_SEGMENTATION
segment_cost += vp8_cost_one(x->mb_segment_tree_probs[0]) + vp8_cost_zero(x->mb_segment_tree_probs[2]);
#endif
break;
case 3:
vp8_write(w, 1, x->mb_segment_tree_probs[0]);
vp8_write(w, 1, x->mb_segment_tree_probs[2]);
#if CONFIG_SEGMENTATION
segment_cost += vp8_cost_one(x->mb_segment_tree_probs[0]) + vp8_cost_one(x->mb_segment_tree_probs[2]);
#endif
break;
// TRAP.. This should not happen
default:
vp8_write(w, 0, x->mb_segment_tree_probs[0]);
vp8_write(w, 0, x->mb_segment_tree_probs[1]);
#if CONFIG_SEGMENTATION
segment_cost += vp8_cost_zero(x->mb_segment_tree_probs[0]) + vp8_cost_zero(x->mb_segment_tree_probs[1]);
#endif
break;
}
}
......@@ -963,7 +944,6 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
const MV_CONTEXT *mvc = pc->fc.mvc;
MACROBLOCKD *xd = &cpi->mb.e_mbd;
#if CONFIG_SEGMENTATION
int left_id, above_id;
int i;
int sum;
int index = 0;
......@@ -1058,10 +1038,6 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
// Make sure the MacroBlockD mode info pointer is set correctly
xd->mode_info_context = m;
#if CONFIG_SEGMENTATION
xd->up_available = (mb_row != 0);
xd->left_available = (mb_col != 0);
#endif
#ifdef ENTROPY_STATS
active_section = 9;
#endif
......@@ -1085,12 +1061,10 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
if (m->mbmi.segment_flag == 0)
{
vp8_write(w,0,xd->mb_segment_tree_probs[3+sum]);
segment_cost += vp8_cost_zero(xd->mb_segment_tree_probs[3+sum]);
}
else
{
vp8_write(w,1,xd->mb_segment_tree_probs[3+sum]);
segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[3+sum]);
write_mb_segid(w, mi, &cpi->mb.e_mbd);
cpi->segmentation_map[index] = segment_id;
}
......@@ -1248,7 +1222,6 @@ static void write_kfmodes(VP8_COMP *cpi)
/* const */
MODE_INFO *m = c->mi;
#if CONFIG_SEGMENTATION
int left_id, above_id;
int i;
int index = 0;
#endif
......@@ -1295,11 +1268,6 @@ static void write_kfmodes(VP8_COMP *cpi)
const int ym = m->mbmi.mode;
int segment_id = m->mbmi.segment_id;
#if CONFIG_SEGMENTATION
MACROBLOCKD *xd = &cpi->mb.e_mbd;
xd->up_available = (mb_row != 0);
xd->left_available = (mb_col != 0);
#endif
#ifdef MODE_STATS
#if CONFIG_SEGMENTATION
segment_modes_intra[segment_id]++;
......@@ -1309,7 +1277,6 @@ static void write_kfmodes(VP8_COMP *cpi)
if (cpi->mb.e_mbd.update_mb_segmentation_map)
{
#if CONFIG_SEGMENTATION
write_mb_segid(bc, &m->mbmi, &cpi->mb.e_mbd);
cpi->segmentation_map[index] = segment_id;
index++;
......
......@@ -579,7 +579,6 @@ void encode_mb_row(VP8_COMP *cpi,
int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride;
int map_index = (mb_row * cpi->common.mb_cols);
#if CONFIG_SEGMENTATION
int left_id, above_id;
int sum;
#endif
#if CONFIG_MULTITHREAD
......@@ -783,8 +782,11 @@ void encode_mb_row(VP8_COMP *cpi,
if (mb_row != 0)
sum += (xd->mode_info_context-cm->mb_cols)->mbmi.segment_flag;
if (xd->mode_info_context->mbmi.segment_id == cpi->segmentation_map[(mb_row*cm->mb_cols) + mb_col])
if ( xd->mode_info_context->mbmi.segment_id ==
cpi->last_segmentation_map[(mb_row*cm->mb_cols) + mb_col] )
{
xd->mode_info_context->mbmi.segment_flag = 0;
}
else
xd->mode_info_context->mbmi.segment_flag = 1;
......@@ -1129,15 +1131,16 @@ void vp8_encode_frame(VP8_COMP *cpi)
}
// Work out the segment probabilites if segmentation is enabled
if (xd->segmentation_enabled)
// Work out the segment probabilites if segmentation is enabled and
// the map is due to be updated
if (xd->segmentation_enabled && xd->update_mb_segmentation_map)
{
int tot_count;
int i;
int count1,count2,count3,count4;
// Set to defaults
vpx_memset(xd->mb_segment_tree_probs, 255 , sizeof(xd->mb_segment_tree_probs));
vpx_memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs));
#if CONFIG_SEGMENTATION
// Select the coding strategy for the segment map (temporal or spatial)
......
......@@ -367,6 +367,9 @@ static void dealloc_compressor_data(VP8_COMP *cpi)
// Delete sementation map
vpx_free(cpi->segmentation_map);
#if CONFIG_SEGMENTATION
vpx_free(cpi->last_segmentation_map);
#endif
cpi->segmentation_map = 0;
vpx_free(cpi->active_map);
......@@ -2124,6 +2127,13 @@ VP8_PTR vp8_create_compressor(VP8_CONFIG *oxcf)
// Create the encoder segmentation map and set all entries to 0
CHECK_MEM_ERROR(cpi->segmentation_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
#if CONFIG_SEGMENTATION
// And a copy "last_segmentation_map" for temporal coding
CHECK_MEM_ERROR(cpi->last_segmentation_map,
vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
#endif
CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
vpx_memset(cpi->active_map , 1, (cpi->common.mb_rows * cpi->common.mb_cols));
cpi->active_map_enabled = 0;
......@@ -4799,6 +4809,16 @@ static void encode_frame_to_data_rate
cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
}
// Take a copy of the segment map if it changed for future comparison
#if CONFIG_SEGMENTATION
if ( cpi->mb.e_mbd.segmentation_enabled &&
cpi->mb.e_mbd.update_mb_segmentation_map )
{
vpx_memcpy( cpi->last_segmentation_map,
cpi->segmentation_map, cm->MBs );
}
#endif
// Clear the one shot update flags for segmentation map and mode/ref loop filter deltas.
cpi->mb.e_mbd.update_mb_segmentation_map = 0;
cpi->mb.e_mbd.update_mb_segmentation_data = 0;
......
......@@ -516,6 +516,9 @@ typedef struct VP8_COMP
#endif
unsigned char *segmentation_map;
#if CONFIG_SEGMENTATION
unsigned char *last_segmentation_map;
#endif
// segment threashold for encode breakout
int segment_encode_breakout[MAX_MB_SEGMENTS];
......
......@@ -234,9 +234,5 @@ void choose_segmap_coding_method( VP8_COMP *cpi,
xd->mb_segment_tree_probs[1] = prob[1];
xd->mb_segment_tree_probs[2] = prob[2];
}
// ***** TODO
// PGW temp test code fix value as spatial
xd->temporal_update = 0;
}
#endif
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