Fix a bug in avx2/sse2 temporal filtering.
avx2/sse2 function only supports square block size. However, under
`YUV 4:2:2` format, subsampling_x does not equal to subsampling_y. In
this case, avx2/sse2 function will fail. C version is used instead.
Bug=aomedia:2643
Change-Id: I8bc4f83242129eb1f87606dd3273ddf290c061d5
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index a637df5..e8c0b70 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -807,10 +807,21 @@
const uint8_t *pred, uint32_t *accum, uint16_t *count) {
assert(num_planes >= 1 && num_planes <= MAX_MB_PLANE);
+ // Determines whether the video is with `YUV 4:2:2` format, since avx2/sse2
+ // function only supports square block size.
+ int is_yuv422_format = 0;
+ for (int plane = 1; plane < num_planes; ++plane) {
+ if (mbd->plane[plane].subsampling_x != mbd->plane[plane].subsampling_y) {
+ is_yuv422_format = 1;
+ break;
+ }
+ }
+
if (TF_ENABLE_PLANEWISE_STRATEGY) {
// TODO(any): avx2 and sse2 version should be changed to align with C
// function before using.
- if (is_frame_high_bitdepth(frame_to_filter) || block_size != BLOCK_32X32) {
+ if (is_frame_high_bitdepth(frame_to_filter) || block_size != BLOCK_32X32 ||
+ is_yuv422_format) {
av1_apply_temporal_filter_planewise_c(
frame_to_filter, mbd, block_size, mb_row, mb_col, num_planes,
noise_levels, use_subblock, block_mse, subblock_mses, q_factor, pred,