Handle allocation failure in sgr SIMD functions In this CL, thread-specific 'error_info' is passed to the low level functions of selfguided restoration module to service the allocation failure of local buffer in av1_selfguided_restoration_avx2() and av1_selfguided_restoration_sse4_1(). Bug: aomedia:3276 Change-Id: I37dabdc2f0181ab5de0c5075c0f9791b15bb1c8e
diff --git a/av1/common/arm/selfguided_neon.c b/av1/common/arm/selfguided_neon.c index 8966080..1d3a3cc 100644 --- a/av1/common/arm/selfguided_neon.c +++ b/av1/common/arm/selfguided_neon.c
@@ -1449,11 +1449,11 @@ return 0; } -void av1_apply_selfguided_restoration_neon(const uint8_t *dat8, int width, - int height, int stride, int eps, - const int *xqd, uint8_t *dst8, - int dst_stride, int32_t *tmpbuf, - int bit_depth, int highbd) { +int av1_apply_selfguided_restoration_neon(const uint8_t *dat8, int width, + int height, int stride, int eps, + const int *xqd, uint8_t *dst8, + int dst_stride, int32_t *tmpbuf, + int bit_depth, int highbd) { int32_t *flt0 = tmpbuf; int32_t *flt1 = flt0 + RESTORATION_UNITPELS_MAX; assert(width * height <= RESTORATION_UNITPELS_MAX); @@ -1591,4 +1591,5 @@ h--; } while (h > 0); } + return 0; }
diff --git a/av1/common/av1_rtcd_defs.pl b/av1/common/av1_rtcd_defs.pl index bd2acda..38e1da9 100644 --- a/av1/common/av1_rtcd_defs.pl +++ b/av1/common/av1_rtcd_defs.pl
@@ -548,7 +548,7 @@ specialize qw/av1_warp_affine sse4_1 avx2 neon neon_i8mm sve/; # LOOP_RESTORATION functions -add_proto qw/void av1_apply_selfguided_restoration/, "const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd"; +add_proto qw/int av1_apply_selfguided_restoration/, "const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd"; specialize qw/av1_apply_selfguided_restoration sse4_1 avx2 neon/; add_proto qw/int av1_selfguided_restoration/, "const uint8_t *dgd8, int width, int height,
diff --git a/av1/common/restoration.c b/av1/common/restoration.c index c0a207f..a26f329 100644 --- a/av1/common/restoration.c +++ b/av1/common/restoration.c
@@ -384,9 +384,11 @@ int stripe_width, int stripe_height, int procunit_width, const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, - int32_t *tmpbuf, int bit_depth) { + int32_t *tmpbuf, int bit_depth, + struct aom_internal_error_info *error_info) { (void)tmpbuf; (void)bit_depth; + (void)error_info; assert(bit_depth == 8); const WienerConvolveParams conv_params = get_conv_params_wiener(8); @@ -852,19 +854,18 @@ return 0; } -void av1_apply_selfguided_restoration_c(const uint8_t *dat8, int width, - int height, int stride, int eps, - const int *xqd, uint8_t *dst8, - int dst_stride, int32_t *tmpbuf, - int bit_depth, int highbd) { +int av1_apply_selfguided_restoration_c(const uint8_t *dat8, int width, + int height, int stride, int eps, + const int *xqd, uint8_t *dst8, + int dst_stride, int32_t *tmpbuf, + int bit_depth, int highbd) { int32_t *flt0 = tmpbuf; int32_t *flt1 = flt0 + RESTORATION_UNITPELS_MAX; assert(width * height <= RESTORATION_UNITPELS_MAX); const int ret = av1_selfguided_restoration_c( dat8, width, height, stride, flt0, flt1, width, eps, bit_depth, highbd); - (void)ret; - assert(!ret); + if (ret != 0) return ret; const sgr_params_type *const params = &av1_sgr_params[eps]; int xq[2]; av1_decode_xq(xqd, xq, params); @@ -891,32 +892,39 @@ *dst8ij = (uint8_t)out; } } + return 0; } static void sgrproj_filter_stripe(const RestorationUnitInfo *rui, int stripe_width, int stripe_height, int procunit_width, const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, - int32_t *tmpbuf, int bit_depth) { + int32_t *tmpbuf, int bit_depth, + struct aom_internal_error_info *error_info) { (void)bit_depth; assert(bit_depth == 8); for (int j = 0; j < stripe_width; j += procunit_width) { int w = AOMMIN(procunit_width, stripe_width - j); - av1_apply_selfguided_restoration( - src + j, w, stripe_height, src_stride, rui->sgrproj_info.ep, - rui->sgrproj_info.xqd, dst + j, dst_stride, tmpbuf, bit_depth, 0); + if (av1_apply_selfguided_restoration( + src + j, w, stripe_height, src_stride, rui->sgrproj_info.ep, + rui->sgrproj_info.xqd, dst + j, dst_stride, tmpbuf, bit_depth, + 0) != 0) { + aom_internal_error( + error_info, AOM_CODEC_MEM_ERROR, + "Error allocating buffer in av1_apply_selfguided_restoration"); + } } } #if CONFIG_AV1_HIGHBITDEPTH -static void wiener_filter_stripe_highbd(const RestorationUnitInfo *rui, - int stripe_width, int stripe_height, - int procunit_width, const uint8_t *src8, - int src_stride, uint8_t *dst8, - int dst_stride, int32_t *tmpbuf, - int bit_depth) { +static void wiener_filter_stripe_highbd( + const RestorationUnitInfo *rui, int stripe_width, int stripe_height, + int procunit_width, const uint8_t *src8, int src_stride, uint8_t *dst8, + int dst_stride, int32_t *tmpbuf, int bit_depth, + struct aom_internal_error_info *error_info) { (void)tmpbuf; + (void)error_info; const WienerConvolveParams conv_params = get_conv_params_wiener(bit_depth); for (int j = 0; j < stripe_width; j += procunit_width) { @@ -930,17 +938,21 @@ } } -static void sgrproj_filter_stripe_highbd(const RestorationUnitInfo *rui, - int stripe_width, int stripe_height, - int procunit_width, - const uint8_t *src8, int src_stride, - uint8_t *dst8, int dst_stride, - int32_t *tmpbuf, int bit_depth) { +static void sgrproj_filter_stripe_highbd( + const RestorationUnitInfo *rui, int stripe_width, int stripe_height, + int procunit_width, const uint8_t *src8, int src_stride, uint8_t *dst8, + int dst_stride, int32_t *tmpbuf, int bit_depth, + struct aom_internal_error_info *error_info) { for (int j = 0; j < stripe_width; j += procunit_width) { int w = AOMMIN(procunit_width, stripe_width - j); - av1_apply_selfguided_restoration( - src8 + j, w, stripe_height, src_stride, rui->sgrproj_info.ep, - rui->sgrproj_info.xqd, dst8 + j, dst_stride, tmpbuf, bit_depth, 1); + if (av1_apply_selfguided_restoration( + src8 + j, w, stripe_height, src_stride, rui->sgrproj_info.ep, + rui->sgrproj_info.xqd, dst8 + j, dst_stride, tmpbuf, bit_depth, + 1) != 0) { + aom_internal_error( + error_info, AOM_CODEC_MEM_ERROR, + "Error allocating buffer in av1_apply_selfguided_restoration"); + } } } #endif // CONFIG_AV1_HIGHBITDEPTH @@ -949,7 +961,8 @@ int stripe_width, int stripe_height, int procunit_width, const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, - int32_t *tmpbuf, int bit_depth); + int32_t *tmpbuf, int bit_depth, + struct aom_internal_error_info *error_info); #if CONFIG_AV1_HIGHBITDEPTH #define NUM_STRIPE_FILTERS 4 @@ -965,14 +978,12 @@ #endif // CONFIG_AV1_HIGHBITDEPTH // Filter one restoration unit -void av1_loop_restoration_filter_unit(const RestorationTileLimits *limits, - const RestorationUnitInfo *rui, - const RestorationStripeBoundaries *rsb, - RestorationLineBuffers *rlbs, int plane_w, - int plane_h, int ss_x, int ss_y, - int highbd, int bit_depth, uint8_t *data8, - int stride, uint8_t *dst8, int dst_stride, - int32_t *tmpbuf, int optimized_lr) { +void av1_loop_restoration_filter_unit( + const RestorationTileLimits *limits, const RestorationUnitInfo *rui, + const RestorationStripeBoundaries *rsb, RestorationLineBuffers *rlbs, + int plane_w, int plane_h, int ss_x, int ss_y, int highbd, int bit_depth, + uint8_t *data8, int stride, uint8_t *dst8, int dst_stride, int32_t *tmpbuf, + int optimized_lr, struct aom_internal_error_info *error_info) { RestorationType unit_rtype = rui->restoration_type; int unit_h = limits->v_end - limits->v_start; @@ -1024,7 +1035,8 @@ copy_below, optimized_lr); stripe_filter(rui, unit_w, h, procunit_width, data8_tl + i * stride, stride, - dst8_tl + i * dst_stride, dst_stride, tmpbuf, bit_depth); + dst8_tl + i * dst_stride, dst_stride, tmpbuf, bit_depth, + error_info); restore_processing_stripe_boundary(&remaining_stripes, rlbs, highbd, h, data8, stride, copy_above, copy_below, @@ -1036,7 +1048,8 @@ static void filter_frame_on_unit(const RestorationTileLimits *limits, int rest_unit_idx, void *priv, int32_t *tmpbuf, - RestorationLineBuffers *rlbs) { + RestorationLineBuffers *rlbs, + struct aom_internal_error_info *error_info) { FilterFrameCtxt *ctxt = (FilterFrameCtxt *)priv; const RestorationInfo *rsi = ctxt->rsi; @@ -1044,7 +1057,7 @@ limits, &rsi->unit_info[rest_unit_idx], &rsi->boundaries, rlbs, ctxt->plane_w, ctxt->plane_h, ctxt->ss_x, ctxt->ss_y, ctxt->highbd, ctxt->bit_depth, ctxt->data8, ctxt->data_stride, ctxt->dst8, - ctxt->dst_stride, tmpbuf, rsi->optimized_lr); + ctxt->dst_stride, tmpbuf, rsi->optimized_lr, error_info); } void av1_loop_restoration_filter_frame_init(AV1LrStruct *lr_ctxt, @@ -1155,9 +1168,6 @@ int32_t *tmpbuf, RestorationLineBuffers *rlbs, sync_read_fn_t on_sync_read, sync_write_fn_t on_sync_write, struct AV1LrSyncData *const lr_sync, struct aom_internal_error_info *error_info) { - // TODO(aomedia:3276): Pass error_info to the low-level functions as required - // in future to handle error propagation. - (void)error_info; const int ext_size = unit_size * 3 / 2; int x0 = 0, j = 0; while (x0 < plane_w) { @@ -1190,7 +1200,7 @@ } #endif - on_rest_unit(limits, unit_idx, priv, tmpbuf, rlbs); + on_rest_unit(limits, unit_idx, priv, tmpbuf, rlbs, error_info); on_sync_write(lr_sync, row_number, j, hnum_rest_units, plane);
diff --git a/av1/common/restoration.h b/av1/common/restoration.h index 5f0e1e0..d5da81d 100644 --- a/av1/common/restoration.h +++ b/av1/common/restoration.h
@@ -318,7 +318,8 @@ typedef void (*rest_unit_visitor_t)(const RestorationTileLimits *limits, int rest_unit_idx, void *priv, int32_t *tmpbuf, - RestorationLineBuffers *rlbs); + RestorationLineBuffers *rlbs, + struct aom_internal_error_info *error_info); typedef struct FilterFrameCtxt { const RestorationInfo *rsi; @@ -357,47 +358,47 @@ * This function applies the loop restoration filter to a single * loop restoration unit. * - * \param[in] limits Limits of the unit - * \param[in] rui The parameters to use for this unit and its - * coefficients - * \param[in] rsb Deblocked pixels to use for stripe boundaries - * \param[in] rlbs Space to use as a scratch buffer - * \param[in] ss_x Horizontal subsampling for plane - * \param[in] ss_y Vertical subsampling for plane - * \param[in] plane_w Width of the current plane - * \param[in] plane_h Height of the current plane - * \param[in] highbd Whether high bitdepth pipeline is used - * \param[in] bit_depth Bit-depth of the video - * \param[in] data8 Frame data (pointing at the top-left corner of - * the frame, not the restoration unit). - * \param[in] stride Stride of \c data8 - * \param[out] dst8 Buffer where the results will be written. Like - * \c data8, \c dst8 should point at the top-left - * corner of the frame - * \param[in] dst_stride Stride of \c dst8 - * \param[in] tmpbuf Scratch buffer used by the sgrproj filter which - * should be at least SGRPROJ_TMPBUF_SIZE big. - * \param[in] optimized_lr Whether to use fast optimized Loop Restoration + * \param[in] limits Limits of the unit + * \param[in] rui The parameters to use for this unit and its + * coefficients + * \param[in] rsb Deblocked pixels to use for stripe boundaries + * \param[in] rlbs Space to use as a scratch buffer + * \param[in] ss_x Horizontal subsampling for plane + * \param[in] ss_y Vertical subsampling for plane + * \param[in] plane_w Width of the current plane + * \param[in] plane_h Height of the current plane + * \param[in] highbd Whether high bitdepth pipeline is used + * \param[in] bit_depth Bit-depth of the video + * \param[in] data8 Frame data (pointing at the top-left corner of + * the frame, not the restoration unit). + * \param[in] stride Stride of \c data8 + * \param[out] dst8 Buffer where the results will be written. Like + * \c data8, \c dst8 should point at the top-left + * corner of the frame + * \param[in] dst_stride Stride of \c dst8 + * \param[in] tmpbuf Scratch buffer used by the sgrproj filter + * which should be at least SGRPROJ_TMPBUF_SIZE + * big. + * \param[in] optimized_lr Whether to use fast optimized Loop Restoration + * \param[in,out] error_info Error info for reporting errors * * \remark Nothing is returned. Instead, the filtered unit is output in * \c dst8 at the proper restoration unit offset. */ -void av1_loop_restoration_filter_unit(const RestorationTileLimits *limits, - const RestorationUnitInfo *rui, - const RestorationStripeBoundaries *rsb, - RestorationLineBuffers *rlbs, int plane_w, - int plane_h, int ss_x, int ss_y, - int highbd, int bit_depth, uint8_t *data8, - int stride, uint8_t *dst8, int dst_stride, - int32_t *tmpbuf, int optimized_lr); +void av1_loop_restoration_filter_unit( + const RestorationTileLimits *limits, const RestorationUnitInfo *rui, + const RestorationStripeBoundaries *rsb, RestorationLineBuffers *rlbs, + int plane_w, int plane_h, int ss_x, int ss_y, int highbd, int bit_depth, + uint8_t *data8, int stride, uint8_t *dst8, int dst_stride, int32_t *tmpbuf, + int optimized_lr, struct aom_internal_error_info *error_info); /*!\brief Function for applying loop restoration filter to a frame * * \ingroup in_loop_restoration * This function applies the loop restoration filter to a frame. * - * \param[in, out] frame Compressed frame buffer - * \param[in, out] cm Pointer to top level common structure + * \param[in,out] frame Compressed frame buffer + * \param[in,out] cm Pointer to top level common structure * \param[in] optimized_lr Whether to use fast optimized Loop Restoration * \param[in] lr_ctxt Loop restoration context *
diff --git a/av1/common/x86/selfguided_avx2.c b/av1/common/x86/selfguided_avx2.c index 4ab35e8..5ab6c46 100644 --- a/av1/common/x86/selfguided_avx2.c +++ b/av1/common/x86/selfguided_avx2.c
@@ -630,18 +630,17 @@ return 0; } -void av1_apply_selfguided_restoration_avx2(const uint8_t *dat8, int width, - int height, int stride, int eps, - const int *xqd, uint8_t *dst8, - int dst_stride, int32_t *tmpbuf, - int bit_depth, int highbd) { +int av1_apply_selfguided_restoration_avx2(const uint8_t *dat8, int width, + int height, int stride, int eps, + const int *xqd, uint8_t *dst8, + int dst_stride, int32_t *tmpbuf, + int bit_depth, int highbd) { int32_t *flt0 = tmpbuf; int32_t *flt1 = flt0 + RESTORATION_UNITPELS_MAX; assert(width * height <= RESTORATION_UNITPELS_MAX); const int ret = av1_selfguided_restoration_avx2( dat8, width, height, stride, flt0, flt1, width, eps, bit_depth, highbd); - (void)ret; - assert(!ret); + if (ret != 0) return ret; const sgr_params_type *const params = &av1_sgr_params[eps]; int xq[2]; av1_decode_xq(xqd, xq, params); @@ -721,4 +720,5 @@ } } } + return 0; }
diff --git a/av1/common/x86/selfguided_sse4.c b/av1/common/x86/selfguided_sse4.c index 948bbfb..ac850f5 100644 --- a/av1/common/x86/selfguided_sse4.c +++ b/av1/common/x86/selfguided_sse4.c
@@ -582,18 +582,17 @@ return 0; } -void av1_apply_selfguided_restoration_sse4_1(const uint8_t *dat8, int width, - int height, int stride, int eps, - const int *xqd, uint8_t *dst8, - int dst_stride, int32_t *tmpbuf, - int bit_depth, int highbd) { +int av1_apply_selfguided_restoration_sse4_1(const uint8_t *dat8, int width, + int height, int stride, int eps, + const int *xqd, uint8_t *dst8, + int dst_stride, int32_t *tmpbuf, + int bit_depth, int highbd) { int32_t *flt0 = tmpbuf; int32_t *flt1 = flt0 + RESTORATION_UNITPELS_MAX; assert(width * height <= RESTORATION_UNITPELS_MAX); const int ret = av1_selfguided_restoration_sse4_1( dat8, width, height, stride, flt0, flt1, width, eps, bit_depth, highbd); - (void)ret; - assert(!ret); + if (ret != 0) return ret; const sgr_params_type *const params = &av1_sgr_params[eps]; int xq[2]; av1_decode_xq(xqd, xq, params); @@ -659,4 +658,5 @@ } } } + return 0; }
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c index cf7633b..6429064 100644 --- a/av1/encoder/pickrst.c +++ b/av1/encoder/pickrst.c
@@ -220,7 +220,7 @@ is_uv && cm->seq_params->subsampling_x, is_uv && cm->seq_params->subsampling_y, highbd, bit_depth, fts->buffers[plane], fts->strides[is_uv], rsc->dst->buffers[plane], - rsc->dst->strides[is_uv], cm->rst_tmpbuf, optimized_lr); + rsc->dst->strides[is_uv], cm->rst_tmpbuf, optimized_lr, cm->error); return sse_restoration_unit(limits, rsc->src, rsc->dst, plane, highbd); } @@ -754,7 +754,8 @@ int width, int height, int dat_stride, int use_highbd, int bit_depth, int pu_width, int pu_height, int32_t *flt0, int32_t *flt1, - int flt_stride) { + int flt_stride, + struct aom_internal_error_info *error_info) { for (int i = 0; i < height; i += pu_height) { const int h = AOMMIN(pu_height, height - i); int32_t *flt0_row = flt0 + i * flt_stride; @@ -764,11 +765,13 @@ // Iterate over the stripe in blocks of width pu_width for (int j = 0; j < width; j += pu_width) { const int w = AOMMIN(pu_width, width - j); - const int ret = av1_selfguided_restoration( - dat8_row + j, w, h, dat_stride, flt0_row + j, flt1_row + j, - flt_stride, sgr_params_idx, bit_depth, use_highbd); - (void)ret; - assert(!ret); + if (av1_selfguided_restoration( + dat8_row + j, w, h, dat_stride, flt0_row + j, flt1_row + j, + flt_stride, sgr_params_idx, bit_depth, use_highbd) != 0) { + aom_internal_error( + error_info, AOM_CODEC_MEM_ERROR, + "Error allocating buffer in av1_selfguided_restoration"); + } } } } @@ -778,10 +781,11 @@ const int dat_stride, const uint8_t *src8, const int src_stride, const int use_highbitdepth, const int bit_depth, const int pu_width, const int pu_height, const int ep, int32_t *flt0, int32_t *flt1, - const int flt_stride, int *exqd, int64_t *err) { + const int flt_stride, int *exqd, int64_t *err, + struct aom_internal_error_info *error_info) { int exq[2]; apply_sgr(ep, dat8, width, height, dat_stride, use_highbitdepth, bit_depth, - pu_width, pu_height, flt0, flt1, flt_stride); + pu_width, pu_height, flt0, flt1, flt_stride, error_info); const sgr_params_type *const params = &av1_sgr_params[ep]; get_proj_subspace(src8, width, height, src_stride, dat8, dat_stride, use_highbitdepth, flt0, flt_stride, flt1, flt_stride, exq, @@ -806,7 +810,8 @@ static SgrprojInfo search_selfguided_restoration( const uint8_t *dat8, int width, int height, int dat_stride, const uint8_t *src8, int src_stride, int use_highbitdepth, int bit_depth, - int pu_width, int pu_height, int32_t *rstbuf, int enable_sgr_ep_pruning) { + int pu_width, int pu_height, int32_t *rstbuf, int enable_sgr_ep_pruning, + struct aom_internal_error_info *error_info) { int32_t *flt0 = rstbuf; int32_t *flt1 = flt0 + RESTORATION_UNITPELS_MAX; int ep, idx, bestep = 0; @@ -822,7 +827,7 @@ int64_t err; compute_sgrproj_err(dat8, width, height, dat_stride, src8, src_stride, use_highbitdepth, bit_depth, pu_width, pu_height, ep, - flt0, flt1, flt_stride, exqd, &err); + flt0, flt1, flt_stride, exqd, &err, error_info); get_best_error(&besterr, err, exqd, bestxqd, &bestep, ep); } } else { @@ -832,7 +837,7 @@ int64_t err; compute_sgrproj_err(dat8, width, height, dat_stride, src8, src_stride, use_highbitdepth, bit_depth, pu_width, pu_height, ep, - flt0, flt1, flt_stride, exqd, &err); + flt0, flt1, flt_stride, exqd, &err, error_info); get_best_error(&besterr, err, exqd, bestxqd, &bestep, ep); } // evaluate left and right ep of winner in seed ep @@ -843,7 +848,7 @@ int64_t err; compute_sgrproj_err(dat8, width, height, dat_stride, src8, src_stride, use_highbitdepth, bit_depth, pu_width, pu_height, ep, - flt0, flt1, flt_stride, exqd, &err); + flt0, flt1, flt_stride, exqd, &err, error_info); get_best_error(&besterr, err, exqd, bestxqd, &bestep, ep); } // evaluate last two group @@ -852,7 +857,7 @@ int64_t err; compute_sgrproj_err(dat8, width, height, dat_stride, src8, src_stride, use_highbitdepth, bit_depth, pu_width, pu_height, ep, - flt0, flt1, flt_stride, exqd, &err); + flt0, flt1, flt_stride, exqd, &err, error_info); get_best_error(&besterr, err, exqd, bestxqd, &bestep, ep); } } @@ -881,10 +886,10 @@ return bits; } -static AOM_INLINE void search_sgrproj(const RestorationTileLimits *limits, - int rest_unit_idx, void *priv, - int32_t *tmpbuf, - RestorationLineBuffers *rlbs) { +static AOM_INLINE void search_sgrproj( + const RestorationTileLimits *limits, int rest_unit_idx, void *priv, + int32_t *tmpbuf, RestorationLineBuffers *rlbs, + struct aom_internal_error_info *error_info) { (void)rlbs; RestSearchCtxt *rsc = (RestSearchCtxt *)priv; RestUnitSearchInfo *rusi = &rsc->rusi[rest_unit_idx]; @@ -919,7 +924,7 @@ dgd_start, limits->h_end - limits->h_start, limits->v_end - limits->v_start, rsc->dgd_stride, src_start, rsc->src_stride, highbd, bit_depth, procunit_width, procunit_height, - tmpbuf, rsc->lpf_sf->enable_sgr_ep_pruning); + tmpbuf, rsc->lpf_sf->enable_sgr_ep_pruning, error_info); RestorationUnitInfo rui; rui.restoration_type = RESTORE_SGRPROJ; @@ -1578,12 +1583,13 @@ return err; } -static AOM_INLINE void search_wiener(const RestorationTileLimits *limits, - int rest_unit_idx, void *priv, - int32_t *tmpbuf, - RestorationLineBuffers *rlbs) { +static AOM_INLINE void search_wiener( + const RestorationTileLimits *limits, int rest_unit_idx, void *priv, + int32_t *tmpbuf, RestorationLineBuffers *rlbs, + struct aom_internal_error_info *error_info) { (void)tmpbuf; (void)rlbs; + (void)error_info; RestSearchCtxt *rsc = (RestSearchCtxt *)priv; RestUnitSearchInfo *rusi = &rsc->rusi[rest_unit_idx]; @@ -1722,13 +1728,14 @@ if (cost_wiener < cost_none) rsc->ref_wiener = rusi->wiener; } -static AOM_INLINE void search_norestore(const RestorationTileLimits *limits, - int rest_unit_idx, void *priv, - int32_t *tmpbuf, - RestorationLineBuffers *rlbs) { +static AOM_INLINE void search_norestore( + const RestorationTileLimits *limits, int rest_unit_idx, void *priv, + int32_t *tmpbuf, RestorationLineBuffers *rlbs, + struct aom_internal_error_info *error_info) { (void)rest_unit_idx; (void)tmpbuf; (void)rlbs; + (void)error_info; RestSearchCtxt *rsc = (RestSearchCtxt *)priv; @@ -1739,13 +1746,14 @@ rsc->total_sse[RESTORE_NONE] += rsc->sse[RESTORE_NONE]; } -static AOM_INLINE void search_switchable(const RestorationTileLimits *limits, - int rest_unit_idx, void *priv, - int32_t *tmpbuf, - RestorationLineBuffers *rlbs) { +static AOM_INLINE void search_switchable( + const RestorationTileLimits *limits, int rest_unit_idx, void *priv, + int32_t *tmpbuf, RestorationLineBuffers *rlbs, + struct aom_internal_error_info *error_info) { (void)limits; (void)tmpbuf; (void)rlbs; + (void)error_info; RestSearchCtxt *rsc = (RestSearchCtxt *)priv; RestUnitSearchInfo *rusi = &rsc->rusi[rest_unit_idx]; @@ -1910,7 +1918,8 @@ for (RestorationType r = RESTORE_NONE; r < num_rtypes; r++) { if (disable_lr_filter[r]) continue; - funs[r](&limits, unit_idx, rsc, rsc->cm->rst_tmpbuf, NULL); + funs[r](&limits, unit_idx, rsc, rsc->cm->rst_tmpbuf, NULL, + cm->error); } } }
diff --git a/test/selfguided_filter_test.cc b/test/selfguided_filter_test.cc index 17c8aa6..3dd513b 100644 --- a/test/selfguided_filter_test.cc +++ b/test/selfguided_filter_test.cc
@@ -30,9 +30,9 @@ using std::make_tuple; using std::tuple; -typedef void (*SgrFunc)(const uint8_t *dat8, int width, int height, int stride, - int eps, const int *xqd, uint8_t *dst8, int dst_stride, - int32_t *tmpbuf, int bit_depth, int highbd); +typedef int (*SgrFunc)(const uint8_t *dat8, int width, int height, int stride, + int eps, const int *xqd, uint8_t *dst8, int dst_stride, + int32_t *tmpbuf, int bit_depth, int highbd); // Test parameter list: // <tst_fun_> @@ -89,9 +89,10 @@ int h = AOMMIN(pu_height, height - k); uint8_t *input_p = input + k * stride + j; uint8_t *output_p = output + k * out_stride + j; - av1_apply_selfguided_restoration_c(input_p, w, h, stride, eps, xqd, - output_p, out_stride, tmpbuf, 8, - 0); + const int ret_c = av1_apply_selfguided_restoration_c( + input_p, w, h, stride, eps, xqd, output_p, out_stride, tmpbuf, 8, + 0); + ASSERT_EQ(ret_c, 0); } } aom_usec_timer_mark(&ref_timer); @@ -106,8 +107,9 @@ int h = AOMMIN(pu_height, height - k); uint8_t *input_p = input + k * stride + j; uint8_t *output_p = output + k * out_stride + j; - tst_fun_(input_p, w, h, stride, eps, xqd, output_p, out_stride, - tmpbuf, 8, 0); + const int ret_tst = tst_fun_(input_p, w, h, stride, eps, xqd, + output_p, out_stride, tmpbuf, 8, 0); + ASSERT_EQ(ret_tst, 0); } } aom_usec_timer_mark(&tst_timer); @@ -179,11 +181,13 @@ uint8_t *input_p = input + k * stride + j; uint8_t *output_p = output + k * out_stride + j; uint8_t *output2_p = output2 + k * out_stride + j; - tst_fun_(input_p, w, h, stride, eps, xqd, output_p, out_stride, - tmpbuf, 8, 0); - av1_apply_selfguided_restoration_c(input_p, w, h, stride, eps, xqd, - output2_p, out_stride, tmpbuf, 8, - 0); + const int ret_tst = tst_fun_(input_p, w, h, stride, eps, xqd, + output_p, out_stride, tmpbuf, 8, 0); + ASSERT_EQ(ret_tst, 0); + const int ret_c = av1_apply_selfguided_restoration_c( + input_p, w, h, stride, eps, xqd, output2_p, out_stride, tmpbuf, 8, + 0); + ASSERT_EQ(ret_c, 0); } for (j = 0; j < test_h; ++j)