Move aq_mode=2 (complexity_aq) to separate file.
Change-Id: Iffa45b9b04196c1ded6037622a8644a2500a62de
This commit is contained in:
Родитель
6bdfc8cd0b
Коммит
2b06bf20ce
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче