Commit e62fea12cb for aom
commit e62fea12cb4e2b09ce134781c67ddbd10b5bd161
Author: Wan-Teh Chang <wtc@google.com>
Date: Thu May 21 15:14:56 2026 -0700
Remove cpi->available_bs_size
Instead, pass dst_size along with dst to init_tile_pack_bs_params(), the
consumer of cpi->available_bs_size. dst_size is more accurate than
cpi->available_bs_size and it is easier to verify dst_size is the size
of the dst buffer.
Bug: oss-fuzz:514006304
Change-Id: Ifeccc016b81f583a3d2e130114871cd00f786837
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 178a84a7c7..2d6890a678 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -4127,7 +4127,7 @@ static int calc_pack_bs_mt_workers(const TileDataEnc *tile_data, int num_tiles,
}
static inline uint32_t pack_tiles_in_tg_obus(
- AV1_COMP *const cpi, uint8_t *const dst,
+ AV1_COMP *const cpi, uint8_t *const dst, size_t dst_size,
struct aom_write_bit_buffer *saved_wb, uint8_t obu_extension_header,
const FrameHeaderInfo *fh_info, int *const largest_tile_id) {
const CommonTileParams *const tiles = &cpi->common.tiles;
@@ -4144,9 +4144,10 @@ static inline uint32_t pack_tiles_in_tg_obus(
cpi->mt_info.pack_bs_mt_enabled);
if (num_workers > 1) {
- av1_write_tile_obu_mt(cpi, dst, &total_size, saved_wb, obu_extension_header,
- fh_info, largest_tile_id, &max_tile_size,
- &obu_header_size, &tile_data_start, num_workers);
+ av1_write_tile_obu_mt(cpi, dst, dst_size, &total_size, saved_wb,
+ obu_extension_header, fh_info, largest_tile_id,
+ &max_tile_size, &obu_header_size, &tile_data_start,
+ num_workers);
} else {
write_tile_obu(cpi, dst, &total_size, saved_wb, obu_extension_header,
fh_info, largest_tile_id, &max_tile_size, &obu_header_size,
@@ -4165,8 +4166,6 @@ static uint32_t write_tiles_in_tg_obus(AV1_COMP *const cpi, uint8_t *const dst,
uint8_t obu_extension_header,
const FrameHeaderInfo *fh_info,
int *const largest_tile_id) {
- // TODO: bug 42302568 - Use dst_size.
- (void)dst_size;
AV1_COMMON *const cm = &cpi->common;
const CommonTileParams *const tiles = &cm->tiles;
*largest_tile_id = 0;
@@ -4187,8 +4186,8 @@ static uint32_t write_tiles_in_tg_obus(AV1_COMP *const cpi, uint8_t *const dst,
return pack_large_scale_tiles_in_tg_obus(
cpi, dst, saved_wb, obu_extension_header, largest_tile_id);
- return pack_tiles_in_tg_obus(cpi, dst, saved_wb, obu_extension_header,
- fh_info, largest_tile_id);
+ return pack_tiles_in_tg_obus(cpi, dst, dst_size, saved_wb,
+ obu_extension_header, fh_info, largest_tile_id);
}
// Returns the number of bytes written on success. Returns 0 on failure.
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index d6151ddaaa..07ef75b615 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -5346,7 +5346,6 @@ int av1_get_compressed_data(AV1_COMP *cpi, AV1_COMP_DATA *const cpi_data) {
cpi->is_dropped_frame = false;
cm->showable_frame = 0;
cpi_data->frame_size = 0;
- cpi->available_bs_size = cpi_data->cx_data_sz;
#if CONFIG_INTERNAL_STATS
struct aom_usec_timer cmptimer;
aom_usec_timer_start(&cmptimer);
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 55c7e913bb..dd94a24458 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -3518,11 +3518,6 @@ typedef struct AV1_COMP {
*/
int sb_counter;
- /*!
- * Available bitstream buffer size in bytes
- */
- size_t available_bs_size;
-
/*!
* The controller of the external partition model.
* It is used to do partition type selection based on external models.
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 7585162a8d..71cd41323b 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -2946,6 +2946,7 @@ static inline size_t get_bs_chunk_size(int tg_or_tile_size,
// Initializes params required for pack bitstream tile.
static void init_tile_pack_bs_params(AV1_COMP *const cpi, uint8_t *const dst,
+ size_t dst_size,
struct aom_write_bit_buffer *saved_wb,
PackBSParams *const pack_bs_params_arr,
uint8_t obu_extn_header) {
@@ -2998,9 +2999,9 @@ static void init_tile_pack_bs_params(AV1_COMP *const cpi, uint8_t *const dst,
}
}
- assert(cpi->available_bs_size > 0);
+ assert(dst_size > 0);
size_t tg_buf_size[MAX_TILES] = { 0 };
- size_t max_buf_size = cpi->available_bs_size;
+ size_t max_buf_size = dst_size;
size_t remain_buf_size = max_buf_size;
const int frame_size_mi = cm->mi_params.mi_rows * cm->mi_params.mi_cols;
@@ -3224,12 +3225,15 @@ static void accumulate_pack_bs_data(
}
}
-void av1_write_tile_obu_mt(
- AV1_COMP *const cpi, uint8_t *const dst, uint32_t *total_size,
- struct aom_write_bit_buffer *saved_wb, uint8_t obu_extn_header,
- const FrameHeaderInfo *fh_info, int *const largest_tile_id,
- unsigned int *max_tile_size, uint32_t *const obu_header_size,
- uint8_t **tile_data_start, const int num_workers) {
+void av1_write_tile_obu_mt(AV1_COMP *const cpi, uint8_t *const dst,
+ size_t dst_size, uint32_t *total_size,
+ struct aom_write_bit_buffer *saved_wb,
+ uint8_t obu_extn_header,
+ const FrameHeaderInfo *fh_info,
+ int *const largest_tile_id,
+ unsigned int *max_tile_size,
+ uint32_t *const obu_header_size,
+ uint8_t **tile_data_start, const int num_workers) {
MultiThreadInfo *const mt_info = &cpi->mt_info;
PackBSParams pack_bs_params[MAX_TILES];
@@ -3238,7 +3242,8 @@ void av1_write_tile_obu_mt(
for (int tile_idx = 0; tile_idx < MAX_TILES; tile_idx++)
pack_bs_params[tile_idx].total_size = &tile_size[tile_idx];
- init_tile_pack_bs_params(cpi, dst, saved_wb, pack_bs_params, obu_extn_header);
+ init_tile_pack_bs_params(cpi, dst, dst_size, saved_wb, pack_bs_params,
+ obu_extn_header);
prepare_pack_bs_workers(cpi, pack_bs_params, pack_bs_worker_hook,
num_workers);
launch_workers(mt_info, num_workers);
diff --git a/av1/encoder/ethread.h b/av1/encoder/ethread.h
index 99d8c70374..76cbd8eddd 100644
--- a/av1/encoder/ethread.h
+++ b/av1/encoder/ethread.h
@@ -111,12 +111,15 @@ void av1_cdef_mse_calc_frame_mt(AV1_COMP *cpi);
void av1_cdef_mt_dealloc(AV1CdefSync *cdef_sync);
-void av1_write_tile_obu_mt(
- AV1_COMP *const cpi, uint8_t *const dst, uint32_t *total_size,
- struct aom_write_bit_buffer *saved_wb, uint8_t obu_extn_header,
- const FrameHeaderInfo *fh_info, int *const largest_tile_id,
- unsigned int *max_tile_size, uint32_t *const obu_header_size,
- uint8_t **tile_data_start, const int num_workers);
+void av1_write_tile_obu_mt(AV1_COMP *const cpi, uint8_t *const dst,
+ size_t dst_size, uint32_t *total_size,
+ struct aom_write_bit_buffer *saved_wb,
+ uint8_t obu_extn_header,
+ const FrameHeaderInfo *fh_info,
+ int *const largest_tile_id,
+ unsigned int *max_tile_size,
+ uint32_t *const obu_header_size,
+ uint8_t **tile_data_start, const int num_workers);
int av1_compute_num_fp_contexts(AV1_PRIMARY *ppi, AV1EncoderConfig *oxcf);