Fix encoder crashes and enc/dec mismatches
This commit adds the logic for segmentation map initialization and disable temporal update of segmentation map when error-resilient mode is on. It fixes the enc/dec mistmates (release build) and assertions(debug) when both aq-mode and error-resilient are on. Change-Id: Id2155e8b28962cf1f64494f4df0c8d79499b6890
This commit is contained in:
parent
a0900fd0db
commit
d803e8a20e
@ -51,7 +51,7 @@ void vp10_setup_in_frame_q_adj(VP10_COMP *cpi) {
|
|||||||
// Make SURE use of floating point in this function is safe.
|
// Make SURE use of floating point in this function is safe.
|
||||||
vpx_clear_system_state();
|
vpx_clear_system_state();
|
||||||
|
|
||||||
if (cm->frame_type == KEY_FRAME ||
|
if (frame_is_intra_only(cm) || cm->error_resilient_mode ||
|
||||||
cpi->refresh_alt_ref_frame ||
|
cpi->refresh_alt_ref_frame ||
|
||||||
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
|
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
|
||||||
int segment;
|
int segment;
|
||||||
|
@ -47,7 +47,7 @@ void vp10_vaq_frame_setup(VP10_COMP *cpi) {
|
|||||||
struct segmentation *seg = &cm->seg;
|
struct segmentation *seg = &cm->seg;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (cm->frame_type == KEY_FRAME ||
|
if (frame_is_intra_only(cm) || cm->error_resilient_mode ||
|
||||||
cpi->refresh_alt_ref_frame ||
|
cpi->refresh_alt_ref_frame ||
|
||||||
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
|
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
|
||||||
vp10_enable_segmentation(seg);
|
vp10_enable_segmentation(seg);
|
||||||
|
@ -273,7 +273,7 @@ void vp10_choose_segmap_coding_method(VP10_COMMON *cm, MACROBLOCKD *xd) {
|
|||||||
no_pred_cost = cost_segmap(no_pred_segcounts, no_pred_tree);
|
no_pred_cost = cost_segmap(no_pred_segcounts, no_pred_tree);
|
||||||
|
|
||||||
// Key frames cannot use temporal prediction
|
// Key frames cannot use temporal prediction
|
||||||
if (!frame_is_intra_only(cm)) {
|
if (!frame_is_intra_only(cm) && !cm->error_resilient_mode) {
|
||||||
// Work out probability tree for coding those segments not
|
// Work out probability tree for coding those segments not
|
||||||
// predicted using the temporal method and the cost.
|
// predicted using the temporal method and the cost.
|
||||||
calc_segtree_probs(t_unpred_seg_counts, t_pred_tree, segp->tree_probs);
|
calc_segtree_probs(t_unpred_seg_counts, t_pred_tree, segp->tree_probs);
|
||||||
@ -300,6 +300,7 @@ void vp10_choose_segmap_coding_method(VP10_COMMON *cm, MACROBLOCKD *xd) {
|
|||||||
|
|
||||||
// Now choose which coding method to use.
|
// Now choose which coding method to use.
|
||||||
if (t_pred_cost < no_pred_cost) {
|
if (t_pred_cost < no_pred_cost) {
|
||||||
|
assert(!cm->error_resilient_mode);
|
||||||
seg->temporal_update = 1;
|
seg->temporal_update = 1;
|
||||||
#if !CONFIG_MISC_FIXES
|
#if !CONFIG_MISC_FIXES
|
||||||
memcpy(segp->tree_probs, t_pred_tree, sizeof(t_pred_tree));
|
memcpy(segp->tree_probs, t_pred_tree, sizeof(t_pred_tree));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user