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
49dcc714
Commit
49dcc714
authored
Mar 26, 2013
by
Deb Mukherjee
Committed by
Gerrit Code Review
Mar 26, 2013
Browse files
Merge "Modeling default coef probs with distribution" into experimental
parents
f68350ca
fd18d5df
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
configure
View file @
49dcc714
...
...
@@ -247,6 +247,7 @@ EXPERIMENT_LIST="
abovesprefmv
code_nonzerocount
useselectrefmv
modelcoefprob
"
CONFIG_LIST
=
"
external_build
...
...
vp9/common/vp9_coefupdateprobs.h
View file @
49dcc714
...
...
@@ -13,9 +13,10 @@
/* Update probabilities for the nodes in the token entropy tree.
Generated file included by vp9_entropy.c */
#define COEF_UPDATE_PROB 252
#define COEF_UPDATE_PROB_8X8 252
#define COEF_UPDATE_PROB_16X16 252
static
const
vp9_prob
vp9_coef_update_prob
[
ENTROPY_NODES
]
=
{
252
,
252
,
252
,
252
,
252
,
252
,
252
,
252
,
252
,
252
,
252
};
#if CONFIG_CODE_NONZEROCOUNT
#define NZC_UPDATE_PROB_4X4 252
...
...
@@ -25,4 +26,8 @@
#define NZC_UPDATE_PROB_PCAT 252
#endif
#if CONFIG_MODELCOEFPROB
#define COEF_MODEL_UPDATE_PROB 16
#endif
#endif // VP9_COMMON_VP9_COEFUPDATEPROBS_H__
vp9/common/vp9_default_coef_probs.h
View file @
49dcc714
...
...
@@ -11,6 +11,10 @@
/*Generated file, included by vp9_entropy.c*/
// NOTE: When the CONFIG_MODELCOEFPROB experiment is on, only the first
// 2 or 3 from each row is actually used depending on whether
// UNCONSTRAINDED_NODES is 2 or 3. If this experiment is merged
// the tables below should be shortened accordingly.
static
const
vp9_coeff_probs
default_coef_probs_4x4
[
BLOCK_TYPES
]
=
{
{
/* block Type 0 */
{
/* Intra */
...
...
vp9/common/vp9_entropy.c
View file @
49dcc714
This diff is collapsed.
Click to expand it.
vp9/common/vp9_entropy.h
View file @
49dcc714
...
...
@@ -15,7 +15,6 @@
#include "vp9/common/vp9_treecoder.h"
#include "vp9/common/vp9_blockd.h"
#include "vp9/common/vp9_common.h"
#include "vp9/common/vp9_coefupdateprobs.h"
extern
const
int
vp9_i8x8_block
[
4
];
...
...
@@ -33,8 +32,8 @@ extern const int vp9_i8x8_block[4];
#define DCT_VAL_CATEGORY5 9
/* 35-66 Extra Bits 5+1 */
#define DCT_VAL_CATEGORY6 10
/* 67+ Extra Bits 14+1 */
#define DCT_EOB_TOKEN 11
/* EOB Extra Bits 0+0 */
#define MAX_ENTROPY_TOKENS 12
#define ENTROPY_NODES 11
#define MAX_ENTROPY_TOKENS
12
#define ENTROPY_NODES
11
#define EOSB_TOKEN 127
/* Not signalled, encoder only */
#define INTER_MODE_CONTEXTS 7
...
...
@@ -142,6 +141,33 @@ static int get_coef_band(TX_SIZE tx_size, int coef_index) {
}
extern
int
vp9_get_coef_context
(
int
*
recent_energy
,
int
token
);
#if CONFIG_MODELCOEFPROB
#define COEFPROB_BITS 8
#define COEFPROB_MODELS (1 << COEFPROB_BITS)
// 2 => EOB and Zero nodes are unconstrained, rest are modeled
// 3 => EOB, Zero and One nodes are unconstrained, rest are modeled
#define UNCONSTRAINED_NODES 3 // Choose one of 2 or 3
// whether forward updates are model-based
#define MODEL_BASED_UPDATE 0
// if model-based how many nodes are unconstrained
#define UNCONSTRAINED_UPDATE_NODES 3
// whether backward updates are model-based
#define MODEL_BASED_ADAPT 0
#define UNCONSTRAINED_ADAPT_NODES 3
// whether to adjust the coef probs for key frames based on qindex
#define ADJUST_KF_COEF_PROBS 0
typedef
vp9_prob
vp9_coeff_probs_model
[
REF_TYPES
][
COEF_BANDS
]
[
PREV_COEF_CONTEXTS
][
2
];
extern
const
vp9_prob
vp9_modelcoefprobs
[
COEFPROB_MODELS
][
ENTROPY_NODES
-
1
];
void
vp9_get_model_distribution
(
vp9_prob
model
,
vp9_prob
*
tree_probs
,
int
b
,
int
r
);
void
vp9_adjust_default_coef_probs
(
struct
VP9Common
*
cm
);
#endif // CONFIG_MODELCOEFPROB
#if CONFIG_CODE_NONZEROCOUNT
/* Alphabet for number of non-zero symbols in block */
#define NZC_0 0
/* Used for all blocks */
...
...
@@ -224,4 +250,7 @@ extern const int vp9_extranzcbits[NZC32X32_TOKENS];
extern
const
int
vp9_basenzcvalue
[
NZC32X32_TOKENS
];
#endif // CONFIG_CODE_NONZEROCOUNT
#include "vp9/common/vp9_coefupdateprobs.h"
#endif // VP9_COMMON_VP9_ENTROPY_H_
vp9/decoder/vp9_decodframe.c
View file @
49dcc714
...
...
@@ -1197,6 +1197,12 @@ static void read_nzc_probs(VP9_COMMON *cm,
static
void
read_coef_probs_common
(
BOOL_DECODER
*
const
bc
,
vp9_coeff_probs
*
coef_probs
,
int
block_types
)
{
#if CONFIG_MODELCOEFPROB && MODEL_BASED_UPDATE
const
int
entropy_nodes_update
=
UNCONSTRAINED_UPDATE_NODES
;
#else
const
int
entropy_nodes_update
=
ENTROPY_NODES
;
#endif
int
i
,
j
,
k
,
l
,
m
;
if
(
vp9_read_bit
(
bc
))
{
...
...
@@ -1206,11 +1212,15 @@ static void read_coef_probs_common(BOOL_DECODER* const bc,
for
(
l
=
0
;
l
<
PREV_COEF_CONTEXTS
;
l
++
)
{
if
(
l
>=
3
&&
k
==
0
)
continue
;
for
(
m
=
CONFIG_CODE_NONZEROCOUNT
;
m
<
ENTROPY_NODES
;
m
++
)
{
for
(
m
=
CONFIG_CODE_NONZEROCOUNT
;
m
<
entropy_nodes_update
;
m
++
)
{
vp9_prob
*
const
p
=
coef_probs
[
i
][
j
][
k
][
l
]
+
m
;
if
(
vp9_read
(
bc
,
COEF_UPDATE_PROB
))
{
if
(
vp9_read
(
bc
,
vp9_coef_update_prob
[
m
]
))
{
*
p
=
read_prob_diff_update
(
bc
,
*
p
);
#if CONFIG_MODELCOEFPROB && MODEL_BASED_UPDATE
if
(
m
==
1
)
vp9_get_model_distribution
(
*
p
,
coef_probs
[
i
][
j
][
k
][
l
],
i
,
j
);
#endif
}
}
}
...
...
@@ -1611,6 +1621,10 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
}
}
}
#if CONFIG_MODELCOEFPROB && ADJUST_KF_COEF_PROBS
if
(
pc
->
frame_type
==
KEY_FRAME
)
vp9_adjust_default_coef_probs
(
pc
);
#endif
#if CONFIG_NEW_MVREF
// If Key frame reset mv ref id probabilities to defaults
...
...
vp9/encoder/vp9_bitstream.c
View file @
49dcc714
...
...
@@ -399,6 +399,43 @@ static int prob_diff_update_savings_search(const unsigned int *ct,
return
bestsavings
;
}
#if CONFIG_MODELCOEFPROB && MODEL_BASED_UPDATE
static
int
prob_diff_update_savings_search_model
(
const
unsigned
int
*
ct
,
const
vp9_prob
*
oldp
,
vp9_prob
*
bestp
,
const
vp9_prob
upd
,
int
b
,
int
r
)
{
int
i
,
old_b
,
new_b
,
update_b
,
savings
,
bestsavings
,
step
;
int
newp
;
vp9_prob
bestnewp
,
newplist
[
ENTROPY_NODES
];
for
(
i
=
UNCONSTRAINED_NODES
-
1
,
old_b
=
0
;
i
<
ENTROPY_NODES
;
++
i
)
old_b
+=
cost_branch256
(
ct
+
2
*
i
,
oldp
[
i
]);
bestsavings
=
0
;
bestnewp
=
oldp
[
UNCONSTRAINED_NODES
-
1
];
step
=
(
*
bestp
>
oldp
[
UNCONSTRAINED_NODES
-
1
]
?
-
1
:
1
);
newp
=
*
bestp
;
// newp = *bestp - step * (abs(*bestp - oldp[UNCONSTRAINED_NODES - 1]) >> 1);
for
(;
newp
!=
oldp
[
UNCONSTRAINED_NODES
-
1
];
newp
+=
step
)
{
if
(
newp
<
1
||
newp
>
255
)
continue
;
newplist
[
UNCONSTRAINED_NODES
-
1
]
=
newp
;
vp9_get_model_distribution
(
newp
,
newplist
,
b
,
r
);
for
(
i
=
UNCONSTRAINED_NODES
-
1
,
new_b
=
0
;
i
<
ENTROPY_NODES
;
++
i
)
new_b
+=
cost_branch256
(
ct
+
2
*
i
,
newplist
[
i
]);
update_b
=
prob_diff_update_cost
(
newp
,
oldp
[
UNCONSTRAINED_NODES
-
1
])
+
vp9_cost_upd256
;
savings
=
old_b
-
new_b
-
update_b
;
if
(
savings
>
bestsavings
)
{
bestsavings
=
savings
;
bestnewp
=
newp
;
}
}
*
bestp
=
bestnewp
;
return
bestsavings
;
}
#endif
static
void
vp9_cond_prob_update
(
vp9_writer
*
bc
,
vp9_prob
*
oldp
,
vp9_prob
upd
,
unsigned
int
*
ct
)
{
vp9_prob
newp
;
...
...
@@ -2014,6 +2051,11 @@ static void update_coef_probs_common(vp9_writer* const bc,
int
i
,
j
,
k
,
l
,
t
;
int
update
[
2
]
=
{
0
,
0
};
int
savings
;
#if CONFIG_MODELCOEFPROB && MODEL_BASED_UPDATE
const
int
entropy_nodes_update
=
UNCONSTRAINED_UPDATE_NODES
;
#else
const
int
entropy_nodes_update
=
ENTROPY_NODES
;
#endif
// vp9_prob bestupd = find_coef_update_prob(cpi);
/* dry run to see if there is any udpate at all needed */
...
...
@@ -2021,20 +2063,27 @@ static void update_coef_probs_common(vp9_writer* const bc,
for
(
i
=
0
;
i
<
block_types
;
++
i
)
{
for
(
j
=
0
;
j
<
REF_TYPES
;
++
j
)
{
for
(
k
=
0
;
k
<
COEF_BANDS
;
++
k
)
{
int
prev_coef_savings
[
ENTROPY_NODES
]
=
{
0
};
//
int prev_coef_savings[ENTROPY_NODES] = {0};
for
(
l
=
0
;
l
<
PREV_COEF_CONTEXTS
;
++
l
)
{
for
(
t
=
CONFIG_CODE_NONZEROCOUNT
;
t
<
ENTROPY_NODES
;
++
t
)
{
for
(
t
=
CONFIG_CODE_NONZEROCOUNT
;
t
<
entropy_nodes_update
;
++
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
];
const
vp9_prob
upd
=
vp9_coef_update_prob
[
t
]
;
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
][
l
][
t
],
oldp
,
&
newp
,
upd
);
#if CONFIG_MODELCOEFPROB && MODEL_BASED_UPDATE
if
(
t
==
UNCONSTRAINED_NODES
-
1
)
s
=
prob_diff_update_savings_search_model
(
frame_branch_ct
[
i
][
j
][
k
][
l
][
0
],
old_frame_coef_probs
[
i
][
j
][
k
][
l
],
&
newp
,
upd
,
i
,
j
);
else
#endif
s
=
prob_diff_update_savings_search
(
frame_branch_ct
[
i
][
j
][
k
][
l
][
t
],
oldp
,
&
newp
,
upd
);
if
(
s
>
0
&&
newp
!=
oldp
)
u
=
1
;
if
(
u
)
...
...
@@ -2061,45 +2110,57 @@ static void update_coef_probs_common(vp9_writer* const bc,
/* Is coef updated at all */
if
(
update
[
1
]
==
0
||
savings
<
0
)
{
vp9_write_bit
(
bc
,
0
);
}
else
{
vp9_write_bit
(
bc
,
1
);
for
(
i
=
0
;
i
<
block_types
;
++
i
)
{
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
)
{
// calc probs and branch cts for this frame only
for
(
t
=
CONFIG_CODE_NONZEROCOUNT
;
t
<
ENTROPY_NODES
;
++
t
)
{
vp9_prob
newp
=
new_frame_coef_probs
[
i
][
j
][
k
][
l
][
t
];
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
;
return
;
}
vp9_write_bit
(
bc
,
1
);
for
(
i
=
0
;
i
<
block_types
;
++
i
)
{
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
)
{
// calc probs and branch cts for this frame only
for
(
t
=
CONFIG_CODE_NONZEROCOUNT
;
t
<
entropy_nodes_update
;
++
t
)
{
vp9_prob
newp
=
new_frame_coef_probs
[
i
][
j
][
k
][
l
][
t
];
vp9_prob
*
oldp
=
old_frame_coef_probs
[
i
][
j
][
k
][
l
]
+
t
;
const
vp9_prob
upd
=
vp9_coef_update_prob
[
t
];
int
s
;
// = prev_coef_savings[t];
int
u
=
0
;
if
(
l
>=
3
&&
k
==
0
)
continue
;
#if defined(SEARCH_NEWP)
#if CONFIG_MODELCOEFPROB && MODEL_BASED_UPDATE
if
(
t
==
UNCONSTRAINED_NODES
-
1
)
s
=
prob_diff_update_savings_search_model
(
frame_branch_ct
[
i
][
j
][
k
][
l
][
0
],
old_frame_coef_probs
[
i
][
j
][
k
][
l
],
&
newp
,
upd
,
i
,
j
);
else
#endif
s
=
prob_diff_update_savings_search
(
frame_branch_ct
[
i
][
j
][
k
][
l
][
t
],
*
oldp
,
&
newp
,
upd
);
if
(
s
>
0
&&
newp
!=
*
oldp
)
u
=
1
;
frame_branch_ct
[
i
][
j
][
k
][
l
][
t
],
*
oldp
,
&
newp
,
upd
);
if
(
s
>
0
&&
newp
!=
*
oldp
)
u
=
1
;
#else
s
=
prob_update_savings
(
frame_branch_ct
[
i
][
j
][
k
][
l
][
t
],
*
oldp
,
newp
,
upd
);
if
(
s
>
0
)
u
=
1
;
s
=
prob_update_savings
(
frame_branch_ct
[
i
][
j
][
k
][
l
][
t
],
*
oldp
,
newp
,
upd
);
if
(
s
>
0
)
u
=
1
;
#endif
vp9_write
(
bc
,
u
,
upd
);
vp9_write
(
bc
,
u
,
upd
);
#ifdef ENTROPY_STATS
if
(
!
cpi
->
dummy_packing
)
++
tree_update_hist
[
i
][
j
][
k
][
l
][
t
][
u
];
if
(
!
cpi
->
dummy_packing
)
++
tree_update_hist
[
i
][
j
][
k
][
l
][
t
][
u
];
#endif
if
(
u
)
{
/* send/use new probability */
write_prob_diff_update
(
bc
,
newp
,
*
oldp
);
*
oldp
=
newp
;
#if CONFIG_MODELCOEFPROB && MODEL_BASED_UPDATE
if
(
t
==
UNCONSTRAINED_NODES
-
1
)
vp9_get_model_distribution
(
newp
,
old_frame_coef_probs
[
i
][
j
][
k
][
l
],
i
,
j
);
#endif
if
(
u
)
{
/* send/use new probability */
write_prob_diff_update
(
bc
,
newp
,
*
oldp
);
*
oldp
=
newp
;
}
}
}
}
...
...
vp9/encoder/vp9_encodeframe.c
View file @
49dcc714
...
...
@@ -1287,9 +1287,6 @@ static void encode_frame_internal(VP9_COMP *cpi) {
vp9_zero
(
cpi
->
mb_mv_ref_count
);
#endif
// force lossless mode
if
(
cm
->
base_qindex
<=
4
)
cm
->
base_qindex
=
0
;
cpi
->
mb
.
e_mbd
.
lossless
=
(
cm
->
base_qindex
==
0
&&
cm
->
y1dc_delta_q
==
0
&&
cm
->
uvdc_delta_q
==
0
&&
...
...
vp9/encoder/vp9_onyx_if.c
View file @
49dcc714
...
...
@@ -3042,6 +3042,10 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
}
// transform / motion compensation build reconstruction frame
#if CONFIG_MODELCOEFPROB && ADJUST_KF_COEF_PROBS
if
(
cm
->
frame_type
==
KEY_FRAME
)
vp9_adjust_default_coef_probs
(
cm
);
#endif
vp9_encode_frame
(
cpi
);
...
...
vp9/encoder/vp9_quantize.c
View file @
49dcc714
...
...
@@ -730,6 +730,10 @@ void vp9_set_quantizer(struct VP9_COMP *cpi, int Q) {
cm
->
base_qindex
=
Q
;
// Set lossless mode
if
(
cm
->
base_qindex
<=
4
)
cm
->
base_qindex
=
0
;
// if any of the delta_q values are changing update flag will
// have to be set.
cm
->
y1dc_delta_q
=
0
;
...
...
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