Encapsulating CYCLIC_REFRESH struct into .c file.
Change-Id: I32695ad703dcbbbbf5f122b403f3d3120a0be366
This commit is contained in:
Родитель
2ec04d1f84
Коммит
fc25e4dc52
|
@ -19,6 +19,51 @@
|
|||
#include "vp9/encoder/vp9_rdopt.h"
|
||||
#include "vp9/encoder/vp9_segmentation.h"
|
||||
|
||||
struct CYCLIC_REFRESH {
|
||||
// Target percentage of blocks per frame that are cyclicly refreshed.
|
||||
int max_mbs_perframe;
|
||||
// Maximum q-delta as percentage of base q.
|
||||
int max_qdelta_perc;
|
||||
// Block size below which we don't apply cyclic refresh.
|
||||
BLOCK_SIZE min_block_size;
|
||||
// Macroblock starting index (unit of 8x8) for cycling through the frame.
|
||||
int mb_index;
|
||||
// Controls how long a block will need to wait to be refreshed again.
|
||||
int time_for_refresh;
|
||||
// Actual number of blocks that were applied delta-q (segment 1).
|
||||
int num_seg_blocks;
|
||||
// Actual encoding bits for segment 1.
|
||||
int actual_seg_bits;
|
||||
// RD mult. parameters for segment 1.
|
||||
int rdmult;
|
||||
// Cyclic refresh map.
|
||||
signed char *map;
|
||||
// Projected rate and distortion for the current superblock.
|
||||
int64_t projected_rate_sb;
|
||||
int64_t projected_dist_sb;
|
||||
// Thresholds applied to projected rate/distortion of the superblock.
|
||||
int64_t thresh_rate_sb;
|
||||
int64_t thresh_dist_sb;
|
||||
};
|
||||
|
||||
CYCLIC_REFRESH *vp9_cyclic_refresh_alloc(int mi_rows, int mi_cols) {
|
||||
CYCLIC_REFRESH *const cr = vpx_calloc(1, sizeof(*cr));
|
||||
if (cr == NULL)
|
||||
return NULL;
|
||||
|
||||
cr->map = vpx_calloc(mi_rows * mi_cols, sizeof(*cr->map));
|
||||
if (cr->map == NULL) {
|
||||
vpx_free(cr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return cr;
|
||||
}
|
||||
|
||||
void vp9_cyclic_refresh_free(CYCLIC_REFRESH *cr) {
|
||||
vpx_free(cr->map);
|
||||
vpx_free(cr);
|
||||
}
|
||||
|
||||
// Check if we should turn off cyclic refresh based on bitrate condition.
|
||||
static int apply_cyclic_refresh_bitrate(const VP9_COMMON *cm,
|
||||
|
@ -73,14 +118,12 @@ static int candidate_refresh_aq(const CYCLIC_REFRESH *cr,
|
|||
// Prior to coding a given prediction block, of size bsize at (mi_row, mi_col),
|
||||
// check if we should reset the segment_id, and update the cyclic_refresh map
|
||||
// and segmentation map.
|
||||
void vp9_update_segment_aq(VP9_COMP *const cpi,
|
||||
MB_MODE_INFO *const mbmi,
|
||||
int mi_row,
|
||||
int mi_col,
|
||||
BLOCK_SIZE bsize,
|
||||
int use_rd) {
|
||||
void vp9_cyclic_refresh_update_segment(VP9_COMP *const cpi,
|
||||
MB_MODE_INFO *const mbmi,
|
||||
int mi_row, int mi_col,
|
||||
BLOCK_SIZE bsize, int use_rd) {
|
||||
const VP9_COMMON *const cm = &cpi->common;
|
||||
CYCLIC_REFRESH *const cr = &cpi->cyclic_refresh;
|
||||
CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
|
||||
const int bw = num_8x8_blocks_wide_lookup[bsize];
|
||||
const int bh = num_8x8_blocks_high_lookup[bsize];
|
||||
const int xmis = MIN(cm->mi_cols - mi_col, bw);
|
||||
|
@ -126,10 +169,10 @@ void vp9_update_segment_aq(VP9_COMP *const cpi,
|
|||
}
|
||||
|
||||
// Setup cyclic background refresh: set delta q and segmentation map.
|
||||
void vp9_setup_cyclic_refresh_aq(VP9_COMP *const cpi) {
|
||||
void vp9_cyclic_refresh_setup(VP9_COMP *const cpi) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
const RATE_CONTROL *const rc = &cpi->rc;
|
||||
CYCLIC_REFRESH *const cr = &cpi->cyclic_refresh;
|
||||
CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
|
||||
struct segmentation *const seg = &cm->seg;
|
||||
unsigned char *const seg_map = cpi->segmentation_map;
|
||||
const int apply_cyclic_refresh = apply_cyclic_refresh_bitrate(cm, rc);
|
||||
|
@ -253,3 +296,13 @@ void vp9_setup_cyclic_refresh_aq(VP9_COMP *const cpi) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void vp9_cyclic_refresh_set_rate_and_dist_sb(CYCLIC_REFRESH *cr,
|
||||
int64_t rate_sb, int64_t dist_sb) {
|
||||
cr->projected_rate_sb = rate_sb;
|
||||
cr->projected_dist_sb = dist_sb;
|
||||
}
|
||||
|
||||
int vp9_cyclic_refresh_get_rdmult(const CYCLIC_REFRESH *cr) {
|
||||
return cr->rdmult;
|
||||
}
|
||||
|
|
|
@ -18,47 +18,30 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
// Target percentage of blocks per frame that are cyclicly refreshed.
|
||||
int max_mbs_perframe;
|
||||
// Maximum q-delta as percentage of base q.
|
||||
int max_qdelta_perc;
|
||||
// Block size below which we don't apply cyclic refresh.
|
||||
BLOCK_SIZE min_block_size;
|
||||
// Macroblock starting index (unit of 8x8) for cycling through the frame.
|
||||
int mb_index;
|
||||
// Controls how long a block will need to wait to be refreshed again.
|
||||
int time_for_refresh;
|
||||
// Actual number of blocks that were applied delta-q (segment 1).
|
||||
int num_seg_blocks;
|
||||
// Actual encoding bits for segment 1.
|
||||
int actual_seg_bits;
|
||||
// RD mult. parameters for segment 1.
|
||||
int rdmult;
|
||||
// Cyclic refresh map.
|
||||
signed char *map;
|
||||
// Projected rate and distortion for the current superblock.
|
||||
int64_t projected_rate_sb;
|
||||
int64_t projected_dist_sb;
|
||||
// Thresholds applied to projected rate/distortion of the superblock.
|
||||
int64_t thresh_rate_sb;
|
||||
int64_t thresh_dist_sb;
|
||||
} CYCLIC_REFRESH;
|
||||
|
||||
struct VP9_COMP;
|
||||
|
||||
struct CYCLIC_REFRESH;
|
||||
typedef struct CYCLIC_REFRESH CYCLIC_REFRESH;
|
||||
|
||||
CYCLIC_REFRESH *vp9_cyclic_refresh_alloc(int mi_rows, int mi_cols);
|
||||
|
||||
void vp9_cyclic_refresh_free(CYCLIC_REFRESH *cr);
|
||||
|
||||
// Prior to coding a given prediction block, of size bsize at (mi_row, mi_col),
|
||||
// check if we should reset the segment_id, and update the cyclic_refresh map
|
||||
// and segmentation map.
|
||||
void vp9_update_segment_aq(struct VP9_COMP *const cpi,
|
||||
MB_MODE_INFO *const mbmi,
|
||||
int mi_row,
|
||||
int mi_col,
|
||||
BLOCK_SIZE bsize,
|
||||
int use_rd);
|
||||
void vp9_cyclic_refresh_update_segment(struct VP9_COMP *const cpi,
|
||||
MB_MODE_INFO *const mbmi,
|
||||
int mi_row, int mi_col,
|
||||
BLOCK_SIZE bsize, int use_rd);
|
||||
|
||||
// Setup cyclic background refresh: set delta q and segmentation map.
|
||||
void vp9_setup_cyclic_refresh_aq(struct VP9_COMP *const cpi);
|
||||
void vp9_cyclic_refresh_setup(struct VP9_COMP *const cpi);
|
||||
|
||||
void vp9_cyclic_refresh_set_rate_and_dist_sb(CYCLIC_REFRESH *cr,
|
||||
int64_t rate_sb, int64_t dist_sb);
|
||||
|
||||
int vp9_cyclic_refresh_get_rdmult(const CYCLIC_REFRESH *cr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
|
|
@ -902,8 +902,8 @@ static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx,
|
|||
// the cyclic refresh map.
|
||||
if ((cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) && seg->enabled &&
|
||||
output_enabled) {
|
||||
vp9_update_segment_aq(cpi, &xd->mi_8x8[0]->mbmi,
|
||||
mi_row, mi_col, bsize, 1);
|
||||
vp9_cyclic_refresh_update_segment(cpi, &xd->mi_8x8[0]->mbmi,
|
||||
mi_row, mi_col, bsize, 1);
|
||||
vp9_init_plane_quantizers(cpi, x);
|
||||
}
|
||||
|
||||
|
@ -1102,7 +1102,7 @@ static void rd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
|||
: cm->last_frame_seg_map;
|
||||
// If segment 1, use rdmult for that segment.
|
||||
if (vp9_get_segment_id(cm, map, bsize, mi_row, mi_col))
|
||||
x->rdmult = cpi->cyclic_refresh.rdmult;
|
||||
x->rdmult = vp9_cyclic_refresh_get_rdmult(cpi->cyclic_refresh);
|
||||
}
|
||||
|
||||
// Find best coding mode & reconstruct the MB so it is available
|
||||
|
@ -1466,7 +1466,8 @@ static void update_state_rt(VP9_COMP *cpi, const PICK_MODE_CONTEXT *ctx,
|
|||
|
||||
// Check for reseting segment_id and update cyclic map.
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && seg->enabled) {
|
||||
vp9_update_segment_aq(cpi, &xd->mi_8x8[0]->mbmi, mi_row, mi_col, bsize, 1);
|
||||
vp9_cyclic_refresh_update_segment(cpi, &xd->mi_8x8[0]->mbmi,
|
||||
mi_row, mi_col, bsize, 1);
|
||||
vp9_init_plane_quantizers(cpi, x);
|
||||
}
|
||||
|
||||
|
@ -1877,10 +1878,10 @@ static void rd_use_partition(VP9_COMP *cpi,
|
|||
select_in_frame_q_segment(cpi, mi_row, mi_col,
|
||||
output_enabled, chosen_rate);
|
||||
}
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
|
||||
cpi->cyclic_refresh.projected_rate_sb = chosen_rate;
|
||||
cpi->cyclic_refresh.projected_dist_sb = chosen_dist;
|
||||
}
|
||||
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
chosen_rate, chosen_dist);
|
||||
|
||||
encode_sb(cpi, tile, tp, mi_row, mi_col, output_enabled, bsize);
|
||||
}
|
||||
|
@ -2318,10 +2319,10 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
|||
if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) {
|
||||
select_in_frame_q_segment(cpi, mi_row, mi_col, output_enabled, best_rate);
|
||||
}
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
|
||||
cpi->cyclic_refresh.projected_rate_sb = best_rate;
|
||||
cpi->cyclic_refresh.projected_dist_sb = best_dist;
|
||||
}
|
||||
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
best_rate, best_dist);
|
||||
|
||||
encode_sb(cpi, tile, tp, mi_row, mi_col, output_enabled, bsize);
|
||||
}
|
||||
|
@ -2925,10 +2926,10 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
|
|||
if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) {
|
||||
select_in_frame_q_segment(cpi, mi_row, mi_col, output_enabled, best_rate);
|
||||
}
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
|
||||
cpi->cyclic_refresh.projected_rate_sb = best_rate;
|
||||
cpi->cyclic_refresh.projected_dist_sb = best_dist;
|
||||
}
|
||||
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
best_rate, best_dist);
|
||||
|
||||
encode_sb(cpi, tile, tp, mi_row, mi_col, output_enabled, bsize);
|
||||
}
|
||||
|
@ -3039,10 +3040,9 @@ static void nonrd_use_partition(VP9_COMP *cpi,
|
|||
}
|
||||
|
||||
if (bsize == BLOCK_64X64 && output_enabled) {
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
|
||||
cpi->cyclic_refresh.projected_rate_sb = *totrate;
|
||||
cpi->cyclic_refresh.projected_dist_sb = *totdist;
|
||||
}
|
||||
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
|
||||
vp9_cyclic_refresh_set_rate_and_dist_sb(cpi->cyclic_refresh,
|
||||
*totrate, *totdist);
|
||||
encode_sb_rt(cpi, tile, tp, mi_row, mi_col, 1, bsize);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -189,11 +189,13 @@ static void dealloc_compressor_data(VP9_COMP *cpi) {
|
|||
cpi->coding_context.last_frame_seg_map_copy = NULL;
|
||||
|
||||
vpx_free(cpi->complexity_map);
|
||||
cpi->complexity_map = 0;
|
||||
vpx_free(cpi->cyclic_refresh.map);
|
||||
cpi->cyclic_refresh.map = 0;
|
||||
cpi->complexity_map = NULL;
|
||||
|
||||
vp9_cyclic_refresh_free(cpi->cyclic_refresh);
|
||||
cpi->cyclic_refresh = NULL;
|
||||
|
||||
vpx_free(cpi->active_map);
|
||||
cpi->active_map = 0;
|
||||
cpi->active_map = NULL;
|
||||
|
||||
vp9_free_frame_buffers(cm);
|
||||
|
||||
|
@ -1661,8 +1663,8 @@ VP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf) {
|
|||
vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
|
||||
|
||||
// Create a map used for cyclic background refresh.
|
||||
CHECK_MEM_ERROR(cm, cpi->cyclic_refresh.map,
|
||||
vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
|
||||
CHECK_MEM_ERROR(cm, cpi->cyclic_refresh,
|
||||
vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols));
|
||||
|
||||
// And a place holder structure is the coding context
|
||||
// for use if we want to save and restore it
|
||||
|
@ -2679,7 +2681,7 @@ static void encode_without_recode_loop(VP9_COMP *cpi,
|
|||
} else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
|
||||
setup_in_frame_q_adj(cpi);
|
||||
} else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
|
||||
vp9_setup_cyclic_refresh_aq(cpi);
|
||||
vp9_cyclic_refresh_setup(cpi);
|
||||
}
|
||||
// transform / motion compensation build reconstruction frame
|
||||
vp9_encode_frame(cpi);
|
||||
|
|
|
@ -725,7 +725,7 @@ typedef struct VP9_COMP {
|
|||
unsigned char *active_map;
|
||||
unsigned int active_map_enabled;
|
||||
|
||||
CYCLIC_REFRESH cyclic_refresh;
|
||||
CYCLIC_REFRESH *cyclic_refresh;
|
||||
|
||||
fractional_mv_step_fp *find_fractional_mv_step;
|
||||
fractional_mv_step_comp_fp *find_fractional_mv_step_comp;
|
||||
|
|
Загрузка…
Ссылка в новой задаче