Make 'cm->seg->temporal_update' variable thread safe
In order to make cm->seg->temporal_update variable thread safe,
Decision of segmentation map coding method is moved from
write_tile_obu() to write_tiles_in_tg_obus() function.
Change-Id: I2e3593b77cb865cd05d672ab695169b231511d05
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index dea5f18..fea97fd 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2082,7 +2082,7 @@
}
}
-static AOM_INLINE void encode_segmentation(AV1_COMMON *cm, MACROBLOCKD *xd,
+static AOM_INLINE void encode_segmentation(AV1_COMMON *cm,
struct aom_write_bit_buffer *wb) {
int i, j;
struct segmentation *seg = &cm->seg;
@@ -2091,17 +2091,9 @@
if (!seg->enabled) return;
// Write update flags
- if (cm->features.primary_ref_frame == PRIMARY_REF_NONE) {
- assert(seg->update_map == 1);
- seg->temporal_update = 0;
- assert(seg->update_data == 1);
- } else {
+ if (cm->features.primary_ref_frame != PRIMARY_REF_NONE) {
aom_wb_write_bit(wb, seg->update_map);
- if (seg->update_map) {
- // Select the coding strategy (temporal or spatial)
- av1_choose_segmap_coding_method(cm, xd);
- aom_wb_write_bit(wb, seg->temporal_update);
- }
+ if (seg->update_map) aom_wb_write_bit(wb, seg->temporal_update);
aom_wb_write_bit(wb, seg->update_data);
}
@@ -3078,7 +3070,7 @@
write_tile_info(cm, saved_wb, wb);
encode_quantization(quant_params, av1_num_planes(cm),
cm->seq_params.separate_uv_delta_q, wb);
- encode_segmentation(cm, xd, wb);
+ encode_segmentation(cm, wb);
const DeltaQInfo *const delta_q_info = &cm->delta_q_info;
if (delta_q_info->delta_q_present_flag) assert(quant_params->base_qindex > 0);
@@ -3970,6 +3962,9 @@
const CommonTileParams *const tiles = &cm->tiles;
*largest_tile_id = 0;
+ // Select the coding strategy (temporal or spatial)
+ if (cm->seg.enabled) av1_choose_segmap_coding_method(cm, &cpi->td.mb.e_mbd);
+
if (tiles->large_scale)
return pack_large_scale_tiles_in_tg_obus(cpi, dst, saved_wb,
largest_tile_id);
diff --git a/av1/encoder/segmentation.c b/av1/encoder/segmentation.c
index de17d57..8252f52 100644
--- a/av1/encoder/segmentation.c
+++ b/av1/encoder/segmentation.c
@@ -175,6 +175,14 @@
int no_pred_cost;
int t_pred_cost = INT_MAX;
int tile_col, tile_row, mi_row, mi_col;
+
+ if (!seg->update_map) return;
+ if (cm->features.primary_ref_frame == PRIMARY_REF_NONE) {
+ seg->temporal_update = 0;
+ assert(seg->update_data == 1);
+ return;
+ }
+
unsigned temporal_predictor_count[SEG_TEMPORAL_PRED_CTXS][2] = { { 0 } };
unsigned no_pred_segcounts[MAX_SEGMENTS] = { 0 };
unsigned t_unpred_seg_counts[MAX_SEGMENTS] = { 0 };