Commit 32345ff4d7 for aom
commit 32345ff4d7f39b0d36149192b0fd8906ee7cb17f
Author: Wan-Teh Chang <wtc@google.com>
Date: Wed Sep 16 12:18:36 2026 -0700
Allow flow estimation on mismatched frame strides
Now that aom_compute_flow_at_point uses the strides corresponding to the
src and ref buffers, we can remove the requirement that the src and ref
buffers have the same stride in
av1_compute_global_motion_feature_match(),
av1_compute_global_motion_disflow(), and
update_valid_ref_frames_for_gm().
Delete the DisflowTest.MismatchedStrides test because mismatched strides
are no longer an error condition for av1_compute_global_motion_disflow()
and av1_compute_global_motion_feature_match().
Change-Id: I8ec4fcd7c88d618b7b411e49622f8155d664ad95
diff --git a/aom_dsp/flow_estimation/corner_match.c b/aom_dsp/flow_estimation/corner_match.c
index 72b65b36b6..3679736f5b 100644
--- a/aom_dsp/flow_estimation/corner_match.c
+++ b/aom_dsp/flow_estimation/corner_match.c
@@ -289,8 +289,7 @@ bool av1_compute_global_motion_feature_match(
assert(ref_pyramid->layers[0].height == src_height);
const int ref_stride = ref_pyramid->layers[0].stride;
- if (ref_stride != src_stride || src_corners->num_corners == 0 ||
- ref_corners->num_corners == 0) {
+ if (src_corners->num_corners == 0 || ref_corners->num_corners == 0) {
return false;
}
diff --git a/aom_dsp/flow_estimation/disflow.c b/aom_dsp/flow_estimation/disflow.c
index 22d1d44631..a275673b57 100644
--- a/aom_dsp/flow_estimation/disflow.c
+++ b/aom_dsp/flow_estimation/disflow.c
@@ -812,9 +812,6 @@ bool av1_compute_global_motion_disflow(
return false;
}
- if (ref_pyramid->layers[0].stride != src_pyramid->layers[0].stride) {
- return false;
- }
if (src_width < (1 << DOWNSAMPLE_SHIFT) ||
src_height < (1 << DOWNSAMPLE_SHIFT)) {
return false;
diff --git a/av1/encoder/global_motion_facade.c b/av1/encoder/global_motion_facade.c
index 7b1af9ca7f..4fdad0bedb 100644
--- a/av1/encoder/global_motion_facade.c
+++ b/av1/encoder/global_motion_facade.c
@@ -314,7 +314,6 @@ static inline void update_valid_ref_frames_for_gm(
if (ref_buf[frame]->y_crop_width == cpi->source->y_crop_width &&
ref_buf[frame]->y_crop_height == cpi->source->y_crop_height &&
- ref_buf[frame]->y_stride == cpi->source->y_stride &&
do_gm_search_logic(&cpi->sf, frame) && !prune_ref_frames &&
ref_pyr_lvl <= pyr_lvl && !cur_frame_gm_disabled) {
assert(ref_buf[frame] != NULL);
diff --git a/test/disflow_test.cc b/test/disflow_test.cc
index 78f9565912..f852608e67 100644
--- a/test/disflow_test.cc
+++ b/test/disflow_test.cc
@@ -179,36 +179,6 @@ TEST(DisflowTest, MismatchedDimensions) {
aom_free_frame_buffer(&src);
aom_free_frame_buffer(&ref);
}
-
-TEST(DisflowTest, MismatchedStrides) {
- YV12_BUFFER_CONFIG src = {};
- YV12_BUFFER_CONFIG ref = {};
-
- constexpr int kWidth = 165;
- constexpr int kHeight = 513;
- ASSERT_EQ(aom_alloc_frame_buffer(&src, kWidth, kHeight, 1, 1, 0,
- AOM_BORDER_IN_PIXELS, 0, true, 0),
- 0);
- ASSERT_EQ(
- aom_alloc_frame_buffer(&ref, kWidth, kHeight, 1, 1, 0, 96, 0, true, 0),
- 0);
- EXPECT_NE(src.y_stride, ref.y_stride);
-
- MotionModel motion_models[1];
- bool mem_alloc_failed = false;
- bool ret = av1_compute_global_motion_disflow(
- TRANSLATION, &src, &ref, 8, 0, motion_models, 1, &mem_alloc_failed);
- EXPECT_FALSE(ret);
- EXPECT_FALSE(mem_alloc_failed);
-
- ret = av1_compute_global_motion_feature_match(
- TRANSLATION, &src, &ref, 8, 0, motion_models, 1, &mem_alloc_failed);
- EXPECT_FALSE(ret);
- EXPECT_FALSE(mem_alloc_failed);
-
- aom_free_frame_buffer(&src);
- aom_free_frame_buffer(&ref);
-}
#endif // CONFIG_AV1_ENCODER && !CONFIG_REALTIME_ONLY
} // namespace