Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xiph.Org
aom-rav1e
Commits
2b06bf20
Commit
2b06bf20
authored
Mar 26, 2014
by
Marco Paniconi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move aq_mode=2 (complexity_aq) to separate file.
Change-Id: Iffa45b9b04196c1ded6037622a8644a2500a62de
parent
6bdfc8cd
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
150 additions
and
95 deletions
+150
-95
vp9/encoder/vp9_aq_complexity.c
vp9/encoder/vp9_aq_complexity.c
+104
-0
vp9/encoder/vp9_aq_complexity.h
vp9/encoder/vp9_aq_complexity.h
+34
-0
vp9/encoder/vp9_encodeframe.c
vp9/encoder/vp9_encodeframe.c
+7
-50
vp9/encoder/vp9_onyx_if.c
vp9/encoder/vp9_onyx_if.c
+3
-45
vp9/vp9cx.mk
vp9/vp9cx.mk
+2
-0
No files found.
vp9/encoder/vp9_aq_complexity.c
0 → 100644
View file @
2b06bf20
/*
* 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
;
}
}
}
vp9/encoder/vp9_aq_complexity.h
0 → 100644
View file @
2b06bf20
/*
* 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_
vp9/encoder/vp9_encodeframe.c
View file @
2b06bf20
...
...
@@ -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
)
...
...
vp9/encoder/vp9_onyx_if.c
View file @
2b06bf20
...
...
@@ -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
...
...
vp9/vp9cx.mk
View file @
2b06bf20
...
...
@@ -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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment