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
0c9e2e9a
Commit
0c9e2e9a
authored
Feb 19, 2013
by
Ronald S. Bultje
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Split coefficient token tables intra vs. inter.
Change-Id: I5416455f8f129ca0f450d00e48358d2012605072
parent
c17672a3
Changes
17
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
882 additions
and
1042 deletions
+882
-1042
vp9/common/vp9_default_coef_probs.h
vp9/common/vp9_default_coef_probs.h
+577
-438
vp9/common/vp9_entropy.c
vp9/common/vp9_entropy.c
+21
-99
vp9/common/vp9_entropy.h
vp9/common/vp9_entropy.h
+5
-12
vp9/common/vp9_onyxc_int.h
vp9/common/vp9_onyxc_int.h
+9
-18
vp9/decoder/vp9_decodemv.c
vp9/decoder/vp9_decodemv.c
+2
-0
vp9/decoder/vp9_decodframe.c
vp9/decoder/vp9_decodframe.c
+15
-29
vp9/decoder/vp9_detokenize.c
vp9/decoder/vp9_detokenize.c
+11
-25
vp9/encoder/vp9_bitstream.c
vp9/encoder/vp9_bitstream.c
+112
-172
vp9/encoder/vp9_block.h
vp9/encoder/vp9_block.h
+1
-2
vp9/encoder/vp9_encodeframe.c
vp9/encoder/vp9_encodeframe.c
+0
-3
vp9/encoder/vp9_encodemb.c
vp9/encoder/vp9_encodemb.c
+11
-8
vp9/encoder/vp9_onyx_if.c
vp9/encoder/vp9_onyx_if.c
+0
-6
vp9/encoder/vp9_onyx_int.h
vp9/encoder/vp9_onyx_int.h
+14
-26
vp9/encoder/vp9_ratectrl.c
vp9/encoder/vp9_ratectrl.c
+0
-6
vp9/encoder/vp9_rdopt.c
vp9/encoder/vp9_rdopt.c
+20
-43
vp9/encoder/vp9_tokenize.c
vp9/encoder/vp9_tokenize.c
+80
-147
vp9/encoder/vp9_tokenize.h
vp9/encoder/vp9_tokenize.h
+4
-8
No files found.
vp9/common/vp9_default_coef_probs.h
View file @
0c9e2e9a
This diff is collapsed.
Click to expand it.
vp9/common/vp9_entropy.c
View file @
0c9e2e9a
...
...
@@ -255,19 +255,10 @@ int vp9_get_coef_context(int * recent_energy, int token) {
void
vp9_default_coef_probs
(
VP9_COMMON
*
pc
)
{
vpx_memcpy
(
pc
->
fc
.
coef_probs_4x4
,
default_coef_probs_4x4
,
sizeof
(
pc
->
fc
.
coef_probs_4x4
));
vpx_memcpy
(
pc
->
fc
.
hybrid_coef_probs_4x4
,
default_hybrid_coef_probs_4x4
,
sizeof
(
pc
->
fc
.
hybrid_coef_probs_4x4
));
vpx_memcpy
(
pc
->
fc
.
coef_probs_8x8
,
default_coef_probs_8x8
,
sizeof
(
pc
->
fc
.
coef_probs_8x8
));
vpx_memcpy
(
pc
->
fc
.
hybrid_coef_probs_8x8
,
default_hybrid_coef_probs_8x8
,
sizeof
(
pc
->
fc
.
hybrid_coef_probs_8x8
));
vpx_memcpy
(
pc
->
fc
.
coef_probs_16x16
,
default_coef_probs_16x16
,
sizeof
(
pc
->
fc
.
coef_probs_16x16
));
vpx_memcpy
(
pc
->
fc
.
hybrid_coef_probs_16x16
,
default_hybrid_coef_probs_16x16
,
sizeof
(
pc
->
fc
.
hybrid_coef_probs_16x16
));
vpx_memcpy
(
pc
->
fc
.
coef_probs_32x32
,
default_coef_probs_32x32
,
sizeof
(
pc
->
fc
.
coef_probs_32x32
));
}
...
...
@@ -290,28 +281,30 @@ static void update_coef_probs(vp9_coeff_probs *dst_coef_probs,
vp9_coeff_probs
*
pre_coef_probs
,
int
block_types
,
vp9_coeff_count
*
coef_counts
,
int
count_sat
,
int
update_factor
)
{
int
t
,
i
,
j
,
k
,
count
;
int
t
,
i
,
j
,
k
,
l
,
count
;
unsigned
int
branch_ct
[
ENTROPY_NODES
][
2
];
vp9_prob
coef_probs
[
ENTROPY_NODES
];
int
factor
;
for
(
i
=
0
;
i
<
block_types
;
++
i
)
for
(
j
=
0
;
j
<
COEF_BANDS
;
++
j
)
for
(
k
=
0
;
k
<
PREV_COEF_CONTEXTS
;
++
k
)
{
if
(
k
>=
3
&&
j
==
0
)
continue
;
vp9_tree_probs_from_distribution
(
MAX_ENTROPY_TOKENS
,
vp9_coef_encodings
,
vp9_coef_tree
,
coef_probs
,
branch_ct
,
coef_counts
[
i
][
j
][
k
]);
for
(
t
=
0
;
t
<
ENTROPY_NODES
;
++
t
)
{
count
=
branch_ct
[
t
][
0
]
+
branch_ct
[
t
][
1
];
count
=
count
>
count_sat
?
count_sat
:
count
;
factor
=
(
update_factor
*
count
/
count_sat
);
dst_coef_probs
[
i
][
j
][
k
][
t
]
=
weighted_prob
(
pre_coef_probs
[
i
][
j
][
k
][
t
],
coef_probs
[
t
],
factor
);
for
(
j
=
0
;
j
<
REF_TYPES
;
++
j
)
for
(
k
=
0
;
k
<
COEF_BANDS
;
++
k
)
for
(
l
=
0
;
l
<
PREV_COEF_CONTEXTS
;
++
l
)
{
if
(
l
>=
3
&&
k
==
0
)
continue
;
vp9_tree_probs_from_distribution
(
MAX_ENTROPY_TOKENS
,
vp9_coef_encodings
,
vp9_coef_tree
,
coef_probs
,
branch_ct
,
coef_counts
[
i
][
j
][
k
][
l
]);
for
(
t
=
0
;
t
<
ENTROPY_NODES
;
++
t
)
{
count
=
branch_ct
[
t
][
0
]
+
branch_ct
[
t
][
1
];
count
=
count
>
count_sat
?
count_sat
:
count
;
factor
=
(
update_factor
*
count
/
count_sat
);
dst_coef_probs
[
i
][
j
][
k
][
l
][
t
]
=
weighted_prob
(
pre_coef_probs
[
i
][
j
][
k
][
l
][
t
],
coef_probs
[
t
],
factor
);
}
}
}
}
void
vp9_adapt_coef_probs
(
VP9_COMMON
*
cm
)
{
...
...
@@ -333,85 +326,14 @@ void vp9_adapt_coef_probs(VP9_COMMON *cm) {
count_sat
=
COEF_COUNT_SAT
;
}
#ifdef COEF_COUNT_TESTING
{
printf
(
"static const unsigned int
\n
coef_counts"
"[BLOCK_TYPES] [COEF_BANDS]"
"[PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {
\n
"
);
for
(
i
=
0
;
i
<
BLOCK_TYPES
;
++
i
)
{
printf
(
" {
\n
"
);
for
(
j
=
0
;
j
<
COEF_BANDS
;
++
j
)
{
printf
(
" {
\n
"
);
for
(
k
=
0
;
k
<
PREV_COEF_CONTEXTS
;
++
k
)
{
printf
(
" {"
);
for
(
t
=
0
;
t
<
MAX_ENTROPY_TOKENS
;
++
t
)
printf
(
"%d, "
,
cm
->
fc
.
coef_counts
[
i
][
j
][
k
][
t
]);
printf
(
"},
\n
"
);
}
printf
(
" },
\n
"
);
}
printf
(
" },
\n
"
);
}
printf
(
"};
\n
"
);
printf
(
"static const unsigned int
\n
coef_counts_8x8"
"[BLOCK_TYPES_8X8] [COEF_BANDS]"
"[PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {
\n
"
);
for
(
i
=
0
;
i
<
BLOCK_TYPES_8X8
;
++
i
)
{
printf
(
" {
\n
"
);
for
(
j
=
0
;
j
<
COEF_BANDS
;
++
j
)
{
printf
(
" {
\n
"
);
for
(
k
=
0
;
k
<
PREV_COEF_CONTEXTS
;
++
k
)
{
printf
(
" {"
);
for
(
t
=
0
;
t
<
MAX_ENTROPY_TOKENS
;
++
t
)
printf
(
"%d, "
,
cm
->
fc
.
coef_counts_8x8
[
i
][
j
][
k
][
t
]);
printf
(
"},
\n
"
);
}
printf
(
" },
\n
"
);
}
printf
(
" },
\n
"
);
}
printf
(
"};
\n
"
);
printf
(
"static const unsigned int
\n
hybrid_coef_counts"
"[BLOCK_TYPES] [COEF_BANDS]"
"[PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {
\n
"
);
for
(
i
=
0
;
i
<
BLOCK_TYPES
;
++
i
)
{
printf
(
" {
\n
"
);
for
(
j
=
0
;
j
<
COEF_BANDS
;
++
j
)
{
printf
(
" {
\n
"
);
for
(
k
=
0
;
k
<
PREV_COEF_CONTEXTS
;
++
k
)
{
printf
(
" {"
);
for
(
t
=
0
;
t
<
MAX_ENTROPY_TOKENS
;
++
t
)
printf
(
"%d, "
,
cm
->
fc
.
hybrid_coef_counts
[
i
][
j
][
k
][
t
]);
printf
(
"},
\n
"
);
}
printf
(
" },
\n
"
);
}
printf
(
" },
\n
"
);
}
printf
(
"};
\n
"
);
}
#endif
update_coef_probs
(
cm
->
fc
.
coef_probs_4x4
,
cm
->
fc
.
pre_coef_probs_4x4
,
BLOCK_TYPES_4X4
,
cm
->
fc
.
coef_counts_4x4
,
count_sat
,
update_factor
);
update_coef_probs
(
cm
->
fc
.
hybrid_coef_probs_4x4
,
cm
->
fc
.
pre_hybrid_coef_probs_4x4
,
BLOCK_TYPES_4X4_HYBRID
,
cm
->
fc
.
hybrid_coef_counts_4x4
,
BLOCK_TYPES
,
cm
->
fc
.
coef_counts_4x4
,
count_sat
,
update_factor
);
update_coef_probs
(
cm
->
fc
.
coef_probs_8x8
,
cm
->
fc
.
pre_coef_probs_8x8
,
BLOCK_TYPES_8X8
,
cm
->
fc
.
coef_counts_8x8
,
count_sat
,
update_factor
);
update_coef_probs
(
cm
->
fc
.
hybrid_coef_probs_8x8
,
cm
->
fc
.
pre_hybrid_coef_probs_8x8
,
BLOCK_TYPES_8X8_HYBRID
,
cm
->
fc
.
hybrid_coef_counts_8x8
,
BLOCK_TYPES
,
cm
->
fc
.
coef_counts_8x8
,
count_sat
,
update_factor
);
update_coef_probs
(
cm
->
fc
.
coef_probs_16x16
,
cm
->
fc
.
pre_coef_probs_16x16
,
BLOCK_TYPES_16X16
,
cm
->
fc
.
coef_counts_16x16
,
count_sat
,
update_factor
);
update_coef_probs
(
cm
->
fc
.
hybrid_coef_probs_16x16
,
cm
->
fc
.
pre_hybrid_coef_probs_16x16
,
BLOCK_TYPES_16X16_HYBRID
,
cm
->
fc
.
hybrid_coef_counts_16x16
,
BLOCK_TYPES
,
cm
->
fc
.
coef_counts_16x16
,
count_sat
,
update_factor
);
update_coef_probs
(
cm
->
fc
.
coef_probs_32x32
,
cm
->
fc
.
pre_coef_probs_32x32
,
BLOCK_TYPES_32X32
,
cm
->
fc
.
coef_counts_32x32
,
...
...
vp9/common/vp9_entropy.h
View file @
0c9e2e9a
...
...
@@ -60,16 +60,9 @@ extern vp9_extra_bit_struct vp9_extra_bits[12]; /* indexed by token value */
/* Coefficients are predicted via a 3-dimensional probability table. */
/* Outside dimension. 0 = Y with DC, 1 = UV */
#define BLOCK_TYPES_4X4 2
#define BLOCK_TYPES_4X4_HYBRID 1
#define BLOCK_TYPES_8X8 2
#define BLOCK_TYPES_8X8_HYBRID 1
#define BLOCK_TYPES_16X16 2
#define BLOCK_TYPES_16X16_HYBRID 1
#define BLOCK_TYPES 2
#define BLOCK_TYPES_32X32 1
#define REF_TYPES 2 // intra=0, inter=1
/* Middle dimension reflects the coefficient position within the transform. */
#define COEF_BANDS 6
...
...
@@ -93,11 +86,11 @@ extern vp9_extra_bit_struct vp9_extra_bits[12]; /* indexed by token value */
/*# define DC_TOKEN_CONTEXTS 3*/
/* 00, 0!0, !0!0 */
#define PREV_COEF_CONTEXTS 6
typedef
unsigned
int
vp9_coeff_count
[
COEF_BANDS
][
PREV_COEF_CONTEXTS
]
typedef
unsigned
int
vp9_coeff_count
[
REF_TYPES
][
COEF_BANDS
][
PREV_COEF_CONTEXTS
]
[
MAX_ENTROPY_TOKENS
];
typedef
unsigned
int
vp9_coeff_stats
[
COEF_BANDS
][
PREV_COEF_CONTEXTS
]
typedef
unsigned
int
vp9_coeff_stats
[
REF_TYPES
][
COEF_BANDS
][
PREV_COEF_CONTEXTS
]
[
ENTROPY_NODES
][
2
];
typedef
vp9_prob
vp9_coeff_probs
[
COEF_BANDS
][
PREV_COEF_CONTEXTS
]
typedef
vp9_prob
vp9_coeff_probs
[
REF_TYPES
][
COEF_BANDS
][
PREV_COEF_CONTEXTS
]
[
ENTROPY_NODES
];
#define SUBEXP_PARAM 4
/* Subexponential code parameter */
...
...
vp9/common/vp9_onyxc_int.h
View file @
0c9e2e9a
...
...
@@ -54,12 +54,9 @@ typedef struct frame_contexts {
vp9_prob
i8x8_mode_prob
[
VP9_I8X8_MODES
-
1
];
vp9_prob
sub_mv_ref_prob
[
SUBMVREF_COUNT
][
VP9_SUBMVREFS
-
1
];
vp9_prob
mbsplit_prob
[
VP9_NUMMBSPLITS
-
1
];
vp9_coeff_probs
coef_probs_4x4
[
BLOCK_TYPES_4X4
];
vp9_coeff_probs
hybrid_coef_probs_4x4
[
BLOCK_TYPES_4X4_HYBRID
];
vp9_coeff_probs
coef_probs_8x8
[
BLOCK_TYPES_8X8
];
vp9_coeff_probs
hybrid_coef_probs_8x8
[
BLOCK_TYPES_8X8_HYBRID
];
vp9_coeff_probs
coef_probs_16x16
[
BLOCK_TYPES_16X16
];
vp9_coeff_probs
hybrid_coef_probs_16x16
[
BLOCK_TYPES_16X16_HYBRID
];
vp9_coeff_probs
coef_probs_4x4
[
BLOCK_TYPES
];
vp9_coeff_probs
coef_probs_8x8
[
BLOCK_TYPES
];
vp9_coeff_probs
coef_probs_16x16
[
BLOCK_TYPES
];
vp9_coeff_probs
coef_probs_32x32
[
BLOCK_TYPES_32X32
];
nmv_context
nmvc
;
...
...
@@ -79,20 +76,14 @@ typedef struct frame_contexts {
unsigned
int
sub_mv_ref_counts
[
SUBMVREF_COUNT
][
VP9_SUBMVREFS
];
unsigned
int
mbsplit_counts
[
VP9_NUMMBSPLITS
];
vp9_coeff_probs
pre_coef_probs_4x4
[
BLOCK_TYPES_4X4
];
vp9_coeff_probs
pre_hybrid_coef_probs_4x4
[
BLOCK_TYPES_4X4_HYBRID
];
vp9_coeff_probs
pre_coef_probs_8x8
[
BLOCK_TYPES_8X8
];
vp9_coeff_probs
pre_hybrid_coef_probs_8x8
[
BLOCK_TYPES_8X8_HYBRID
];
vp9_coeff_probs
pre_coef_probs_16x16
[
BLOCK_TYPES_16X16
];
vp9_coeff_probs
pre_hybrid_coef_probs_16x16
[
BLOCK_TYPES_16X16_HYBRID
];
vp9_coeff_probs
pre_coef_probs_4x4
[
BLOCK_TYPES
];
vp9_coeff_probs
pre_coef_probs_8x8
[
BLOCK_TYPES
];
vp9_coeff_probs
pre_coef_probs_16x16
[
BLOCK_TYPES
];
vp9_coeff_probs
pre_coef_probs_32x32
[
BLOCK_TYPES_32X32
];
vp9_coeff_count
coef_counts_4x4
[
BLOCK_TYPES_4X4
];
vp9_coeff_count
hybrid_coef_counts_4x4
[
BLOCK_TYPES_4X4_HYBRID
];
vp9_coeff_count
coef_counts_8x8
[
BLOCK_TYPES_8X8
];
vp9_coeff_count
hybrid_coef_counts_8x8
[
BLOCK_TYPES_8X8_HYBRID
];
vp9_coeff_count
coef_counts_16x16
[
BLOCK_TYPES_16X16
];
vp9_coeff_count
hybrid_coef_counts_16x16
[
BLOCK_TYPES_16X16_HYBRID
];
vp9_coeff_count
coef_counts_4x4
[
BLOCK_TYPES
];
vp9_coeff_count
coef_counts_8x8
[
BLOCK_TYPES
];
vp9_coeff_count
coef_counts_16x16
[
BLOCK_TYPES
];
vp9_coeff_count
coef_counts_32x32
[
BLOCK_TYPES_32X32
];
nmv_context_counts
NMVcount
;
...
...
vp9/decoder/vp9_decodemv.c
View file @
0c9e2e9a
...
...
@@ -143,6 +143,8 @@ static void kfread_modes(VP9D_COMP *pbi,
int
map_index
=
mb_row
*
pbi
->
common
.
mb_cols
+
mb_col
;
MB_PREDICTION_MODE
y_mode
;
m
->
mbmi
.
ref_frame
=
INTRA_FRAME
;
// Read the Macroblock segmentation map if it is being updated explicitly
// this frame (reset to 0 by default).
m
->
mbmi
.
segment_id
=
0
;
...
...
vp9/decoder/vp9_decodframe.c
View file @
0c9e2e9a
...
...
@@ -1170,20 +1170,21 @@ static void init_frame(VP9D_COMP *pbi) {
static
void
read_coef_probs_common
(
BOOL_DECODER
*
const
bc
,
vp9_coeff_probs
*
coef_probs
,
int
block_types
)
{
int
i
,
j
,
k
,
l
;
int
i
,
j
,
k
,
l
,
m
;
if
(
vp9_read_bit
(
bc
))
{
for
(
i
=
0
;
i
<
block_types
;
i
++
)
{
for
(
j
=
0
;
j
<
COEF_BANDS
;
j
++
)
{
/* NB: This j loop starts from 1 on block type i == 0 */
for
(
k
=
0
;
k
<
PREV_COEF_CONTEXTS
;
k
++
)
{
if
(
k
>=
3
&&
j
==
0
)
continue
;
for
(
l
=
0
;
l
<
ENTROPY_NODES
;
l
++
)
{
vp9_prob
*
const
p
=
coef_probs
[
i
][
j
][
k
]
+
l
;
if
(
vp9_read
(
bc
,
COEF_UPDATE_PROB
))
{
*
p
=
read_prob_diff_update
(
bc
,
*
p
);
for
(
j
=
0
;
j
<
REF_TYPES
;
j
++
)
{
for
(
k
=
0
;
k
<
COEF_BANDS
;
k
++
)
{
for
(
l
=
0
;
l
<
PREV_COEF_CONTEXTS
;
l
++
)
{
if
(
l
>=
3
&&
k
==
0
)
continue
;
for
(
m
=
0
;
m
<
ENTROPY_NODES
;
m
++
)
{
vp9_prob
*
const
p
=
coef_probs
[
i
][
j
][
k
][
l
]
+
m
;
if
(
vp9_read
(
bc
,
COEF_UPDATE_PROB
))
{
*
p
=
read_prob_diff_update
(
bc
,
*
p
);
}
}
}
}
...
...
@@ -1195,19 +1196,13 @@ static void read_coef_probs_common(BOOL_DECODER* const bc,
static
void
read_coef_probs
(
VP9D_COMP
*
pbi
,
BOOL_DECODER
*
const
bc
)
{
VP9_COMMON
*
const
pc
=
&
pbi
->
common
;
read_coef_probs_common
(
bc
,
pc
->
fc
.
coef_probs_4x4
,
BLOCK_TYPES_4X4
);
read_coef_probs_common
(
bc
,
pc
->
fc
.
hybrid_coef_probs_4x4
,
BLOCK_TYPES_4X4_HYBRID
);
read_coef_probs_common
(
bc
,
pc
->
fc
.
coef_probs_4x4
,
BLOCK_TYPES
);
if
(
pbi
->
common
.
txfm_mode
!=
ONLY_4X4
)
{
read_coef_probs_common
(
bc
,
pc
->
fc
.
coef_probs_8x8
,
BLOCK_TYPES_8X8
);
read_coef_probs_common
(
bc
,
pc
->
fc
.
hybrid_coef_probs_8x8
,
BLOCK_TYPES_8X8_HYBRID
);
read_coef_probs_common
(
bc
,
pc
->
fc
.
coef_probs_8x8
,
BLOCK_TYPES
);
}
if
(
pbi
->
common
.
txfm_mode
>
ALLOW_8X8
)
{
read_coef_probs_common
(
bc
,
pc
->
fc
.
coef_probs_16x16
,
BLOCK_TYPES_16X16
);
read_coef_probs_common
(
bc
,
pc
->
fc
.
hybrid_coef_probs_16x16
,
BLOCK_TYPES_16X16_HYBRID
);
read_coef_probs_common
(
bc
,
pc
->
fc
.
coef_probs_16x16
,
BLOCK_TYPES
);
}
if
(
pbi
->
common
.
txfm_mode
>
ALLOW_16X16
)
{
read_coef_probs_common
(
bc
,
pc
->
fc
.
coef_probs_32x32
,
BLOCK_TYPES_32X32
);
...
...
@@ -1582,16 +1577,10 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
vp9_copy
(
pbi
->
common
.
fc
.
pre_coef_probs_4x4
,
pbi
->
common
.
fc
.
coef_probs_4x4
);
vp9_copy
(
pbi
->
common
.
fc
.
pre_hybrid_coef_probs_4x4
,
pbi
->
common
.
fc
.
hybrid_coef_probs_4x4
);
vp9_copy
(
pbi
->
common
.
fc
.
pre_coef_probs_8x8
,
pbi
->
common
.
fc
.
coef_probs_8x8
);
vp9_copy
(
pbi
->
common
.
fc
.
pre_hybrid_coef_probs_8x8
,
pbi
->
common
.
fc
.
hybrid_coef_probs_8x8
);
vp9_copy
(
pbi
->
common
.
fc
.
pre_coef_probs_16x16
,
pbi
->
common
.
fc
.
coef_probs_16x16
);
vp9_copy
(
pbi
->
common
.
fc
.
pre_hybrid_coef_probs_16x16
,
pbi
->
common
.
fc
.
hybrid_coef_probs_16x16
);
vp9_copy
(
pbi
->
common
.
fc
.
pre_coef_probs_32x32
,
pbi
->
common
.
fc
.
coef_probs_32x32
);
vp9_copy
(
pbi
->
common
.
fc
.
pre_ymode_prob
,
pbi
->
common
.
fc
.
ymode_prob
);
...
...
@@ -1606,11 +1595,8 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
#endif
pbi
->
common
.
fc
.
pre_nmvc
=
pbi
->
common
.
fc
.
nmvc
;
vp9_zero
(
pbi
->
common
.
fc
.
coef_counts_4x4
);
vp9_zero
(
pbi
->
common
.
fc
.
hybrid_coef_counts_4x4
);
vp9_zero
(
pbi
->
common
.
fc
.
coef_counts_8x8
);
vp9_zero
(
pbi
->
common
.
fc
.
hybrid_coef_counts_8x8
);
vp9_zero
(
pbi
->
common
.
fc
.
coef_counts_16x16
);
vp9_zero
(
pbi
->
common
.
fc
.
hybrid_coef_counts_16x16
);
vp9_zero
(
pbi
->
common
.
fc
.
coef_counts_32x32
);
vp9_zero
(
pbi
->
common
.
fc
.
ymode_counts
);
vp9_zero
(
pbi
->
common
.
fc
.
sb_ymode_counts
);
...
...
vp9/decoder/vp9_detokenize.c
View file @
0c9e2e9a
...
...
@@ -65,7 +65,7 @@ static int get_signed(BOOL_DECODER *br, int value_to_sign) {
#define INCREMENT_COUNT(token) \
do { \
coef_counts[type][get_coef_band(txfm_size, c)][pt][token]++; \
coef_counts[type][
ref][
get_coef_band(txfm_size, c)][pt][token]++; \
pt = vp9_get_coef_context(&recent_energy, token); \
} while (0)
...
...
@@ -99,39 +99,25 @@ static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd,
vp9_coeff_probs
*
coef_probs
;
vp9_prob
*
prob
;
vp9_coeff_count
*
coef_counts
;
const
int
ref
=
xd
->
mode_info_context
->
mbmi
.
ref_frame
!=
INTRA_FRAME
;
switch
(
txfm_size
)
{
default:
case
TX_4X4
:
if
(
tx_type
==
DCT_DCT
)
{
coef_probs
=
fc
->
coef_probs_4x4
;
coef_counts
=
fc
->
coef_counts_4x4
;
}
else
{
coef_probs
=
fc
->
hybrid_coef_probs_4x4
;
coef_counts
=
fc
->
hybrid_coef_counts_4x4
;
}
coef_probs
=
fc
->
coef_probs_4x4
;
coef_counts
=
fc
->
coef_counts_4x4
;
break
;
case
TX_8X8
:
if
(
tx_type
==
DCT_DCT
)
{
coef_probs
=
fc
->
coef_probs_8x8
;
coef_counts
=
fc
->
coef_counts_8x8
;
}
else
{
coef_probs
=
fc
->
hybrid_coef_probs_8x8
;
coef_counts
=
fc
->
hybrid_coef_counts_8x8
;
}
coef_probs
=
fc
->
coef_probs_8x8
;
coef_counts
=
fc
->
coef_counts_8x8
;
#if CONFIG_CNVCONTEXT
above_ec
=
(
A0
[
aidx
]
+
A0
[
aidx
+
1
])
!=
0
;
left_ec
=
(
L0
[
lidx
]
+
L0
[
lidx
+
1
])
!=
0
;
#endif
break
;
case
TX_16X16
:
if
(
tx_type
==
DCT_DCT
)
{
coef_probs
=
fc
->
coef_probs_16x16
;
coef_counts
=
fc
->
coef_counts_16x16
;
}
else
{
coef_probs
=
fc
->
hybrid_coef_probs_16x16
;
coef_counts
=
fc
->
hybrid_coef_counts_16x16
;
}
coef_probs
=
fc
->
coef_probs_16x16
;
coef_counts
=
fc
->
coef_counts_16x16
;
#if CONFIG_CNVCONTEXT
if
(
type
==
PLANE_TYPE_UV
)
{
ENTROPY_CONTEXT
*
A1
=
(
ENTROPY_CONTEXT
*
)
(
xd
->
above_context
+
1
);
...
...
@@ -176,7 +162,7 @@ static int decode_coefs(VP9D_COMP *dx, const MACROBLOCKD *xd,
int
val
;
const
uint8_t
*
cat6
=
cat6_prob
;
if
(
c
>=
seg_eob
)
break
;
prob
=
coef_probs
[
type
][
get_coef_band
(
txfm_size
,
c
)][
pt
];
prob
=
coef_probs
[
type
][
ref
][
get_coef_band
(
txfm_size
,
c
)][
pt
];
if
(
!
vp9_read
(
br
,
prob
[
EOB_CONTEXT_NODE
]))
break
;
SKIP_START:
...
...
@@ -184,7 +170,7 @@ SKIP_START:
if
(
!
vp9_read
(
br
,
prob
[
ZERO_CONTEXT_NODE
]))
{
INCREMENT_COUNT
(
ZERO_TOKEN
);
++
c
;
prob
=
coef_probs
[
type
][
get_coef_band
(
txfm_size
,
c
)][
pt
];
prob
=
coef_probs
[
type
][
ref
][
get_coef_band
(
txfm_size
,
c
)][
pt
];
goto
SKIP_START
;
}
// ONE_CONTEXT_NODE_0_
...
...
@@ -248,7 +234,7 @@ SKIP_START:
}
if
(
c
<
seg_eob
)
coef_counts
[
type
][
get_coef_band
(
txfm_size
,
c
)][
pt
][
DCT_EOB_TOKEN
]
++
;
coef_counts
[
type
][
ref
][
get_coef_band
(
txfm_size
,
c
)][
pt
][
DCT_EOB_TOKEN
]
++
;
A0
[
aidx
]
=
L0
[
lidx
]
=
(
c
>
0
);
if
(
txfm_size
>=
TX_8X8
)
{
...
...
vp9/encoder/vp9_bitstream.c
View file @
0c9e2e9a
...
...
@@ -42,12 +42,9 @@ unsigned __int64 Sectionbits[500];
int
intra_mode_stats
[
VP9_KF_BINTRAMODES
]
[
VP9_KF_BINTRAMODES
]
[
VP9_KF_BINTRAMODES
];
vp9_coeff_stats
tree_update_hist_4x4
[
BLOCK_TYPES_4X4
];
vp9_coeff_stats
hybrid_tree_update_hist_4x4
[
BLOCK_TYPES_4X4_HYBRID
];
vp9_coeff_stats
tree_update_hist_8x8
[
BLOCK_TYPES_8X8
];
vp9_coeff_stats
hybrid_tree_update_hist_8x8
[
BLOCK_TYPES_8X8_HYBRID
];
vp9_coeff_stats
tree_update_hist_16x16
[
BLOCK_TYPES_16X16
];
vp9_coeff_stats
hybrid_tree_update_hist_16x16
[
BLOCK_TYPES_16X16_HYBRID
];
vp9_coeff_stats
tree_update_hist_4x4
[
BLOCK_TYPES
];
vp9_coeff_stats
tree_update_hist_8x8
[
BLOCK_TYPES
];
vp9_coeff_stats
tree_update_hist_16x16
[
BLOCK_TYPES
];
vp9_coeff_stats
tree_update_hist_32x32
[
BLOCK_TYPES_32X32
];
extern
unsigned
int
active_section
;
...
...
@@ -1145,20 +1142,23 @@ static void write_modes(VP9_COMP *cpi, vp9_writer* const bc,
/* This function is used for debugging probability trees. */
static
void
print_prob_tree
(
vp9_coeff_probs
*
coef_probs
)
{
static
void
print_prob_tree
(
vp9_coeff_probs
*
coef_probs
,
int
block_types
)
{
/* print coef probability tree */
int
i
,
j
,
k
,
l
;
int
i
,
j
,
k
,
l
,
m
;
FILE
*
f
=
fopen
(
"enc_tree_probs.txt"
,
"a"
);
fprintf
(
f
,
"{
\n
"
);
for
(
i
=
0
;
i
<
BLOCK_TYPES_4X4
;
i
++
)
{
for
(
i
=
0
;
i
<
block_types
;
i
++
)
{
fprintf
(
f
,
" {
\n
"
);
for
(
j
=
0
;
j
<
COEF_BANDS
;
j
++
)
{
fprintf
(
f
,
" {
\n
"
);
for
(
k
=
0
;
k
<
PREV_COEF_CONTEXTS
;
k
++
)
{
fprintf
(
f
,
" {"
);
for
(
l
=
0
;
l
<
ENTROPY_NODES
;
l
++
)
{
fprintf
(
f
,
"%3u, "
,
(
unsigned
int
)(
coef_probs
[
i
][
j
][
k
][
l
]));
for
(
j
=
0
;
j
<
REF_TYPES
;
++
j
)
{
fprintf
(
f
,
" {
\n
"
);
for
(
k
=
0
;
k
<
COEF_BANDS
;
k
++
)
{
fprintf
(
f
,
" {
\n
"
);
for
(
l
=
0
;
l
<
PREV_COEF_CONTEXTS
;
l
++
)
{
fprintf
(
f
,
" {"
);
for
(
m
=
0
;
m
<
ENTROPY_NODES
;
m
++
)
{
fprintf
(
f
,
"%3u, "
,
(
unsigned
int
)(
coef_probs
[
i
][
j
][
k
][
l
][
m
]));
}
}
fprintf
(
f
,
" }
\n
"
);
}
...
...
@@ -1178,26 +1178,28 @@ static void build_tree_distribution(vp9_coeff_probs *coef_probs,
#endif
vp9_coeff_stats
*
coef_branch_ct
,
int
block_types
)
{
int
i
=
0
,
j
,
k
;
int
i
,
j
,
k
,
l
;
#ifdef ENTROPY_STATS
int
t
=
0
;
#endif
for
(
i
=
0
;
i
<
block_types
;
++
i
)
{
for
(
j
=
0
;
j
<
COEF_BANDS
;
++
j
)
{
for
(
k
=
0
;
k
<
PREV_COEF_CONTEXTS
;
++
k
)
{
if
(
k
>=
3
&&
j
==
0
)
continue
;
vp9_tree_probs_from_distribution
(
MAX_ENTROPY_TOKENS
,
vp9_coef_encodings
,
vp9_coef_tree
,
coef_probs
[
i
][
j
][
k
],
coef_branch_ct
[
i
][
j
][
k
],
coef_counts
[
i
][
j
][
k
]);
for
(
j
=
0
;
j
<
REF_TYPES
;
++
j
)
{
for
(
k
=
0
;
k
<
COEF_BANDS
;
++
k
)
{
for
(
l
=
0
;
l
<
PREV_COEF_CONTEXTS
;
++
l
)
{
if
(
l
>=
3
&&
k
==
0
)
continue
;
vp9_tree_probs_from_distribution
(
MAX_ENTROPY_TOKENS
,
vp9_coef_encodings
,
vp9_coef_tree
,
coef_probs
[
i
][
j
][
k
][
l
],
coef_branch_ct
[
i
][
j
][
k
][
l
],
coef_counts
[
i
][
j
][
k
][
l
]);
#ifdef ENTROPY_STATS
if
(
!
cpi
->
dummy_packing
)
for
(
t
=
0
;
t
<
MAX_ENTROPY_TOKENS
;
++
t
)
context_counters
[
i
][
j
][
k
][
t
]
+=
coef_counts
[
i
][
j
][
k
][
t
];
context_counters
[
i
][
j
][
k
][
l
][
t
]
+=
coef_counts
[
i
][
j
][
k
][
l
][
t
];
#endif
}
}
}
}
...
...
@@ -1209,40 +1211,19 @@ static void build_coeff_contexts(VP9_COMP *cpi) {
#ifdef ENTROPY_STATS
cpi
,
context_counters_4x4
,
#endif
cpi
->
frame_branch_ct_4x4
,
BLOCK_TYPES_4X4
);
build_tree_distribution
(
cpi
->
frame_hybrid_coef_probs_4x4
,
cpi
->
hybrid_coef_counts_4x4
,
#ifdef ENTROPY_STATS
cpi
,
hybrid_context_counters_4x4
,
#endif
cpi
->
frame_hybrid_branch_ct_4x4
,
BLOCK_TYPES_4X4_HYBRID
);
cpi
->
frame_branch_ct_4x4
,
BLOCK_TYPES
);
build_tree_distribution
(
cpi
->
frame_coef_probs_8x8
,
cpi
->
coef_counts_8x8
,
#ifdef ENTROPY_STATS
cpi
,
context_counters_8x8
,
#endif
cpi
->
frame_branch_ct_8x8
,
BLOCK_TYPES_8X8
);
build_tree_distribution
(
cpi
->
frame_hybrid_coef_probs_8x8
,
cpi
->
hybrid_coef_counts_8x8
,
#ifdef ENTROPY_STATS
cpi
,
hybrid_context_counters_8x8
,
#endif
cpi
->
frame_hybrid_branch_ct_8x8
,
BLOCK_TYPES_8X8_HYBRID
);
cpi
->
frame_branch_ct_8x8
,
BLOCK_TYPES
);
build_tree_distribution
(
cpi
->
frame_coef_probs_16x16
,
cpi
->
coef_counts_16x16
,
#ifdef ENTROPY_STATS
cpi
,
context_counters_16x16
,
#endif
cpi
->
frame_branch_ct_16x16
,
BLOCK_TYPES_16X16
);
build_tree_distribution
(
cpi
->
frame_hybrid_coef_probs_16x16
,
cpi
->
hybrid_coef_counts_16x16
,
#ifdef ENTROPY_STATS
cpi
,
hybrid_context_counters_16x16
,
#endif
cpi
->
frame_hybrid_branch_ct_16x16
,
BLOCK_TYPES_16X16_HYBRID
);
cpi
->
frame_branch_ct_16x16
,
BLOCK_TYPES
);
build_tree_distribution
(
cpi
->
frame_coef_probs_32x32
,
cpi
->
coef_counts_32x32
,
#ifdef ENTROPY_STATS
...
...
@@ -1260,7 +1241,7 @@ static void update_coef_probs_common(vp9_writer* const bc,
vp9_coeff_probs
*
old_frame_coef_probs
,
vp9_coeff_stats
*
frame_branch_ct
,
int
block_types
)
{
int
i
,
j
,
k
,
t
;
int
i
,
j
,
k
,
l
,
t
;
int
update
[
2
]
=
{
0
,
0
};
int
savings
;
// vp9_prob bestupd = find_coef_update_prob(cpi);
...
...
@@ -1268,39 +1249,39 @@ static void update_coef_probs_common(vp9_writer* const bc,
/* dry run to see if there is any udpate at all needed */
savings
=
0
;
for
(
i
=
0
;
i
<
block_types
;
++
i
)
{
for
(
j
=
0
;
j
<
COEF_BANDS
;
++
j
)
{
int
prev_coef_savings
[
ENTROPY_NODES
]
=
{
0
};
for
(
k
=
0
;
k
<
PREV_COEF_CONTEXTS
;
++
k
)
{
for
(
t
=
0
;
t
<
ENTROPY_NODES
;
++
t
)
{
vp9_prob
newp
=
new_frame_coef_probs
[
i
][
j
][
k
][
t
];
const
vp9_prob
oldp
=
old_frame_coef_probs
[
i
][
j
][
k
][
t
];
const
vp9_prob
upd
=
COEF_UPDATE_PROB
;
int
s
=
prev_coef_savings
[
t
];
int
u
=
0
;
if
(
k
>=
3
&&
j
==
0
)
continue
;
for
(
j
=
0
;
j
<
REF_TYPES
;
++
j
)
{
for
(
k
=
0
;
k
<
COEF_BANDS
;
++
k
)
{
int
prev_coef_savings
[
ENTROPY_NODES
]
=
{
0
};
for
(
l
=
0
;
l
<
PREV_COEF_CONTEXTS
;
++
l
)
{
for
(
t
=
0
;
t
<
ENTROPY_NODES
;
++
t
)
{
vp9_prob
newp
=
new_frame_coef_probs
[
i
][
j
][
k
][
l
][
t
];
const
vp9_prob
oldp
=
old_frame_coef_probs
[
i
][
j
][
k
][
l
][
t
];
const
vp9_prob
upd
=
COEF_UPDATE_PROB
;
int
s
=
prev_coef_savings
[
t
];
int
u
=
0
;
if
(
l
>=
3
&&
k
==
0
)
continue
;
#if defined(SEARCH_NEWP)
s
=
prob_diff_update_savings_search
(
frame_branch_ct
[
i
][
j
][
k
][
t
],
oldp
,
&
newp
,
upd
);
if
(
s
>
0
&&
newp
!=
oldp
)
u
=
1
;
if
(
u
)
savings
+=
s
-
(
int
)(
vp9_cost_zero
(
upd
));
else
savings
-=
(
int
)(
vp9_cost_zero
(
upd
));
s
=
prob_diff_update_savings_search
(
frame_branch_ct
[
i
][
j
][
k
][
l
][
t
],
oldp
,
&