Refactor tile group functions in write_tile_obu() This CL refactors the operations used to pack tile group size and other data at the end of tile group from write_tile_obu() into a new function write_last_tile_info() to facilitate tile level multi-threading, and also changes some variables. Change-Id: I7e0c6255f82deba5bef8e668eb219c1bdef2e163
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 36c223c..551108f 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -3459,7 +3459,7 @@ typedef struct { struct aom_write_bit_buffer *saved_wb; TileBufferEnc buf; - uint32_t *obu_header_size; + uint32_t obu_header_size; uint32_t *total_size; uint8_t *dst; uint8_t *tile_data_curr; @@ -3691,7 +3691,7 @@ *curr_tg_hdr_size = av1_write_obu_header( &cpi->ppi->level_params, &cpi->frame_header_count, obu_type, pack_bs_params->obu_extn_header, tile_data_curr); - *pack_bs_params->obu_header_size = *curr_tg_hdr_size; + pack_bs_params->obu_header_size = *curr_tg_hdr_size; if (cpi->num_tg == 1) *curr_tg_hdr_size += write_frame_header_obu( @@ -3724,6 +3724,55 @@ } } +void write_last_tile_info(AV1_COMP *const cpi, const FrameHeaderInfo *fh_info, + struct aom_write_bit_buffer *saved_wb, + size_t *curr_tg_data_size, uint8_t *curr_tg_start, + uint32_t *const total_size, uint8_t **tile_data_start, + int *const largest_tile_id, int *const is_first_tg, + uint32_t obu_header_size, uint8_t obu_extn_header) { + // write current tile group size + const uint32_t obu_payload_size = + (uint32_t)(*curr_tg_data_size) - obu_header_size; + const size_t length_field_size = + obu_memmove(obu_header_size, obu_payload_size, curr_tg_start); + if (av1_write_uleb_obu_size(obu_header_size, obu_payload_size, + curr_tg_start) != AOM_CODEC_OK) { + assert(0); + } + *curr_tg_data_size += (int)length_field_size; + *total_size += (uint32_t)length_field_size; + *tile_data_start += length_field_size; + if (cpi->num_tg == 1) { + // if this tg is combined with the frame header then update saved + // frame header base offset accroding to length field size + saved_wb->bit_buffer += length_field_size; + } + + if (!(*is_first_tg) && cpi->common.features.error_resilient_mode) { + // Make room for a duplicate Frame Header OBU. + memmove(curr_tg_start + fh_info->total_length, curr_tg_start, + *curr_tg_data_size); + + // Insert a copy of the Frame Header OBU. + memcpy(curr_tg_start, fh_info->frame_header, fh_info->total_length); + + // Force context update tile to be the first tile in error + // resiliant mode as the duplicate frame headers will have + // context_update_tile_id set to 0 + *largest_tile_id = 0; + + // Rewrite the OBU header to change the OBU type to Redundant Frame + // Header. + av1_write_obu_header(&cpi->ppi->level_params, &cpi->frame_header_count, + OBU_REDUNDANT_FRAME_HEADER, obu_extn_header, + &curr_tg_start[fh_info->obu_header_byte_offset]); + + *curr_tg_data_size += (int)(fh_info->total_length); + *total_size += (uint32_t)(fh_info->total_length); + } + *is_first_tg = 0; +} + // Store information related to each default tile in the OBU header. static void write_tile_obu( AV1_COMP *const cpi, uint8_t *const dst, uint32_t *total_size, @@ -3771,7 +3820,7 @@ pack_bs_params.is_last_tile_in_tg = is_last_tile_in_tg; pack_bs_params.new_tg = new_tg; pack_bs_params.obu_extn_header = obu_extn_header; - pack_bs_params.obu_header_size = obu_header_size; + pack_bs_params.obu_header_size = 0; pack_bs_params.saved_wb = saved_wb; pack_bs_params.tile_col = tile_col; pack_bs_params.tile_row = tile_row; @@ -3783,6 +3832,7 @@ if (new_tg) { curr_tg_data_size = pack_bs_params.curr_tg_hdr_size; *tile_data_start += pack_bs_params.curr_tg_hdr_size; + *obu_header_size = pack_bs_params.obu_header_size; new_tg = 0; } if (is_last_tile_in_tg) new_tg = 1; @@ -3795,51 +3845,11 @@ *max_tile_size = (unsigned int)pack_bs_params.buf.size; } - if (is_last_tile_in_tg) { - // write current tile group size - const uint32_t obu_payload_size = - (uint32_t)curr_tg_data_size - *obu_header_size; - const size_t length_field_size = - obu_memmove(*obu_header_size, obu_payload_size, tile_data_curr); - if (av1_write_uleb_obu_size(*obu_header_size, obu_payload_size, - tile_data_curr) != AOM_CODEC_OK) { - assert(0); - } - curr_tg_data_size += (int)length_field_size; - *total_size += (uint32_t)length_field_size; - *tile_data_start += length_field_size; - if (num_tg_hdrs == 1) { - // if this tg is combined with the frame header then update saved - // frame header base offset accroding to length field size - saved_wb->bit_buffer += length_field_size; - } - - if (!is_first_tg && cm->features.error_resilient_mode) { - // Make room for a duplicate Frame Header OBU. - memmove(tile_data_curr + fh_info->total_length, tile_data_curr, - curr_tg_data_size); - - // Insert a copy of the Frame Header OBU. - memcpy(tile_data_curr, fh_info->frame_header, fh_info->total_length); - - // Force context update tile to be the first tile in error - // resiliant mode as the duplicate frame headers will have - // context_update_tile_id set to 0 - *largest_tile_id = 0; - - // Rewrite the OBU header to change the OBU type to Redundant Frame - // Header. - av1_write_obu_header( - &cpi->ppi->level_params, &cpi->frame_header_count, - OBU_REDUNDANT_FRAME_HEADER, obu_extn_header, - &tile_data_curr[fh_info->obu_header_byte_offset]); - tile_data_curr += fh_info->total_length; - - curr_tg_data_size += (int)(fh_info->total_length); - *total_size += (uint32_t)(fh_info->total_length); - } - is_first_tg = 0; - } + if (is_last_tile_in_tg) + write_last_tile_info(cpi, fh_info, saved_wb, &curr_tg_data_size, + tile_data_curr, total_size, tile_data_start, + largest_tile_id, &is_first_tg, *obu_header_size, + obu_extn_header); *total_size += (uint32_t)pack_bs_params.buf.size; } }