Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xiph.Org
aom-rav1e
Commits
9fdf2e2e
Commit
9fdf2e2e
authored
Jan 22, 2018
by
Hui Su
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove more code about probability based entropy coding
Change-Id: Ie0bc1dd68f7a5d81e49da0ae6f855e572e12aa10
parent
5b5f3d50
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
19 additions
and
92 deletions
+19
-92
aom_dsp/prob.h
aom_dsp/prob.h
+2
-21
av1/common/seg_common.c
av1/common/seg_common.c
+0
-4
av1/common/seg_common.h
av1/common/seg_common.h
+0
-2
tools/aom_entropy_optimizer.c
tools/aom_entropy_optimizer.c
+17
-65
No files found.
aom_dsp/prob.h
View file @
9fdf2e2e
...
...
@@ -27,8 +27,6 @@
extern
"C"
{
#endif
typedef
uint8_t
aom_prob
;
// TODO(negge): Rename this aom_prob once we remove vpxbool.
typedef
uint16_t
aom_cdf_prob
;
...
...
@@ -625,30 +623,13 @@ typedef uint16_t aom_cdf_prob;
#define BR_NODE 1
#define aom_prob_half ((aom_prob)128)
typedef
int8_t
aom_tree_index
;
#define TREE_SIZE(leaf_count) (-2 + 2 * (leaf_count))
#define MODE_MV_COUNT_SAT 20
/* We build coding trees compactly in arrays.
Each node of the tree is a pair of aom_tree_indices.
Array index often references a corresponding probability table.
Index <= 0 means done encoding/decoding and value = -Index,
Index > 0 means need another bit, specification at index.
Nonnegative indices are always even; processing begins at node 0. */
typedef
const
aom_tree_index
aom_tree
[];
static
INLINE
aom_prob
get_prob
(
unsigned
int
num
,
unsigned
int
den
)
{
static
INLINE
uint8_t
get_prob
(
unsigned
int
num
,
unsigned
int
den
)
{
assert
(
den
!=
0
);
{
const
int
p
=
(
int
)(((
uint64_t
)
num
*
256
+
(
den
>>
1
))
/
den
);
// (p > 255) ? 255 : (p < 1) ? 1 : p;
const
int
clipped_prob
=
p
|
((
255
-
p
)
>>
23
)
|
(
p
==
0
);
return
(
aom_prob
)
clipped_prob
;
return
(
uint8_t
)
clipped_prob
;
}
}
...
...
av1/common/seg_common.c
View file @
9fdf2e2e
...
...
@@ -75,8 +75,4 @@ void av1_set_segdata(struct segmentation *seg, int segment_id,
seg
->
feature_data
[
segment_id
][
feature_id
]
=
seg_data
;
}
const
aom_tree_index
av1_segment_tree
[
TREE_SIZE
(
MAX_SEGMENTS
)]
=
{
2
,
4
,
6
,
8
,
10
,
12
,
0
,
-
1
,
-
2
,
-
3
,
-
4
,
-
5
,
-
6
,
-
7
};
// TBD? Functions to read and write segment data with range / validity checking
av1/common/seg_common.h
View file @
9fdf2e2e
...
...
@@ -96,8 +96,6 @@ static INLINE int get_segdata(const struct segmentation *seg, int segment_id,
return
seg
->
feature_data
[
segment_id
][
feature_id
];
}
extern
const
aom_tree_index
av1_segment_tree
[
TREE_SIZE
(
MAX_SEGMENTS
)];
#ifdef __cplusplus
}
// extern "C"
#endif
...
...
tools/aom_entropy_optimizer.c
View file @
9fdf2e2e
...
...
@@ -28,64 +28,22 @@
#include "./aom_config.h"
#include "av1/common/entropymode.h"
const
aom_tree_index
av1_intra_mode_tree
[
TREE_SIZE
(
INTRA_MODES
)]
=
{
-
DC_PRED
,
2
,
/* 0 = DC_NODE */
-
PAETH_PRED
,
4
,
/* 1 = PAETH_NODE */
-
V_PRED
,
6
,
/* 2 = V_NODE */
8
,
12
,
/* 3 = COM_NODE */
-
H_PRED
,
10
,
/* 4 = H_NODE */
-
D135_PRED
,
-
D117_PRED
,
/* 5 = D135_NODE */
-
D45_PRED
,
14
,
/* 6 = D45_NODE */
-
D63_PRED
,
16
,
/* 7 = D63_NODE */
-
D153_PRED
,
18
,
/* 8 = D153_NODE */
-
D207_PRED
,
20
,
/* 9 = D207_NODE */
-
SMOOTH_PRED
,
22
,
/* 10 = SMOOTH_NODE */
-
SMOOTH_V_PRED
,
-
SMOOTH_H_PRED
/* 11 = SMOOTH_V_NODE */
};
#define SPACES_PER_TAB 2
typedef
unsigned
int
aom_count_type
;
// A log file recording parsed counts
static
FILE
*
logfile
;
// TODO(yuec): make it a command line option
static
INLINE
aom_prob
get_binary_prob_new
(
unsigned
int
n0
,
unsigned
int
n1
)
{
static
INLINE
uint8_t
get_binary_prob_new
(
unsigned
int
n0
,
unsigned
int
n1
)
{
// The "+1" will prevent this function from generating extreme probability
// when both n0 and n1 are small
const
unsigned
int
den
=
n0
+
1
+
n1
+
1
;
return
get_prob
(
n0
+
1
,
den
);
}
// Optimized probabilities will be stored in probs[].
static
unsigned
int
optimize_tree_probs
(
const
aom_tree_index
*
tree
,
unsigned
int
idx
,
const
unsigned
int
*
counts
,
aom_prob
*
probs
)
{
const
int
l
=
tree
[
idx
];
const
unsigned
int
left_count
=
(
l
<=
0
)
?
counts
[
-
l
]
:
optimize_tree_probs
(
tree
,
l
,
counts
,
probs
);
const
int
r
=
tree
[
idx
+
1
];
const
unsigned
int
right_count
=
(
r
<=
0
)
?
counts
[
-
r
]
:
optimize_tree_probs
(
tree
,
r
,
counts
,
probs
);
probs
[
idx
>>
1
]
=
get_binary_prob_new
(
left_count
,
right_count
);
return
left_count
+
right_count
;
}
static
int
parse_stats
(
aom_count_type
**
ct_ptr
,
FILE
*
const
probsfile
,
int
tabs
,
int
dim_of_cts
,
int
*
cts_each_dim
,
const
aom_tree_index
*
tree
,
int
flatten_last_dim
)
{
int
flatten_last_dim
)
{
if
(
dim_of_cts
<
1
)
{
fprintf
(
stderr
,
"The dimension of a counts vector should be at least 1!
\n
"
);
return
1
;
...
...
@@ -93,7 +51,7 @@ static int parse_stats(aom_count_type **ct_ptr, FILE *const probsfile, int tabs,
if
(
dim_of_cts
==
1
)
{
const
int
total_modes
=
cts_each_dim
[
0
];
aom_count_type
*
counts1d
=
*
ct_ptr
;
aom_prob
*
probs
=
aom_malloc
(
sizeof
(
*
probs
)
*
(
total_modes
-
1
));
uint8_t
*
probs
=
aom_malloc
(
sizeof
(
*
probs
)
*
(
total_modes
-
1
));
if
(
probs
==
NULL
)
{
fprintf
(
stderr
,
"Allocating prob array failed!
\n
"
);
...
...
@@ -101,12 +59,8 @@ static int parse_stats(aom_count_type **ct_ptr, FILE *const probsfile, int tabs,
}
(
*
ct_ptr
)
+=
total_modes
;
if
(
tree
!=
NULL
)
{
optimize_tree_probs
(
tree
,
0
,
counts1d
,
probs
);
}
else
{
assert
(
total_modes
==
2
);
probs
[
0
]
=
get_binary_prob_new
(
counts1d
[
0
],
counts1d
[
1
]);
}
assert
(
total_modes
==
2
);
probs
[
0
]
=
get_binary_prob_new
(
counts1d
[
0
],
counts1d
[
1
]);
if
(
tabs
>
0
)
fprintf
(
probsfile
,
"%*c"
,
tabs
*
SPACES_PER_TAB
,
' '
);
for
(
int
k
=
0
;
k
<
total_modes
-
1
;
++
k
)
{
if
(
k
==
total_modes
-
2
)
...
...
@@ -141,7 +95,7 @@ static int parse_stats(aom_count_type **ct_ptr, FILE *const probsfile, int tabs,
tabs_next_level
=
tabs
+
1
;
}
if
(
parse_stats
(
ct_ptr
,
probsfile
,
tabs_next_level
,
dim_of_cts
-
1
,
cts_each_dim
+
1
,
tree
,
flatten_last_dim
))
{
cts_each_dim
+
1
,
flatten_last_dim
))
{
return
1
;
}
if
(
dim_of_cts
==
2
||
(
dim_of_cts
==
3
&&
flatten_last_dim
))
{
...
...
@@ -167,7 +121,6 @@ static int parse_stats(aom_count_type **ct_ptr, FILE *const probsfile, int tabs,
// probsfile: output file
// dim_of_cts: number of dimensions of counts array
// cts_each_dim: an array storing size of each dimension of counts array
// tree: binary tree for a multi-symbol syntax, or NULL for a binary one
// flatten_last_dim: for a binary syntax, if flatten_last_dim is 0, probs in
// different contexts will be written separately, e.g.,
// {{p1}, {p2}, ...};
...
...
@@ -177,15 +130,14 @@ static int parse_stats(aom_count_type **ct_ptr, FILE *const probsfile, int tabs,
// prefix: declaration header for the entropy table
static
void
optimize_entropy_table
(
aom_count_type
*
counts
,
FILE
*
const
probsfile
,
int
dim_of_cts
,
int
*
cts_each_dim
,
const
aom_tree_index
*
tree
,
int
flatten_last_dim
,
char
*
prefix
)
{
int
*
cts_each_dim
,
int
flatten_last_dim
,
char
*
prefix
)
{
aom_count_type
*
ct_ptr
=
counts
;
assert
(
!
flatten_last_dim
||
cts_each_dim
[
dim_of_cts
-
1
]
==
2
);
fprintf
(
probsfile
,
"%s = {
\n
"
,
prefix
);
if
(
parse_stats
(
&
ct_ptr
,
probsfile
,
1
,
dim_of_cts
,
cts_each_dim
,
tree
,
if
(
parse_stats
(
&
ct_ptr
,
probsfile
,
1
,
dim_of_cts
,
cts_each_dim
,
flatten_last_dim
))
{
fprintf
(
probsfile
,
"Optimizer failed!
\n
"
);
}
...
...
@@ -402,7 +354,7 @@ int main(int argc, const char **argv) {
cts_each_dim
[
0
]
=
NEWMV_MODE_CONTEXTS
;
cts_each_dim
[
1
]
=
2
;
optimize_entropy_table
(
&
fc
.
newmv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
NULL
,
1
,
&
fc
.
newmv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
1
,
"static const aom_prob default_newmv_prob[NEWMV_MODE_CONTEXTS]"
);
optimize_cdf_table
(
&
fc
.
newmv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
"static const aom_cdf_prob "
...
...
@@ -411,7 +363,7 @@ int main(int argc, const char **argv) {
cts_each_dim
[
0
]
=
GLOBALMV_MODE_CONTEXTS
;
cts_each_dim
[
1
]
=
2
;
optimize_entropy_table
(
&
fc
.
zeromv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
NULL
,
1
,
&
fc
.
zeromv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
1
,
"static const aom_prob default_zeromv_prob[GLOBALMV_MODE_CONTEXTS]"
);
optimize_cdf_table
(
&
fc
.
zeromv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
"static const aom_cdf_prob "
...
...
@@ -420,7 +372,7 @@ int main(int argc, const char **argv) {
cts_each_dim
[
0
]
=
REFMV_MODE_CONTEXTS
;
cts_each_dim
[
1
]
=
2
;
optimize_entropy_table
(
&
fc
.
refmv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
NULL
,
1
,
&
fc
.
refmv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
1
,
"static const aom_prob default_refmv_prob[REFMV_MODE_CONTEXTS]"
);
optimize_cdf_table
(
&
fc
.
refmv_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
"static const aom_cdf_prob "
...
...
@@ -587,7 +539,7 @@ int main(int argc, const char **argv) {
cts_each_dim
[
1
]
=
TXB_SKIP_CONTEXTS
;
cts_each_dim
[
2
]
=
2
;
optimize_entropy_table
(
&
fc
.
txb_skip
[
0
][
0
][
0
],
probsfile
,
3
,
cts_each_dim
,
NULL
,
1
,
&
fc
.
txb_skip
[
0
][
0
][
0
],
probsfile
,
3
,
cts_each_dim
,
1
,
"static const aom_prob "
"default_txk_skip[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS]"
);
optimize_cdf_table
(
&
fc
.
txb_skip
[
0
][
0
][
0
],
probsfile
,
3
,
cts_each_dim
,
...
...
@@ -600,7 +552,7 @@ int main(int argc, const char **argv) {
cts_each_dim
[
2
]
=
EOB_COEF_CONTEXTS
;
cts_each_dim
[
3
]
=
2
;
optimize_entropy_table
(
&
fc
.
eob_flag
[
0
][
0
][
0
][
0
],
probsfile
,
4
,
cts_each_dim
,
NULL
,
1
,
&
fc
.
eob_flag
[
0
][
0
][
0
][
0
],
probsfile
,
4
,
cts_each_dim
,
1
,
"static const aom_prob "
"default_eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]"
);
...
...
@@ -609,7 +561,7 @@ int main(int argc, const char **argv) {
cts_each_dim
[
2
]
=
EOB_COEF_CONTEXTS
;
cts_each_dim
[
3
]
=
2
;
optimize_entropy_table
(
&
fc
.
eob_extra
[
0
][
0
][
0
][
0
],
probsfile
,
4
,
cts_each_dim
,
NULL
,
1
,
&
fc
.
eob_extra
[
0
][
0
][
0
][
0
],
probsfile
,
4
,
cts_each_dim
,
1
,
"static const aom_prob "
"default_eob_extra[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]"
);
...
...
@@ -668,7 +620,7 @@ int main(int argc, const char **argv) {
cts_each_dim
[
3
]
=
LEVEL_CONTEXTS
;
cts_each_dim
[
4
]
=
2
;
optimize_entropy_table
(
&
fc
.
coeff_lps
[
0
][
0
][
0
][
0
][
0
],
probsfile
,
5
,
cts_each_dim
,
NULL
,
1
,
cts_each_dim
,
1
,
"static const aom_prob "
"default_coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE-"
"1][LEVEL_CONTEXTS]"
);
...
...
@@ -709,7 +661,7 @@ int main(int argc, const char **argv) {
cts_each_dim
[
0
]
=
SKIP_MODE_CONTEXTS
;
cts_each_dim
[
1
]
=
2
;
optimize_entropy_table
(
&
fc
.
skip_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
NULL
,
1
,
&
fc
.
skip_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
1
,
"static const aom_prob default_skip_mode_probs[SKIP_MODE_CONTEXTS]"
);
optimize_cdf_table
(
&
fc
.
skip_mode
[
0
][
0
],
probsfile
,
2
,
cts_each_dim
,
"static const aom_cdf_prob "
...
...
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