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
9504f5fa
Commit
9504f5fa
authored
Jun 06, 2013
by
Deb Mukherjee
Committed by
Gerrit Code Review
Jun 06, 2013
Browse files
Options
Browse Files
Download
Plain Diff
Merge "Fix in forward updates for INTRA modes/partitions" into experimental
parents
61e65862
26937046
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
94 additions
and
102 deletions
+94
-102
vp9/decoder/vp9_decodemv.c
vp9/decoder/vp9_decodemv.c
+14
-8
vp9/encoder/vp9_bitstream.c
vp9/encoder/vp9_bitstream.c
+80
-94
No files found.
vp9/decoder/vp9_decodemv.c
View file @
9504f5fa
...
...
@@ -404,14 +404,20 @@ static void mb_mode_mv_init(VP9D_COMP *pbi, vp9_reader *r) {
cm
->
prob_comppred
[
i
]
=
vp9_read_prob
(
r
);
// VP9_INTRA_MODES
if
(
vp9_read_bit
(
r
))
for
(
i
=
0
;
i
<
VP9_INTRA_MODES
-
1
;
++
i
)
cm
->
fc
.
y_mode_prob
[
i
]
=
vp9_read_prob
(
r
);
for
(
j
=
0
;
j
<
NUM_PARTITION_CONTEXTS
;
++
j
)
if
(
vp9_read_bit
(
r
))
for
(
i
=
0
;
i
<
PARTITION_TYPES
-
1
;
++
i
)
cm
->
fc
.
partition_prob
[
j
][
i
]
=
vp9_read_prob
(
r
);
for
(
i
=
0
;
i
<
VP9_INTRA_MODES
-
1
;
++
i
)
{
if
(
vp9_read
(
r
,
VP9_DEF_UPDATE_PROB
))
{
cm
->
fc
.
y_mode_prob
[
i
]
=
vp9_read_prob_diff_update
(
r
,
cm
->
fc
.
y_mode_prob
[
i
]);
}
}
for
(
j
=
0
;
j
<
NUM_PARTITION_CONTEXTS
;
++
j
)
{
for
(
i
=
0
;
i
<
PARTITION_TYPES
-
1
;
++
i
)
{
if
(
vp9_read
(
r
,
VP9_DEF_UPDATE_PROB
))
{
cm
->
fc
.
partition_prob
[
j
][
i
]
=
vp9_read_prob_diff_update
(
r
,
cm
->
fc
.
partition_prob
[
j
][
i
]);
}
}
}
read_nmvprobs
(
r
,
nmvc
,
xd
->
allow_high_precision_mv
);
}
...
...
vp9/encoder/vp9_bitstream.c
View file @
9504f5fa
...
...
@@ -203,100 +203,6 @@ static int prob_diff_update_cost(vp9_prob newp, vp9_prob oldp) {
return
update_bits
[
delp
]
*
256
;
}
static
void
update_mode
(
vp9_writer
*
w
,
int
n
,
const
struct
vp9_token
tok
[
/* n */
],
vp9_tree
tree
,
vp9_prob
Pnew
[
/* n-1 */
],
vp9_prob
Pcur
[
/* n-1 */
],
unsigned
int
bct
[
/* n-1 */
]
[
2
],
const
unsigned
int
num_events
[
/* n */
]
)
{
unsigned
int
new_b
=
0
,
old_b
=
0
;
int
i
=
0
;
vp9_tree_probs_from_distribution
(
tree
,
Pnew
,
bct
,
num_events
,
0
);
n
--
;
do
{
new_b
+=
cost_branch
(
bct
[
i
],
Pnew
[
i
]);
old_b
+=
cost_branch
(
bct
[
i
],
Pcur
[
i
]);
}
while
(
++
i
<
n
);
if
(
new_b
+
(
n
<<
8
)
<
old_b
)
{
int
i
=
0
;
vp9_write_bit
(
w
,
1
);
do
{
const
vp9_prob
p
=
Pnew
[
i
];
vp9_write_literal
(
w
,
Pcur
[
i
]
=
p
?
p
:
1
,
8
);
}
while
(
++
i
<
n
);
}
else
vp9_write_bit
(
w
,
0
);
}
static
void
update_mbintra_mode_probs
(
VP9_COMP
*
const
cpi
,
vp9_writer
*
const
bc
)
{
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
vp9_prob
pnew
[
VP9_INTRA_MODES
-
1
];
unsigned
int
bct
[
VP9_INTRA_MODES
-
1
][
2
];
update_mode
(
bc
,
VP9_INTRA_MODES
,
vp9_intra_mode_encodings
,
vp9_intra_mode_tree
,
pnew
,
cm
->
fc
.
y_mode_prob
,
bct
,
(
unsigned
int
*
)
cpi
->
y_mode_count
);
}
void
vp9_update_skip_probs
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
const
pc
=
&
cpi
->
common
;
int
k
;
for
(
k
=
0
;
k
<
MBSKIP_CONTEXTS
;
++
k
)
pc
->
mbskip_pred_probs
[
k
]
=
get_binary_prob
(
cpi
->
skip_false_count
[
k
],
cpi
->
skip_true_count
[
k
]);
}
// This function updates the reference frame prediction stats
static
void
update_refpred_stats
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
int
i
;
vp9_prob
new_pred_probs
[
PREDICTION_PROBS
];
int
old_cost
,
new_cost
;
// Set the prediction probability structures to defaults
if
(
cm
->
frame_type
!=
KEY_FRAME
)
{
// From the prediction counts set the probabilities for each context
for
(
i
=
0
;
i
<
PREDICTION_PROBS
;
i
++
)
{
const
int
c0
=
cpi
->
ref_pred_count
[
i
][
0
];
const
int
c1
=
cpi
->
ref_pred_count
[
i
][
1
];
new_pred_probs
[
i
]
=
get_binary_prob
(
c0
,
c1
);
// Decide whether or not to update the reference frame probs.
// Returned costs are in 1/256 bit units.
old_cost
=
c0
*
vp9_cost_zero
(
cm
->
ref_pred_probs
[
i
])
+
c1
*
vp9_cost_one
(
cm
->
ref_pred_probs
[
i
]);
new_cost
=
c0
*
vp9_cost_zero
(
new_pred_probs
[
i
])
+
c1
*
vp9_cost_one
(
new_pred_probs
[
i
]);
// Cost saving must be >= 8 bits (2048 in these units)
if
((
old_cost
-
new_cost
)
>=
2048
)
{
cpi
->
ref_pred_probs_update
[
i
]
=
1
;
cm
->
ref_pred_probs
[
i
]
=
new_pred_probs
[
i
];
}
else
cpi
->
ref_pred_probs_update
[
i
]
=
0
;
}
}
}
static
void
write_intra_mode
(
vp9_writer
*
bc
,
int
m
,
const
vp9_prob
*
p
)
{
write_token
(
bc
,
vp9_intra_mode_tree
,
p
,
vp9_intra_mode_encodings
+
m
);
}
static
int
prob_update_savings
(
const
unsigned
int
*
ct
,
const
vp9_prob
oldp
,
const
vp9_prob
newp
,
const
vp9_prob
upd
)
{
...
...
@@ -401,6 +307,86 @@ static void vp9_cond_prob_diff_update(vp9_writer *bc, vp9_prob *oldp,
}
}
static
void
update_mode
(
vp9_writer
*
w
,
int
n
,
const
struct
vp9_token
tok
[
/* n */
],
vp9_tree
tree
,
vp9_prob
Pnew
[
/* n-1 */
],
vp9_prob
Pcur
[
/* n-1 */
],
unsigned
int
bct
[
/* n-1 */
]
[
2
],
const
unsigned
int
num_events
[
/* n */
]
)
{
int
i
=
0
;
vp9_tree_probs_from_distribution
(
tree
,
Pnew
,
bct
,
num_events
,
0
);
n
--
;
for
(
i
=
0
;
i
<
n
;
++
i
)
{
vp9_cond_prob_diff_update
(
w
,
&
Pcur
[
i
],
VP9_DEF_UPDATE_PROB
,
bct
[
i
]);
}
}
static
void
update_mbintra_mode_probs
(
VP9_COMP
*
const
cpi
,
vp9_writer
*
const
bc
)
{
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
vp9_prob
pnew
[
VP9_INTRA_MODES
-
1
];
unsigned
int
bct
[
VP9_INTRA_MODES
-
1
][
2
];
update_mode
(
bc
,
VP9_INTRA_MODES
,
vp9_intra_mode_encodings
,
vp9_intra_mode_tree
,
pnew
,
cm
->
fc
.
y_mode_prob
,
bct
,
(
unsigned
int
*
)
cpi
->
y_mode_count
);
}
void
vp9_update_skip_probs
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
const
pc
=
&
cpi
->
common
;
int
k
;
for
(
k
=
0
;
k
<
MBSKIP_CONTEXTS
;
++
k
)
pc
->
mbskip_pred_probs
[
k
]
=
get_binary_prob
(
cpi
->
skip_false_count
[
k
],
cpi
->
skip_true_count
[
k
]);
}
// This function updates the reference frame prediction stats
static
void
update_refpred_stats
(
VP9_COMP
*
cpi
)
{
VP9_COMMON
*
const
cm
=
&
cpi
->
common
;
int
i
;
vp9_prob
new_pred_probs
[
PREDICTION_PROBS
];
int
old_cost
,
new_cost
;
// Set the prediction probability structures to defaults
if
(
cm
->
frame_type
!=
KEY_FRAME
)
{
// From the prediction counts set the probabilities for each context
for
(
i
=
0
;
i
<
PREDICTION_PROBS
;
i
++
)
{
const
int
c0
=
cpi
->
ref_pred_count
[
i
][
0
];
const
int
c1
=
cpi
->
ref_pred_count
[
i
][
1
];
new_pred_probs
[
i
]
=
get_binary_prob
(
c0
,
c1
);
// Decide whether or not to update the reference frame probs.
// Returned costs are in 1/256 bit units.
old_cost
=
c0
*
vp9_cost_zero
(
cm
->
ref_pred_probs
[
i
])
+
c1
*
vp9_cost_one
(
cm
->
ref_pred_probs
[
i
]);
new_cost
=
c0
*
vp9_cost_zero
(
new_pred_probs
[
i
])
+
c1
*
vp9_cost_one
(
new_pred_probs
[
i
]);
// Cost saving must be >= 8 bits (2048 in these units)
if
((
old_cost
-
new_cost
)
>=
2048
)
{
cpi
->
ref_pred_probs_update
[
i
]
=
1
;
cm
->
ref_pred_probs
[
i
]
=
new_pred_probs
[
i
];
}
else
{
cpi
->
ref_pred_probs_update
[
i
]
=
0
;
}
}
}
}
static
void
write_intra_mode
(
vp9_writer
*
bc
,
int
m
,
const
vp9_prob
*
p
)
{
write_token
(
bc
,
vp9_intra_mode_tree
,
p
,
vp9_intra_mode_encodings
+
m
);
}
static
void
update_switchable_interp_probs
(
VP9_COMMON
*
const
pc
,
vp9_writer
*
const
bc
)
{
unsigned
int
branch_ct
[
VP9_SWITCHABLE_FILTERS
+
1
]
...
...
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