Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Xiph.Org
aom-rav1e
Commits
bc732efc
Commit
bc732efc
authored
Oct 12, 2017
by
Debargha Mukherjee
Browse files
Use cdfs for loop-restoration types
BUG=aomedia:907 Change-Id: I30a0290e499d338250343b5f9092bdcabe7d867a
parent
fc0eeb33
Changes
7
Hide whitespace changes
Inline
Side-by-side
av1/common/entropymode.c
View file @
bc732efc
...
...
@@ -2492,15 +2492,20 @@ static const aom_cdf_prob default_quarter_tx_size_cdf[CDF_SIZE(2)] = {
#endif
#if CONFIG_LOOP_RESTORATION
const aom_
tree_index
av1
_switchable_restore_
tree[TREE
_SIZE(RESTORE_SWITCHABLE_TYPES)] = {
-RESTORE_NONE, 2, -RESTORE_WIENER, -RESTORE_SGRPROJ
,
static
const aom_
cdf_prob
default
_switchable_restore_
cdf[CDF
_SIZE(RESTORE_SWITCHABLE_TYPES)] = {
AOM_ICDF(32 * 128), AOM_ICDF(144 * 128), AOM_ICDF(32768), 0
,
};
static const aom_prob
default_switchable_restore_prob[RESTORE_SWITCHABLE_TYPES - 1] = {
32, 128,
};
#if CONFIG_NEW_MULTISYMBOL
static const aom_cdf_prob default_wiener_restore_cdf[CDF_SIZE(2)] = {
AOM_ICDF(64 * 128), AOM_ICDF(32768), 0,
};
static const aom_cdf_prob default_sgrproj_restore_cdf[CDF_SIZE(2)] = {
AOM_ICDF(64 * 128), AOM_ICDF(32768), 0,
};
#endif // CONFIG_NEW_MULTISYMBOL
#endif // CONFIG_LOOP_RESTORATION
#define NUM_PALETTE_NEIGHBORS 3 // left, top-left and top.
...
...
@@ -6644,7 +6649,11 @@ static void init_mode_probs(FRAME_CONTEXT *fc) {
av1_copy(fc->inter_lgt_prob, default_inter_lgt_prob);
#endif // CONFIG_LGT_FROM_PRED
#if CONFIG_LOOP_RESTORATION
av1_copy(fc->switchable_restore_prob, default_switchable_restore_prob);
av1_copy(fc->switchable_restore_cdf, default_switchable_restore_cdf);
#if CONFIG_NEW_MULTISYMBOL
av1_copy(fc->wiener_restore_cdf, default_wiener_restore_cdf);
av1_copy(fc->sgrproj_restore_cdf, default_sgrproj_restore_cdf);
#endif // CONFIG_NEW_MULTISYMBOL
#endif // CONFIG_LOOP_RESTORATION
av1_copy(fc->y_mode_cdf, default_if_y_mode_cdf);
av1_copy(fc->uv_mode_cdf, default_uv_mode_cdf);
...
...
av1/common/entropymode.h
View file @
bc732efc
...
...
@@ -348,7 +348,11 @@ typedef struct frame_contexts {
aom_cdf_prob
filter_intra_mode_cdf
[
PLANE_TYPES
][
CDF_SIZE
(
FILTER_INTRA_MODES
)];
#endif // CONFIG_FILTER_INTRA
#if CONFIG_LOOP_RESTORATION
aom_prob
switchable_restore_prob
[
RESTORE_SWITCHABLE_TYPES
-
1
];
aom_cdf_prob
switchable_restore_cdf
[
CDF_SIZE
(
RESTORE_SWITCHABLE_TYPES
)];
#if CONFIG_NEW_MULTISYMBOL
aom_cdf_prob
wiener_restore_cdf
[
CDF_SIZE
(
2
)];
aom_cdf_prob
sgrproj_restore_cdf
[
CDF_SIZE
(
2
)];
#endif // CONFIG_NEW_MULTISYMBOL
#endif // CONFIG_LOOP_RESTORATION
aom_cdf_prob
y_mode_cdf
[
BLOCK_SIZE_GROUPS
][
CDF_SIZE
(
INTRA_MODES
)];
aom_cdf_prob
uv_mode_cdf
[
INTRA_MODES
][
CDF_SIZE
(
UV_INTRA_MODES
)];
...
...
@@ -706,9 +710,7 @@ extern const aom_tree_index av1_ncobmc_tree[TREE_SIZE(OBMC_FAMILY_MODES)];
#endif // CONFIG_NCOBMC_ADAPT_WEIGHT
#if CONFIG_LOOP_RESTORATION
#define RESTORE_NONE_SGRPROJ_PROB 64
#define RESTORE_NONE_BILATERAL_PROB 16
#define RESTORE_NONE_WIENER_PROB 64
#define RESTORE_NONE_DOMAINTXFMRF_PROB 64
extern
const
aom_tree_index
av1_switchable_restore_tree
[
TREE_SIZE
(
RESTORE_SWITCHABLE_TYPES
)];
#endif // CONFIG_LOOP_RESTORATION
...
...
av1/decoder/decodeframe.c
View file @
bc732efc
...
...
@@ -2887,9 +2887,8 @@ static void loop_restoration_read_sb_coeffs(const AV1_COMMON *const cm,
if
(
rsi
->
frame_restoration_type
==
RESTORE_SWITCHABLE
)
{
assert
(
plane
==
0
);
rsi
->
restoration_type
[
rtile_idx
]
=
aom_read_tree
(
r
,
av1_switchable_restore_tree
,
cm
->
fc
->
switchable_restore_prob
,
ACCT_STR
);
aom_read_symbol
(
r
,
xd
->
tile_ctx
->
switchable_restore_cdf
,
RESTORE_SWITCHABLE_TYPES
,
ACCT_STR
);
if
(
rsi
->
restoration_type
[
rtile_idx
]
==
RESTORE_WIENER
)
{
read_wiener_filter
(
wiener_win
,
&
rsi
->
wiener_info
[
rtile_idx
],
wiener_info
,
r
);
...
...
@@ -2897,7 +2896,11 @@ static void loop_restoration_read_sb_coeffs(const AV1_COMMON *const cm,
read_sgrproj_filter
(
&
rsi
->
sgrproj_info
[
rtile_idx
],
sgrproj_info
,
r
);
}
}
else
if
(
rsi
->
frame_restoration_type
==
RESTORE_WIENER
)
{
#if CONFIG_NEW_MULTISYMBOL
if
(
aom_read_symbol
(
r
,
xd
->
tile_ctx
->
wiener_restore_cdf
,
2
,
ACCT_STR
))
{
#else
if
(
aom_read
(
r
,
RESTORE_NONE_WIENER_PROB
,
ACCT_STR
))
{
#endif // CONFIG_NEW_MULTISYMBOL
rsi
->
restoration_type
[
rtile_idx
]
=
RESTORE_WIENER
;
read_wiener_filter
(
wiener_win
,
&
rsi
->
wiener_info
[
rtile_idx
],
wiener_info
,
r
);
...
...
@@ -2905,7 +2908,11 @@ static void loop_restoration_read_sb_coeffs(const AV1_COMMON *const cm,
rsi
->
restoration_type
[
rtile_idx
]
=
RESTORE_NONE
;
}
}
else
if
(
rsi
->
frame_restoration_type
==
RESTORE_SGRPROJ
)
{
#if CONFIG_NEW_MULTISYMBOL
if
(
aom_read_symbol
(
r
,
xd
->
tile_ctx
->
sgrproj_restore_cdf
,
2
,
ACCT_STR
))
{
#else
if
(
aom_read
(
r
,
RESTORE_NONE_SGRPROJ_PROB
,
ACCT_STR
))
{
#endif // CONFIG_NEW_MULTISYMBOL
rsi
->
restoration_type
[
rtile_idx
]
=
RESTORE_SGRPROJ
;
read_sgrproj_filter
(
&
rsi
->
sgrproj_info
[
rtile_idx
],
sgrproj_info
,
r
);
}
else
{
...
...
av1/encoder/bitstream.c
View file @
bc732efc
...
...
@@ -91,7 +91,6 @@ static struct av1_token interintra_mode_encodings[INTERINTRA_MODES];
static
struct
av1_token
compound_type_encodings
[
COMPOUND_TYPES
];
#endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
#if CONFIG_LOOP_RESTORATION
static
struct
av1_token
switchable_restore_encodings
[
RESTORE_SWITCHABLE_TYPES
];
static
void
loop_restoration_write_sb_coeffs
(
const
AV1_COMMON
*
const
cm
,
MACROBLOCKD
*
xd
,
aom_writer
*
const
w
,
int
plane
,
...
...
@@ -128,10 +127,6 @@ void av1_encode_token_init(void) {
#if CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
av1_tokens_from_tree
(
compound_type_encodings
,
av1_compound_type_tree
);
#endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
#if CONFIG_LOOP_RESTORATION
av1_tokens_from_tree
(
switchable_restore_encodings
,
av1_switchable_restore_tree
);
#endif // CONFIG_LOOP_RESTORATION
}
static
void
write_intra_mode_kf
(
const
AV1_COMMON
*
cm
,
FRAME_CONTEXT
*
frame_ctx
,
...
...
@@ -3471,9 +3466,9 @@ static void loop_restoration_write_sb_coeffs(const AV1_COMMON *const cm,
if
(
rsi
->
frame_restoration_type
==
RESTORE_SWITCHABLE
)
{
assert
(
plane
==
0
);
a
v1
_write_
token
(
w
,
av1_switchable_restore_tree
,
cm
->
fc
->
switchable_restore_
prob
,
&
switchable_restore_encodings
[
rsi
->
restoration_type
[
rtile_idx
]]
);
a
om
_write_
symbol
(
w
,
rsi
->
restoration_type
[
rtile_idx
],
xd
->
tile_ctx
->
switchable_restore_
cdf
,
RESTORE_SWITCHABLE_TYPES
);
if
(
rsi
->
restoration_type
[
rtile_idx
]
==
RESTORE_WIENER
)
{
write_wiener_filter
(
wiener_win
,
&
rsi
->
wiener_info
[
rtile_idx
],
wiener_info
,
w
);
...
...
@@ -3481,21 +3476,30 @@ static void loop_restoration_write_sb_coeffs(const AV1_COMMON *const cm,
write_sgrproj_filter
(
&
rsi
->
sgrproj_info
[
rtile_idx
],
sgrproj_info
,
w
);
}
}
else
if
(
rsi
->
frame_restoration_type
==
RESTORE_WIENER
)
{
#if CONFIG_NEW_MULTISYMBOL
aom_write_symbol
(
w
,
rsi
->
restoration_type
[
rtile_idx
]
!=
RESTORE_NONE
,
xd
->
tile_ctx
->
wiener_restore_cdf
,
2
);
#else
aom_write
(
w
,
rsi
->
restoration_type
[
rtile_idx
]
!=
RESTORE_NONE
,
RESTORE_NONE_WIENER_PROB
);
#endif // CONFIG_NEW_MULTISYMBOL
if
(
rsi
->
restoration_type
[
rtile_idx
]
!=
RESTORE_NONE
)
{
write_wiener_filter
(
wiener_win
,
&
rsi
->
wiener_info
[
rtile_idx
],
wiener_info
,
w
);
}
}
else
if
(
rsi
->
frame_restoration_type
==
RESTORE_SGRPROJ
)
{
#if CONFIG_NEW_MULTISYMBOL
aom_write_symbol
(
w
,
rsi
->
restoration_type
[
rtile_idx
]
!=
RESTORE_NONE
,
xd
->
tile_ctx
->
sgrproj_restore_cdf
,
2
);
#else
aom_write
(
w
,
rsi
->
restoration_type
[
rtile_idx
]
!=
RESTORE_NONE
,
RESTORE_NONE_SGRPROJ_PROB
);
#endif // CONFIG_NEW_MULTISYMBOL
if
(
rsi
->
restoration_type
[
rtile_idx
]
!=
RESTORE_NONE
)
{
write_sgrproj_filter
(
&
rsi
->
sgrproj_info
[
rtile_idx
],
sgrproj_info
,
w
);
}
}
}
#endif // CONFIG_LOOP_RESTORATION
static
void
encode_loopfilter
(
AV1_COMMON
*
cm
,
struct
aom_write_bit_buffer
*
wb
)
{
...
...
av1/encoder/block.h
View file @
bc732efc
...
...
@@ -304,6 +304,8 @@ struct macroblock {
#endif // CONFIG_EXT_INTRA
#if CONFIG_LOOP_RESTORATION
int
switchable_restore_cost
[
RESTORE_SWITCHABLE_TYPES
];
int
wiener_restore_cost
[
2
];
int
sgrproj_restore_cost
[
2
];
#endif // CONFIG_LOOP_RESTORATION
#if CONFIG_INTRABC
int
intrabc_cost
[
2
];
...
...
av1/encoder/pickrst.c
View file @
bc732efc
...
...
@@ -598,7 +598,7 @@ static void search_sgrproj_for_rtile(const struct rest_search_ctxt *ctxt,
limits
->
h_end
-
limits
->
h_start
,
limits
->
v_start
,
limits
->
v_end
-
limits
->
v_start
,
(
1
<<
ctxt
->
plane
));
// #bits when a tile is not restored
int
bits
=
av1_cost_bit
(
RESTORE_NONE_SGRPROJ_PROB
,
0
)
;
int
bits
=
x
->
sgrproj_restore_cost
[
0
]
;
double
cost_norestore
=
RDCOST_DBL
(
x
->
rdmult
,
(
bits
>>
4
),
err
);
ctxt
->
best_tile_cost
[
rtile_idx
]
=
INT64_MAX
;
...
...
@@ -627,7 +627,7 @@ static void search_sgrproj_for_rtile(const struct rest_search_ctxt *ctxt,
bits
=
count_sgrproj_bits
(
&
plane_rsi
->
sgrproj_info
[
rtile_idx
],
ref_sgrproj_info
)
<<
AV1_PROB_COST_SHIFT
;
bits
+=
av1_cost_bit
(
RESTORE_NONE_SGRPROJ_PROB
,
1
)
;
bits
+=
x
->
sgrproj_restore_cost
[
1
]
;
double
cost_sgrproj
=
RDCOST_DBL
(
x
->
rdmult
,
(
bits
>>
4
),
err
);
if
(
cost_sgrproj
>=
cost_norestore
)
{
ctxt
->
type
[
rtile_idx
]
=
RESTORE_NONE
;
...
...
@@ -645,6 +645,7 @@ static double search_sgrproj(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,
RestorationInfo
*
info
,
RestorationType
*
type
,
int64_t
*
best_tile_cost
,
YV12_BUFFER_CONFIG
*
dst_frame
)
{
const
MACROBLOCK
*
const
x
=
&
cpi
->
td
.
mb
;
struct
rest_search_ctxt
ctxt
;
const
int
nrtiles
=
init_rest_search_ctxt
(
src
,
cpi
,
partial_frame
,
plane
,
info
,
type
,
...
...
@@ -686,8 +687,7 @@ static double search_sgrproj(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,
int
bits
=
frame_level_restore_bits
[
plane_rsi
->
frame_restoration_type
]
<<
AV1_PROB_COST_SHIFT
;
for
(
int
rtile_idx
=
0
;
rtile_idx
<
nrtiles
;
++
rtile_idx
)
{
bits
+=
av1_cost_bit
(
RESTORE_NONE_SGRPROJ_PROB
,
type
[
rtile_idx
]
!=
RESTORE_NONE
);
bits
+=
x
->
sgrproj_restore_cost
[
type
[
rtile_idx
]
!=
RESTORE_NONE
];
plane_rsi
->
sgrproj_info
[
rtile_idx
]
=
sgrproj_info
[
rtile_idx
];
if
(
type
[
rtile_idx
]
==
RESTORE_SGRPROJ
)
{
bits
+=
count_sgrproj_bits
(
&
plane_rsi
->
sgrproj_info
[
rtile_idx
],
...
...
@@ -1191,7 +1191,7 @@ static void search_wiener_for_rtile(const struct rest_search_ctxt *ctxt,
limits
->
h_end
-
limits
->
h_start
,
limits
->
v_start
,
limits
->
v_end
-
limits
->
v_start
,
(
1
<<
ctxt
->
plane
));
// #bits when a tile is not restored
int
bits
=
av1_cost_bit
(
RESTORE_NONE_WIENER_PROB
,
0
)
;
int
bits
=
x
->
wiener_restore_cost
[
0
]
;
double
cost_norestore
=
RDCOST_DBL
(
x
->
rdmult
,
(
bits
>>
4
),
err
);
ctxt
->
best_tile_cost
[
rtile_idx
]
=
INT64_MAX
;
...
...
@@ -1242,7 +1242,7 @@ static void search_wiener_for_rtile(const struct rest_search_ctxt *ctxt,
}
bits
=
count_wiener_bits
(
wiener_win
,
rtile_wiener_info
,
ref_wiener_info
)
<<
AV1_PROB_COST_SHIFT
;
bits
+=
av1_cost_bit
(
RESTORE_NONE_WIENER_PROB
,
1
)
;
bits
+=
x
->
wiener_restore_cost
[
1
]
;
double
cost_wiener
=
RDCOST_DBL
(
x
->
rdmult
,
(
bits
>>
4
),
err
);
if
(
cost_wiener
>=
cost_norestore
)
{
ctxt
->
type
[
rtile_idx
]
=
RESTORE_NONE
;
...
...
@@ -1258,6 +1258,7 @@ static double search_wiener(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,
int
partial_frame
,
int
plane
,
RestorationInfo
*
info
,
RestorationType
*
type
,
int64_t
*
best_tile_cost
,
YV12_BUFFER_CONFIG
*
dst_frame
)
{
const
MACROBLOCK
*
const
x
=
&
cpi
->
td
.
mb
;
struct
rest_search_ctxt
ctxt
;
const
int
nrtiles
=
init_rest_search_ctxt
(
src
,
cpi
,
partial_frame
,
plane
,
info
,
type
,
...
...
@@ -1305,8 +1306,7 @@ static double search_wiener(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,
(
plane
==
AOM_PLANE_Y
)
?
WIENER_WIN
:
WIENER_WIN_CHROMA
;
for
(
int
tile_idx
=
0
;
tile_idx
<
nrtiles
;
++
tile_idx
)
{
bits
+=
av1_cost_bit
(
RESTORE_NONE_WIENER_PROB
,
type
[
tile_idx
]
!=
RESTORE_NONE
);
bits
+=
x
->
wiener_restore_cost
[
type
[
tile_idx
]
!=
RESTORE_NONE
];
plane_rsi
->
wiener_info
[
tile_idx
]
=
wiener_info
[
tile_idx
];
if
(
type
[
tile_idx
]
==
RESTORE_WIENER
)
{
...
...
av1/encoder/rd.c
View file @
bc732efc
...
...
@@ -271,8 +271,19 @@ void av1_fill_mode_rates(AV1_COMMON *const cm, MACROBLOCK *x,
#endif // CONFIG_INTRA_INTERP
#endif // CONFIG_EXT_INTRA
#if CONFIG_LOOP_RESTORATION
av1_cost_tokens
(
x
->
switchable_restore_cost
,
fc
->
switchable_restore_prob
,
av1_switchable_restore_tree
);
av1_cost_tokens_from_cdf
(
x
->
switchable_restore_cost
,
fc
->
switchable_restore_cdf
,
NULL
);
#if CONFIG_NEW_MULTISYMBOL
av1_cost_tokens_from_cdf
(
x
->
wiener_restore_cost
,
fc
->
wiener_restore_cdf
,
NULL
);
av1_cost_tokens_from_cdf
(
x
->
sgrproj_restore_cost
,
fc
->
sgrproj_restore_cdf
,
NULL
);
#else
x
->
wiener_restore_cost
[
0
]
=
av1_cost_bit
(
RESTORE_NONE_WIENER_PROB
,
0
);
x
->
wiener_restore_cost
[
1
]
=
av1_cost_bit
(
RESTORE_NONE_WIENER_PROB
,
1
);
x
->
sgrproj_restore_cost
[
0
]
=
av1_cost_bit
(
RESTORE_NONE_SGRPROJ_PROB
,
0
);
x
->
sgrproj_restore_cost
[
1
]
=
av1_cost_bit
(
RESTORE_NONE_SGRPROJ_PROB
,
1
);
#endif // CONFIG_NEW_MULTISYMBOL
#endif // CONFIG_LOOP_RESTORATION
#if CONFIG_INTRABC
av1_cost_tokens_from_cdf
(
x
->
intrabc_cost
,
fc
->
intrabc_cdf
,
NULL
);
...
...
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