This reduces code duplication and differences with the fork. Signed-off-by: James Almer <jamrial@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.4
| @@ -30,8 +30,8 @@ | |||||
| #include "idctdsp_arm.h" | #include "idctdsp_arm.h" | ||||
| /* XXX: local hack */ | /* XXX: local hack */ | ||||
| static void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size); | |||||
| static void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size); | |||||
| static void (*put_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size); | |||||
| static void (*add_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size); | |||||
| void ff_add_pixels_clamped_arm(const int16_t *block, uint8_t *dest, | void ff_add_pixels_clamped_arm(const int16_t *block, uint8_t *dest, | ||||
| int line_size); | int line_size); | ||||
| @@ -41,25 +41,25 @@ void ff_add_pixels_clamped_arm(const int16_t *block, uint8_t *dest, | |||||
| static void j_rev_dct_arm_put(uint8_t *dest, int line_size, int16_t *block) | static void j_rev_dct_arm_put(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| ff_j_rev_dct_arm(block); | ff_j_rev_dct_arm(block); | ||||
| ff_put_pixels_clamped(block, dest, line_size); | |||||
| put_pixels_clamped(block, dest, line_size); | |||||
| } | } | ||||
| static void j_rev_dct_arm_add(uint8_t *dest, int line_size, int16_t *block) | static void j_rev_dct_arm_add(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| ff_j_rev_dct_arm(block); | ff_j_rev_dct_arm(block); | ||||
| ff_add_pixels_clamped(block, dest, line_size); | |||||
| add_pixels_clamped(block, dest, line_size); | |||||
| } | } | ||||
| static void simple_idct_arm_put(uint8_t *dest, int line_size, int16_t *block) | static void simple_idct_arm_put(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| ff_simple_idct_arm(block); | ff_simple_idct_arm(block); | ||||
| ff_put_pixels_clamped(block, dest, line_size); | |||||
| put_pixels_clamped(block, dest, line_size); | |||||
| } | } | ||||
| static void simple_idct_arm_add(uint8_t *dest, int line_size, int16_t *block) | static void simple_idct_arm_add(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| ff_simple_idct_arm(block); | ff_simple_idct_arm(block); | ||||
| ff_add_pixels_clamped(block, dest, line_size); | |||||
| add_pixels_clamped(block, dest, line_size); | |||||
| } | } | ||||
| av_cold void ff_idctdsp_init_arm(IDCTDSPContext *c, AVCodecContext *avctx, | av_cold void ff_idctdsp_init_arm(IDCTDSPContext *c, AVCodecContext *avctx, | ||||
| @@ -67,8 +67,8 @@ av_cold void ff_idctdsp_init_arm(IDCTDSPContext *c, AVCodecContext *avctx, | |||||
| { | { | ||||
| int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
| ff_put_pixels_clamped = c->put_pixels_clamped; | |||||
| ff_add_pixels_clamped = c->add_pixels_clamped; | |||||
| put_pixels_clamped = c->put_pixels_clamped; | |||||
| add_pixels_clamped = c->add_pixels_clamped; | |||||
| if (!avctx->lowres && !high_bit_depth) { | if (!avctx->lowres && !high_bit_depth) { | ||||
| if ((avctx->idct_algo == FF_IDCT_AUTO && !(avctx->flags & CODEC_FLAG_BITEXACT)) || | if ((avctx->idct_algo == FF_IDCT_AUTO && !(avctx->flags & CODEC_FLAG_BITEXACT)) || | ||||
| @@ -80,6 +80,27 @@ av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, | |||||
| } | } | ||||
| } | } | ||||
| void ff_put_pixels_clamped(const int16_t *block, uint8_t *av_restrict pixels, | |||||
| int line_size) | |||||
| { | |||||
| int i; | |||||
| /* read the pixels */ | |||||
| for (i = 0; i < 8; i++) { | |||||
| pixels[0] = av_clip_uint8(block[0]); | |||||
| pixels[1] = av_clip_uint8(block[1]); | |||||
| pixels[2] = av_clip_uint8(block[2]); | |||||
| pixels[3] = av_clip_uint8(block[3]); | |||||
| pixels[4] = av_clip_uint8(block[4]); | |||||
| pixels[5] = av_clip_uint8(block[5]); | |||||
| pixels[6] = av_clip_uint8(block[6]); | |||||
| pixels[7] = av_clip_uint8(block[7]); | |||||
| pixels += line_size; | |||||
| block += 8; | |||||
| } | |||||
| } | |||||
| static void put_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels, | static void put_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels, | ||||
| int line_size) | int line_size) | ||||
| { | { | ||||
| @@ -133,6 +154,26 @@ static void put_signed_pixels_clamped_c(const int16_t *block, | |||||
| } | } | ||||
| } | } | ||||
| void ff_add_pixels_clamped(const int16_t *block, uint8_t *av_restrict pixels, | |||||
| int line_size) | |||||
| { | |||||
| int i; | |||||
| /* read the pixels */ | |||||
| for (i = 0; i < 8; i++) { | |||||
| pixels[0] = av_clip_uint8(pixels[0] + block[0]); | |||||
| pixels[1] = av_clip_uint8(pixels[1] + block[1]); | |||||
| pixels[2] = av_clip_uint8(pixels[2] + block[2]); | |||||
| pixels[3] = av_clip_uint8(pixels[3] + block[3]); | |||||
| pixels[4] = av_clip_uint8(pixels[4] + block[4]); | |||||
| pixels[5] = av_clip_uint8(pixels[5] + block[5]); | |||||
| pixels[6] = av_clip_uint8(pixels[6] + block[6]); | |||||
| pixels[7] = av_clip_uint8(pixels[7] + block[7]); | |||||
| pixels += line_size; | |||||
| block += 8; | |||||
| } | |||||
| } | |||||
| static void add_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels, | static void add_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels, | ||||
| int line_size) | int line_size) | ||||
| { | { | ||||
| @@ -166,13 +207,13 @@ static void add_pixels_clamped2_c(const int16_t *block, uint8_t *av_restrict pix | |||||
| static void jref_idct_put(uint8_t *dest, int line_size, int16_t *block) | static void jref_idct_put(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| ff_j_rev_dct(block); | ff_j_rev_dct(block); | ||||
| put_pixels_clamped_c(block, dest, line_size); | |||||
| ff_put_pixels_clamped(block, dest, line_size); | |||||
| } | } | ||||
| static void jref_idct_add(uint8_t *dest, int line_size, int16_t *block) | static void jref_idct_add(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| ff_j_rev_dct(block); | ff_j_rev_dct(block); | ||||
| add_pixels_clamped_c(block, dest, line_size); | |||||
| ff_add_pixels_clamped(block, dest, line_size); | |||||
| } | } | ||||
| static void ff_jref_idct4_put(uint8_t *dest, int line_size, int16_t *block) | static void ff_jref_idct4_put(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| @@ -255,9 +296,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->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; | |||||
| if (CONFIG_MPEG4_DECODER && avctx->idct_algo == FF_IDCT_XVID) | if (CONFIG_MPEG4_DECODER && avctx->idct_algo == FF_IDCT_XVID) | ||||
| ff_xvididct_init(c, avctx); | ff_xvididct_init(c, avctx); | ||||
| @@ -48,6 +48,11 @@ void ff_init_scantable_permutation(uint8_t *idct_permutation, | |||||
| int ff_init_scantable_permutation_x86(uint8_t *idct_permutation, | int ff_init_scantable_permutation_x86(uint8_t *idct_permutation, | ||||
| enum idct_permutation_type perm_type); | enum idct_permutation_type perm_type); | ||||
| void ff_put_pixels_clamped(const int16_t *block, uint8_t *av_restrict pixels, | |||||
| int line_size); | |||||
| void ff_add_pixels_clamped(const int16_t *block, uint8_t *av_restrict pixels, | |||||
| int line_size); | |||||
| typedef struct IDCTDSPContext { | typedef struct IDCTDSPContext { | ||||
| /* pixel ops : interface with DCT */ | /* pixel ops : interface with DCT */ | ||||
| void (*put_pixels_clamped)(const int16_t *block /* align 16 */, | void (*put_pixels_clamped)(const int16_t *block /* align 16 */, | ||||
| @@ -106,45 +111,4 @@ void ff_idctdsp_init_ppc(IDCTDSPContext *c, AVCodecContext *avctx, | |||||
| void ff_idctdsp_init_x86(IDCTDSPContext *c, AVCodecContext *avctx, | void ff_idctdsp_init_x86(IDCTDSPContext *c, AVCodecContext *avctx, | ||||
| unsigned high_bit_depth); | unsigned high_bit_depth); | ||||
| static inline void put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, | |||||
| int line_size) | |||||
| { | |||||
| int i; | |||||
| /* read the pixels */ | |||||
| for (i = 0; i < 8; i++) { | |||||
| pixels[0] = av_clip_uint8(block[0]); | |||||
| pixels[1] = av_clip_uint8(block[1]); | |||||
| pixels[2] = av_clip_uint8(block[2]); | |||||
| pixels[3] = av_clip_uint8(block[3]); | |||||
| pixels[4] = av_clip_uint8(block[4]); | |||||
| pixels[5] = av_clip_uint8(block[5]); | |||||
| pixels[6] = av_clip_uint8(block[6]); | |||||
| pixels[7] = av_clip_uint8(block[7]); | |||||
| pixels += line_size; | |||||
| block += 8; | |||||
| } | |||||
| } | |||||
| static inline void add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, | |||||
| int line_size) | |||||
| { | |||||
| int i; | |||||
| /* read the pixels */ | |||||
| for (i = 0; i < 8; i++) { | |||||
| pixels[0] = av_clip_uint8(pixels[0] + block[0]); | |||||
| pixels[1] = av_clip_uint8(pixels[1] + block[1]); | |||||
| pixels[2] = av_clip_uint8(pixels[2] + block[2]); | |||||
| pixels[3] = av_clip_uint8(pixels[3] + block[3]); | |||||
| pixels[4] = av_clip_uint8(pixels[4] + block[4]); | |||||
| pixels[5] = av_clip_uint8(pixels[5] + block[5]); | |||||
| pixels[6] = av_clip_uint8(pixels[6] + block[6]); | |||||
| pixels[7] = av_clip_uint8(pixels[7] + block[7]); | |||||
| pixels += line_size; | |||||
| block += 8; | |||||
| } | |||||
| } | |||||
| #endif /* AVCODEC_IDCTDSP_H */ | #endif /* AVCODEC_IDCTDSP_H */ | ||||
| @@ -25,13 +25,13 @@ | |||||
| static void idct_xvid_put(uint8_t *dest, int line_size, int16_t *block) | static void idct_xvid_put(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| ff_idct_xvid(block); | ff_idct_xvid(block); | ||||
| put_pixels_clamped_c(block, dest, line_size); | |||||
| ff_put_pixels_clamped(block, dest, line_size); | |||||
| } | } | ||||
| static void idct_xvid_add(uint8_t *dest, int line_size, int16_t *block) | static void idct_xvid_add(uint8_t *dest, int line_size, int16_t *block) | ||||
| { | { | ||||
| ff_idct_xvid(block); | ff_idct_xvid(block); | ||||
| add_pixels_clamped_c(block, dest, line_size); | |||||
| ff_add_pixels_clamped(block, dest, line_size); | |||||
| } | } | ||||
| av_cold void ff_xvididct_init(IDCTDSPContext *c, AVCodecContext *avctx) | av_cold void ff_xvididct_init(IDCTDSPContext *c, AVCodecContext *avctx) | ||||