Skip to content

Commit efa0107

Browse files
youennfphiln
authored andcommitted
av1/encoder/encoder_utils.c & a/av1/common/resize: Stack-buffer-overflow in aom_scaled_2d_ssse3
https://bugs.webkit.org/show_bug.cgi?id=253498 rdar://106063201 Reviewed by Eric Carlson. Cherry-pick upstream change from https://aomedia.googlesource.com/aom/+/6318378f833b2a0d8e67fb3d12bcdc4e1c26b0e6%5E%21/#F2. * Source/ThirdParty/libwebrtc/Source/third_party/libaom/source/libaom/av1/common/resize.c: (av1_realloc_and_scale_if_required): * Source/ThirdParty/libwebrtc/Source/third_party/libaom/source/libaom/av1/common/resize.h: * Source/ThirdParty/libwebrtc/Source/third_party/libaom/source/libaom/av1/encoder/encoder_utils.c: (av1_scale_references): Originally-landed-as: 259548.381@safari-7615-branch (1de648970cbf). rdar://106063201 Canonical link: https://commits.webkit.org/264327@main
1 parent 9c4599a commit efa0107

3 files changed

Lines changed: 31 additions & 4 deletions

File tree

Source/ThirdParty/libwebrtc/Source/third_party/libaom/source/libaom/av1/common/resize.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,15 +1384,20 @@ YV12_BUFFER_CONFIG *av1_realloc_and_scale_if_required(
13841384
aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR,
13851385
"Failed to allocate scaled buffer");
13861386

1387+
const bool has_optimized_scaler = av1_has_optimized_scaler(
1388+
unscaled->y_crop_width, unscaled->y_crop_height, scaled_width,
1389+
scaled_height);
1390+
13871391
#if CONFIG_AV1_HIGHBITDEPTH
1388-
if (use_optimized_scaler && cm->seq_params->bit_depth == AOM_BITS_8) {
1392+
if (use_optimized_scaler && has_optimized_scaler &&
1393+
cm->seq_params->bit_depth == AOM_BITS_8) {
13891394
av1_resize_and_extend_frame(unscaled, scaled, filter, phase, num_planes);
13901395
} else {
13911396
av1_resize_and_extend_frame_nonnormative(
13921397
unscaled, scaled, (int)cm->seq_params->bit_depth, num_planes);
13931398
}
13941399
#else
1395-
if (use_optimized_scaler) {
1400+
if (use_optimized_scaler && has_optimized_scaler) {
13961401
av1_resize_and_extend_frame(unscaled, scaled, filter, phase, num_planes);
13971402
} else {
13981403
av1_resize_and_extend_frame_nonnormative(

Source/ThirdParty/libwebrtc/Source/third_party/libaom/source/libaom/av1/common/resize.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,24 @@ static INLINE int av1_superres_scaled(const AV1_COMMON *cm) {
105105
return !(cm->width == cm->superres_upscaled_width);
106106
}
107107

108+
// There's SIMD optimizations for 1/4, 1/2 and 3/4 downscaling.
109+
// SSSE3 also has optimizations for 2x upscaling.
110+
// Use non normative scalers for other scaling ratios.
111+
static INLINE bool av1_has_optimized_scaler(const int src_width,
112+
const int src_height,
113+
const int dst_width,
114+
const int dst_height) {
115+
const bool has_optimized_scaler =
116+
(dst_width * 4 == src_width && dst_height * 4 == src_height) ||
117+
(dst_width * 2 == src_width && dst_height * 2 == src_height) ||
118+
(dst_width * 4 == src_width * 3 && dst_height * 4 == src_height * 3);
119+
#if HAVE_SSSE3
120+
return has_optimized_scaler ||
121+
(dst_width == src_width * 2 && dst_height == src_height * 2);
122+
#endif
123+
return has_optimized_scaler;
124+
}
125+
108126
#define UPSCALE_NORMATIVE_TAPS 8
109127
extern const int16_t av1_resize_filter_normative[1 << RS_SUBPEL_BITS]
110128
[UPSCALE_NORMATIVE_TAPS];

Source/ThirdParty/libwebrtc/Source/third_party/libaom/source/libaom/av1/encoder/encoder_utils.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,15 +733,19 @@ void av1_scale_references(AV1_COMP *cpi, const InterpFilter filter,
733733
aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR,
734734
"Failed to allocate frame buffer");
735735
}
736+
const bool has_optimized_scaler = av1_has_optimized_scaler(
737+
cm->width, cm->height, new_fb->buf.y_crop_width,
738+
new_fb->buf.y_crop_height);
736739
#if CONFIG_AV1_HIGHBITDEPTH
737-
if (use_optimized_scaler && cm->seq_params->bit_depth == AOM_BITS_8)
740+
if (use_optimized_scaler && has_optimized_scaler &&
741+
cm->seq_params->bit_depth == AOM_BITS_8)
738742
av1_resize_and_extend_frame(ref, &new_fb->buf, filter, phase,
739743
num_planes);
740744
else
741745
av1_resize_and_extend_frame_nonnormative(
742746
ref, &new_fb->buf, (int)cm->seq_params->bit_depth, num_planes);
743747
#else
744-
if (use_optimized_scaler)
748+
if (use_optimized_scaler && has_optimized_scaler)
745749
av1_resize_and_extend_frame(ref, &new_fb->buf, filter, phase,
746750
num_planes);
747751
else

0 commit comments

Comments
 (0)