From 32baeafeee4f8446c2c3720b9223ad2166ca9d30 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Tue, 4 Apr 2017 12:45:51 -0400 Subject: jrev/xvid: hardcode use of C put/add_pixels_clamped. This removes the last use of the ff_put/add_pixels_clamped global function pointers, and as such they are removed. This patch has a negative effect on performance on MIPS, since there's a SIMD-optimized put/add_pixels_clamped, but no xvid or jrev. From a code maintenance point of view, that is probably acceptable. Because the global function pointers are removed, this fixes the following tsan warnings when running e.g. fate-dnxhr-parse: WARNING: ThreadSanitizer: data race (pid=29917) Write of size 8 at 0x0000025b12d8 by thread T2 (mutexes: write M1543): #0 ff_idctdsp_init src/libavcodec/idctdsp.c:313 (ffmpeg+0x00000044b68e) [..] Previous write of size 8 at 0x0000025b12d8 by thread T1 (mutexes: write M1541): #0 ff_idctdsp_init src/libavcodec/idctdsp.c:313 (ffmpeg+0x00000044b68e) --- libavcodec/idctdsp.c | 18 ++++++------------ libavcodec/idctdsp.h | 6 ++++-- libavcodec/jrevdct.c | 4 ++-- libavcodec/xvididct.c | 4 ++-- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/libavcodec/idctdsp.c b/libavcodec/idctdsp.c index 84dd6457bd..d596aed1a9 100644 --- a/libavcodec/idctdsp.c +++ b/libavcodec/idctdsp.c @@ -80,11 +80,8 @@ av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, } } -void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); -void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); - -static void put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, - ptrdiff_t line_size) +void ff_put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, + ptrdiff_t line_size) { int i; @@ -157,8 +154,8 @@ static void put_signed_pixels_clamped_c(const int16_t *block, } } -static void add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, - ptrdiff_t line_size) +void ff_add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, + ptrdiff_t line_size) { int i; @@ -290,9 +287,9 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx) } } - c->put_pixels_clamped = put_pixels_clamped_c; + c->put_pixels_clamped = ff_put_pixels_clamped_c; c->put_signed_pixels_clamped = put_signed_pixels_clamped_c; - c->add_pixels_clamped = add_pixels_clamped_c; + c->add_pixels_clamped = ff_add_pixels_clamped_c; if (CONFIG_MPEG4_DECODER && avctx->idct_algo == FF_IDCT_XVID) ff_xvid_idct_init(c, avctx); @@ -310,9 +307,6 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx) if (ARCH_MIPS) ff_idctdsp_init_mips(c, avctx, high_bit_depth); - ff_put_pixels_clamped = c->put_pixels_clamped; - ff_add_pixels_clamped = c->add_pixels_clamped; - ff_init_scantable_permutation(c->idct_permutation, c->perm_type); } diff --git a/libavcodec/idctdsp.h b/libavcodec/idctdsp.h index f9ba6c3131..26221f6a9d 100644 --- a/libavcodec/idctdsp.h +++ b/libavcodec/idctdsp.h @@ -97,8 +97,10 @@ typedef struct IDCTDSPContext { enum idct_permutation_type perm_type; } IDCTDSPContext; -extern void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); -extern void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); +void ff_put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, + ptrdiff_t line_size); +void ff_add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, + ptrdiff_t line_size); void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx); diff --git a/libavcodec/jrevdct.c b/libavcodec/jrevdct.c index 89dd9f2fca..3b15a52677 100644 --- a/libavcodec/jrevdct.c +++ b/libavcodec/jrevdct.c @@ -1159,11 +1159,11 @@ void ff_j_rev_dct1(DCTBLOCK data){ void ff_jref_idct_put(uint8_t *dest, ptrdiff_t line_size, int16_t *block) { ff_j_rev_dct(block); - ff_put_pixels_clamped(block, dest, line_size); + ff_put_pixels_clamped_c(block, dest, line_size); } void ff_jref_idct_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block) { ff_j_rev_dct(block); - ff_add_pixels_clamped(block, dest, line_size); + ff_add_pixels_clamped_c(block, dest, line_size); } diff --git a/libavcodec/xvididct.c b/libavcodec/xvididct.c index 4642a30d62..d8f3dd7072 100644 --- a/libavcodec/xvididct.c +++ b/libavcodec/xvididct.c @@ -321,13 +321,13 @@ void ff_xvid_idct(int16_t *const in) static void xvid_idct_put(uint8_t *dest, ptrdiff_t line_size, int16_t *block) { ff_xvid_idct(block); - ff_put_pixels_clamped(block, dest, line_size); + ff_put_pixels_clamped_c(block, dest, line_size); } static void xvid_idct_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block) { ff_xvid_idct(block); - ff_add_pixels_clamped(block, dest, line_size); + ff_add_pixels_clamped_c(block, dest, line_size); } av_cold void ff_xvid_idct_init(IDCTDSPContext *c, AVCodecContext *avctx) -- cgit v1.2.3