Commit 32baeafe authored by Ronald S. Bultje's avatar Ronald S. Bultje

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)
parent e0c20567
...@@ -80,10 +80,7 @@ av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, ...@@ -80,10 +80,7 @@ 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_put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
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) ptrdiff_t line_size)
{ {
int i; int i;
...@@ -157,7 +154,7 @@ static void put_signed_pixels_clamped_c(const int16_t *block, ...@@ -157,7 +154,7 @@ 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, void ff_add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
ptrdiff_t line_size) ptrdiff_t line_size)
{ {
int i; int i;
...@@ -290,9 +287,9 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx) ...@@ -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->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) if (CONFIG_MPEG4_DECODER && avctx->idct_algo == FF_IDCT_XVID)
ff_xvid_idct_init(c, avctx); ff_xvid_idct_init(c, avctx);
...@@ -310,9 +307,6 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx) ...@@ -310,9 +307,6 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
if (ARCH_MIPS) if (ARCH_MIPS)
ff_idctdsp_init_mips(c, avctx, high_bit_depth); 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, ff_init_scantable_permutation(c->idct_permutation,
c->perm_type); c->perm_type);
} }
...@@ -97,8 +97,10 @@ typedef struct IDCTDSPContext { ...@@ -97,8 +97,10 @@ typedef struct IDCTDSPContext {
enum idct_permutation_type perm_type; enum idct_permutation_type perm_type;
} IDCTDSPContext; } IDCTDSPContext;
extern void (*ff_put_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,
extern void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); 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); void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx);
......
...@@ -1159,11 +1159,11 @@ void ff_j_rev_dct1(DCTBLOCK data){ ...@@ -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) void ff_jref_idct_put(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
{ {
ff_j_rev_dct(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) void ff_jref_idct_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
{ {
ff_j_rev_dct(block); ff_j_rev_dct(block);
ff_add_pixels_clamped(block, dest, line_size); ff_add_pixels_clamped_c(block, dest, line_size);
} }
...@@ -321,13 +321,13 @@ void ff_xvid_idct(int16_t *const in) ...@@ -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) static void xvid_idct_put(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
{ {
ff_xvid_idct(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) static void xvid_idct_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
{ {
ff_xvid_idct(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) av_cold void ff_xvid_idct_init(IDCTDSPContext *c, AVCodecContext *avctx)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment