summaryrefslogtreecommitdiff
path: root/vp8/encoder
diff options
context:
space:
mode:
authorMarco Paniconi <marpan@google.com>2012-09-21 18:54:11 -0700
committerMarco Paniconi <marpan@google.com>2012-09-21 18:57:30 -0700
commit5979b89b9246b83fab71c77296b54a31686c8df9 (patch)
tree4ec1798aebe1ec15ee2a09cfc07c4d6c7b811d63 /vp8/encoder
parente278673c8eae8993eaec30d50e0dd5b25cbacd4a (diff)
downloadlibvpx-5979b89b9246b83fab71c77296b54a31686c8df9.tar
libvpx-5979b89b9246b83fab71c77296b54a31686c8df9.tar.gz
libvpx-5979b89b9246b83fab71c77296b54a31686c8df9.tar.bz2
libvpx-5979b89b9246b83fab71c77296b54a31686c8df9.zip
Update to cyclic refresh.
-Increase the amount of mbs to be refreshed. -Replace the delta qp with a fixed and reduced delta. -Change to the mb update loop to try to always update same amount of mbs. Change-Id: I93ac88002fd8dc677d2337f77998ff93f64e4ff9
Diffstat (limited to 'vp8/encoder')
-rw-r--r--vp8/encoder/onyx_if.c82
1 files changed, 28 insertions, 54 deletions
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 488558791..a8929133c 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -450,72 +450,51 @@ static void segmentation_test_function(VP8_COMP *cpi)
/* A simple function to cyclically refresh the background at a lower Q */
static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
{
- unsigned char *seg_map;
+ unsigned char *seg_map = cpi->segmentation_map;
signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
int i;
int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
- /* Create a temporary map for segmentation data. */
- CHECK_MEM_ERROR(seg_map, vpx_calloc(cpi->common.mb_rows * cpi->common.mb_cols, 1));
-
- cpi->cyclic_refresh_q = Q;
-
- for (i = Q; i > 0; i--)
- {
- if (vp8_bits_per_mb[cpi->common.frame_type][i] >= ((vp8_bits_per_mb[cpi->common.frame_type][Q]*(Q + 128)) / 64))
- {
- break;
- }
- }
+ cpi->cyclic_refresh_q = Q / 2;
- cpi->cyclic_refresh_q = i;
-
- /* Only update for inter frames */
if (cpi->common.frame_type != KEY_FRAME)
{
+ // set every macroblock to eligible for update
+ vpx_memset(cpi->segmentation_map, 0, mbs_in_frame);
+
/* Cycle through the macro_block rows */
/* MB loop to set local segmentation map */
- for (i = cpi->cyclic_refresh_mode_index; i < mbs_in_frame; i++)
+ i = cpi->cyclic_refresh_mode_index;
+ do
{
- /* If the MB is as a candidate for clean up then mark it for
- * possible boost/refresh (segment 1) The segment id may get
- * reset to 0 later if the MB gets coded anything other than
- * last frame 0,0 as only (last frame 0,0) MBs are eligable for
- * refresh : that is to say Mbs likely to be background blocks.
- */
- if (cpi->cyclic_refresh_map[i] == 0)
- {
- seg_map[i] = 1;
- }
- else
- {
- seg_map[i] = 0;
-
- /* Skip blocks that have been refreshed recently anyway. */
- if (cpi->cyclic_refresh_map[i] < 0)
- cpi->cyclic_refresh_map[i]++;
- }
-
-
- if (block_count > 0)
- block_count--;
- else
- break;
+ /* If the MB is as a candidate for clean up then mark it for
+ * possible boost/refresh (segment 1) The segment id may get
+ * reset to 0 later if the MB gets coded anything other than
+ * last frame 0,0 as only (last frame 0,0) MBs are eligable for
+ * refresh : that is to say Mbs likely to be background blocks.
+ */
+ if (cpi->cyclic_refresh_map[i] == 0)
+ {
+ seg_map[i] = 1;
+ block_count --;
+ }
+ else if (cpi->cyclic_refresh_map[i] < 0)
+ cpi->cyclic_refresh_map[i]++;
+
+ i++;
+ if (i == mbs_in_frame)
+ i = 0;
}
+ while(block_count && i != cpi->cyclic_refresh_mode_index);
- /* If we have gone through the frame reset to the start */
cpi->cyclic_refresh_mode_index = i;
-
- if (cpi->cyclic_refresh_mode_index >= mbs_in_frame)
- cpi->cyclic_refresh_mode_index = 0;
}
- /* Set the segmentation Map */
- set_segmentation_map(cpi, seg_map);
-
/* Activate segmentation. */
+ cpi->mb.e_mbd.update_mb_segmentation_map = 1;
+ cpi->mb.e_mbd.update_mb_segmentation_data = 1;
enable_segmentation(cpi);
/* Set up the quant segment data */
@@ -533,11 +512,6 @@ static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment)
/* Initialise the feature data structure */
set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
- /* Delete sementation map */
- vpx_free(seg_map);
-
- seg_map = 0;
-
}
static void set_default_lf_deltas(VP8_COMP *cpi)
@@ -1828,7 +1802,7 @@ struct VP8_COMP* vp8_create_compressor(VP8_CONFIG *oxcf)
* Currently this is tied to error resilliant mode
*/
cpi->cyclic_refresh_mode_enabled = cpi->oxcf.error_resilient_mode;
- cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 40;
+ cpi->cyclic_refresh_mode_max_mbs_perframe = (cpi->common.mb_rows * cpi->common.mb_cols) / 5;
cpi->cyclic_refresh_mode_index = 0;
cpi->cyclic_refresh_q = 32;