Commit 1b5a433c0a for aom
commit 1b5a433c0ab780ff4474df5d4f91542dffc65021
Author: Wan-Teh Chang <wtc@google.com>
Date: Wed May 27 13:32:29 2026 -0700
Pass size to all aom_start_encode() calls
First replace the remaining aom_start_encode() calls with
aom_start_encode_with_size(). Then delete the old aom_start_encode()
function and rename aom_start_encode_with_size() to aom_start_encode().
Bug: 42302568
Change-Id: I64d9c4fae475b158ab577492fd72dc52254b02cb
diff --git a/aom_dsp/bitwriter.c b/aom_dsp/bitwriter.c
index 7fb660dea8..9a02b087a9 100644
--- a/aom_dsp/bitwriter.c
+++ b/aom_dsp/bitwriter.c
@@ -12,13 +12,7 @@
#include <string.h>
#include "aom_dsp/bitwriter.h"
-void aom_start_encode(aom_writer *w, uint8_t *source) {
- // TODO: bug 42302568 - During the transition period, size=0 means the
- // buffer size is unknown.
- aom_start_encode_with_size(w, source, /*size=*/0);
-}
-
-void aom_start_encode_with_size(aom_writer *w, uint8_t *source, size_t size) {
+void aom_start_encode(aom_writer *w, uint8_t *source, size_t size) {
w->buffer = source;
w->size = size;
w->pos = 0;
@@ -30,9 +24,7 @@ int aom_stop_encode(aom_writer *w) {
uint32_t bytes;
unsigned char *data;
data = od_ec_enc_done(&w->ec, &bytes);
- // TODO: bug 42302568 - Remove "w->size != 0 &&" after all aom_start_encode()
- // calls have been converted to aom_start_encode_with_size().
- if (!data || (w->size != 0 && bytes > w->size)) {
+ if (!data || bytes > w->size) {
od_ec_enc_clear(&w->ec);
return -1;
}
diff --git a/aom_dsp/bitwriter.h b/aom_dsp/bitwriter.h
index 46da728432..35f82daefc 100644
--- a/aom_dsp/bitwriter.h
+++ b/aom_dsp/bitwriter.h
@@ -61,12 +61,7 @@ static inline void init_token_stats(TOKEN_STATS *token_stats) {
token_stats->cost = 0;
}
-// TODO: bug 42302568 - Gradually replace aom_start_encode() calls with
-// aom_start_encode_with_size(). When there are no more aom_start_encode()
-// calls, remove aom_start_encode() and rename aom_start_encode_with_size()
-// back to aom_start_encode().
-void aom_start_encode(aom_writer *w, uint8_t *buffer);
-void aom_start_encode_with_size(aom_writer *w, uint8_t *buffer, size_t size);
+void aom_start_encode(aom_writer *w, uint8_t *buffer, size_t size);
// Returns a negative number on error. Caller must check the return value and
// handle error.
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 7cb21bdc65..558ac361e8 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3639,10 +3639,12 @@ static uint32_t init_large_scale_tile_obu_header(
// Write total buffer size and related information into the OBU header for large
// scale tile case.
static void write_large_scale_tile_obu_size(
- const CommonTileParams *const tiles, uint8_t *const dst, uint8_t *data,
- struct aom_write_bit_buffer *saved_wb, LargeTileFrameOBU *const lst_obu,
- int have_tiles, uint32_t *total_size, int max_tile_size,
- int max_tile_col_size) {
+ const CommonTileParams *const tiles, uint8_t *const dst, size_t dst_size,
+ uint8_t *data, struct aom_write_bit_buffer *saved_wb,
+ LargeTileFrameOBU *const lst_obu, int have_tiles, uint32_t *total_size,
+ int max_tile_size, int max_tile_col_size) {
+ // TODO: bug 42302568 - Use dst_size.
+ (void)dst_size;
int tile_size_bytes = 0;
int tile_col_size_bytes = 0;
if (have_tiles) {
@@ -3678,8 +3680,9 @@ static void write_large_scale_tile_obu_size(
// Store information on each large scale tile in the OBU header.
static void write_large_scale_tile_obu(
- AV1_COMP *const cpi, uint8_t *const dst, LargeTileFrameOBU *const lst_obu,
- int *const largest_tile_id, uint32_t *total_size, const int have_tiles,
+ AV1_COMP *const cpi, uint8_t *const dst, size_t dst_size,
+ LargeTileFrameOBU *const lst_obu, int *const largest_tile_id,
+ uint32_t *total_size, const int have_tiles,
unsigned int *const max_tile_size, unsigned int *const max_tile_col_size) {
AV1_COMMON *const cm = &cpi->common;
const CommonTileParams *const tiles = &cm->tiles;
@@ -3702,22 +3705,33 @@ static void write_large_scale_tile_obu(
for (int tile_row = 0; tile_row < tile_rows; tile_row++) {
TileBufferEnc *const buf = &tile_buffers[tile_row][tile_col];
- const int data_offset = have_tiles ? 4 : 0;
+ const uint32_t data_offset = have_tiles ? 4 : 0;
const int tile_idx = tile_row * tile_cols + tile_col;
TileDataEnc *this_tile = &cpi->tile_data[tile_idx];
av1_tile_set_row(&tile_info, cm, tile_row);
aom_writer mode_bc;
+ // Require *total_size + lst_obu->tg_hdr_size + data_offset < dst_size.
+ if (*total_size > dst_size ||
+ lst_obu->tg_hdr_size > dst_size - *total_size ||
+ data_offset >= dst_size - *total_size - lst_obu->tg_hdr_size) {
+ aom_internal_error(cm->error, AOM_CODEC_ERROR, "Error writing modes");
+ }
buf->data = dst + *total_size + lst_obu->tg_hdr_size;
// Is CONFIG_EXT_TILE = 1, every tile in the row has a header,
// even for the last one, unless no tiling is used at all.
+ if (*total_size > UINT32_MAX - data_offset) {
+ aom_internal_error(cm->error, AOM_CODEC_ERROR, "Error writing modes");
+ }
*total_size += data_offset;
cpi->td.mb.e_mbd.tile_ctx = &this_tile->tctx;
mode_bc.allow_update_cdf = !tiles->large_scale;
mode_bc.allow_update_cdf =
mode_bc.allow_update_cdf && !cm->features.disable_cdf_update;
- aom_start_encode(&mode_bc, buf->data + data_offset);
+ aom_start_encode(
+ &mode_bc, buf->data + data_offset,
+ dst_size - *total_size - lst_obu->tg_hdr_size - data_offset);
write_modes(cpi, &cpi->td, &tile_info, &mode_bc, tile_row, tile_col);
if (aom_stop_encode(&mode_bc) < 0) {
aom_internal_error(cm->error, AOM_CODEC_ERROR, "Error writing modes");
@@ -3773,7 +3787,7 @@ static void write_large_scale_tile_obu(
// Packs information in the obu header for large scale tiles.
static inline uint32_t pack_large_scale_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,
int *const largest_tile_id) {
AV1_COMMON *const cm = &cpi->common;
@@ -3789,12 +3803,13 @@ static inline uint32_t pack_large_scale_tiles_in_tg_obus(
total_size += init_large_scale_tile_obu_header(
cpi, &data, saved_wb, obu_extension_header, &lst_obu);
- write_large_scale_tile_obu(cpi, dst, &lst_obu, largest_tile_id, &total_size,
- have_tiles, &max_tile_size, &max_tile_col_size);
+ write_large_scale_tile_obu(cpi, dst, dst_size, &lst_obu, largest_tile_id,
+ &total_size, have_tiles, &max_tile_size,
+ &max_tile_col_size);
- write_large_scale_tile_obu_size(tiles, dst, data, saved_wb, &lst_obu,
- have_tiles, &total_size, max_tile_size,
- max_tile_col_size);
+ write_large_scale_tile_obu_size(tiles, dst, dst_size, data, saved_wb,
+ &lst_obu, have_tiles, &total_size,
+ max_tile_size, max_tile_col_size);
return total_size;
}
@@ -3862,8 +3877,8 @@ void av1_pack_tile_info(AV1_COMP *const cpi, ThreadData *const td,
aom_internal_error(td->mb.e_mbd.error_info, AOM_CODEC_ERROR,
"Error writing modes");
}
- aom_start_encode_with_size(&mode_bc, pack_bs_params->dst + *total_size,
- pack_bs_params->tile_buf_size - *total_size);
+ aom_start_encode(&mode_bc, pack_bs_params->dst + *total_size,
+ pack_bs_params->tile_buf_size - *total_size);
write_modes(cpi, td, &tile_info, &mode_bc, tile_row, tile_col);
if (aom_stop_encode(&mode_bc) < 0) {
aom_internal_error(td->mb.e_mbd.error_info, AOM_CODEC_ERROR,
@@ -4046,11 +4061,14 @@ static void write_tile_obu(
// Write total buffer size and related information into the OBU header for
// default tile case.
static void write_tile_obu_size(AV1_COMP *const cpi, uint8_t *const dst,
+ size_t dst_size,
struct aom_write_bit_buffer *saved_wb,
int largest_tile_id, uint32_t *const total_size,
unsigned int max_tile_size,
uint32_t obu_header_size,
uint8_t *tile_data_start) {
+ // TODO: bug 42302568 - Use dst_size.
+ (void)dst_size;
const CommonTileParams *const tiles = &cpi->common.tiles;
// Fill in context_update_tile_id indicating the tile to use for the
@@ -4161,8 +4179,9 @@ static inline uint32_t pack_tiles_in_tg_obus(
}
if (num_tiles > 1)
- write_tile_obu_size(cpi, dst, saved_wb, *largest_tile_id, &total_size,
- max_tile_size, obu_header_size, tile_data_start);
+ write_tile_obu_size(cpi, dst, dst_size, saved_wb, *largest_tile_id,
+ &total_size, max_tile_size, obu_header_size,
+ tile_data_start);
return total_size;
}
@@ -4190,7 +4209,7 @@ static uint32_t write_tiles_in_tg_obus(AV1_COMP *const cpi, uint8_t *const dst,
if (tiles->large_scale)
return pack_large_scale_tiles_in_tg_obus(
- cpi, dst, saved_wb, obu_extension_header, largest_tile_id);
+ cpi, dst, dst_size, saved_wb, obu_extension_header, largest_tile_id);
return pack_tiles_in_tg_obus(cpi, dst, dst_size, saved_wb,
obu_extension_header, fh_info, largest_tile_id);
diff --git a/test/accounting_test.cc b/test/accounting_test.cc
index 2c90a67b8a..fe024387bc 100644
--- a/test/accounting_test.cc
+++ b/test/accounting_test.cc
@@ -27,7 +27,7 @@ TEST(AV1, TestAccounting) {
const int kSymbols = 1024;
aom_writer bw;
uint8_t bw_buffer[kBufferSize];
- aom_start_encode(&bw, bw_buffer);
+ aom_start_encode(&bw, bw_buffer, sizeof(bw_buffer));
for (int i = 0; i < kSymbols; i++) {
aom_write(&bw, 0, 32);
aom_write(&bw, 0, 32);
diff --git a/test/binary_codes_test.cc b/test/binary_codes_test.cc
index c62e320ec2..56c05b757a 100644
--- a/test/binary_codes_test.cc
+++ b/test/binary_codes_test.cc
@@ -42,7 +42,7 @@ TEST(AV1, TestPrimitiveRefsubexpfin) {
const uint16_t kValues = 16;
uint16_t enc_values[kRanges][kSubexpParams][kReferences][kValues][4];
const uint16_t range_vals[kRanges] = { 1, 13, 64, 120, 230, 420, 1100, 8000 };
- aom_start_encode(&bw, bw_buffer);
+ aom_start_encode(&bw, bw_buffer, sizeof(bw_buffer));
for (int n = 0; n < kRanges; ++n) {
const uint16_t range = range_vals[n];
for (int k = 0; k < kSubexpParams; ++k) {
diff --git a/test/boolcoder_test.cc b/test/boolcoder_test.cc
index de2ba659b3..3629bd7140 100644
--- a/test/boolcoder_test.cc
+++ b/test/boolcoder_test.cc
@@ -54,7 +54,7 @@ TEST(AV1, TestBitIO) {
ACMRandom bit_rnd(random_seed);
aom_writer bw;
uint8_t bw_buffer[kBufferSize];
- aom_start_encode(&bw, bw_buffer);
+ aom_start_encode(&bw, bw_buffer, sizeof(bw_buffer));
int bit = (bit_method == 0) ? 0 : (bit_method == 1) ? 1 : 0;
for (int i = 0; i < kBitsToTest; ++i) {
@@ -96,7 +96,7 @@ TEST(AV1, TestTell) {
// Coders are noisier at low probabilities, so we start at p = 4.
for (int p = 4; p < 256; p++) {
double probability = p / 256.;
- aom_start_encode(&bw, bw_buffer);
+ aom_start_encode(&bw, bw_buffer, sizeof(bw_buffer));
for (int i = 0; i < kSymbols; i++) {
aom_write(&bw, 0, p);
}
@@ -142,7 +142,7 @@ TEST(AV1, TestHasOverflowed) {
const int kSymbols = 1024;
// Coders are noisier at low probabilities, so we start at p = 4.
for (int p = 4; p < 256; p++) {
- aom_start_encode(&bw, bw_buffer);
+ aom_start_encode(&bw, bw_buffer, sizeof(bw_buffer));
for (int i = 0; i < kSymbols; i++) {
aom_write(&bw, 1, p);
}