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_tile_common.h"
|
||||
|
||||
#include "vp9/encoder/vp9_aq_complexity.h"
|
||||
#include "vp9/encoder/vp9_aq_cyclicrefresh.h"
|
||||
#include "vp9/encoder/vp9_aq_variance.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);
|
||||
}
|
||||
|
||||
// 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,
|
||||
int mi_row, int mi_col, BLOCK_SIZE bsize,
|
||||
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
|
||||
// closer to the target.
|
||||
if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) {
|
||||
select_in_frame_q_segment(cpi, mi_row, mi_col,
|
||||
output_enabled, chosen_rate);
|
||||
vp9_select_in_frame_q_segment(cpi, mi_row, mi_col,
|
||||
output_enabled, chosen_rate);
|
||||
}
|
||||
|
||||
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
|
||||
// closer to the target.
|
||||
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)
|
||||
|
@ -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
|
||||
// closer to the target.
|
||||
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)
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "vp9/common/vp9_systemdependent.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_variance.h"
|
||||
#include "vp9/encoder/vp9_bitstream.h"
|
||||
|
@ -103,9 +104,6 @@ FILE *keyfile;
|
|||
|
||||
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) {
|
||||
switch (mode) {
|
||||
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;
|
||||
}
|
||||
|
||||
// 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) {
|
||||
VP9_COMMON *const cm = &cpi->common;
|
||||
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) {
|
||||
vp9_vaq_frame_setup(cpi);
|
||||
} 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) {
|
||||
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) {
|
||||
vp9_vaq_frame_setup(cpi);
|
||||
} 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
|
||||
|
|
|
@ -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_cyclicrefresh.c
|
||||
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)
|
||||
VP9_CX_SRCS-$(CONFIG_INTERNAL_STATS) += common/vp9_postproc.h
|
||||
VP9_CX_SRCS-$(CONFIG_INTERNAL_STATS) += common/vp9_postproc.c
|
||||
|
|
Загрузка…
Ссылка в новой задаче