Make ext_tile compatible with reference_buffer
In ext_tile experiment, when cm->large_scale_tile is 1, prev_frame_id can be
the same as current_frame_id, which is prohibited in reference_buffer
experiment and causes "CORRUPT_FRAME" error to be reported.
In this patch, enable/disable reference_buffer according to large_scale_tile
value, and thus make these 2 experiments compatible.
Change-Id: If64943acb91e7a7b859db4e2ac62581e9b53ef85
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index 4faab1c..c95a8f2 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -224,6 +224,9 @@
struct aom_read_bit_buffer rb = { data, data + data_sz, 0, NULL, NULL };
const int frame_marker = aom_rb_read_literal(&rb, 2);
const BITSTREAM_PROFILE profile = av1_read_profile(&rb);
+#if CONFIG_EXT_TILE
+ unsigned int large_scale_tile;
+#endif // CONFIG_EXT_TILE
if (frame_marker != AOM_FRAME_MARKER) return AOM_CODEC_UNSUP_BITSTREAM;
@@ -232,6 +235,10 @@
if ((profile >= 2 && data_sz <= 1) || data_sz < 1)
return AOM_CODEC_UNSUP_BITSTREAM;
+#if CONFIG_EXT_TILE
+ large_scale_tile = aom_rb_read_literal(&rb, 1);
+#endif // CONFIG_EXT_TILE
+
if (aom_rb_read_bit(&rb)) { // show an existing frame
aom_rb_read_literal(&rb, 3); // Frame buffer to show.
return AOM_CODEC_OK;
@@ -248,6 +255,9 @@
int frame_id_len;
SequenceHeader seq_params;
read_sequence_header(&seq_params);
+#if CONFIG_EXT_TILE
+ if (large_scale_tile) seq_params.frame_id_numbers_present_flag = 0;
+#endif // CONFIG_EXT_TILE
if (seq_params.frame_id_numbers_present_flag) {
frame_id_len = seq_params.frame_id_length_minus7 + 7;
aom_rb_read_literal(&rb, frame_id_len);
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 50c7466..75ce9f7 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -3273,7 +3273,6 @@
struct aom_read_bit_buffer *const rb) {
AV1_COMMON *const cm = &pbi->common;
#if CONFIG_EXT_TILE
- cm->large_scale_tile = aom_rb_read_literal(rb, 1);
cm->single_tile_decoding = 0;
if (cm->large_scale_tile) {
struct loopfilter *lf = &cm->lf;
@@ -4422,6 +4421,13 @@
aom_internal_error(&cm->error, AOM_CODEC_UNSUP_BITSTREAM,
"Unsupported bitstream profile");
+#if CONFIG_EXT_TILE
+ cm->large_scale_tile = aom_rb_read_literal(rb, 1);
+#if CONFIG_REFERENCE_BUFFER
+ if (cm->large_scale_tile) pbi->seq_params.frame_id_numbers_present_flag = 0;
+#endif // CONFIG_REFERENCE_BUFFER
+#endif // CONFIG_EXT_TILE
+
cm->show_existing_frame = aom_rb_read_bit(rb);
if (cm->show_existing_frame) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index c9996c6..bcb95d8 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3561,7 +3561,6 @@
static void write_tile_info(const AV1_COMMON *const cm,
struct aom_write_bit_buffer *wb) {
#if CONFIG_EXT_TILE
- aom_wb_write_literal(wb, cm->large_scale_tile, 1);
if (cm->large_scale_tile) {
const int tile_width =
ALIGN_POWER_OF_TWO(cm->tile_width, cm->mib_size_log2) >>
@@ -4165,9 +4164,17 @@
}
#if CONFIG_REFERENCE_BUFFER
-void write_sequence_header(SequenceHeader *seq_params) {
+void write_sequence_header(
+#if CONFIG_EXT_TILE
+ AV1_COMMON *const cm,
+#endif // CONFIG_EXT_TILE
+ SequenceHeader *seq_params) {
/* Placeholder for actually writing to the bitstream */
- seq_params->frame_id_numbers_present_flag = FRAME_ID_NUMBERS_PRESENT_FLAG;
+ seq_params->frame_id_numbers_present_flag =
+#if CONFIG_EXT_TILE
+ cm->large_scale_tile ? 0 :
+#endif // CONFIG_EXT_TILE
+ FRAME_ID_NUMBERS_PRESENT_FLAG;
seq_params->frame_id_length_minus7 = FRAME_ID_LENGTH_MINUS7;
seq_params->delta_frame_id_length_minus2 = DELTA_FRAME_ID_LENGTH_MINUS2;
}
@@ -4206,13 +4213,21 @@
#if CONFIG_REFERENCE_BUFFER
/* TODO: Move outside frame loop or inside key-frame branch */
- write_sequence_header(&cpi->seq_params);
+ write_sequence_header(
+#if CONFIG_EXT_TILE
+ cm,
+#endif // CONFIG_EXT_TILE
+ &cpi->seq_params);
#endif
aom_wb_write_literal(wb, AOM_FRAME_MARKER, 2);
write_profile(cm->profile, wb);
+#if CONFIG_EXT_TILE
+ aom_wb_write_literal(wb, cm->large_scale_tile, 1);
+#endif // CONFIG_EXT_TILE
+
#if CONFIG_EXT_REFS
// NOTE: By default all coded frames to be used as a reference
cm->is_reference_frame = 1;
diff --git a/av1/encoder/bitstream.h b/av1/encoder/bitstream.h
index fd23074..29c9303 100644
--- a/av1/encoder/bitstream.h
+++ b/av1/encoder/bitstream.h
@@ -19,7 +19,11 @@
#include "av1/encoder/encoder.h"
#if CONFIG_REFERENCE_BUFFER
-void write_sequence_header(SequenceHeader *seq_params);
+void write_sequence_header(
+#if CONFIG_EXT_TILE
+ AV1_COMMON *const cm,
+#endif // CONFIG_EXT_TILE
+ SequenceHeader *seq_params);
#endif
void av1_pack_bitstream(AV1_COMP *const cpi, uint8_t *dest, size_t *size);
diff --git a/configure b/configure
index 99e9939..e8c5574 100755
--- a/configure
+++ b/configure
@@ -574,11 +574,6 @@
disable_feature lgt
enable_feature lowbitdepth
fi
- if enabled ext_tile; then
- log_echo "ext_tile not compatible with reference_buffer, so"
- log_echo "disabling reference_buffer"
- disable_feature reference_buffer
- fi
if enabled var_tx_no_tx_mode && ! enabled var_tx; then
log_echo "var_tx_no_tx_mode requires var_tx, so disabling var_tx_no_tx_mode"
disable_feature var_tx_no_tx_mode