Move aq_mode=2 (complexity_aq) to separate file.

Change-Id: Iffa45b9b04196c1ded6037622a8644a2500a62de
This commit is contained in:
Marco Paniconi 2014-03-26 16:05:45 -07:00
Родитель 6bdfc8cd0b
Коммит 2b06bf20ce
5 изменённых файлов: 150 добавлений и 95 удалений

Просмотреть файл

@ -0,0 +1,104 @@
/*
* Copyright (c) 2014 The WebM project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include <limits.h>
#include <math.h>
#include "vp9/common/vp9_seg_common.h"
#include "vp9/encoder/vp9_segmentation.h"
static const double in_frame_q_adj_ratio[MAX_SEGMENTS] =
{1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
void vp9_setup_in_frame_q_adj(VP9_COMP *cpi) {
VP9_COMMON *const cm = &cpi->common;
struct segmentation *const seg = &cm->seg;
// Make SURE use of floating point in this function is safe.
vp9_clear_system_state();
if (cm->frame_type == KEY_FRAME ||
cpi->refresh_alt_ref_frame ||
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
int segment;
// Clear down the segment map.
vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
// Clear down the complexity map used for rd.
vpx_memset(cpi->complexity_map, 0, cm->mi_rows * cm->mi_cols);
vp9_enable_segmentation(seg);
vp9_clearall_segfeatures(seg);
// Select delta coding method.
seg->abs_delta = SEGMENT_DELTADATA;
// Segment 0 "Q" feature is disabled so it defaults to the baseline Q.
vp9_disable_segfeature(seg, 0, SEG_LVL_ALT_Q);
// Use some of the segments for in frame Q adjustment.
for (segment = 1; segment < 2; segment++) {
const int qindex_delta =
vp9_compute_qdelta_by_rate(cpi,
cm->base_qindex,
in_frame_q_adj_ratio[segment]);
vp9_enable_segfeature(seg, segment, SEG_LVL_ALT_Q);
vp9_set_segdata(seg, segment, SEG_LVL_ALT_Q, qindex_delta);
}
}
}
// Select a segment for the current SB64
void vp9_select_in_frame_q_segment(VP9_COMP *cpi,
int mi_row, int mi_col,
int output_enabled, int projected_rate) {
VP9_COMMON *const cm = &cpi->common;
const int mi_offset = mi_row * cm->mi_cols + mi_col;
const int bw = num_8x8_blocks_wide_lookup[BLOCK_64X64];
const int bh = num_8x8_blocks_high_lookup[BLOCK_64X64];
const int xmis = MIN(cm->mi_cols - mi_col, bw);
const int ymis = MIN(cm->mi_rows - mi_row, bh);
int complexity_metric = 64;
int x, y;
unsigned char segment;
if (!output_enabled) {
segment = 0;
} else {
// Rate depends on fraction of a SB64 in frame (xmis * ymis / bw * bh).
// It is converted to bits * 256 units.
const int target_rate = (cpi->rc.sb64_target_rate * xmis * ymis * 256) /
(bw * bh);
if (projected_rate < (target_rate / 4)) {
segment = 1;
} else {
segment = 0;
}
if (target_rate > 0) {
complexity_metric =
clamp((int)((projected_rate * 64) / target_rate), 16, 255);
}
}
// Fill in the entires in the segment map corresponding to this SB64.
for (y = 0; y < ymis; y++) {
for (x = 0; x < xmis; x++) {
cpi->segmentation_map[mi_offset + y * cm->mi_cols + x] = segment;
cpi->complexity_map[mi_offset + y * cm->mi_cols + x] =
(unsigned char)complexity_metric;
}
}
}

Просмотреть файл

@ -0,0 +1,34 @@
/*
* Copyright (c) 2014 The WebM project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef VP9_ENCODER_VP9_AQ_COMPLEXITY_H_
#define VP9_ENCODER_VP9_AQ_COMPLEXITY_H_
#ifdef __cplusplus
extern "C" {
#endif
struct VP9_COMP;
// Select a segment for the current SB64.
void vp9_select_in_frame_q_segment(struct VP9_COMP *cpi, int mi_row, int mi_col,
int output_enabled, int projected_rate);
// This function sets up a set of segments with delta Q values around
// the baseline frame quantizer.
void vp9_setup_in_frame_q_adj(struct VP9_COMP *cpi);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // VP9_ENCODER_VP9_AQ_COMPLEXITY_H_

Просмотреть файл

@ -30,6 +30,7 @@
#include "vp9/common/vp9_systemdependent.h" #include "vp9/common/vp9_systemdependent.h"
#include "vp9/common/vp9_tile_common.h" #include "vp9/common/vp9_tile_common.h"
#include "vp9/encoder/vp9_aq_complexity.h"
#include "vp9/encoder/vp9_aq_cyclicrefresh.h" #include "vp9/encoder/vp9_aq_cyclicrefresh.h"
#include "vp9/encoder/vp9_aq_variance.h" #include "vp9/encoder/vp9_aq_variance.h"
#include "vp9/encoder/vp9_encodeframe.h" #include "vp9/encoder/vp9_encodeframe.h"
@ -828,52 +829,6 @@ static void activity_masking(VP9_COMP *cpi, MACROBLOCK *x) {
adjust_act_zbin(cpi, x); adjust_act_zbin(cpi, x);
} }
// Select a segment for the current SB64
static void select_in_frame_q_segment(VP9_COMP *cpi,
int mi_row, int mi_col,
int output_enabled, int projected_rate) {
VP9_COMMON *const cm = &cpi->common;
const int mi_offset = mi_row * cm->mi_cols + mi_col;
const int bw = num_8x8_blocks_wide_lookup[BLOCK_64X64];
const int bh = num_8x8_blocks_high_lookup[BLOCK_64X64];
const int xmis = MIN(cm->mi_cols - mi_col, bw);
const int ymis = MIN(cm->mi_rows - mi_row, bh);
int complexity_metric = 64;
int x, y;
unsigned char segment;
if (!output_enabled) {
segment = 0;
} else {
// Rate depends on fraction of a SB64 in frame (xmis * ymis / bw * bh).
// It is converted to bits * 256 units
const int target_rate = (cpi->rc.sb64_target_rate * xmis * ymis * 256) /
(bw * bh);
if (projected_rate < (target_rate / 4)) {
segment = 1;
} else {
segment = 0;
}
if (target_rate > 0) {
complexity_metric =
clamp((int)((projected_rate * 64) / target_rate), 16, 255);
}
}
// Fill in the entires in the segment map corresponding to this SB64
for (y = 0; y < ymis; y++) {
for (x = 0; x < xmis; x++) {
cpi->segmentation_map[mi_offset + y * cm->mi_cols + x] = segment;
cpi->complexity_map[mi_offset + y * cm->mi_cols + x] =
(unsigned char)complexity_metric;
}
}
}
static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx, static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx,
int mi_row, int mi_col, BLOCK_SIZE bsize, int mi_row, int mi_col, BLOCK_SIZE bsize,
int output_enabled) { int output_enabled) {
@ -1876,8 +1831,8 @@ static void rd_use_partition(VP9_COMP *cpi,
// and and if necessary apply a Q delta using segmentation to get // and and if necessary apply a Q delta using segmentation to get
// closer to the target. // closer to the target.
if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) { if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) {
select_in_frame_q_segment(cpi, mi_row, mi_col, vp9_select_in_frame_q_segment(cpi, mi_row, mi_col,
output_enabled, chosen_rate); output_enabled, chosen_rate);
} }
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
@ -2318,7 +2273,8 @@ static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
// and and if necessary apply a Q delta using segmentation to get // and and if necessary apply a Q delta using segmentation to get
// closer to the target. // closer to the target.
if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) { 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); vp9_select_in_frame_q_segment(cpi, mi_row, mi_col, output_enabled,
best_rate);
} }
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
@ -2925,7 +2881,8 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
// and and if necessary apply a Q delta using segmentation to get // and and if necessary apply a Q delta using segmentation to get
// closer to the target. // closer to the target.
if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) { 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); vp9_select_in_frame_q_segment(cpi, mi_row, mi_col, output_enabled,
best_rate);
} }
if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)

Просмотреть файл

@ -27,6 +27,7 @@
#include "vp9/common/vp9_systemdependent.h" #include "vp9/common/vp9_systemdependent.h"
#include "vp9/common/vp9_tile_common.h" #include "vp9/common/vp9_tile_common.h"
#include "vp9/encoder/vp9_aq_complexity.h"
#include "vp9/encoder/vp9_aq_cyclicrefresh.h" #include "vp9/encoder/vp9_aq_cyclicrefresh.h"
#include "vp9/encoder/vp9_aq_variance.h" #include "vp9/encoder/vp9_aq_variance.h"
#include "vp9/encoder/vp9_bitstream.h" #include "vp9/encoder/vp9_bitstream.h"
@ -103,9 +104,6 @@ FILE *keyfile;
void vp9_init_quantizer(VP9_COMP *cpi); void vp9_init_quantizer(VP9_COMP *cpi);
static const double in_frame_q_adj_ratio[MAX_SEGMENTS] =
{1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
static INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) { static INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) {
switch (mode) { switch (mode) {
case NORMAL: case NORMAL:
@ -264,46 +262,6 @@ int vp9_compute_qdelta_by_rate(VP9_COMP *cpi, int base_q_index,
return target_index - base_q_index; return target_index - base_q_index;
} }
// This function sets up a set of segments with delta Q values around
// the baseline frame quantizer.
static void setup_in_frame_q_adj(VP9_COMP *cpi) {
VP9_COMMON *const cm = &cpi->common;
struct segmentation *const seg = &cm->seg;
// Make SURE use of floating point in this function is safe.
vp9_clear_system_state();
if (cm->frame_type == KEY_FRAME ||
cpi->refresh_alt_ref_frame ||
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
int segment;
// Clear down the segment map
vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
// Clear down the complexity map used for rd
vpx_memset(cpi->complexity_map, 0, cm->mi_rows * cm->mi_cols);
vp9_enable_segmentation(seg);
vp9_clearall_segfeatures(seg);
// Select delta coding method
seg->abs_delta = SEGMENT_DELTADATA;
// Segment 0 "Q" feature is disabled so it defaults to the baseline Q
vp9_disable_segfeature(seg, 0, SEG_LVL_ALT_Q);
// Use some of the segments for in frame Q adjustment
for (segment = 1; segment < 2; segment++) {
const int qindex_delta =
vp9_compute_qdelta_by_rate(cpi,
cm->base_qindex,
in_frame_q_adj_ratio[segment]);
vp9_enable_segfeature(seg, segment, SEG_LVL_ALT_Q);
vp9_set_segdata(seg, segment, SEG_LVL_ALT_Q, qindex_delta);
}
}
}
static void configure_static_seg_features(VP9_COMP *cpi) { static void configure_static_seg_features(VP9_COMP *cpi) {
VP9_COMMON *const cm = &cpi->common; VP9_COMMON *const cm = &cpi->common;
const RATE_CONTROL *const rc = &cpi->rc; const RATE_CONTROL *const rc = &cpi->rc;
@ -2679,7 +2637,7 @@ static void encode_without_recode_loop(VP9_COMP *cpi,
if (cpi->oxcf.aq_mode == VARIANCE_AQ) { if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
vp9_vaq_frame_setup(cpi); vp9_vaq_frame_setup(cpi);
} else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
setup_in_frame_q_adj(cpi); vp9_setup_in_frame_q_adj(cpi);
} else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) { } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
vp9_cyclic_refresh_setup(cpi); vp9_cyclic_refresh_setup(cpi);
} }
@ -2739,7 +2697,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi,
if (cpi->oxcf.aq_mode == VARIANCE_AQ) { if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
vp9_vaq_frame_setup(cpi); vp9_vaq_frame_setup(cpi);
} else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) { } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
setup_in_frame_q_adj(cpi); vp9_setup_in_frame_q_adj(cpi);
} }
// transform / motion compensation build reconstruction frame // transform / motion compensation build reconstruction frame

Просмотреть файл

@ -73,6 +73,8 @@ VP9_CX_SRCS-yes += encoder/vp9_aq_variance.c
VP9_CX_SRCS-yes += encoder/vp9_aq_variance.h VP9_CX_SRCS-yes += encoder/vp9_aq_variance.h
VP9_CX_SRCS-yes += encoder/vp9_aq_cyclicrefresh.c VP9_CX_SRCS-yes += encoder/vp9_aq_cyclicrefresh.c
VP9_CX_SRCS-yes += encoder/vp9_aq_cyclicrefresh.h VP9_CX_SRCS-yes += encoder/vp9_aq_cyclicrefresh.h
VP9_CX_SRCS-yes += encoder/vp9_aq_complexity.c
VP9_CX_SRCS-yes += encoder/vp9_aq_complexity.h
ifeq ($(CONFIG_VP9_POSTPROC),yes) ifeq ($(CONFIG_VP9_POSTPROC),yes)
VP9_CX_SRCS-$(CONFIG_INTERNAL_STATS) += common/vp9_postproc.h VP9_CX_SRCS-$(CONFIG_INTERNAL_STATS) += common/vp9_postproc.h
VP9_CX_SRCS-$(CONFIG_INTERNAL_STATS) += common/vp9_postproc.c VP9_CX_SRCS-$(CONFIG_INTERNAL_STATS) += common/vp9_postproc.c