History

dsputil: Split off IDCT bits into their own context

Diego Biurrun committed 12 years ago

Commit e3fcb141 parent adcb83978 files · +1235 −896Browse files

Unified · Split

78 files
  1. configure +21 −19
  2. doc/optimization.txt +0 −3
  3. libavcodec/Makefile +3 −2
  4. libavcodec/aic.c +11 −12
  5. libavcodec/arm/Makefile +13 −10
  6. libavcodec/arm/dsputil_arm.h +0 −4
  7. libavcodec/arm/dsputil_armv6.S +0 −27
  8. libavcodec/arm/dsputil_init_arm.c +0 −60
  9. libavcodec/arm/dsputil_init_armv6.c +0 −18
  10. libavcodec/arm/idctdsp_arm.S +1 −1
  11. libavcodec/arm/idctdsp_arm.h +34 −0
  12. libavcodec/arm/idctdsp_armv6.S +48 −0
  13. libavcodec/arm/idctdsp_init_arm.c +98 −0
  14. libavcodec/arm/idctdsp_init_armv5te.c +3 −3
  15. libavcodec/arm/idctdsp_init_armv6.c +48 −0
  16. libavcodec/arm/idctdsp_init_neon.c +4 −4
  17. libavcodec/arm/idctdsp_neon.S +1 −1
  18. libavcodec/asv.c +0 −1
  19. libavcodec/asv.h +2 −0
  20. libavcodec/asvdec.c +9 −7
  21. libavcodec/asvenc.c +1 −0
  22. libavcodec/cavs.c +4 −3
  23. libavcodec/cavs.h +2 −2
  24. libavcodec/cavsdsp.c +1 −1
  25. libavcodec/dnxhddec.c +26 −26
  26. libavcodec/dnxhdenc.c +5 −4
  27. libavcodec/dsputil.c +1 −161
  28. libavcodec/dsputil.h +0 −66
  29. libavcodec/dvdec.c +5 −4
  30. libavcodec/dxva2_mpeg2.c +1 −1
  31. libavcodec/eamad.c +5 −4
  32. libavcodec/eatgq.c +1 −1
  33. libavcodec/eatqi.c +4 −3
  34. libavcodec/g2meet.c +6 −6
  35. libavcodec/h263.c +4 −4
  36. libavcodec/idctdsp.c +197 −0
  37. libavcodec/idctdsp.h +104 −0
  38. libavcodec/intrax8.c +8 −7
  39. libavcodec/ljpegenc.c +5 −4
  40. libavcodec/mdec.c +11 −9
  41. libavcodec/mimic.c +5 −5
  42. libavcodec/mjpegdec.c +6 −4
  43. libavcodec/mjpegdec.h +2 −2
  44. libavcodec/mjpegenc_common.c +1 −1
  45. libavcodec/mjpegenc_common.h +1 −1
  46. libavcodec/mpeg12dec.c +15 −15
  47. libavcodec/mpeg4videodec.c +20 −19
  48. libavcodec/mpeg4videoenc.c +14 −14
  49. libavcodec/mpegvideo.c +27 −25
  50. libavcodec/mpegvideo.h +2 −0
  51. libavcodec/mpegvideo_enc.c +11 −9
  52. libavcodec/mpegvideo_xvmc.c +1 −1
  53. libavcodec/msmpeg4.c +5 −5
  54. libavcodec/nuv.c +1 −0
  55. libavcodec/ppc/Makefile +1 −1
  56. libavcodec/ppc/dsputil_altivec.h +0 −3
  57. libavcodec/ppc/dsputil_ppc.c +0 −6
  58. libavcodec/ppc/idctdsp.c +27 −3
  59. libavcodec/proresdec.c +1 −1
  60. libavcodec/proresdsp.c +1 −1
  61. libavcodec/rtjpeg.c +4 −4
  62. libavcodec/rtjpeg.h +3 −2
  63. libavcodec/vc1dec.c +69 −47
  64. libavcodec/wmv2.c +12 −11
  65. libavcodec/wmv2dsp.c +1 −1
  66. libavcodec/x86/Makefile +6 −4
  67. libavcodec/x86/cavsdsp.c +2 −1
  68. libavcodec/x86/dsputil_init.c +0 −85
  69. libavcodec/x86/dsputil_mmx.c +0 −135
  70. libavcodec/x86/dsputil_x86.h +0 −7
  71. libavcodec/x86/idct_mmx_xvid.c +1 −1
  72. libavcodec/x86/idct_sse2_xvid.c +1 −1
  73. libavcodec/x86/idctdsp.h +31 −0
  74. libavcodec/x86/idctdsp_init.c +106 −0
  75. libavcodec/x86/idctdsp_mmx.c +168 −0
  76. libavcodec/x86/mpegvideoenc_template.c +1 −1
  77. libavcodec/x86/proresdsp_init.c +1 −1
  78. libavcodec/x86/simple_idct.c +1 −1
configure+21−19
@@ -1546,6 +1546,7 @@ CONFIG_EXTRA=" · 1545 unmodified lines
15461546 huffman
15471547 huffyuvdsp
15481548 huffyuvencdsp
1549+ idctdsp
15491550 intrax8
15501551 lgplv3
15511552 lpc
@@ -1703,6 +1704,7 @@ threads_if_any="$THREADS_LIST" · 151 unmodified lines
17031704
17041705 # subsystems
17051706 dct_select="rdft"
1707+dsputil_select="idctdsp"
17061708 error_resilience_select="dsputil"
17071709 intrax8_select="error_resilience"
17081710 mdct_select="fft"
@@ -1710,7 +1712,7 @@ rdft_select="fft" · 1 unmodified line
17101712 mpeg_er_select="error_resilience"
17111713 mpegaudio_select="mpegaudiodsp"
17121714 mpegaudiodsp_select="dct"
1713−mpegvideo_select="blockdsp dsputil hpeldsp videodsp"
1715+mpegvideo_select="blockdsp dsputil hpeldsp idctdsp videodsp"
17141716 mpegvideoenc_select="dsputil mpegvideo qpeldsp"
17151717
17161718 # decoders / encoders
@@ -1720,16 +1722,16 @@ aac_latm_decoder_select="aac_decoder aac_latm_parser" · 3 unmodified lines
17201722 ac3_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
17211723 ac3_encoder_select="ac3dsp audiodsp dsputil mdct"
17221724 ac3_fixed_encoder_select="ac3dsp audiodsp dsputil mdct"
1723−aic_decoder_select="dsputil golomb"
1725+aic_decoder_select="golomb idctdsp"
17241726 alac_encoder_select="lpc"
17251727 als_decoder_select="bswapdsp"
17261728 amrnb_decoder_select="lsp"
17271729 amrwb_decoder_select="lsp"
17281730 amv_decoder_select="sp5x_decoder"
17291731 ape_decoder_select="bswapdsp"
1730−asv1_decoder_select="blockdsp bswapdsp dsputil"
1732+asv1_decoder_select="blockdsp bswapdsp idctdsp"
17311733 asv1_encoder_select="bswapdsp dsputil"
1732−asv2_decoder_select="blockdsp bswapdsp dsputil"
1734+asv2_decoder_select="blockdsp bswapdsp idctdsp"
17331735 asv2_encoder_select="bswapdsp dsputil"
17341736 atrac1_decoder_select="mdct sinewin"
17351737 atrac3_decoder_select="mdct"
@@ -1737,23 +1739,23 @@ atrac3p_decoder_select="mdct sinewin" · 1 unmodified line
17371739 bink_decoder_select="blockdsp hpeldsp"
17381740 binkaudio_dct_decoder_select="mdct rdft dct sinewin"
17391741 binkaudio_rdft_decoder_select="mdct rdft sinewin"
1740−cavs_decoder_select="blockdsp dsputil golomb h264chroma qpeldsp videodsp"
1742+cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
17411743 cllc_decoder_select="bswapdsp"
17421744 comfortnoise_encoder_select="lpc"
17431745 cook_decoder_select="audiodsp mdct sinewin"
17441746 cscd_decoder_select="lzo"
17451747 cscd_decoder_suggest="zlib"
17461748 dca_decoder_select="mdct"
1747−dnxhd_decoder_select="blockdsp dsputil"
1748−dnxhd_encoder_select="aandcttables blockdsp dsputil mpegvideoenc"
1749−dvvideo_decoder_select="dsputil"
1749+dnxhd_decoder_select="blockdsp idctdsp"
1750+dnxhd_encoder_select="aandcttables blockdsp dsputil idctdsp mpegvideoenc"
1751+dvvideo_decoder_select="idctdsp"
17501752 dvvideo_encoder_select="dsputil"
17511753 dxa_decoder_deps="zlib"
17521754 eac3_decoder_select="ac3_decoder"
17531755 eac3_encoder_select="ac3_encoder"
1754−eamad_decoder_select="aandcttables blockdsp bswapdsp dsputil mpegvideo"
1755−eatgq_decoder_select="aandcttables dsputil"
1756−eatqi_decoder_select="aandcttables blockdsp bswapdsp dsputil mpeg1video_decoder"
1756+eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
1757+eatgq_decoder_select="aandcttables idctdsp"
1758+eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpeg1video_decoder"
17571759 exr_decoder_deps="zlib"
17581760 ffv1_decoder_select="golomb rangecoder"
17591761 ffv1_encoder_select="rangecoder"
@@ -1770,7 +1772,7 @@ flv_encoder_select="h263_encoder" · 10 unmodified lines
17701772 fourxm_decoder_select="blockdsp bswapdsp"
17711773 fraps_decoder_select="bswapdsp huffman"
17721774 g2m_decoder_deps="zlib"
1773−g2m_decoder_select="blockdsp dsputil"
1775+g2m_decoder_select="blockdsp idctdsp"
17741776 h261_decoder_select="mpeg_er mpegvideo"
17751777 h261_encoder_select="aandcttables mpegvideoenc"
17761778 h263_decoder_select="error_resilience h263_parser h263dsp mpeg_er mpegvideo qpeldsp"
@@ -1790,12 +1792,12 @@ jpegls_decoder_select="golomb mjpeg_decoder" · 13 unmodified lines
17901792 jpegls_encoder_select="golomb"
17911793 jv_decoder_select="blockdsp"
17921794 lagarith_decoder_select="huffyuvdsp"
1793−ljpeg_encoder_select="aandcttables dsputil"
1795+ljpeg_encoder_select="aandcttables idctdsp"
17941796 loco_decoder_select="golomb"
1795−mdec_decoder_select="blockdsp dsputil mpegvideo"
1797+mdec_decoder_select="blockdsp idctdsp mpegvideo"
17961798 metasound_decoder_select="lsp mdct sinewin"
1797−mimic_decoder_select="blockdsp bswapdsp dsputil hpeldsp"
1798−mjpeg_decoder_select="blockdsp dsputil hpeldsp"
1799+mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
1800+mjpeg_decoder_select="blockdsp hpeldsp idctdsp"
17991801 mjpeg_encoder_select="aandcttables mpegvideoenc"
18001802 mjpegb_decoder_select="mjpeg_decoder"
18011803 mlp_decoder_select="mlp_parser"
@@ -1829,13 +1831,13 @@ mss2_decoder_select="error_resilience mpeg_er qpeldsp vc1_decoder" · 27 unmodified lines
18291831 mxpeg_decoder_select="mjpeg_decoder"
18301832 nellymoser_decoder_select="mdct sinewin"
18311833 nellymoser_encoder_select="audio_frame_queue mdct sinewin"
1832−nuv_decoder_select="dsputil lzo"
1834+nuv_decoder_select="idctdsp lzo"
18331835 on2avc_decoder_select="mdct"
18341836 opus_decoder_deps="avresample"
18351837 png_decoder_deps="zlib"
18361838 png_encoder_deps="zlib"
18371839 png_encoder_select="huffyuvencdsp"
1838−prores_decoder_select="dsputil"
1840+prores_decoder_select="idctdsp"
18391841 prores_encoder_select="dsputil"
18401842 qcelp_decoder_select="lsp"
18411843 qdm2_decoder_select="mdct rdft mpegaudiodsp"
@@ -1888,7 +1890,7 @@ wmav2_encoder_select="mdct sinewin" · 46 unmodified lines
18881890 wmavoice_decoder_select="lsp rdft dct mdct sinewin"
18891891 wmv1_decoder_select="h263_decoder"
18901892 wmv1_encoder_select="h263_encoder"
1891−wmv2_decoder_select="blockdsp h263_decoder intrax8 videodsp"
1893+wmv2_decoder_select="blockdsp h263_decoder idctdsp intrax8 videodsp"
18921894 wmv2_encoder_select="h263_encoder"
18931895 wmv3_decoder_select="vc1_decoder"
18941896 wmv3image_decoder_select="wmv3_decoder"
doc/optimization.txt+0−3
@@ -136,9 +136,6 @@ dct_unquantize_mpeg2 · 135 unmodified lines
136136 dct_unquantize_h263
137137 Used in MPEG-4/H.263 en/decoding.
138138
139−FIXME remaining functions?
140−BTW, most of these functions are in dsputil.c/.h, some are in mpegvideo.c/.h.
141−
142139
143140
144141 Alignment:
libavcodec/Makefile+3−2
@@ -33,9 +33,8 @@ OBJS-$(CONFIG_BLOCKDSP) += blockdsp.o · 32 unmodified lines
3333 OBJS-$(CONFIG_BSWAPDSP) += bswapdsp.o
3434 OBJS-$(CONFIG_CABAC) += cabac.o
3535 OBJS-$(CONFIG_DCT) += dct.o dct32_fixed.o dct32_float.o
36+OBJS-$(CONFIG_DSPUTIL) += dsputil.o
3637 OBJS-$(CONFIG_DXVA2) += dxva2.o
37−OBJS-$(CONFIG_DSPUTIL) += dsputil.o faanidct.o \
38− simple_idct.o jrevdct.o
3938 OBJS-$(CONFIG_ENCODERS) += faandct.o jfdctfst.o jfdctint.o
4039 OBJS-$(CONFIG_ERROR_RESILIENCE) += error_resilience.o
4140 FFT-OBJS-$(CONFIG_HARDCODED_TABLES) += cos_tables.o cos_fixed_tables.o
@@ -51,6 +50,8 @@ OBJS-$(CONFIG_HPELDSP) += hpeldsp.o · 9 unmodified lines
5150 OBJS-$(CONFIG_HUFFMAN) += huffman.o
5251 OBJS-$(CONFIG_HUFFYUVDSP) += huffyuvdsp.o
5352 OBJS-$(CONFIG_HUFFYUVENCDSP) += huffyuvencdsp.o
53+OBJS-$(CONFIG_IDCTDSP) += idctdsp.o faanidct.o \
54+ simple_idct.o jrevdct.o
5455 OBJS-$(CONFIG_INTRAX8) += intrax8.o intrax8dsp.o
5556 OBJS-$(CONFIG_LIBXVID) += libxvid_rc.o
5657 OBJS-$(CONFIG_LPC) += lpc.o
libavcodec/aic.c+11−12
@@ -24,10 +24,10 @@ · 23 unmodified lines
2424
2525 #include "avcodec.h"
2626 #include "bytestream.h"
27−#include "dsputil.h"
2827 #include "internal.h"
2928 #include "get_bits.h"
3029 #include "golomb.h"
30+#include "idctdsp.h"
3131 #include "unary.h"
3232
3333 #define AIC_HDR_SIZE 24
@@ -139,7 +139,7 @@ static const uint8_t *aic_scan[NUM_BANDS] = { · 105 unmodified lines
139139 typedef struct AICContext {
140140 AVCodecContext *avctx;
141141 AVFrame *frame;
142− DSPContext dsp;
142+ IDCTDSPContext idsp;
143143 ScanTable scantable;
144144
145145 int num_x_slices;
@@ -336,16 +336,15 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, · 190 unmodified lines
336336 recombine_block_il(ctx->block, ctx->scantable.permutated,
337337 &base_y, &ext_y, blk);
338338 unquant_block(ctx->block, ctx->quant);
339− ctx->dsp.idct(ctx->block);
339+ ctx->idsp.idct(ctx->block);
340340
341341 if (!ctx->interlaced) {
342342 dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
343− ctx->dsp.put_signed_pixels_clamped(ctx->block, dst,
344− ystride);
343+ ctx->idsp.put_signed_pixels_clamped(ctx->block, dst, ystride);
345344 } else {
346345 dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
347− ctx->dsp.put_signed_pixels_clamped(ctx->block, dst,
348− ystride * 2);
346+ ctx->idsp.put_signed_pixels_clamped(ctx->block, dst,
347+ ystride * 2);
349348 }
350349 }
351350 Y += 16;
@@ -354,9 +353,9 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, · 2 unmodified lines
354353 recombine_block(ctx->block, ctx->scantable.permutated,
355354 &base_c, &ext_c);
356355 unquant_block(ctx->block, ctx->quant);
357− ctx->dsp.idct(ctx->block);
358− ctx->dsp.put_signed_pixels_clamped(ctx->block, C[blk],
359− ctx->frame->linesize[blk + 1]);
356+ ctx->idsp.idct(ctx->block);
357+ ctx->idsp.put_signed_pixels_clamped(ctx->block, C[blk],
358+ ctx->frame->linesize[blk + 1]);
360359 C[blk] += 8;
361360 }
362361 }
@@ -426,11 +425,11 @@ static av_cold int aic_decode_init(AVCodecContext *avctx) · 63 unmodified lines
426425
427426 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
428427
429− ff_dsputil_init(&ctx->dsp, avctx);
428+ ff_idctdsp_init(&ctx->idsp, avctx);
430429
431430 for (i = 0; i < 64; i++)
432431 scan[i] = i;
433− ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, scan);
432+ ff_init_scantable(ctx->idsp.idct_permutation, &ctx->scantable, scan);
434433
435434 ctx->mb_width = FFALIGN(avctx->width, 16) >> 4;
436435 ctx->mb_height = FFALIGN(avctx->height, 16) >> 4;
libavcodec/arm/Makefile+13−10
@@ -6,10 +6,7 @@ OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_init_arm.o \ · 5 unmodified lines
66 arm/ac3dsp_arm.o
77 OBJS-$(CONFIG_AUDIODSP) += arm/audiodsp_init_arm.o
88 OBJS-$(CONFIG_BLOCKDSP) += arm/blockdsp_init_arm.o
9−OBJS-$(CONFIG_DSPUTIL) += arm/dsputil_init_arm.o \
10− arm/dsputil_arm.o \
11− arm/jrevdct_arm.o \
12− arm/simple_idct_arm.o
9+OBJS-$(CONFIG_DSPUTIL) += arm/dsputil_init_arm.o
1310 OBJS-$(CONFIG_FFT) += arm/fft_init_arm.o \
1411 arm/fft_fixed_init_arm.o
1512 OBJS-$(CONFIG_H264CHROMA) += arm/h264chroma_init_arm.o
@@ -18,6 +15,10 @@ OBJS-$(CONFIG_H264PRED) += arm/h264pred_init_arm.o · 2 unmodified lines
1815 OBJS-$(CONFIG_H264QPEL) += arm/h264qpel_init_arm.o
1916 OBJS-$(CONFIG_HPELDSP) += arm/hpeldsp_init_arm.o \
2017 arm/hpeldsp_arm.o
18+OBJS-$(CONFIG_IDCTDSP) += arm/idctdsp_init_arm.o \
19+ arm/idctdsp_arm.o \
20+ arm/jrevdct_arm.o \
21+ arm/simple_idct_arm.o
2122 OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_init_arm.o
2223 OBJS-$(CONFIG_MPEGVIDEO) += arm/mpegvideo_arm.o
2324 OBJS-$(CONFIG_NEON_CLOBBER_TEST) += arm/neontest.o
@@ -40,7 +41,7 @@ OBJS-$(CONFIG_RV30_DECODER) += arm/rv34dsp_init_arm.o · 16 unmodified lines
4041 OBJS-$(CONFIG_RV40_DECODER) += arm/rv34dsp_init_arm.o \
4142 arm/rv40dsp_init_arm.o
4243
43−ARMV5TE-OBJS-$(CONFIG_DSPUTIL) += arm/dsputil_init_armv5te.o \
44+ARMV5TE-OBJS-$(CONFIG_IDCTDSP) += arm/idctdsp_init_armv5te.o \
4445 arm/simple_idct_armv5te.o
4546 ARMV5TE-OBJS-$(CONFIG_MPEGVIDEO) += arm/mpegvideo_armv5te.o \
4647 arm/mpegvideo_armv5te_s.o
@@ -51,11 +52,13 @@ ARMV5TE-OBJS-$(CONFIG_MLP_DECODER) += arm/mlpdsp_armv5te.o · 4 unmodified lines
5152
5253 ARMV6-OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_armv6.o
5354 ARMV6-OBJS-$(CONFIG_DSPUTIL) += arm/dsputil_init_armv6.o \
54− arm/dsputil_armv6.o \
55− arm/simple_idct_armv6.o
55+ arm/dsputil_armv6.o
5656 ARMV6-OBJS-$(CONFIG_H264DSP) += arm/h264dsp_armv6.o
5757 ARMV6-OBJS-$(CONFIG_HPELDSP) += arm/hpeldsp_init_armv6.o \
5858 arm/hpeldsp_armv6.o
59+ARMV6-OBJS-$(CONFIG_IDCTDSP) += arm/idctdsp_init_armv6.o \
60+ arm/idctdsp_armv6.o \
61+ arm/simple_idct_armv6.o
5962 ARMV6-OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_fixed_armv6.o
6063
6164 ARMV6-OBJS-$(CONFIG_MLP_DECODER) += arm/mlpdsp_armv6.o
@@ -83,9 +86,6 @@ NEON-OBJS-$(CONFIG_AUDIODSP) += arm/audiodsp_init_neon.o \ · 21 unmodified lines
8386 arm/int_neon.o
8487 NEON-OBJS-$(CONFIG_BLOCKDSP) += arm/blockdsp_init_neon.o \
8588 arm/blockdsp_neon.o
86−NEON-OBJS-$(CONFIG_DSPUTIL) += arm/dsputil_init_neon.o \
87− arm/dsputil_neon.o \
88− arm/simple_idct_neon.o
8989 NEON-OBJS-$(CONFIG_FFT) += arm/fft_neon.o \
9090 arm/fft_fixed_neon.o
9191 NEON-OBJS-$(CONFIG_H264CHROMA) += arm/h264cmc_neon.o
@@ -96,6 +96,9 @@ NEON-OBJS-$(CONFIG_H264QPEL) += arm/h264qpel_neon.o \ · 4 unmodified lines
9696 arm/hpeldsp_neon.o
9797 NEON-OBJS-$(CONFIG_HPELDSP) += arm/hpeldsp_init_neon.o \
9898 arm/hpeldsp_neon.o
99+NEON-OBJS-$(CONFIG_IDCTDSP) += arm/idctdsp_init_neon.o \
100+ arm/idctdsp_neon.o \
101+ arm/simple_idct_neon.o
99102 NEON-OBJS-$(CONFIG_MDCT) += arm/mdct_neon.o \
100103 arm/mdct_fixed_neon.o
101104 NEON-OBJS-$(CONFIG_MPEGVIDEO) += arm/mpegvideo_neon.o
libavcodec/arm/dsputil_arm.h+0−4
@@ -24,11 +24,7 @@ · 23 unmodified lines
2424 #include "libavcodec/avcodec.h"
2525 #include "libavcodec/dsputil.h"
2626
27−void ff_dsputil_init_armv5te(DSPContext *c, AVCodecContext *avctx,
28− unsigned high_bit_depth);
2927 void ff_dsputil_init_armv6(DSPContext *c, AVCodecContext *avctx,
3028 unsigned high_bit_depth);
31−void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx,
32− unsigned high_bit_depth);
3329
3430 #endif /* AVCODEC_ARM_DSPUTIL_ARM_H */
libavcodec/arm/dsputil_armv6.S+0−27
@@ -20,33 +20,6 @@ · 19 unmodified lines
2020
2121 #include "libavutil/arm/asm.S"
2222
23−function ff_add_pixels_clamped_armv6, export=1
24− push {r4-r8,lr}
25− mov r3, #8
26−1:
27− ldm r0!, {r4,r5,r12,lr}
28− ldrd r6, r7, [r1]
29− pkhbt r8, r4, r5, lsl #16
30− pkhtb r5, r5, r4, asr #16
31− pkhbt r4, r12, lr, lsl #16
32− pkhtb lr, lr, r12, asr #16
33− pld [r1, r2]
34− uxtab16 r8, r8, r6
35− uxtab16 r5, r5, r6, ror #8
36− uxtab16 r4, r4, r7
37− uxtab16 lr, lr, r7, ror #8
38− usat16 r8, #8, r8
39− usat16 r5, #8, r5
40− usat16 r4, #8, r4
41− usat16 lr, #8, lr
42− orr r6, r8, r5, lsl #8
43− orr r7, r4, lr, lsl #8
44− subs r3, r3, #1
45− strd_post r6, r7, r1, r2
46− bgt 1b
47− pop {r4-r8,pc}
48−endfunc
49−
5023 function ff_get_pixels_armv6, export=1
5124 pld [r1, r2]
5225 push {r4-r8, lr}
libavcodec/arm/dsputil_init_arm.c+0−60
@@ -28,71 +28,11 @@ · 27 unmodified lines
2828 #include "libavcodec/dsputil.h"
2929 #include "dsputil_arm.h"
3030
31−void ff_j_rev_dct_arm(int16_t *data);
32−void ff_simple_idct_arm(int16_t *data);
33−
34−/* XXX: local hack */
35−static void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size);
36−static void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size);
37−
38−void ff_add_pixels_clamped_arm(const int16_t *block, uint8_t *dest,
39− int line_size);
40−
41−/* XXX: those functions should be suppressed ASAP when all IDCTs are
42− * converted */
43−static void j_rev_dct_arm_put(uint8_t *dest, int line_size, int16_t *block)
44−{
45− ff_j_rev_dct_arm(block);
46− ff_put_pixels_clamped(block, dest, line_size);
47−}
48−
49−static void j_rev_dct_arm_add(uint8_t *dest, int line_size, int16_t *block)
50−{
51− ff_j_rev_dct_arm(block);
52− ff_add_pixels_clamped(block, dest, line_size);
53−}
54−
55−static void simple_idct_arm_put(uint8_t *dest, int line_size, int16_t *block)
56−{
57− ff_simple_idct_arm(block);
58− ff_put_pixels_clamped(block, dest, line_size);
59−}
60−
61−static void simple_idct_arm_add(uint8_t *dest, int line_size, int16_t *block)
62−{
63− ff_simple_idct_arm(block);
64− ff_add_pixels_clamped(block, dest, line_size);
65−}
66−
6731 av_cold void ff_dsputil_init_arm(DSPContext *c, AVCodecContext *avctx,
6832 unsigned high_bit_depth)
6933 {
7034 int cpu_flags = av_get_cpu_flags();
7135
72− ff_put_pixels_clamped = c->put_pixels_clamped;
73− ff_add_pixels_clamped = c->add_pixels_clamped;
74−
75− if (!high_bit_depth) {
76− if (avctx->idct_algo == FF_IDCT_AUTO ||
77− avctx->idct_algo == FF_IDCT_ARM) {
78− c->idct_put = j_rev_dct_arm_put;
79− c->idct_add = j_rev_dct_arm_add;
80− c->idct = ff_j_rev_dct_arm;
81− c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
82− } else if (avctx->idct_algo == FF_IDCT_SIMPLEARM) {
83− c->idct_put = simple_idct_arm_put;
84− c->idct_add = simple_idct_arm_add;
85− c->idct = ff_simple_idct_arm;
86− c->idct_permutation_type = FF_NO_IDCT_PERM;
87− }
88− }
89−
90− c->add_pixels_clamped = ff_add_pixels_clamped_arm;
91−
92− if (have_armv5te(cpu_flags))
93− ff_dsputil_init_armv5te(c, avctx, high_bit_depth);
9436 if (have_armv6(cpu_flags))
9537 ff_dsputil_init_armv6(c, avctx, high_bit_depth);
96− if (have_neon(cpu_flags))
97− ff_dsputil_init_neon(c, avctx, high_bit_depth);
9838 }
libavcodec/arm/dsputil_init_armv6.c+0−18
@@ -26,13 +26,6 @@ · 25 unmodified lines
2626 #include "libavcodec/mpegvideo.h"
2727 #include "dsputil_arm.h"
2828
29−void ff_simple_idct_armv6(int16_t *data);
30−void ff_simple_idct_put_armv6(uint8_t *dest, int line_size, int16_t *data);
31−void ff_simple_idct_add_armv6(uint8_t *dest, int line_size, int16_t *data);
32−
33−void ff_add_pixels_clamped_armv6(const int16_t *block, uint8_t *pixels,
34− int line_size);
35−
3629 void ff_get_pixels_armv6(int16_t *block, const uint8_t *pixels, int stride);
3730 void ff_diff_pixels_armv6(int16_t *block, const uint8_t *s1,
3831 const uint8_t *s2, int stride);
@@ -56,17 +49,6 @@ int ff_pix_sum_armv6(uint8_t *pix, int line_size); · 17 unmodified lines
5649 av_cold void ff_dsputil_init_armv6(DSPContext *c, AVCodecContext *avctx,
5750 unsigned high_bit_depth)
5851 {
59− if (!high_bit_depth) {
60− if (avctx->idct_algo == FF_IDCT_AUTO ||
61− avctx->idct_algo == FF_IDCT_SIMPLEARMV6) {
62− c->idct_put = ff_simple_idct_put_armv6;
63− c->idct_add = ff_simple_idct_add_armv6;
64− c->idct = ff_simple_idct_armv6;
65− c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
66− }
67− }
68− c->add_pixels_clamped = ff_add_pixels_clamped_armv6;
69−
7052 if (!high_bit_depth)
7153 c->get_pixels = ff_get_pixels_armv6;
7254 c->diff_pixels = ff_diff_pixels_armv6;
libavcodec/arm/idctdsp_arm.Srenamed from libavcodec/arm/dsputil_arm.S+1−1
@@ -1,5 +1,5 @@
11 @
2−@ ARMv4 optimized DSP utils
2+@ ARMv4-optimized IDCT functions
33 @ Copyright (c) 2004 AGAWA Koji <i (AT) atty (DOT) jp>
44 @
55 @ This file is part of Libav.
libavcodec/arm/idctdsp_arm.h+34−0
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
3+ *
4+ * This file is part of Libav.
5+ *
6+ * Libav is free software; you can redistribute it and/or
7+ * modify it under the terms of the GNU Lesser General Public
8+ * License as published by the Free Software Foundation; either
9+ * version 2.1 of the License, or (at your option) any later version.
10+ *
11+ * Libav is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+ * Lesser General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU Lesser General Public
17+ * License along with Libav; if not, write to the Free Software
18+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19+ */
20+
21+#ifndef AVCODEC_ARM_IDCTDSP_ARM_H
22+#define AVCODEC_ARM_IDCTDSP_ARM_H
23+
24+#include "libavcodec/avcodec.h"
25+#include "libavcodec/idctdsp.h"
26+
27+void ff_idctdsp_init_armv5te(IDCTDSPContext *c, AVCodecContext *avctx,
28+ unsigned high_bit_depth);
29+void ff_idctdsp_init_armv6(IDCTDSPContext *c, AVCodecContext *avctx,
30+ unsigned high_bit_depth);
31+void ff_idctdsp_init_neon(IDCTDSPContext *c, AVCodecContext *avctx,
32+ unsigned high_bit_depth);
33+
34+#endif /* AVCODEC_ARM_IDCTDSP_ARM_H */
libavcodec/arm/idctdsp_armv6.S+48−0
@@ -0,0 +1,48 @@
1+/*
2+ * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
3+ *
4+ * This file is part of Libav.
5+ *
6+ * Libav is free software; you can redistribute it and/or
7+ * modify it under the terms of the GNU Lesser General Public
8+ * License as published by the Free Software Foundation; either
9+ * version 2.1 of the License, or (at your option) any later version.
10+ *
11+ * Libav is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+ * Lesser General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU Lesser General Public
17+ * License along with Libav; if not, write to the Free Software
18+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19+ */
20+
21+#include "libavutil/arm/asm.S"
22+
23+function ff_add_pixels_clamped_armv6, export=1
24+ push {r4-r8,lr}
25+ mov r3, #8
26+1:
27+ ldm r0!, {r4,r5,r12,lr}
28+ ldrd r6, r7, [r1]
29+ pkhbt r8, r4, r5, lsl #16
30+ pkhtb r5, r5, r4, asr #16
31+ pkhbt r4, r12, lr, lsl #16
32+ pkhtb lr, lr, r12, asr #16
33+ pld [r1, r2]
34+ uxtab16 r8, r8, r6
35+ uxtab16 r5, r5, r6, ror #8
36+ uxtab16 r4, r4, r7
37+ uxtab16 lr, lr, r7, ror #8
38+ usat16 r8, #8, r8
39+ usat16 r5, #8, r5
40+ usat16 r4, #8, r4
41+ usat16 lr, #8, lr
42+ orr r6, r8, r5, lsl #8
43+ orr r7, r4, lr, lsl #8
44+ subs r3, r3, #1
45+ strd_post r6, r7, r1, r2
46+ bgt 1b
47+ pop {r4-r8,pc}
48+endfunc
libavcodec/arm/idctdsp_init_arm.c+98−0
@@ -0,0 +1,98 @@
1+/*
2+ * ARM-optimized IDCT functions
3+ * Copyright (c) 2001 Lionel Ulmer
4+ *
5+ * This file is part of Libav.
6+ *
7+ * Libav is free software; you can redistribute it and/or
8+ * modify it under the terms of the GNU Lesser General Public
9+ * License as published by the Free Software Foundation; either
10+ * version 2.1 of the License, or (at your option) any later version.
11+ *
12+ * Libav is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+ * Lesser General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU Lesser General Public
18+ * License along with Libav; if not, write to the Free Software
19+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+ */
21+
22+#include <stdint.h>
23+
24+#include "libavutil/attributes.h"
25+#include "libavutil/cpu.h"
26+#include "libavutil/arm/cpu.h"
27+#include "libavcodec/avcodec.h"
28+#include "libavcodec/idctdsp.h"
29+#include "idctdsp_arm.h"
30+
31+void ff_j_rev_dct_arm(int16_t *data);
32+void ff_simple_idct_arm(int16_t *data);
33+
34+/* XXX: local hack */
35+static void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size);
36+static void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, int line_size);
37+
38+void ff_add_pixels_clamped_arm(const int16_t *block, uint8_t *dest,
39+ int line_size);
40+
41+/* XXX: those functions should be suppressed ASAP when all IDCTs are
42+ * converted */
43+static void j_rev_dct_arm_put(uint8_t *dest, int line_size, int16_t *block)
44+{
45+ ff_j_rev_dct_arm(block);
46+ ff_put_pixels_clamped(block, dest, line_size);
47+}
48+
49+static void j_rev_dct_arm_add(uint8_t *dest, int line_size, int16_t *block)
50+{
51+ ff_j_rev_dct_arm(block);
52+ ff_add_pixels_clamped(block, dest, line_size);
53+}
54+
55+static void simple_idct_arm_put(uint8_t *dest, int line_size, int16_t *block)
56+{
57+ ff_simple_idct_arm(block);
58+ ff_put_pixels_clamped(block, dest, line_size);
59+}
60+
61+static void simple_idct_arm_add(uint8_t *dest, int line_size, int16_t *block)
62+{
63+ ff_simple_idct_arm(block);
64+ ff_add_pixels_clamped(block, dest, line_size);
65+}
66+
67+av_cold void ff_idctdsp_init_arm(IDCTDSPContext *c, AVCodecContext *avctx,
68+ unsigned high_bit_depth)
69+{
70+ int cpu_flags = av_get_cpu_flags();
71+
72+ ff_put_pixels_clamped = c->put_pixels_clamped;
73+ ff_add_pixels_clamped = c->add_pixels_clamped;
74+
75+ if (!high_bit_depth) {
76+ if (avctx->idct_algo == FF_IDCT_AUTO ||
77+ avctx->idct_algo == FF_IDCT_ARM) {
78+ c->idct_put = j_rev_dct_arm_put;
79+ c->idct_add = j_rev_dct_arm_add;
80+ c->idct = ff_j_rev_dct_arm;
81+ c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
82+ } else if (avctx->idct_algo == FF_IDCT_SIMPLEARM) {
83+ c->idct_put = simple_idct_arm_put;
84+ c->idct_add = simple_idct_arm_add;
85+ c->idct = ff_simple_idct_arm;
86+ c->idct_permutation_type = FF_NO_IDCT_PERM;
87+ }
88+ }
89+
90+ c->add_pixels_clamped = ff_add_pixels_clamped_arm;
91+
92+ if (have_armv5te(cpu_flags))
93+ ff_idctdsp_init_armv5te(c, avctx, high_bit_depth);
94+ if (have_armv6(cpu_flags))
95+ ff_idctdsp_init_armv6(c, avctx, high_bit_depth);
96+ if (have_neon(cpu_flags))
97+ ff_idctdsp_init_neon(c, avctx, high_bit_depth);
98+}
libavcodec/arm/idctdsp_init_armv5te.crenamed from libavcodec/arm/dsputil_init_armv5te.c+3−3
@@ -22,14 +22,14 @@ · 21 unmodified lines
2222
2323 #include "libavutil/attributes.h"
2424 #include "libavcodec/avcodec.h"
25−#include "libavcodec/dsputil.h"
26−#include "dsputil_arm.h"
25+#include "libavcodec/idctdsp.h"
26+#include "idctdsp_arm.h"
2727
2828 void ff_simple_idct_armv5te(int16_t *data);
2929 void ff_simple_idct_put_armv5te(uint8_t *dest, int line_size, int16_t *data);
3030 void ff_simple_idct_add_armv5te(uint8_t *dest, int line_size, int16_t *data);
3131
32−av_cold void ff_dsputil_init_armv5te(DSPContext *c, AVCodecContext *avctx,
32+av_cold void ff_idctdsp_init_armv5te(IDCTDSPContext *c, AVCodecContext *avctx,
3333 unsigned high_bit_depth)
3434 {
3535 if (!high_bit_depth &&
libavcodec/arm/idctdsp_init_armv6.c+48−0
@@ -0,0 +1,48 @@
1+/*
2+ * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
3+ *
4+ * This file is part of Libav.
5+ *
6+ * Libav is free software; you can redistribute it and/or
7+ * modify it under the terms of the GNU Lesser General Public
8+ * License as published by the Free Software Foundation; either
9+ * version 2.1 of the License, or (at your option) any later version.
10+ *
11+ * Libav is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+ * Lesser General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU Lesser General Public
17+ * License along with Libav; if not, write to the Free Software
18+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19+ */
20+
21+#include <stdint.h>
22+
23+#include "libavutil/attributes.h"
24+#include "libavcodec/avcodec.h"
25+#include "libavcodec/idctdsp.h"
26+#include "idctdsp_arm.h"
27+
28+void ff_simple_idct_armv6(int16_t *data);
29+void ff_simple_idct_put_armv6(uint8_t *dest, int line_size, int16_t *data);
30+void ff_simple_idct_add_armv6(uint8_t *dest, int line_size, int16_t *data);
31+
32+void ff_add_pixels_clamped_armv6(const int16_t *block, uint8_t *pixels,
33+ int line_size);
34+
35+av_cold void ff_idctdsp_init_armv6(IDCTDSPContext *c, AVCodecContext *avctx,
36+ unsigned high_bit_depth)
37+{
38+ if (!high_bit_depth) {
39+ if (avctx->idct_algo == FF_IDCT_AUTO ||
40+ avctx->idct_algo == FF_IDCT_SIMPLEARMV6) {
41+ c->idct_put = ff_simple_idct_put_armv6;
42+ c->idct_add = ff_simple_idct_add_armv6;
43+ c->idct = ff_simple_idct_armv6;
44+ c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
45+ }
46+ }
47+ c->add_pixels_clamped = ff_add_pixels_clamped_armv6;
48+}
libavcodec/arm/idctdsp_init_neon.crenamed from libavcodec/arm/dsputil_init_neon.c+4−4
@@ -1,5 +1,5 @@
11 /*
2− * ARM NEON optimised DSP functions
2+ * ARM-NEON-optimized IDCT functions
33 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
44 *
55 * This file is part of Libav.
@@ -23,8 +23,8 @@ · 17 unmodified lines
2323
2424 #include "libavutil/attributes.h"
2525 #include "libavcodec/avcodec.h"
26−#include "libavcodec/dsputil.h"
27−#include "dsputil_arm.h"
26+#include "libavcodec/idctdsp.h"
27+#include "idctdsp_arm.h"
2828
2929 void ff_simple_idct_neon(int16_t *data);
3030 void ff_simple_idct_put_neon(uint8_t *dest, int line_size, int16_t *data);
@@ -34,7 +34,7 @@ void ff_add_pixels_clamped_neon(const int16_t *, uint8_t *, int); · 3 unmodified lines
3434 void ff_put_pixels_clamped_neon(const int16_t *, uint8_t *, int);
3535 void ff_put_signed_pixels_clamped_neon(const int16_t *, uint8_t *, int);
3636
37−av_cold void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx,
37+av_cold void ff_idctdsp_init_neon(IDCTDSPContext *c, AVCodecContext *avctx,
3838 unsigned high_bit_depth)
3939 {
4040 if (!high_bit_depth) {
libavcodec/arm/idctdsp_neon.Srenamed from libavcodec/arm/dsputil_neon.S+1−1
@@ -1,5 +1,5 @@
11 /*
2− * ARM NEON optimised DSP functions
2+ * ARM-NEON-optimized IDCT functions
33 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
44 *
55 * This file is part of Libav.
libavcodec/asv.c+0−1
@@ -84,7 +84,6 @@ av_cold void ff_asv_common_init(AVCodecContext *avctx) { · 83 unmodified lines
8484 ASV1Context * const a = avctx->priv_data;
8585
8686 ff_bswapdsp_init(&a->bbdsp);
87− ff_dsputil_init(&a->dsp, avctx);
8887
8988 a->mb_width = (avctx->width + 15) / 16;
9089 a->mb_height = (avctx->height + 15) / 16;
libavcodec/asv.h+2−0
@@ -34,6 +34,7 @@ · 33 unmodified lines
3434 #include "blockdsp.h"
3535 #include "bswapdsp.h"
3636 #include "dsputil.h"
37+#include "idctdsp.h"
3738 #include "get_bits.h"
3839 #include "put_bits.h"
3940
@@ -42,6 +43,7 @@ typedef struct ASV1Context{ · 2 unmodified lines
4243 BlockDSPContext bdsp;
4344 BswapDSPContext bbdsp;
4445 DSPContext dsp;
46+ IDCTDSPContext idsp;
4547 PutBitContext pb;
4648 GetBitContext gb;
4749 ScanTable scantable;
libavcodec/asvdec.c+9−7
@@ -30,6 +30,7 @@ · 29 unmodified lines
3030 #include "avcodec.h"
3131 #include "blockdsp.h"
3232 #include "put_bits.h"
33+#include "idctdsp.h"
3334 #include "internal.h"
3435 #include "mathops.h"
3536 #include "mpeg12data.h"
@@ -190,14 +191,14 @@ static inline void idct_put(ASV1Context *a, AVFrame *frame, int mb_x, int mb_y) · 154 unmodified lines
190191 uint8_t *dest_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8;
191192 uint8_t *dest_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8;
192193
193− a->dsp.idct_put(dest_y , linesize, block[0]);
194− a->dsp.idct_put(dest_y + 8, linesize, block[1]);
195− a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]);
196− a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
194+ a->idsp.idct_put(dest_y, linesize, block[0]);
195+ a->idsp.idct_put(dest_y + 8, linesize, block[1]);
196+ a->idsp.idct_put(dest_y + 8 * linesize, linesize, block[2]);
197+ a->idsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]);
197198
198199 if (!(a->avctx->flags&CODEC_FLAG_GRAY)) {
199− a->dsp.idct_put(dest_cb, frame->linesize[1], block[4]);
200− a->dsp.idct_put(dest_cr, frame->linesize[2], block[5]);
200+ a->idsp.idct_put(dest_cb, frame->linesize[1], block[4]);
201+ a->idsp.idct_put(dest_cr, frame->linesize[2], block[5]);
201202 }
202203 }
203204
@@ -283,8 +284,9 @@ static av_cold int decode_init(AVCodecContext *avctx) · 79 unmodified lines
283284
284285 ff_asv_common_init(avctx);
285286 ff_blockdsp_init(&a->bdsp, avctx);
287+ ff_idctdsp_init(&a->idsp, avctx);
286288 init_vlcs(a);
287− ff_init_scantable(a->dsp.idct_permutation, &a->scantable, ff_asv_scantab);
289+ ff_init_scantable(a->idsp.idct_permutation, &a->scantable, ff_asv_scantab);
288290 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
289291
290292 a->inv_qscale = avctx->extradata[0];
libavcodec/asvenc.c+1−0
@@ -247,6 +247,7 @@ static av_cold int encode_init(AVCodecContext *avctx){ · 246 unmodified lines
247247 avctx->coded_frame->key_frame = 1;
248248
249249 ff_asv_common_init(avctx);
250+ ff_dsputil_init(&a->dsp, avctx);
250251
251252 if(avctx->global_quality == 0) avctx->global_quality= 4*FF_QUALITY_SCALE;
252253
libavcodec/cavs.c+4−3
@@ -29,6 +29,7 @@ · 28 unmodified lines
2929 #include "get_bits.h"
3030 #include "golomb.h"
3131 #include "h264chroma.h"
32+#include "idctdsp.h"
3233 #include "mathops.h"
3334 #include "qpeldsp.h"
3435 #include "cavs.h"
@@ -760,13 +761,13 @@ av_cold int ff_cavs_init(AVCodecContext *avctx) · 725 unmodified lines
760761 AVSContext *h = avctx->priv_data;
761762
762763 ff_blockdsp_init(&h->bdsp, avctx);
763− ff_dsputil_init(&h->dsp, avctx);
764764 ff_h264chroma_init(&h->h264chroma, 8);
765+ ff_idctdsp_init(&h->idsp, avctx);
765766 ff_videodsp_init(&h->vdsp, 8);
766767 ff_cavsdsp_init(&h->cdsp, avctx);
767− ff_init_scantable_permutation(h->dsp.idct_permutation,
768+ ff_init_scantable_permutation(h->idsp.idct_permutation,
768769 h->cdsp.idct_perm);
769− ff_init_scantable(h->dsp.idct_permutation, &h->scantable, ff_zigzag_direct);
770+ ff_init_scantable(h->idsp.idct_permutation, &h->scantable, ff_zigzag_direct);
770771
771772 h->avctx = avctx;
772773 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
libavcodec/cavs.h+2−2
@@ -24,8 +24,8 @@ · 23 unmodified lines
2424
2525 #include "cavsdsp.h"
2626 #include "blockdsp.h"
27−#include "dsputil.h"
2827 #include "h264chroma.h"
28+#include "idctdsp.h"
2929 #include "get_bits.h"
3030 #include "videodsp.h"
3131
@@ -162,9 +162,9 @@ typedef struct AVSFrame { · 130 unmodified lines
162162
163163 typedef struct AVSContext {
164164 AVCodecContext *avctx;
165− DSPContext dsp;
166165 BlockDSPContext bdsp;
167166 H264ChromaContext h264chroma;
167+ IDCTDSPContext idsp;
168168 VideoDSPContext vdsp;
169169 CAVSDSPContext cdsp;
170170 GetBitContext gb;
libavcodec/cavsdsp.c+1−1
@@ -24,7 +24,7 @@ · 23 unmodified lines
2424
2525 #include <stdio.h>
2626
27−#include "dsputil.h"
27+#include "idctdsp.h"
2828 #include "mathops.h"
2929 #include "cavsdsp.h"
3030 #include "libavutil/common.h"
libavcodec/dnxhddec.c+26−26
@@ -28,7 +28,7 @@ · 27 unmodified lines
2828 #include "blockdsp.h"
2929 #include "get_bits.h"
3030 #include "dnxhddata.h"
31−#include "dsputil.h"
31+#include "idctdsp.h"
3232 #include "internal.h"
3333
3434 typedef struct DNXHDContext {
@@ -42,7 +42,7 @@ typedef struct DNXHDContext { · 7 unmodified lines
4242 int cur_field; ///< current interlaced field
4343 VLC ac_vlc, dc_vlc, run_vlc;
4444 int last_dc[3];
45− DSPContext dsp;
45+ IDCTDSPContext idsp;
4646 DECLARE_ALIGNED(16, int16_t, blocks)[12][64];
4747 ScanTable scantable;
4848 const CIDEntry *cid_table;
@@ -95,7 +95,7 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, int cid) · 46 unmodified lines
9595 ctx->cid_table->run_bits, 1, 1,
9696 ctx->cid_table->run_codes, 2, 2, 0);
9797
98− ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable,
98+ ff_init_scantable(ctx->idsp.idct_permutation, &ctx->scantable,
9999 ff_zigzag_direct);
100100 ctx->cid = cid;
101101 }
@@ -136,7 +136,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, · 34 unmodified lines
136136 ctx->avctx->bits_per_raw_sample = 10;
137137 if (ctx->bit_depth != 10) {
138138 ff_blockdsp_init(&ctx->bdsp, ctx->avctx);
139− ff_dsputil_init(&ctx->dsp, ctx->avctx);
139+ ff_idctdsp_init(&ctx->idsp, ctx->avctx);
140140 ctx->bit_depth = 10;
141141 ctx->decode_dct_block = dnxhd_decode_dct_block_10_444;
142142 }
@@ -146,7 +146,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, · 3 unmodified lines
146146 ctx->avctx->bits_per_raw_sample = 10;
147147 if (ctx->bit_depth != 10) {
148148 ff_blockdsp_init(&ctx->bdsp, ctx->avctx);
149− ff_dsputil_init(&ctx->dsp, ctx->avctx);
149+ ff_idctdsp_init(&ctx->idsp, ctx->avctx);
150150 ctx->bit_depth = 10;
151151 ctx->decode_dct_block = dnxhd_decode_dct_block_10;
152152 }
@@ -155,7 +155,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, · 2 unmodified lines
155155 ctx->avctx->bits_per_raw_sample = 8;
156156 if (ctx->bit_depth != 8) {
157157 ff_blockdsp_init(&ctx->bdsp, ctx->avctx);
158− ff_dsputil_init(&ctx->dsp, ctx->avctx);
158+ ff_idctdsp_init(&ctx->idsp, ctx->avctx);
159159 ctx->bit_depth = 8;
160160 ctx->decode_dct_block = dnxhd_decode_dct_block_8;
161161 }
@@ -340,34 +340,34 @@ static int dnxhd_decode_macroblock(DNXHDContext *ctx, AVFrame *frame, · 178 unmodified lines
340340 dct_y_offset = dct_linesize_luma << 3;
341341 dct_x_offset = 8 << shift1;
342342 if (!ctx->is_444) {
343− ctx->dsp.idct_put(dest_y, dct_linesize_luma, ctx->blocks[0]);
344− ctx->dsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, ctx->blocks[1]);
345− ctx->dsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, ctx->blocks[4]);
346− ctx->dsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->blocks[5]);
343+ ctx->idsp.idct_put(dest_y, dct_linesize_luma, ctx->blocks[0]);
344+ ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, ctx->blocks[1]);
345+ ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, ctx->blocks[4]);
346+ ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->blocks[5]);
347347
348348 if (!(ctx->avctx->flags & CODEC_FLAG_GRAY)) {
349349 dct_y_offset = dct_linesize_chroma << 3;
350− ctx->dsp.idct_put(dest_u, dct_linesize_chroma, ctx->blocks[2]);
351− ctx->dsp.idct_put(dest_v, dct_linesize_chroma, ctx->blocks[3]);
352− ctx->dsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, ctx->blocks[6]);
353− ctx->dsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, ctx->blocks[7]);
350+ ctx->idsp.idct_put(dest_u, dct_linesize_chroma, ctx->blocks[2]);
351+ ctx->idsp.idct_put(dest_v, dct_linesize_chroma, ctx->blocks[3]);
352+ ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, ctx->blocks[6]);
353+ ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, ctx->blocks[7]);
354354 }
355355 } else {
356− ctx->dsp.idct_put(dest_y, dct_linesize_luma, ctx->blocks[0]);
357− ctx->dsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, ctx->blocks[1]);
358− ctx->dsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, ctx->blocks[6]);
359− ctx->dsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->blocks[7]);
356+ ctx->idsp.idct_put(dest_y, dct_linesize_luma, ctx->blocks[0]);
357+ ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, ctx->blocks[1]);
358+ ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, ctx->blocks[6]);
359+ ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->blocks[7]);
360360
361361 if (!(ctx->avctx->flags & CODEC_FLAG_GRAY)) {
362362 dct_y_offset = dct_linesize_chroma << 3;
363− ctx->dsp.idct_put(dest_u, dct_linesize_chroma, ctx->blocks[2]);
364− ctx->dsp.idct_put(dest_u + dct_x_offset, dct_linesize_chroma, ctx->blocks[3]);
365− ctx->dsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, ctx->blocks[8]);
366− ctx->dsp.idct_put(dest_u + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->blocks[9]);
367− ctx->dsp.idct_put(dest_v, dct_linesize_chroma, ctx->blocks[4]);
368− ctx->dsp.idct_put(dest_v + dct_x_offset, dct_linesize_chroma, ctx->blocks[5]);
369− ctx->dsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, ctx->blocks[10]);
370− ctx->dsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->blocks[11]);
363+ ctx->idsp.idct_put(dest_u, dct_linesize_chroma, ctx->blocks[2]);
364+ ctx->idsp.idct_put(dest_u + dct_x_offset, dct_linesize_chroma, ctx->blocks[3]);
365+ ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, ctx->blocks[8]);
366+ ctx->idsp.idct_put(dest_u + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->blocks[9]);
367+ ctx->idsp.idct_put(dest_v, dct_linesize_chroma, ctx->blocks[4]);
368+ ctx->idsp.idct_put(dest_v + dct_x_offset, dct_linesize_chroma, ctx->blocks[5]);
369+ ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, ctx->blocks[10]);
370+ ctx->idsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->blocks[11]);
371371 }
372372 }
373373
libavcodec/dnxhdenc.c+5−4
@@ -200,14 +200,14 @@ static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias) · 199 unmodified lines
200200
201201 if (ctx->cid_table->bit_depth == 8) {
202202 for (i = 1; i < 64; i++) {
203− int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
203+ int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
204204 weight_matrix[j] = ctx->cid_table->luma_weight[i];
205205 }
206206 ff_convert_matrix(&ctx->m, ctx->qmatrix_l, ctx->qmatrix_l16,
207207 weight_matrix, ctx->m.intra_quant_bias, 1,
208208 ctx->m.avctx->qmax, 1);
209209 for (i = 1; i < 64; i++) {
210− int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
210+ int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
211211 weight_matrix[j] = ctx->cid_table->chroma_weight[i];
212212 }
213213 ff_convert_matrix(&ctx->m, ctx->qmatrix_c, ctx->qmatrix_c16,
@@ -228,7 +228,7 @@ static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias) · 14 unmodified lines
228228 // 10-bit
229229 for (qscale = 1; qscale <= ctx->m.avctx->qmax; qscale++) {
230230 for (i = 1; i < 64; i++) {
231− int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
231+ int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
232232
233233 /* The quantization formula from the VC-3 standard is:
234234 * quantized = sign(block[i]) * floor(abs(block[i]/s) * p /
@@ -308,6 +308,7 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx) · 73 unmodified lines
308308
309309 ff_blockdsp_init(&ctx->bdsp, avctx);
310310 ff_dsputil_init(&ctx->m.dsp, avctx);
311+ ff_idctdsp_init(&ctx->m.idsp, avctx);
311312 ff_dct_common_init(&ctx->m);
312313 if (!ctx->m.dct_quantize)
313314 ctx->m.dct_quantize = ff_dct_quantize_c;
@@ -634,7 +635,7 @@ static int dnxhd_calc_bits_thread(AVCodecContext *avctx, void *arg, · 320 unmodified lines
634635
635636 if (avctx->mb_decision == FF_MB_DECISION_RD || !RC_VARIANCE) {
636637 dnxhd_unquantize_c(ctx, block, i, qscale, last_index);
637− ctx->m.dsp.idct(block);
638+ ctx->m.idsp.idct(block);
638639 ssd += dnxhd_ssd_block(block, src_block);
639640 }
640641 }
libavcodec/dsputil.c+1−161
@@ -33,7 +33,6 @@ · 32 unmodified lines
3333 #include "dsputil.h"
3434 #include "simple_idct.h"
3535 #include "faandct.h"
36−#include "faanidct.h"
3736 #include "imgconvert.h"
3837 #include "mathops.h"
3938 #include "mpegvideo.h"
@@ -48,60 +47,6 @@ uint32_t ff_square_tab[512] = { 0, }; · 8 unmodified lines
4847 #define BIT_DEPTH 8
4948 #include "dsputilenc_template.c"
5049
51−av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st,
52− const uint8_t *src_scantable)
53−{
54− int i, end;
55−
56− st->scantable = src_scantable;
57−
58− for (i = 0; i < 64; i++) {
59− int j = src_scantable[i];
60− st->permutated[i] = permutation[j];
61− }
62−
63− end = -1;
64− for (i = 0; i < 64; i++) {
65− int j = st->permutated[i];
66− if (j > end)
67− end = j;
68− st->raster_end[i] = end;
69− }
70−}
71−
72−av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation,
73− int idct_permutation_type)
74−{
75− int i;
76−
77− if (ARCH_X86)
78− if (ff_init_scantable_permutation_x86(idct_permutation,
79− idct_permutation_type))
80− return;
81−
82− switch (idct_permutation_type) {
83− case FF_NO_IDCT_PERM:
84− for (i = 0; i < 64; i++)
85− idct_permutation[i] = i;
86− break;
87− case FF_LIBMPEG2_IDCT_PERM:
88− for (i = 0; i < 64; i++)
89− idct_permutation[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
90− break;
91− case FF_TRANSPOSE_IDCT_PERM:
92− for (i = 0; i < 64; i++)
93− idct_permutation[i] = ((i & 7) << 3) | (i >> 3);
94− break;
95− case FF_PARTTRANS_IDCT_PERM:
96− for (i = 0; i < 64; i++)
97− idct_permutation[i] = (i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3);
98− break;
99− default:
100− av_log(NULL, AV_LOG_ERROR,
101− "Internal error, IDCT permutation not set\n");
102− }
103−}
104−
10550 static int pix_sum_c(uint8_t *pix, int line_size)
10651 {
10752 int s = 0, i, j;
@@ -259,68 +204,6 @@ static void diff_pixels_c(int16_t *restrict block, const uint8_t *s1, · 151 unmodified lines
259204 }
260205 }
261206
262−static void put_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
263− int line_size)
264−{
265− int i;
266−
267− /* read the pixels */
268− for (i = 0; i < 8; i++) {
269− pixels[0] = av_clip_uint8(block[0]);
270− pixels[1] = av_clip_uint8(block[1]);
271− pixels[2] = av_clip_uint8(block[2]);
272− pixels[3] = av_clip_uint8(block[3]);
273− pixels[4] = av_clip_uint8(block[4]);
274− pixels[5] = av_clip_uint8(block[5]);
275− pixels[6] = av_clip_uint8(block[6]);
276− pixels[7] = av_clip_uint8(block[7]);
277−
278− pixels += line_size;
279− block += 8;
280− }
281−}
282−
283−static void put_signed_pixels_clamped_c(const int16_t *block,
284− uint8_t *restrict pixels,
285− int line_size)
286−{
287− int i, j;
288−
289− for (i = 0; i < 8; i++) {
290− for (j = 0; j < 8; j++) {
291− if (*block < -128)
292− *pixels = 0;
293− else if (*block > 127)
294− *pixels = 255;
295− else
296− *pixels = (uint8_t) (*block + 128);
297− block++;
298− pixels++;
299− }
300− pixels += (line_size - 8);
301− }
302−}
303−
304−static void add_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
305− int line_size)
306−{
307− int i;
308−
309− /* read the pixels */
310− for (i = 0; i < 8; i++) {
311− pixels[0] = av_clip_uint8(pixels[0] + block[0]);
312− pixels[1] = av_clip_uint8(pixels[1] + block[1]);
313− pixels[2] = av_clip_uint8(pixels[2] + block[2]);
314− pixels[3] = av_clip_uint8(pixels[3] + block[3]);
315− pixels[4] = av_clip_uint8(pixels[4] + block[4]);
316− pixels[5] = av_clip_uint8(pixels[5] + block[5]);
317− pixels[6] = av_clip_uint8(pixels[6] + block[6]);
318− pixels[7] = av_clip_uint8(pixels[7] + block[7]);
319− pixels += line_size;
320− block += 8;
321− }
322−}
323−
324207 static int sum_abs_dctelem_c(int16_t *block)
325208 {
326209 int sum = 0, i;
@@ -967,7 +850,7 @@ static int rd8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, · 640 unmodified lines
967850 s->dct_unquantize_inter(s, temp, 0, s->qscale);
968851 }
969852
970− s->dsp.idct_add(lsrc2, 8, temp);
853+ s->idsp.idct_add(lsrc2, 8, temp);
971854
972855 distortion = s->dsp.sse[1](NULL, lsrc2, lsrc1, 8, 8);
973856
@@ -1138,18 +1021,6 @@ WRAPPER8_16_SQ(quant_psnr8x8_c, quant_psnr16_c) · 164 unmodified lines
11381021 WRAPPER8_16_SQ(rd8x8_c, rd16_c)
11391022 WRAPPER8_16_SQ(bit8x8_c, bit16_c)
11401023
1141−static void jref_idct_put(uint8_t *dest, int line_size, int16_t *block)
1142−{
1143− ff_j_rev_dct(block);
1144− put_pixels_clamped_c(block, dest, line_size);
1145−}
1146−
1147−static void jref_idct_add(uint8_t *dest, int line_size, int16_t *block)
1148−{
1149− ff_j_rev_dct(block);
1150− add_pixels_clamped_c(block, dest, line_size);
1151−}
1152−
11531024 /* draw the edges of width 'w' of an image of size width, height */
11541025 // FIXME: Check that this is OK for MPEG-4 interlaced.
11551026 static void draw_edges_8_c(uint8_t *buf, int wrap, int width, int height,
@@ -1209,36 +1080,8 @@ av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx) · 53 unmodified lines
12091080 }
12101081 #endif /* CONFIG_ENCODERS */
12111082
1212− if (avctx->bits_per_raw_sample == 10) {
1213− c->idct_put = ff_simple_idct_put_10;
1214− c->idct_add = ff_simple_idct_add_10;
1215− c->idct = ff_simple_idct_10;
1216− c->idct_permutation_type = FF_NO_IDCT_PERM;
1217− } else {
1218− if (avctx->idct_algo == FF_IDCT_INT) {
1219− c->idct_put = jref_idct_put;
1220− c->idct_add = jref_idct_add;
1221− c->idct = ff_j_rev_dct;
1222− c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
1223− } else if (avctx->idct_algo == FF_IDCT_FAAN) {
1224− c->idct_put = ff_faanidct_put;
1225− c->idct_add = ff_faanidct_add;
1226− c->idct = ff_faanidct;
1227− c->idct_permutation_type = FF_NO_IDCT_PERM;
1228− } else { // accurate/default
1229− c->idct_put = ff_simple_idct_put_8;
1230− c->idct_add = ff_simple_idct_add_8;
1231− c->idct = ff_simple_idct_8;
1232− c->idct_permutation_type = FF_NO_IDCT_PERM;
1233− }
1234− }
1235−
12361083 c->diff_pixels = diff_pixels_c;
12371084
1238− c->put_pixels_clamped = put_pixels_clamped_c;
1239− c->put_signed_pixels_clamped = put_signed_pixels_clamped_c;
1240− c->add_pixels_clamped = add_pixels_clamped_c;
1241−
12421085 c->sum_abs_dctelem = sum_abs_dctelem_c;
12431086
12441087 c->pix_sum = pix_sum_c;
@@ -1309,7 +1152,4 @@ av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx) · 64 unmodified lines
13091152 ff_dsputil_init_ppc(c, avctx, high_bit_depth);
13101153 if (ARCH_X86)
13111154 ff_dsputil_init_x86(c, avctx, high_bit_depth);
1312−
1313− ff_init_scantable_permutation(c->idct_permutation,
1314− c->idct_permutation_type);
13151155 }
libavcodec/dsputil.h+0−66
@@ -44,22 +44,6 @@ typedef int (*me_cmp_func)(struct MpegEncContext *c, · 43 unmodified lines
4444 uint8_t *blk1 /* align width (8 or 16) */,
4545 uint8_t *blk2 /* align 1 */, int line_size, int h);
4646
47−/**
48− * Scantable.
49− */
50−typedef struct ScanTable {
51− const uint8_t *scantable;
52− uint8_t permutated[64];
53− uint8_t raster_end[64];
54−} ScanTable;
55−
56−void ff_init_scantable(uint8_t *permutation, ScanTable *st,
57− const uint8_t *src_scantable);
58−void ff_init_scantable_permutation(uint8_t *idct_permutation,
59− int idct_permutation_type);
60−int ff_init_scantable_permutation_x86(uint8_t *idct_permutation,
61− int idct_permutation_type);
62−
6347 /**
6448 * DSPContext.
6549 */
@@ -72,15 +56,6 @@ typedef struct DSPContext { · 6 unmodified lines
7256 const uint8_t *s1 /* align 8 */,
7357 const uint8_t *s2 /* align 8 */,
7458 int stride);
75− void (*put_pixels_clamped)(const int16_t *block /* align 16 */,
76− uint8_t *pixels /* align 8 */,
77− int line_size);
78− void (*put_signed_pixels_clamped)(const int16_t *block /* align 16 */,
79− uint8_t *pixels /* align 8 */,
80− int line_size);
81− void (*add_pixels_clamped)(const int16_t *block /* align 16 */,
82− uint8_t *pixels /* align 8 */,
83− int line_size);
8459 int (*sum_abs_dctelem)(int16_t *block /* align 16 */);
8560
8661 int (*pix_sum)(uint8_t *pix, int line_size);
@@ -112,47 +87,6 @@ typedef struct DSPContext { · 25 unmodified lines
11287 void (*fdct)(int16_t *block /* align 16 */);
11388 void (*fdct248)(int16_t *block /* align 16 */);
11489
115− /* IDCT really */
116− void (*idct)(int16_t *block /* align 16 */);
117−
118− /**
119− * block -> idct -> clip to unsigned 8 bit -> dest.
120− * (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...)
121− * @param line_size size in bytes of a horizontal line of dest
122− */
123− void (*idct_put)(uint8_t *dest /* align 8 */,
124− int line_size, int16_t *block /* align 16 */);
125−
126− /**
127− * block -> idct -> add dest -> clip to unsigned 8 bit -> dest.
128− * @param line_size size in bytes of a horizontal line of dest
129− */
130− void (*idct_add)(uint8_t *dest /* align 8 */,
131− int line_size, int16_t *block /* align 16 */);
132−
133− /**
134− * IDCT input permutation.
135− * Several optimized IDCTs need a permutated input (relative to the
136− * normal order of the reference IDCT).
137− * This permutation must be performed before the idct_put/add.
138− * Note, normally this can be merged with the zigzag/alternate scan<br>
139− * An example to avoid confusion:
140− * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...)
141− * - (x -> reference DCT -> reference IDCT -> x)
142− * - (x -> reference DCT -> simple_mmx_perm = idct_permutation
143− * -> simple_idct_mmx -> x)
144− * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant
145− * -> simple_idct_mmx -> ...)
146− */
147− uint8_t idct_permutation[64];
148− int idct_permutation_type;
149−#define FF_NO_IDCT_PERM 1
150−#define FF_LIBMPEG2_IDCT_PERM 2
151−#define FF_SIMPLE_IDCT_PERM 3
152−#define FF_TRANSPOSE_IDCT_PERM 4
153−#define FF_PARTTRANS_IDCT_PERM 5
154−#define FF_SSE2_IDCT_PERM 6
155−
15690 int (*try_8x8basis)(int16_t rem[64], int16_t weight[64],
15791 int16_t basis[64], int scale);
15892 void (*add_8x8basis)(int16_t rem[64], int16_t basis[64], int scale);
libavcodec/dvdec.c+5−4
@@ -39,6 +39,7 @@ · 38 unmodified lines
3939 #include "libavutil/imgutils.h"
4040 #include "libavutil/pixdesc.h"
4141 #include "avcodec.h"
42+#include "idctdsp.h"
4243 #include "internal.h"
4344 #include "get_bits.h"
4445 #include "put_bits.h"
@@ -61,17 +62,17 @@ static const int dv_iweight_bits = 14; · 16 unmodified lines
6162 static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
6263 {
6364 DVVideoContext *s = avctx->priv_data;
64− DSPContext dsp;
65+ IDCTDSPContext idsp;
6566 int i;
6667
67− ff_dsputil_init(&dsp, avctx);
68+ ff_idctdsp_init(&idsp, avctx);
6869
6970 for (i = 0; i < 64; i++)
70− s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
71+ s->dv_zigzag[0][i] = idsp.idct_permutation[ff_zigzag_direct[i]];
7172
7273 memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1]));
7374
74− s->idct_put[0] = dsp.idct_put;
75+ s->idct_put[0] = idsp.idct_put;
7576 s->idct_put[1] = ff_simple_idct248_put;
7677
7778 return ff_dvvideo_init(avctx);
libavcodec/dxva2_mpeg2.c+1−1
@@ -110,7 +110,7 @@ static void fill_quantization_matrices(AVCodecContext *avctx, · 109 unmodified lines
110110 for (i = 0; i < 4; i++)
111111 qm->bNewQmatrix[i] = 1;
112112 for (i = 0; i < 64; i++) {
113− int n = s->dsp.idct_permutation[ff_zigzag_direct[i]];
113+ int n = s->idsp.idct_permutation[ff_zigzag_direct[i]];
114114 qm->Qmatrix[0][i] = s->intra_matrix[n];;
115115 qm->Qmatrix[1][i] = s->inter_matrix[n];;
116116 qm->Qmatrix[2][i] = s->chroma_intra_matrix[n];;
libavcodec/eamad.c+5−4
@@ -33,6 +33,7 @@ · 32 unmodified lines
3333 #include "get_bits.h"
3434 #include "aandcttab.h"
3535 #include "eaidct.h"
36+#include "idctdsp.h"
3637 #include "internal.h"
3738 #include "mpeg12.h"
3839 #include "mpeg12data.h"
@@ -47,7 +48,7 @@ typedef struct MadContext { · 8 unmodified lines
4748 AVCodecContext *avctx;
4849 BlockDSPContext bdsp;
4950 BswapDSPContext bbdsp;
50− DSPContext dsp;
51+ IDCTDSPContext idsp;
5152 AVFrame *last_frame;
5253 GetBitContext gb;
5354 void *bitstream_buf;
@@ -66,9 +67,9 @@ static av_cold int decode_init(AVCodecContext *avctx) · 12 unmodified lines
6667 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
6768 ff_blockdsp_init(&s->bdsp, avctx);
6869 ff_bswapdsp_init(&s->bbdsp);
69− ff_dsputil_init(&s->dsp, avctx);
70− ff_init_scantable_permutation(s->dsp.idct_permutation, FF_NO_IDCT_PERM);
71− ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
70+ ff_idctdsp_init(&s->idsp, avctx);
71+ ff_init_scantable_permutation(s->idsp.idct_permutation, FF_NO_IDCT_PERM);
72+ ff_init_scantable(s->idsp.idct_permutation, &s->scantable, ff_zigzag_direct);
7273 ff_mpeg12_init_vlcs();
7374
7475 s->last_frame = av_frame_alloc();
libavcodec/eatgq.c+1−1
@@ -32,7 +32,7 @@ · 31 unmodified lines
3232 #define BITSTREAM_READER_LE
3333 #include "get_bits.h"
3434 #include "bytestream.h"
35−#include "dsputil.h"
35+#include "idctdsp.h"
3636 #include "aandcttab.h"
3737 #include "eaidct.h"
3838 #include "internal.h"
libavcodec/eatqi.c+4−3
@@ -32,6 +32,7 @@ · 31 unmodified lines
3232 #include "get_bits.h"
3333 #include "aandcttab.h"
3434 #include "eaidct.h"
35+#include "idctdsp.h"
3536 #include "internal.h"
3637 #include "mpeg12.h"
3738 #include "mpegvideo.h"
@@ -51,9 +52,9 @@ static av_cold int tqi_decode_init(AVCodecContext *avctx) · 13 unmodified lines
5152 s->avctx = avctx;
5253 ff_blockdsp_init(&s->bdsp, avctx);
5354 ff_bswapdsp_init(&t->bsdsp);
54− ff_dsputil_init(&s->dsp, avctx);
55− ff_init_scantable_permutation(s->dsp.idct_permutation, FF_NO_IDCT_PERM);
56− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
55+ ff_idctdsp_init(&s->idsp, avctx);
56+ ff_init_scantable_permutation(s->idsp.idct_permutation, FF_NO_IDCT_PERM);
57+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
5758 s->qscale = 1;
5859 avctx->time_base = (AVRational){1, 15};
5960 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
libavcodec/g2meet.c+6−6
@@ -31,7 +31,7 @@ · 30 unmodified lines
3131 #include "avcodec.h"
3232 #include "blockdsp.h"
3333 #include "bytestream.h"
34−#include "dsputil.h"
34+#include "idctdsp.h"
3535 #include "get_bits.h"
3636 #include "internal.h"
3737 #include "mjpeg.h"
@@ -74,7 +74,7 @@ static const uint8_t chroma_quant[64] = { · 36 unmodified lines
7474
7575 typedef struct JPGContext {
7676 BlockDSPContext bdsp;
77− DSPContext dsp;
77+ IDCTDSPContext idsp;
7878 ScanTable scantable;
7979
8080 VLC dc_vlc[2], ac_vlc[2];
@@ -153,8 +153,8 @@ static av_cold int jpg_init(AVCodecContext *avctx, JPGContext *c) · 72 unmodified lines
153153 return ret;
154154
155155 ff_blockdsp_init(&c->bdsp, avctx);
156− ff_dsputil_init(&c->dsp, avctx);
157− ff_init_scantable(c->dsp.idct_permutation, &c->scantable,
156+ ff_idctdsp_init(&c->idsp, avctx);
157+ ff_init_scantable(c->idsp.idct_permutation, &c->scantable,
158158 ff_zigzag_direct);
159159
160160 return 0;
@@ -279,13 +279,13 @@ static int jpg_decode_data(JPGContext *c, int width, int height, · 118 unmodified lines
279279 if ((ret = jpg_decode_block(c, &gb, 0,
280280 c->block[i + j * 2])) != 0)
281281 return ret;
282− c->dsp.idct(c->block[i + j * 2]);
282+ c->idsp.idct(c->block[i + j * 2]);
283283 }
284284 }
285285 for (i = 1; i < 3; i++) {
286286 if ((ret = jpg_decode_block(c, &gb, i, c->block[i + 3])) != 0)
287287 return ret;
288− c->dsp.idct(c->block[i + 3]);
288+ c->idsp.idct(c->block[i + 3]);
289289 }
290290
291291 for (j = 0; j < 16; j++) {
libavcodec/h263.c+4−4
@@ -267,7 +267,7 @@ void ff_h263_pred_acdc(MpegEncContext * s, int16_t *block, int n) · 266 unmodified lines
267267 if (a != 1024) {
268268 ac_val -= 16;
269269 for(i=1;i<8;i++) {
270− block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
270+ block[s->idsp.idct_permutation[i << 3]] += ac_val[i];
271271 }
272272 pred_dc = a;
273273 }
@@ -276,7 +276,7 @@ void ff_h263_pred_acdc(MpegEncContext * s, int16_t *block, int n) · 2 unmodified lines
276276 if (c != 1024) {
277277 ac_val -= 16 * wrap;
278278 for(i=1;i<8;i++) {
279− block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
279+ block[s->idsp.idct_permutation[i]] += ac_val[i + 8];
280280 }
281281 pred_dc = c;
282282 }
@@ -304,10 +304,10 @@ void ff_h263_pred_acdc(MpegEncContext * s, int16_t *block, int n) · 21 unmodified lines
304304
305305 /* left copy */
306306 for(i=1;i<8;i++)
307− ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
307+ ac_val1[i] = block[s->idsp.idct_permutation[i << 3]];
308308 /* top copy */
309309 for(i=1;i<8;i++)
310− ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
310+ ac_val1[8 + i] = block[s->idsp.idct_permutation[i]];
311311 }
312312
313313 int16_t *ff_h263_pred_motion(MpegEncContext * s, int block, int dir,
libavcodec/idctdsp.c+197−0
@@ -0,0 +1,197 @@
1+/*
2+ * This file is part of Libav.
3+ *
4+ * Libav is free software; you can redistribute it and/or
5+ * modify it under the terms of the GNU Lesser General Public
6+ * License as published by the Free Software Foundation; either
7+ * version 2.1 of the License, or (at your option) any later version.
8+ *
9+ * Libav is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+ * Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public
15+ * License along with Libav; if not, write to the Free Software
16+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17+ */
18+
19+#include "config.h"
20+#include "libavutil/attributes.h"
21+#include "libavutil/common.h"
22+#include "avcodec.h"
23+#include "dct.h"
24+#include "faanidct.h"
25+#include "idctdsp.h"
26+#include "simple_idct.h"
27+
28+av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st,
29+ const uint8_t *src_scantable)
30+{
31+ int i, end;
32+
33+ st->scantable = src_scantable;
34+
35+ for (i = 0; i < 64; i++) {
36+ int j = src_scantable[i];
37+ st->permutated[i] = permutation[j];
38+ }
39+
40+ end = -1;
41+ for (i = 0; i < 64; i++) {
42+ int j = st->permutated[i];
43+ if (j > end)
44+ end = j;
45+ st->raster_end[i] = end;
46+ }
47+}
48+
49+av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation,
50+ int idct_permutation_type)
51+{
52+ int i;
53+
54+ if (ARCH_X86)
55+ if (ff_init_scantable_permutation_x86(idct_permutation,
56+ idct_permutation_type))
57+ return;
58+
59+ switch (idct_permutation_type) {
60+ case FF_NO_IDCT_PERM:
61+ for (i = 0; i < 64; i++)
62+ idct_permutation[i] = i;
63+ break;
64+ case FF_LIBMPEG2_IDCT_PERM:
65+ for (i = 0; i < 64; i++)
66+ idct_permutation[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
67+ break;
68+ case FF_TRANSPOSE_IDCT_PERM:
69+ for (i = 0; i < 64; i++)
70+ idct_permutation[i] = ((i & 7) << 3) | (i >> 3);
71+ break;
72+ case FF_PARTTRANS_IDCT_PERM:
73+ for (i = 0; i < 64; i++)
74+ idct_permutation[i] = (i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3);
75+ break;
76+ default:
77+ av_log(NULL, AV_LOG_ERROR,
78+ "Internal error, IDCT permutation not set\n");
79+ }
80+}
81+
82+static void put_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
83+ int line_size)
84+{
85+ int i;
86+
87+ /* read the pixels */
88+ for (i = 0; i < 8; i++) {
89+ pixels[0] = av_clip_uint8(block[0]);
90+ pixels[1] = av_clip_uint8(block[1]);
91+ pixels[2] = av_clip_uint8(block[2]);
92+ pixels[3] = av_clip_uint8(block[3]);
93+ pixels[4] = av_clip_uint8(block[4]);
94+ pixels[5] = av_clip_uint8(block[5]);
95+ pixels[6] = av_clip_uint8(block[6]);
96+ pixels[7] = av_clip_uint8(block[7]);
97+
98+ pixels += line_size;
99+ block += 8;
100+ }
101+}
102+
103+static void put_signed_pixels_clamped_c(const int16_t *block,
104+ uint8_t *restrict pixels,
105+ int line_size)
106+{
107+ int i, j;
108+
109+ for (i = 0; i < 8; i++) {
110+ for (j = 0; j < 8; j++) {
111+ if (*block < -128)
112+ *pixels = 0;
113+ else if (*block > 127)
114+ *pixels = 255;
115+ else
116+ *pixels = (uint8_t) (*block + 128);
117+ block++;
118+ pixels++;
119+ }
120+ pixels += (line_size - 8);
121+ }
122+}
123+
124+static void add_pixels_clamped_c(const int16_t *block, uint8_t *restrict pixels,
125+ int line_size)
126+{
127+ int i;
128+
129+ /* read the pixels */
130+ for (i = 0; i < 8; i++) {
131+ pixels[0] = av_clip_uint8(pixels[0] + block[0]);
132+ pixels[1] = av_clip_uint8(pixels[1] + block[1]);
133+ pixels[2] = av_clip_uint8(pixels[2] + block[2]);
134+ pixels[3] = av_clip_uint8(pixels[3] + block[3]);
135+ pixels[4] = av_clip_uint8(pixels[4] + block[4]);
136+ pixels[5] = av_clip_uint8(pixels[5] + block[5]);
137+ pixels[6] = av_clip_uint8(pixels[6] + block[6]);
138+ pixels[7] = av_clip_uint8(pixels[7] + block[7]);
139+ pixels += line_size;
140+ block += 8;
141+ }
142+}
143+
144+static void jref_idct_put(uint8_t *dest, int line_size, int16_t *block)
145+{
146+ ff_j_rev_dct(block);
147+ put_pixels_clamped_c(block, dest, line_size);
148+}
149+
150+static void jref_idct_add(uint8_t *dest, int line_size, int16_t *block)
151+{
152+ ff_j_rev_dct(block);
153+ add_pixels_clamped_c(block, dest, line_size);
154+}
155+
156+av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
157+{
158+ const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;
159+
160+ if (avctx->bits_per_raw_sample == 10) {
161+ c->idct_put = ff_simple_idct_put_10;
162+ c->idct_add = ff_simple_idct_add_10;
163+ c->idct = ff_simple_idct_10;
164+ c->idct_permutation_type = FF_NO_IDCT_PERM;
165+ } else {
166+ if (avctx->idct_algo == FF_IDCT_INT) {
167+ c->idct_put = jref_idct_put;
168+ c->idct_add = jref_idct_add;
169+ c->idct = ff_j_rev_dct;
170+ c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
171+ } else if (avctx->idct_algo == FF_IDCT_FAAN) {
172+ c->idct_put = ff_faanidct_put;
173+ c->idct_add = ff_faanidct_add;
174+ c->idct = ff_faanidct;
175+ c->idct_permutation_type = FF_NO_IDCT_PERM;
176+ } else { // accurate/default
177+ c->idct_put = ff_simple_idct_put_8;
178+ c->idct_add = ff_simple_idct_add_8;
179+ c->idct = ff_simple_idct_8;
180+ c->idct_permutation_type = FF_NO_IDCT_PERM;
181+ }
182+ }
183+
184+ c->put_pixels_clamped = put_pixels_clamped_c;
185+ c->put_signed_pixels_clamped = put_signed_pixels_clamped_c;
186+ c->add_pixels_clamped = add_pixels_clamped_c;
187+
188+ if (ARCH_ARM)
189+ ff_idctdsp_init_arm(c, avctx, high_bit_depth);
190+ if (ARCH_PPC)
191+ ff_idctdsp_init_ppc(c, avctx, high_bit_depth);
192+ if (ARCH_X86)
193+ ff_idctdsp_init_x86(c, avctx, high_bit_depth);
194+
195+ ff_init_scantable_permutation(c->idct_permutation,
196+ c->idct_permutation_type);
197+}
libavcodec/idctdsp.h+104−0
@@ -0,0 +1,104 @@
1+/*
2+ * This file is part of Libav.
3+ *
4+ * Libav is free software; you can redistribute it and/or
5+ * modify it under the terms of the GNU Lesser General Public
6+ * License as published by the Free Software Foundation; either
7+ * version 2.1 of the License, or (at your option) any later version.
8+ *
9+ * Libav is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+ * Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public
15+ * License along with Libav; if not, write to the Free Software
16+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17+ */
18+
19+#ifndef AVCODEC_IDCTDSP_H
20+#define AVCODEC_IDCTDSP_H
21+
22+#include <stdint.h>
23+
24+#include "avcodec.h"
25+
26+/**
27+ * Scantable.
28+ */
29+typedef struct ScanTable {
30+ const uint8_t *scantable;
31+ uint8_t permutated[64];
32+ uint8_t raster_end[64];
33+} ScanTable;
34+
35+void ff_init_scantable(uint8_t *permutation, ScanTable *st,
36+ const uint8_t *src_scantable);
37+void ff_init_scantable_permutation(uint8_t *idct_permutation,
38+ int idct_permutation_type);
39+int ff_init_scantable_permutation_x86(uint8_t *idct_permutation,
40+ int idct_permutation_type);
41+
42+typedef struct IDCTDSPContext {
43+ /* pixel ops : interface with DCT */
44+ void (*put_pixels_clamped)(const int16_t *block /* align 16 */,
45+ uint8_t *pixels /* align 8 */,
46+ int line_size);
47+ void (*put_signed_pixels_clamped)(const int16_t *block /* align 16 */,
48+ uint8_t *pixels /* align 8 */,
49+ int line_size);
50+ void (*add_pixels_clamped)(const int16_t *block /* align 16 */,
51+ uint8_t *pixels /* align 8 */,
52+ int line_size);
53+
54+ void (*idct)(int16_t *block /* align 16 */);
55+
56+ /**
57+ * block -> idct -> clip to unsigned 8 bit -> dest.
58+ * (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...)
59+ * @param line_size size in bytes of a horizontal line of dest
60+ */
61+ void (*idct_put)(uint8_t *dest /* align 8 */,
62+ int line_size, int16_t *block /* align 16 */);
63+
64+ /**
65+ * block -> idct -> add dest -> clip to unsigned 8 bit -> dest.
66+ * @param line_size size in bytes of a horizontal line of dest
67+ */
68+ void (*idct_add)(uint8_t *dest /* align 8 */,
69+ int line_size, int16_t *block /* align 16 */);
70+
71+ /**
72+ * IDCT input permutation.
73+ * Several optimized IDCTs need a permutated input (relative to the
74+ * normal order of the reference IDCT).
75+ * This permutation must be performed before the idct_put/add.
76+ * Note, normally this can be merged with the zigzag/alternate scan<br>
77+ * An example to avoid confusion:
78+ * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...)
79+ * - (x -> reference DCT -> reference IDCT -> x)
80+ * - (x -> reference DCT -> simple_mmx_perm = idct_permutation
81+ * -> simple_idct_mmx -> x)
82+ * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant
83+ * -> simple_idct_mmx -> ...)
84+ */
85+ uint8_t idct_permutation[64];
86+ int idct_permutation_type;
87+#define FF_NO_IDCT_PERM 1
88+#define FF_LIBMPEG2_IDCT_PERM 2
89+#define FF_SIMPLE_IDCT_PERM 3
90+#define FF_TRANSPOSE_IDCT_PERM 4
91+#define FF_PARTTRANS_IDCT_PERM 5
92+#define FF_SSE2_IDCT_PERM 6
93+} IDCTDSPContext;
94+
95+void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx);
96+
97+void ff_idctdsp_init_arm(IDCTDSPContext *c, AVCodecContext *avctx,
98+ unsigned high_bit_depth);
99+void ff_idctdsp_init_ppc(IDCTDSPContext *c, AVCodecContext *avctx,
100+ unsigned high_bit_depth);
101+void ff_idctdsp_init_x86(IDCTDSPContext *c, AVCodecContext *avctx,
102+ unsigned high_bit_depth);
103+
104+#endif /* AVCODEC_IDCTDSP_H */
libavcodec/intrax8.c+8−7
@@ -24,6 +24,7 @@ · 23 unmodified lines
2424 #include "avcodec.h"
2525 #include "error_resilience.h"
2626 #include "get_bits.h"
27+#include "idctdsp.h"
2728 #include "mpegvideo.h"
2829 #include "msmpeg4data.h"
2930 #include "intrax8huf.h"
@@ -440,7 +441,7 @@ lut2[q>12][c]={ · 410 unmodified lines
440441 static void x8_ac_compensation(IntraX8Context * const w, int const direction, int const dc_level){
441442 MpegEncContext * const s= w->s;
442443 int t;
443−#define B(x,y) s->block[0][s->dsp.idct_permutation[(x)+(y)*8]]
444+#define B(x, y) s->block[0][s->idsp.idct_permutation[(x) + (y) * 8]]
444445 #define T(x) ((x) * dc_level + 0x8000) >> 16;
445446 switch(direction){
446447 case 0:
@@ -646,9 +647,9 @@ static int x8_decode_intra_mb(IntraX8Context* const w, const int chroma){ · 199 unmodified lines
646647 s->current_picture.f->linesize[!!chroma] );
647648 }
648649 if(!zeros_only)
649− s->dsp.idct_add ( s->dest[chroma],
650− s->current_picture.f->linesize[!!chroma],
651− s->block[0] );
650+ s->idsp.idct_add(s->dest[chroma],
651+ s->current_picture.f->linesize[!!chroma],
652+ s->block[0]);
652653
653654 block_placed:
654655
@@ -698,9 +699,9 @@ av_cold void ff_intrax8_common_init(IntraX8Context * w, MpegEncContext * const s · 43 unmodified lines
698699 assert(s->mb_width>0);
699700 w->prediction_table=av_mallocz(s->mb_width*2*2);//two rows, 2 blocks per cannon mb
700701
701− ff_init_scantable(s->dsp.idct_permutation, &w->scantable[0], ff_wmv1_scantable[0]);
702− ff_init_scantable(s->dsp.idct_permutation, &w->scantable[1], ff_wmv1_scantable[2]);
703− ff_init_scantable(s->dsp.idct_permutation, &w->scantable[2], ff_wmv1_scantable[3]);
702+ ff_init_scantable(s->idsp.idct_permutation, &w->scantable[0], ff_wmv1_scantable[0]);
703+ ff_init_scantable(s->idsp.idct_permutation, &w->scantable[1], ff_wmv1_scantable[2]);
704+ ff_init_scantable(s->idsp.idct_permutation, &w->scantable[2], ff_wmv1_scantable[3]);
704705
705706 ff_intrax8dsp_init(&w->dsp);
706707 }
libavcodec/ljpegenc.c+5−4
@@ -35,7 +35,7 @@ · 34 unmodified lines
3535 #include "libavutil/pixdesc.h"
3636
3737 #include "avcodec.h"
38−#include "dsputil.h"
38+#include "idctdsp.h"
3939 #include "internal.h"
4040 #include "mjpegenc_common.h"
4141 #include "mpegvideo.h"
@@ -43,7 +43,7 @@ · 1 unmodified line
4343 #include "mjpegenc.h"
4444
4545 typedef struct LJpegEncContext {
46− DSPContext dsp;
46+ IDCTDSPContext idsp;
4747 ScanTable scantable;
4848 uint16_t matrix[64];
4949
@@ -285,8 +285,9 @@ static av_cold int ljpeg_encode_init(AVCodecContext *avctx) · 235 unmodified lines
285285
286286 s->scratch = av_malloc_array(avctx->width + 1, sizeof(*s->scratch));
287287
288− ff_dsputil_init(&s->dsp, avctx);
289− ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
288+ ff_idctdsp_init(&s->idsp, avctx);
289+ ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
290+ ff_zigzag_direct);
290291
291292 av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift,
292293 &chroma_v_shift);
libavcodec/mdec.c+11−9
@@ -29,6 +29,7 @@ · 28 unmodified lines
2929
3030 #include "avcodec.h"
3131 #include "blockdsp.h"
32+#include "idctdsp.h"
3233 #include "mpegvideo.h"
3334 #include "mpeg12.h"
3435 #include "thread.h"
@@ -36,7 +37,7 @@ · 1 unmodified line
3637 typedef struct MDECContext {
3738 AVCodecContext *avctx;
3839 BlockDSPContext bdsp;
39− DSPContext dsp;
40+ IDCTDSPContext idsp;
4041 ThreadFrame frame;
4142 GetBitContext gb;
4243 ScanTable scantable;
@@ -146,14 +147,14 @@ static inline void idct_put(MDECContext *a, AVFrame *frame, int mb_x, int mb_y) · 103 unmodified lines
146147 uint8_t *dest_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8;
147148 uint8_t *dest_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8;
148149
149− a->dsp.idct_put(dest_y, linesize, block[0]);
150− a->dsp.idct_put(dest_y + 8, linesize, block[1]);
151− a->dsp.idct_put(dest_y + 8 * linesize, linesize, block[2]);
152− a->dsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]);
150+ a->idsp.idct_put(dest_y, linesize, block[0]);
151+ a->idsp.idct_put(dest_y + 8, linesize, block[1]);
152+ a->idsp.idct_put(dest_y + 8 * linesize, linesize, block[2]);
153+ a->idsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]);
153154
154155 if (!(a->avctx->flags & CODEC_FLAG_GRAY)) {
155− a->dsp.idct_put(dest_cb, frame->linesize[1], block[4]);
156− a->dsp.idct_put(dest_cr, frame->linesize[2], block[5]);
156+ a->idsp.idct_put(dest_cb, frame->linesize[1], block[4]);
157+ a->idsp.idct_put(dest_cr, frame->linesize[2], block[5]);
157158 }
158159 }
159160
@@ -215,9 +216,10 @@ static av_cold int decode_init(AVCodecContext *avctx) · 55 unmodified lines
215216 a->avctx = avctx;
216217
217218 ff_blockdsp_init(&a->bdsp, avctx);
218− ff_dsputil_init(&a->dsp, avctx);
219+ ff_idctdsp_init(&a->idsp, avctx);
219220 ff_mpeg12_init_vlcs();
220− ff_init_scantable(a->dsp.idct_permutation, &a->scantable, ff_zigzag_direct);
221+ ff_init_scantable(a->idsp.idct_permutation, &a->scantable,
222+ ff_zigzag_direct);
221223
222224 if (avctx->idct_algo == FF_IDCT_AUTO)
223225 avctx->idct_algo = FF_IDCT_SIMPLE;
libavcodec/mimic.c+5−5
@@ -29,8 +29,8 @@ · 28 unmodified lines
2929 #include "get_bits.h"
3030 #include "bytestream.h"
3131 #include "bswapdsp.h"
32−#include "dsputil.h"
3332 #include "hpeldsp.h"
33+#include "idctdsp.h"
3434 #include "thread.h"
3535
3636 #define MIMIC_HEADER_SIZE 20
@@ -56,8 +56,8 @@ typedef struct { · 19 unmodified lines
5656 ScanTable scantable;
5757 BlockDSPContext bdsp;
5858 BswapDSPContext bbdsp;
59− DSPContext dsp;
6059 HpelDSPContext hdsp;
60+ IDCTDSPContext idsp;
6161 VLC vlc;
6262
6363 /* Kept in the context so multithreading can have a constant to read from */
@@ -151,9 +151,9 @@ static av_cold int mimic_decode_init(AVCodecContext *avctx) · 87 unmodified lines
151151 }
152152 ff_blockdsp_init(&ctx->bdsp, avctx);
153153 ff_bswapdsp_init(&ctx->bbdsp);
154− ff_dsputil_init(&ctx->dsp, avctx);
155154 ff_hpeldsp_init(&ctx->hdsp, avctx->flags);
156− ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, col_zag);
155+ ff_idctdsp_init(&ctx->idsp, avctx);
156+ ff_init_scantable(ctx->idsp.idct_permutation, &ctx->scantable, col_zag);
157157
158158 for (i = 0; i < FF_ARRAY_ELEMS(ctx->frames); i++) {
159159 ctx->frames[i].f = av_frame_alloc();
@@ -302,7 +302,7 @@ static int decode(MimicContext *ctx, int quality, int num_coeffs, · 142 unmodified lines
302302 "block.\n");
303303 return ret;
304304 }
305− ctx->dsp.idct_put(dst, stride, ctx->dct_block);
305+ ctx->idsp.idct_put(dst, stride, ctx->dct_block);
306306 } else {
307307 unsigned int backref = get_bits(&ctx->gb, 4);
308308 int index = (ctx->cur_index + backref) & 15;
libavcodec/mjpegdec.c+6−4
@@ -36,6 +36,7 @@ · 35 unmodified lines
3636 #include "libavutil/opt.h"
3737 #include "avcodec.h"
3838 #include "blockdsp.h"
39+#include "idctdsp.h"
3940 #include "internal.h"
4041 #include "mjpeg.h"
4142 #include "mjpegdec.h"
@@ -95,8 +96,9 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) · 53 unmodified lines
9596 s->avctx = avctx;
9697 ff_blockdsp_init(&s->bdsp, avctx);
9798 ff_hpeldsp_init(&s->hdsp, avctx->flags);
98− ff_dsputil_init(&s->dsp, avctx);
99− ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
99+ ff_idctdsp_init(&s->idsp, avctx);
100+ ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
101+ ff_zigzag_direct);
100102 s->buffer_size = 0;
101103 s->buffer = NULL;
102104 s->start_code = -1;
@@ -889,7 +891,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah, · 786 unmodified lines
889891 "error y=%d x=%d\n", mb_y, mb_x);
890892 return AVERROR_INVALIDDATA;
891893 }
892− s->dsp.idct_put(ptr, linesize[c], s->block);
894+ s->idsp.idct_put(ptr, linesize[c], s->block);
893895 }
894896 } else {
895897 int block_idx = s->block_stride[c] * (v * mb_y + y) +
@@ -1002,7 +1004,7 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss, · 106 unmodified lines
10021004 reference_data + block_offset,
10031005 linesize, 8);
10041006 } else {
1005− s->dsp.idct_put(ptr, linesize, *block);
1007+ s->idsp.idct_put(ptr, linesize, *block);
10061008 ptr += 8;
10071009 }
10081010 }
libavcodec/mjpegdec.h+2−2
@@ -35,8 +35,8 @@ · 34 unmodified lines
3535 #include "avcodec.h"
3636 #include "blockdsp.h"
3737 #include "get_bits.h"
38−#include "dsputil.h"
3938 #include "hpeldsp.h"
39+#include "idctdsp.h"
4040
4141 #define MAX_COMPONENTS 4
4242
@@ -97,8 +97,8 @@ typedef struct MJpegDecodeContext { · 54 unmodified lines
9797 uint64_t coefs_finished[MAX_COMPONENTS]; ///< bitmask of which coefs have been completely decoded (progressive mode)
9898 ScanTable scantable;
9999 BlockDSPContext bdsp;
100− DSPContext dsp;
101100 HpelDSPContext hdsp;
101+ IDCTDSPContext idsp;
102102
103103 int restart_interval;
104104 int restart_count;
libavcodec/mjpegenc_common.c+1−1
@@ -26,7 +26,7 @@ · 25 unmodified lines
2626 #include "libavutil/pixfmt.h"
2727
2828 #include "avcodec.h"
29−#include "dsputil.h"
29+#include "idctdsp.h"
3030 #include "put_bits.h"
3131 #include "mjpegenc_common.h"
3232 #include "mjpeg.h"
libavcodec/mjpegenc_common.h+1−1
@@ -24,7 +24,7 @@ · 23 unmodified lines
2424 #include <stdint.h>
2525
2626 #include "avcodec.h"
27−#include "dsputil.h"
27+#include "idctdsp.h"
2828 #include "put_bits.h"
2929
3030 void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb,
libavcodec/mpeg12dec.c+15−15
@@ -33,8 +33,8 @@ · 32 unmodified lines
3333
3434 #include "avcodec.h"
3535 #include "bytestream.h"
36−#include "dsputil.h"
3736 #include "error_resilience.h"
37+#include "idctdsp.h"
3838 #include "internal.h"
3939 #include "mpeg_er.h"
4040 #include "mpeg12.h"
@@ -1100,7 +1100,7 @@ static av_cold int mpeg_decode_init(AVCodecContext *avctx) · 1059 unmodified lines
11001100 /* we need some permutation to store matrices,
11011101 * until MPV_common_init() sets the real permutation. */
11021102 for (i = 0; i < 64; i++)
1103− s2->dsp.idct_permutation[i] = i;
1103+ s2->idsp.idct_permutation[i] = i;
11041104
11051105 ff_MPV_decode_defaults(s2);
11061106
@@ -1309,15 +1309,15 @@ static int mpeg_decode_postinit(AVCodecContext *avctx) · 202 unmodified lines
13091309
13101310 /* Quantization matrices may need reordering
13111311 * if DCT permutation is changed. */
1312− memcpy(old_permutation, s->dsp.idct_permutation, 64 * sizeof(uint8_t));
1312+ memcpy(old_permutation, s->idsp.idct_permutation, 64 * sizeof(uint8_t));
13131313
13141314 if (ff_MPV_common_init(s) < 0)
13151315 return -2;
13161316
1317− quant_matrix_rebuild(s->intra_matrix, old_permutation, s->dsp.idct_permutation);
1318− quant_matrix_rebuild(s->inter_matrix, old_permutation, s->dsp.idct_permutation);
1319− quant_matrix_rebuild(s->chroma_intra_matrix, old_permutation, s->dsp.idct_permutation);
1320− quant_matrix_rebuild(s->chroma_inter_matrix, old_permutation, s->dsp.idct_permutation);
1317+ quant_matrix_rebuild(s->intra_matrix, old_permutation, s->idsp.idct_permutation);
1318+ quant_matrix_rebuild(s->inter_matrix, old_permutation, s->idsp.idct_permutation);
1319+ quant_matrix_rebuild(s->chroma_intra_matrix, old_permutation, s->idsp.idct_permutation);
1320+ quant_matrix_rebuild(s->chroma_inter_matrix, old_permutation, s->idsp.idct_permutation);
13211321
13221322 s1->mpeg_enc_ctx_allocated = 1;
13231323 }
@@ -1469,7 +1469,7 @@ static int load_matrix(MpegEncContext *s, uint16_t matrix0[64], · 145 unmodified lines
14691469 int i;
14701470
14711471 for (i = 0; i < 64; i++) {
1472− int j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1472+ int j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
14731473 int v = get_bits(&s->gb, 8);
14741474 if (v == 0) {
14751475 av_log(s->avctx, AV_LOG_ERROR, "matrix damaged\n");
@@ -1561,11 +1561,11 @@ static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1) · 85 unmodified lines
15611561 }
15621562
15631563 if (s->alternate_scan) {
1564− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
1565− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
1564+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
1565+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
15661566 } else {
1567− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
1568− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
1567+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
1568+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
15691569 }
15701570
15711571 /* composite display not parsed */
@@ -2070,7 +2070,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, · 498 unmodified lines
20702070 load_matrix(s, s->chroma_intra_matrix, s->intra_matrix, 1);
20712071 } else {
20722072 for (i = 0; i < 64; i++) {
2073− j = s->dsp.idct_permutation[i];
2073+ j = s->idsp.idct_permutation[i];
20742074 v = ff_mpeg1_default_intra_matrix[i];
20752075 s->intra_matrix[j] = v;
20762076 s->chroma_intra_matrix[j] = v;
@@ -2080,7 +2080,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, · 3 unmodified lines
20802080 load_matrix(s, s->chroma_inter_matrix, s->inter_matrix, 0);
20812081 } else {
20822082 for (i = 0; i < 64; i++) {
2083− int j = s->dsp.idct_permutation[i];
2083+ int j = s->idsp.idct_permutation[i];
20842084 v = ff_mpeg1_default_non_intra_matrix[i];
20852085 s->inter_matrix[j] = v;
20862086 s->chroma_inter_matrix[j] = v;
@@ -2142,7 +2142,7 @@ static int vcr2_init_sequence(AVCodecContext *avctx) · 55 unmodified lines
21422142 s1->mpeg_enc_ctx_allocated = 1;
21432143
21442144 for (i = 0; i < 64; i++) {
2145− int j = s->dsp.idct_permutation[i];
2145+ int j = s->idsp.idct_permutation[i];
21462146 v = ff_mpeg1_default_intra_matrix[i];
21472147 s->intra_matrix[j] = v;
21482148 s->chroma_intra_matrix[j] = v;
libavcodec/mpeg4videodec.c+20−19
@@ -21,6 +21,7 @@ · 20 unmodified lines
2121 */
2222
2323 #include "error_resilience.h"
24+#include "idctdsp.h"
2425 #include "internal.h"
2526 #include "mpegutils.h"
2627 #include "mpegvideo.h"
@@ -71,11 +72,11 @@ void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir) · 44 unmodified lines
7172 n == 1 || n == 3) {
7273 /* same qscale */
7374 for (i = 1; i < 8; i++)
74− block[s->dsp.idct_permutation[i << 3]] += ac_val[i];
75+ block[s->idsp.idct_permutation[i << 3]] += ac_val[i];
7576 } else {
7677 /* different qscale, we must rescale */
7778 for (i = 1; i < 8; i++)
78− block[s->dsp.idct_permutation[i << 3]] += ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale);
79+ block[s->idsp.idct_permutation[i << 3]] += ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale);
7980 }
8081 } else {
8182 const int xy = s->mb_x + s->mb_y * s->mb_stride - s->mb_stride;
@@ -86,21 +87,21 @@ void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir) · 4 unmodified lines
8687 n == 2 || n == 3) {
8788 /* same qscale */
8889 for (i = 1; i < 8; i++)
89− block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
90+ block[s->idsp.idct_permutation[i]] += ac_val[i + 8];
9091 } else {
9192 /* different qscale, we must rescale */
9293 for (i = 1; i < 8; i++)
93− block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale);
94+ block[s->idsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale);
9495 }
9596 }
9697 }
9798 /* left copy */
9899 for (i = 1; i < 8; i++)
99− ac_val1[i] = block[s->dsp.idct_permutation[i << 3]];
100+ ac_val1[i] = block[s->idsp.idct_permutation[i << 3]];
100101
101102 /* top copy */
102103 for (i = 1; i < 8; i++)
103− ac_val1[8 + i] = block[s->dsp.idct_permutation[i]];
104+ ac_val1[8 + i] = block[s->idsp.idct_permutation[i]];
104105 }
105106
106107 /**
@@ -1815,7 +1816,7 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) · 1708 unmodified lines
18151816
18161817 /* load default matrixes */
18171818 for (i = 0; i < 64; i++) {
1818− int j = s->dsp.idct_permutation[i];
1819+ int j = s->idsp.idct_permutation[i];
18191820 v = ff_mpeg4_default_intra_matrix[i];
18201821 s->intra_matrix[j] = v;
18211822 s->chroma_intra_matrix[j] = v;
@@ -1835,14 +1836,14 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) · 13 unmodified lines
18351836 break;
18361837
18371838 last = v;
1838− j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1839+ j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
18391840 s->intra_matrix[j] = last;
18401841 s->chroma_intra_matrix[j] = last;
18411842 }
18421843
18431844 /* replicate last value */
18441845 for (; i < 64; i++) {
1845− int j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1846+ int j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
18461847 s->intra_matrix[j] = last;
18471848 s->chroma_intra_matrix[j] = last;
18481849 }
@@ -1858,14 +1859,14 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) · 9 unmodified lines
18581859 break;
18591860
18601861 last = v;
1861− j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1862+ j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
18621863 s->inter_matrix[j] = v;
18631864 s->chroma_inter_matrix[j] = v;
18641865 }
18651866
18661867 /* replicate last value */
18671868 for (; i < 64; i++) {
1868− int j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1869+ int j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
18691870 s->inter_matrix[j] = last;
18701871 s->chroma_inter_matrix[j] = last;
18711872 }
@@ -2219,15 +2220,15 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) · 347 unmodified lines
22192220 }
22202221
22212222 if (s->alternate_scan) {
2222− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
2223− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
2224− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
2225− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
2223+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
2224+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
2225+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
2226+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
22262227 } else {
2227− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
2228− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
2229− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
2230− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
2228+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
2229+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
2230+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
2231+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
22312232 }
22322233
22332234 if (s->pict_type == AV_PICTURE_TYPE_S &&
libavcodec/mpeg4videoenc.c+14−14
@@ -110,11 +110,11 @@ static inline void restore_ac_coeffs(MpegEncContext *s, int16_t block[6][64], · 109 unmodified lines
110110 if (dir[n]) {
111111 /* top prediction */
112112 for (i = 1; i < 8; i++)
113− block[n][s->dsp.idct_permutation[i]] = ac_val[i + 8];
113+ block[n][s->idsp.idct_permutation[i]] = ac_val[i + 8];
114114 } else {
115115 /* left prediction */
116116 for (i = 1; i < 8; i++)
117− block[n][s->dsp.idct_permutation[i << 3]] = ac_val[i];
117+ block[n][s->idsp.idct_permutation[i << 3]] = ac_val[i];
118118 }
119119 }
120120 }
@@ -152,17 +152,17 @@ static inline int decide_ac_pred(MpegEncContext *s, int16_t block[6][64], · 31 unmodified lines
152152 if (s->mb_y == 0 || s->qscale == qscale_table[xy] || n == 2 || n == 3) {
153153 /* same qscale */
154154 for (i = 1; i < 8; i++) {
155− const int level = block[n][s->dsp.idct_permutation[i]];
156− block[n][s->dsp.idct_permutation[i]] = level - ac_val[i + 8];
157− ac_val1[i] = block[n][s->dsp.idct_permutation[i << 3]];
155+ const int level = block[n][s->idsp.idct_permutation[i]];
156+ block[n][s->idsp.idct_permutation[i]] = level - ac_val[i + 8];
157+ ac_val1[i] = block[n][s->idsp.idct_permutation[i << 3]];
158158 ac_val1[i + 8] = level;
159159 }
160160 } else {
161161 /* different qscale, we must rescale */
162162 for (i = 1; i < 8; i++) {
163− const int level = block[n][s->dsp.idct_permutation[i]];
164− block[n][s->dsp.idct_permutation[i]] = level - ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale);
165− ac_val1[i] = block[n][s->dsp.idct_permutation[i << 3]];
163+ const int level = block[n][s->idsp.idct_permutation[i]];
164+ block[n][s->idsp.idct_permutation[i]] = level - ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale);
165+ ac_val1[i] = block[n][s->idsp.idct_permutation[i << 3]];
166166 ac_val1[i + 8] = level;
167167 }
168168 }
@@ -174,18 +174,18 @@ static inline int decide_ac_pred(MpegEncContext *s, int16_t block[6][64], · 5 unmodified lines
174174 if (s->mb_x == 0 || s->qscale == qscale_table[xy] || n == 1 || n == 3) {
175175 /* same qscale */
176176 for (i = 1; i < 8; i++) {
177− const int level = block[n][s->dsp.idct_permutation[i << 3]];
178− block[n][s->dsp.idct_permutation[i << 3]] = level - ac_val[i];
177+ const int level = block[n][s->idsp.idct_permutation[i << 3]];
178+ block[n][s->idsp.idct_permutation[i << 3]] = level - ac_val[i];
179179 ac_val1[i] = level;
180− ac_val1[i + 8] = block[n][s->dsp.idct_permutation[i]];
180+ ac_val1[i + 8] = block[n][s->idsp.idct_permutation[i]];
181181 }
182182 } else {
183183 /* different qscale, we must rescale */
184184 for (i = 1; i < 8; i++) {
185− const int level = block[n][s->dsp.idct_permutation[i << 3]];
186− block[n][s->dsp.idct_permutation[i << 3]] = level - ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale);
185+ const int level = block[n][s->idsp.idct_permutation[i << 3]];
186+ block[n][s->idsp.idct_permutation[i << 3]] = level - ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale);
187187 ac_val1[i] = level;
188− ac_val1[i + 8] = block[n][s->dsp.idct_permutation[i]];
188+ ac_val1[i + 8] = block[n][s->idsp.idct_permutation[i]];
189189 }
190190 }
191191 st[n] = s->intra_v_scantable.permutated;
libavcodec/mpegvideo.c+27−25
@@ -34,7 +34,7 @@ · 33 unmodified lines
3434 #include "libavutil/timer.h"
3535 #include "avcodec.h"
3636 #include "blockdsp.h"
37−#include "dsputil.h"
37+#include "idctdsp.h"
3838 #include "internal.h"
3939 #include "mathops.h"
4040 #include "mpegutils.h"
@@ -380,6 +380,7 @@ av_cold int ff_dct_common_init(MpegEncContext *s) · 339 unmodified lines
380380 ff_blockdsp_init(&s->bdsp, s->avctx);
381381 ff_dsputil_init(&s->dsp, s->avctx);
382382 ff_hpeldsp_init(&s->hdsp, s->avctx->flags);
383+ ff_idctdsp_init(&s->idsp, s->avctx);
383384 ff_mpegvideodsp_init(&s->mdsp);
384385 ff_videodsp_init(&s->vdsp, s->avctx->bits_per_raw_sample);
385386
@@ -403,14 +404,14 @@ av_cold int ff_dct_common_init(MpegEncContext *s) · 17 unmodified lines
403404 * note: only wmv uses different ones
404405 */
405406 if (s->alternate_scan) {
406− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
407− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
407+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
408+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
408409 } else {
409− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
410− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
410+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
411+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
411412 }
412− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
413− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
413+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
414+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
414415
415416 return 0;
416417 }
@@ -2041,7 +2042,7 @@ static inline void put_dct(MpegEncContext *s, · 1624 unmodified lines
20412042 int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
20422043 {
20432044 s->dct_unquantize_intra(s, block, i, qscale);
2044− s->dsp.idct_put (dest, line_size, block);
2045+ s->idsp.idct_put(dest, line_size, block);
20452046 }
20462047
20472048 /* add block[] to dest[] */
@@ -2049,7 +2050,7 @@ static inline void add_dct(MpegEncContext *s, · 1 unmodified line
20492050 int16_t *block, int i, uint8_t *dest, int line_size)
20502051 {
20512052 if (s->block_last_index[i] >= 0) {
2052− s->dsp.idct_add (dest, line_size, block);
2053+ s->idsp.idct_add(dest, line_size, block);
20532054 }
20542055 }
20552056
@@ -2059,7 +2060,7 @@ static inline void add_dequant_dct(MpegEncContext *s, · 3 unmodified lines
20592060 if (s->block_last_index[i] >= 0) {
20602061 s->dct_unquantize_inter(s, block, i, qscale);
20612062
2062− s->dsp.idct_add (dest, line_size, block);
2063+ s->idsp.idct_add(dest, line_size, block);
20632064 }
20642065 }
20652066
@@ -2127,7 +2128,8 @@ FF_ENABLE_DEPRECATION_WARNINGS · 61 unmodified lines
21272128 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
21282129 for(i=0; i<6; i++){
21292130 for(j=0; j<64; j++){
2130− av_log(s->avctx, AV_LOG_DEBUG, "%5d", block[i][s->dsp.idct_permutation[j]]);
2131+ av_log(s->avctx, AV_LOG_DEBUG, "%5d",
2132+ block[i][s->idsp.idct_permutation[j]]);
21312133 }
21322134 av_log(s->avctx, AV_LOG_DEBUG, "\n");
21332135 }
@@ -2304,29 +2306,29 @@ FF_ENABLE_DEPRECATION_WARNINGS · 170 unmodified lines
23042306 }
23052307 }
23062308 }else{
2307− s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2308− s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2309− s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2310− s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2309+ s->idsp.idct_put(dest_y, dct_linesize, block[0]);
2310+ s->idsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2311+ s->idsp.idct_put(dest_y + dct_offset, dct_linesize, block[2]);
2312+ s->idsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
23112313
23122314 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
23132315 if(s->chroma_y_shift){
2314− s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2315− s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2316+ s->idsp.idct_put(dest_cb, uvlinesize, block[4]);
2317+ s->idsp.idct_put(dest_cr, uvlinesize, block[5]);
23162318 }else{
23172319
23182320 dct_linesize = uvlinesize << s->interlaced_dct;
23192321 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize * 8;
23202322
2321− s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2322− s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2323− s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2324− s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2323+ s->idsp.idct_put(dest_cb, dct_linesize, block[4]);
2324+ s->idsp.idct_put(dest_cr, dct_linesize, block[5]);
2325+ s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2326+ s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
23252327 if(!s->chroma_x_shift){//Chroma444
2326− s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
2327− s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
2328− s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
2329− s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
2328+ s->idsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
2329+ s->idsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
2330+ s->idsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
2331+ s->idsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
23302332 }
23312333 }
23322334 }//gray
libavcodec/mpegvideo.h+2−0
@@ -35,6 +35,7 @@ · 34 unmodified lines
3535 #include "get_bits.h"
3636 #include "h263dsp.h"
3737 #include "hpeldsp.h"
38+#include "idctdsp.h"
3839 #include "mpegvideodsp.h"
3940 #include "put_bits.h"
4041 #include "ratecontrol.h"
@@ -352,6 +353,7 @@ typedef struct MpegEncContext { · 311 unmodified lines
352353 BlockDSPContext bdsp;
353354 DSPContext dsp; ///< pointers for accelerated dsp functions
354355 HpelDSPContext hdsp;
356+ IDCTDSPContext idsp;
355357 MpegVideoDSPContext mdsp;
356358 QpelDSPContext qdsp;
357359 VideoDSPContext vdsp;
libavcodec/mpegvideo_enc.c+11−9
@@ -38,6 +38,7 @@ · 37 unmodified lines
3838 #include "avcodec.h"
3939 #include "dct.h"
4040 #include "dsputil.h"
41+#include "idctdsp.h"
4142 #include "mpeg12.h"
4243 #include "mpegvideo.h"
4344 #include "h261.h"
@@ -86,7 +87,7 @@ void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], · 42 unmodified lines
8687 dsp->fdct == ff_jpeg_fdct_islow_10 ||
8788 dsp->fdct == ff_faandct) {
8889 for (i = 0; i < 64; i++) {
89− const int j = dsp->idct_permutation[i];
90+ const int j = s->idsp.idct_permutation[i];
9091 /* 16 <= qscale * quant_matrix[i] <= 7905
9192 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
9293 * 19952 <= x <= 249205026
@@ -98,7 +99,7 @@ void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], · 5 unmodified lines
9899 }
99100 } else if (dsp->fdct == ff_fdct_ifast) {
100101 for (i = 0; i < 64; i++) {
101− const int j = dsp->idct_permutation[i];
102+ const int j = s->idsp.idct_permutation[i];
102103 /* 16 <= qscale * quant_matrix[i] <= 7905
103104 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
104105 * 19952 <= x <= 249205026
@@ -111,7 +112,7 @@ void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], · 6 unmodified lines
111112 }
112113 } else {
113114 for (i = 0; i < 64; i++) {
114− const int j = dsp->idct_permutation[i];
115+ const int j = s->idsp.idct_permutation[i];
115116 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
116117 * Assume x = qscale * quant_matrix[i]
117118 * So 16 <= x <= 7905
@@ -755,7 +756,7 @@ av_cold int ff_MPV_encode_init(AVCodecContext *avctx) · 637 unmodified lines
755756
756757 /* init q matrix */
757758 for (i = 0; i < 64; i++) {
758− int j = s->dsp.idct_permutation[i];
759+ int j = s->idsp.idct_permutation[i];
759760 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
760761 s->mpeg_quant) {
761762 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
@@ -3360,7 +3361,7 @@ static int encode_picture(MpegEncContext *s, int picture_number) · 2598 unmodified lines
33603361 if (s->out_format == FMT_MJPEG) {
33613362 /* for mjpeg, we do include qscale in the matrix */
33623363 for(i=1;i<64;i++){
3363− int j= s->dsp.idct_permutation[i];
3364+ int j = s->idsp.idct_permutation[i];
33643365
33653366 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
33663367 }
@@ -3589,7 +3590,7 @@ static int dct_quantize_trellis_c(MpegEncContext *s, · 222 unmodified lines
35893590 if(s->out_format == FMT_H263){
35903591 unquant_coeff= alevel*qmul + qadd;
35913592 }else{ //MPEG1
3592− j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
3593+ j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
35933594 if(s->mb_intra){
35943595 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
35953596 unquant_coeff = (unquant_coeff - 1) | 1;
@@ -3795,7 +3796,7 @@ static int messed_sign=0; · 199 unmodified lines
37953796 #endif
37963797
37973798 if(basis[0][0] == 0)
3798− build_basis(s->dsp.idct_permutation);
3799+ build_basis(s->idsp.idct_permutation);
37993800
38003801 qmul= qscale*2;
38013802 qadd= (qscale-1)|1;
@@ -4214,8 +4215,9 @@ int ff_dct_quantize_c(MpegEncContext *s, · 412 unmodified lines
42144215 *overflow= s->max_qcoeff < max; //overflow might have happened
42154216
42164217 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4217− if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4218− ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4218+ if (s->idsp.idct_permutation_type != FF_NO_IDCT_PERM)
4219+ ff_block_permute(block, s->idsp.idct_permutation,
4220+ scantable, last_non_zero);
42194221
42204222 return last_non_zero;
42214223 }
libavcodec/mpegvideo_xvmc.c+1−1
@@ -307,7 +307,7 @@ void ff_xvmc_decode_mb(MpegEncContext *s) · 306 unmodified lines
307307 if (s->mb_intra && (render->idct || !render->unsigned_intra))
308308 *s->pblocks[i][0] -= 1 << 10;
309309 if (!render->idct) {
310− s->dsp.idct(*s->pblocks[i]);
310+ s->idsp.idct(*s->pblocks[i]);
311311 /* It is unclear if MC hardware requires pixel diff values to be
312312 * in the range [-255;255]. TODO: Clipping if such hardware is
313313 * ever found. As of now it would only be an unnecessary
libavcodec/msmpeg4.c+5−5
@@ -28,7 +28,7 @@ · 27 unmodified lines
2828 */
2929
3030 #include "avcodec.h"
31−#include "dsputil.h"
31+#include "idctdsp.h"
3232 #include "mpegvideo.h"
3333 #include "msmpeg4.h"
3434 #include "libavutil/x86/asm.h"
@@ -136,10 +136,10 @@ av_cold void ff_msmpeg4_common_init(MpegEncContext *s) · 101 unmodified lines
136136
137137
138138 if(s->msmpeg4_version>=4){
139− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_wmv1_scantable[1]);
140− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_wmv1_scantable[2]);
141− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_wmv1_scantable[3]);
142− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_wmv1_scantable[0]);
139+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_wmv1_scantable[1]);
140+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_wmv1_scantable[2]);
141+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_wmv1_scantable[3]);
142+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_wmv1_scantable[0]);
143143 }
144144 //Note the default tables are set in common_init in mpegvideo.c
145145
libavcodec/nuv.c+1−0
@@ -28,6 +28,7 @@ · 27 unmodified lines
2828 #include "libavutil/lzo.h"
2929 #include "libavutil/imgutils.h"
3030 #include "avcodec.h"
31+#include "idctdsp.h"
3132 #include "internal.h"
3233 #include "rtjpeg.h"
3334
libavcodec/ppc/Makefile+1−1
@@ -9,6 +9,7 @@ OBJS-$(CONFIG_H264DSP) += ppc/h264dsp.o · 8 unmodified lines
99 OBJS-$(CONFIG_H264QPEL) += ppc/h264qpel.o
1010 OBJS-$(CONFIG_HPELDSP) += ppc/hpeldsp_altivec.o
1111 OBJS-$(CONFIG_HUFFYUVDSP) += ppc/huffyuvdsp_altivec.o
12+OBJS-$(CONFIG_IDCTDSP) += ppc/idctdsp.o
1213 OBJS-$(CONFIG_MPEGAUDIODSP) += ppc/mpegaudiodsp_altivec.o
1314 OBJS-$(CONFIG_MPEGVIDEO) += ppc/mpegvideo_altivec.o \
1415 ppc/mpegvideodsp.o
@@ -24,7 +25,6 @@ OBJS-$(CONFIG_VP8_DECODER) += ppc/vp8dsp_altivec.o · 9 unmodified lines
2425
2526 ALTIVEC-OBJS-$(CONFIG_DSPUTIL) += ppc/dsputil_altivec.o \
2627 ppc/fdct_altivec.o \
27− ppc/idct_altivec.o \
2828
2929 FFT-OBJS-$(HAVE_GNU_AS) += ppc/fft_altivec_s.o
3030 ALTIVEC-OBJS-$(CONFIG_FFT) += $(FFT-OBJS-yes)
libavcodec/ppc/dsputil_altivec.h+0−3
@@ -29,9 +29,6 @@ · 28 unmodified lines
2929
3030 void ff_fdct_altivec(int16_t *block);
3131
32−void ff_idct_put_altivec(uint8_t *dest, int line_size, int16_t *block);
33−void ff_idct_add_altivec(uint8_t *dest, int line_size, int16_t *block);
34−
3532 void ff_dsputil_init_altivec(DSPContext *c, AVCodecContext *avctx,
3633 unsigned high_bit_depth);
3734
libavcodec/ppc/dsputil_ppc.c+0−6
@@ -42,12 +42,6 @@ av_cold void ff_dsputil_init_ppc(DSPContext *c, AVCodecContext *avctx, · 41 unmodified lines
4242 c->fdct = ff_fdct_altivec;
4343 }
4444 #endif //CONFIG_ENCODERS
45− if ((avctx->idct_algo == FF_IDCT_AUTO) ||
46− (avctx->idct_algo == FF_IDCT_ALTIVEC)) {
47− c->idct_put = ff_idct_put_altivec;
48− c->idct_add = ff_idct_add_altivec;
49− c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
50− }
5145 }
5246 }
5347 }
libavcodec/ppc/idctdsp.crenamed from libavcodec/ppc/idct_altivec.c+27−3
@@ -37,8 +37,13 @@ · 36 unmodified lines
3737 #include <altivec.h>
3838 #endif
3939
40+#include "libavutil/attributes.h"
41+#include "libavutil/cpu.h"
42+#include "libavutil/ppc/cpu.h"
4043 #include "libavutil/ppc/types_altivec.h"
41−#include "dsputil_altivec.h"
44+#include "libavcodec/idctdsp.h"
45+
46+#if HAVE_ALTIVEC
4247
4348 #define IDCT_HALF \
4449 /* 1st stage */ \
@@ -148,7 +153,7 @@ static const vec_s16 constants[5] = { · 103 unmodified lines
148153 { 19266, 26722, 25172, 22654, 19266, 22654, 25172, 26722 }
149154 };
150155
151−void ff_idct_put_altivec(uint8_t *dest, int stride, int16_t *blk)
156+static void idct_put_altivec(uint8_t *dest, int stride, int16_t *blk)
152157 {
153158 vec_s16 *block = (vec_s16 *) blk;
154159 vec_u8 tmp;
@@ -177,7 +182,7 @@ void ff_idct_put_altivec(uint8_t *dest, int stride, int16_t *blk) · 22 unmodified lines
177182 COPY(dest, vx7);
178183 }
179184
180−void ff_idct_add_altivec(uint8_t *dest, int stride, int16_t *blk)
185+static void idct_add_altivec(uint8_t *dest, int stride, int16_t *blk)
181186 {
182187 vec_s16 *block = (vec_s16 *) blk;
183188 vec_u8 tmp;
@@ -219,3 +224,22 @@ void ff_idct_add_altivec(uint8_t *dest, int stride, int16_t *blk) · 35 unmodified lines
219224 dest += stride;
220225 ADD(dest, vx7, perm1);
221226 }
227+
228+#endif /* HAVE_ALTIVEC */
229+
230+av_cold void ff_idctdsp_init_ppc(IDCTDSPContext *c, AVCodecContext *avctx,
231+ unsigned high_bit_depth)
232+{
233+#if HAVE_ALTIVEC
234+ if (PPC_ALTIVEC(av_get_cpu_flags())) {
235+ if (!high_bit_depth) {
236+ if ((avctx->idct_algo == FF_IDCT_AUTO) ||
237+ (avctx->idct_algo == FF_IDCT_ALTIVEC)) {
238+ c->idct_add = idct_add_altivec;
239+ c->idct_put = idct_put_altivec;
240+ c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
241+ }
242+ }
243+ }
244+#endif /* HAVE_ALTIVEC */
245+}
libavcodec/proresdec.c+1−1
@@ -34,7 +34,7 @@ · 33 unmodified lines
3434
3535 #include "libavutil/intmath.h"
3636 #include "avcodec.h"
37−#include "dsputil.h"
37+#include "idctdsp.h"
3838 #include "internal.h"
3939 #include "proresdata.h"
4040 #include "proresdsp.h"
libavcodec/proresdsp.c+1−1
@@ -23,7 +23,7 @@ · 22 unmodified lines
2323 #include "config.h"
2424 #include "libavutil/attributes.h"
2525 #include "libavutil/common.h"
26−#include "dsputil.h"
26+#include "idctdsp.h"
2727 #include "proresdsp.h"
2828 #include "simple_idct.h"
2929
libavcodec/rtjpeg.c+4−4
@@ -121,7 +121,7 @@ int ff_rtjpeg_decode_frame_yuv420(RTJpegContext *c, AVFrame *f, · 120 unmodified lines
121121 if (res < 0) \
122122 return res; \
123123 if (res > 0) \
124− c->dsp.idct_put(dst, stride, block); \
124+ c->idsp.idct_put(dst, stride, block); \
125125 } while (0)
126126 int16_t *block = c->block;
127127 BLOCK(c->lquant, y1, f->linesize[0]);
@@ -159,7 +159,7 @@ void ff_rtjpeg_decode_init(RTJpegContext *c, int width, int height, · 31 unmodified lines
159159 const uint32_t *lquant, const uint32_t *cquant) {
160160 int i;
161161 for (i = 0; i < 64; i++) {
162− int p = c->dsp.idct_permutation[i];
162+ int p = c->idsp.idct_permutation[i];
163163 c->lquant[p] = lquant[i];
164164 c->cquant[p] = cquant[i];
165165 }
@@ -171,13 +171,13 @@ void ff_rtjpeg_init(RTJpegContext *c, AVCodecContext *avctx) · 5 unmodified lines
171171 {
172172 int i;
173173
174− ff_dsputil_init(&c->dsp, avctx);
174+ ff_idctdsp_init(&c->idsp, avctx);
175175
176176 for (i = 0; i < 64; i++) {
177177 int z = ff_zigzag_direct[i];
178178 z = ((z << 3) | (z >> 3)) & 63; // rtjpeg uses a transposed variant
179179
180180 // permute the scan and quantization tables for the chosen idct
181− c->scan[i] = c->dsp.idct_permutation[z];
181+ c->scan[i] = c->idsp.idct_permutation[z];
182182 }
183183 }
libavcodec/rtjpeg.h+3−2
@@ -23,15 +23,16 @@ · 22 unmodified lines
2323 #define AVCODEC_RTJPEG_H
2424
2525 #include <stdint.h>
26−#include "dsputil.h"
26+
2727 #include "libavutil/mem.h"
28+#include "idctdsp.h"
2829
2930 #define RTJPEG_FILE_VERSION 0
3031 #define RTJPEG_HEADER_SIZE 12
3132
3233 typedef struct RTJpegContext {
3334 int w, h;
34− DSPContext dsp;
35+ IDCTDSPContext idsp;
3536 uint8_t scan[64];
3637 uint32_t lquant[64];
3738 uint32_t cquant[64];
libavcodec/vc1dec.c+69−47
@@ -109,24 +109,24 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) · 108 unmodified lines
109109 fieldtx = v->fieldtx_plane[topleft_mb_pos];
110110 stride_y = s->linesize << fieldtx;
111111 v_dist = (16 - fieldtx) >> (fieldtx == 0);
112− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
113− s->dest[0] - 16 * s->linesize - 16,
114− stride_y);
115− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
116− s->dest[0] - 16 * s->linesize - 8,
117− stride_y);
118− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
119− s->dest[0] - v_dist * s->linesize - 16,
120− stride_y);
121− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
122− s->dest[0] - v_dist * s->linesize - 8,
123− stride_y);
124− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
125− s->dest[1] - 8 * s->uvlinesize - 8,
126− s->uvlinesize);
127− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
128− s->dest[2] - 8 * s->uvlinesize - 8,
129− s->uvlinesize);
112+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
113+ s->dest[0] - 16 * s->linesize - 16,
114+ stride_y);
115+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
116+ s->dest[0] - 16 * s->linesize - 8,
117+ stride_y);
118+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
119+ s->dest[0] - v_dist * s->linesize - 16,
120+ stride_y);
121+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
122+ s->dest[0] - v_dist * s->linesize - 8,
123+ stride_y);
124+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
125+ s->dest[1] - 8 * s->uvlinesize - 8,
126+ s->uvlinesize);
127+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
128+ s->dest[2] - 8 * s->uvlinesize - 8,
129+ s->uvlinesize);
130130 }
131131 if (s->mb_x == s->mb_width - 1) {
132132 top_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x;
@@ -134,24 +134,24 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) · 1 unmodified line
134134 fieldtx = v->fieldtx_plane[top_mb_pos];
135135 stride_y = s->linesize << fieldtx;
136136 v_dist = fieldtx ? 15 : 8;
137− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
138− s->dest[0] - 16 * s->linesize,
139− stride_y);
140− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
141− s->dest[0] - 16 * s->linesize + 8,
142− stride_y);
143− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
144− s->dest[0] - v_dist * s->linesize,
145− stride_y);
146− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
147− s->dest[0] - v_dist * s->linesize + 8,
148− stride_y);
149− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
150− s->dest[1] - 8 * s->uvlinesize,
151− s->uvlinesize);
152− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
153− s->dest[2] - 8 * s->uvlinesize,
154− s->uvlinesize);
137+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
138+ s->dest[0] - 16 * s->linesize,
139+ stride_y);
140+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
141+ s->dest[0] - 16 * s->linesize + 8,
142+ stride_y);
143+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
144+ s->dest[0] - v_dist * s->linesize,
145+ stride_y);
146+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
147+ s->dest[0] - v_dist * s->linesize + 8,
148+ stride_y);
149+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
150+ s->dest[1] - 8 * s->uvlinesize,
151+ s->uvlinesize);
152+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
153+ s->dest[2] - 8 * s->uvlinesize,
154+ s->uvlinesize);
155155 }
156156 }
157157
@@ -3280,7 +3280,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, · 3122 unmodified lines
32803280 v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
32813281 else {
32823282 v->vc1dsp.vc1_inv_trans_8x8(block);
3283− s->dsp.add_pixels_clamped(block, dst, linesize);
3283+ s->idsp.add_pixels_clamped(block, dst, linesize);
32843284 }
32853285 }
32863286 break;
@@ -3611,7 +3611,10 @@ static int vc1_decode_p_mb(VC1Context *v) · 324 unmodified lines
36113611 if (v->rangeredfrm)
36123612 for (j = 0; j < 64; j++)
36133613 s->block[i][j] <<= 1;
3614− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3614+ s->idsp.put_signed_pixels_clamped(s->block[i],
3615+ s->dest[dst_idx] + off,
3616+ i & 4 ? s->uvlinesize
3617+ : s->linesize);
36153618 if (v->pq >= 9 && v->overlap) {
36163619 if (v->c_avail)
36173620 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
@@ -3719,8 +3722,10 @@ static int vc1_decode_p_mb(VC1Context *v) · 101 unmodified lines
37193722 if (v->rangeredfrm)
37203723 for (j = 0; j < 64; j++)
37213724 s->block[i][j] <<= 1;
3722− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off,
3723− (i & 4) ? s->uvlinesize : s->linesize);
3725+ s->idsp.put_signed_pixels_clamped(s->block[i],
3726+ s->dest[dst_idx] + off,
3727+ (i & 4) ? s->uvlinesize
3728+ : s->linesize);
37243729 if (v->pq >= 9 && v->overlap) {
37253730 if (v->c_avail)
37263731 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
@@ -3869,7 +3874,9 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) · 142 unmodified lines
38693874 stride_y = s->uvlinesize;
38703875 off = 0;
38713876 }
3872− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
3877+ s->idsp.put_signed_pixels_clamped(s->block[i],
3878+ s->dest[dst_idx] + off,
3879+ stride_y);
38733880 //TODO: loop filter
38743881 }
38753882
@@ -4031,7 +4038,10 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) · 155 unmodified lines
40314038 continue;
40324039 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
40334040 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4034− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4041+ s->idsp.put_signed_pixels_clamped(s->block[i],
4042+ s->dest[dst_idx] + off,
4043+ (i & 4) ? s->uvlinesize
4044+ : s->linesize);
40354045 // TODO: loop filter
40364046 }
40374047 } else {
@@ -4233,7 +4243,10 @@ static void vc1_decode_b_mb(VC1Context *v) · 195 unmodified lines
42334243 if (v->rangeredfrm)
42344244 for (j = 0; j < 64; j++)
42354245 s->block[i][j] <<= 1;
4236− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
4246+ s->idsp.put_signed_pixels_clamped(s->block[i],
4247+ s->dest[dst_idx] + off,
4248+ i & 4 ? s->uvlinesize
4249+ : s->linesize);
42374250 } else if (val) {
42384251 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
42394252 first_block, s->dest[dst_idx] + off,
@@ -4305,7 +4318,10 @@ static void vc1_decode_b_mb_intfi(VC1Context *v) · 65 unmodified lines
43054318 for (j = 0; j < 64; j++)
43064319 s->block[i][j] <<= 1;
43074320 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4308− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4321+ s->idsp.put_signed_pixels_clamped(s->block[i],
4322+ s->dest[dst_idx] + off,
4323+ (i & 4) ? s->uvlinesize
4324+ : s->linesize);
43094325 // TODO: yet to perform loop filter
43104326 }
43114327 } else {
@@ -4524,7 +4540,9 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) · 212 unmodified lines
45244540 stride_y = s->uvlinesize;
45254541 off = 0;
45264542 }
4527− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
4543+ s->idsp.put_signed_pixels_clamped(s->block[i],
4544+ s->dest[dst_idx] + off,
4545+ stride_y);
45284546 }
45294547 } else {
45304548 s->mb_intra = v->is_intra[s->mb_x] = 0;
@@ -4828,12 +4846,16 @@ static void vc1_decode_i_blocks(VC1Context *v) · 297 unmodified lines
48284846 if (v->rangeredfrm)
48294847 for (j = 0; j < 64; j++)
48304848 s->block[k][j] <<= 1;
4831− s->dsp.put_signed_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4849+ s->idsp.put_signed_pixels_clamped(s->block[k], dst[k],
4850+ k & 4 ? s->uvlinesize
4851+ : s->linesize);
48324852 } else {
48334853 if (v->rangeredfrm)
48344854 for (j = 0; j < 64; j++)
48354855 s->block[k][j] = (s->block[k][j] - 64) << 1;
4836− s->dsp.put_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4856+ s->idsp.put_pixels_clamped(s->block[k], dst[k],
4857+ k & 4 ? s->uvlinesize
4858+ : s->linesize);
48374859 }
48384860 }
48394861
libavcodec/wmv2.c+12−11
@@ -19,6 +19,7 @@ · 18 unmodified lines
1919 */
2020
2121 #include "avcodec.h"
22+#include "idctdsp.h"
2223 #include "mpegvideo.h"
2324 #include "msmpeg4data.h"
2425 #include "simple_idct.h"
@@ -30,24 +31,24 @@ av_cold void ff_wmv2_common_init(Wmv2Context * w){ · 5 unmodified lines
3031
3132 ff_blockdsp_init(&s->bdsp, s->avctx);
3233 ff_wmv2dsp_init(&w->wdsp);
33− s->dsp.idct_permutation_type = w->wdsp.idct_perm;
34− ff_init_scantable_permutation(s->dsp.idct_permutation,
34+ s->idsp.idct_permutation_type = w->wdsp.idct_perm;
35+ ff_init_scantable_permutation(s->idsp.idct_permutation,
3536 w->wdsp.idct_perm);
36− ff_init_scantable(s->dsp.idct_permutation, &w->abt_scantable[0],
37+ ff_init_scantable(s->idsp.idct_permutation, &w->abt_scantable[0],
3738 ff_wmv2_scantableA);
38− ff_init_scantable(s->dsp.idct_permutation, &w->abt_scantable[1],
39+ ff_init_scantable(s->idsp.idct_permutation, &w->abt_scantable[1],
3940 ff_wmv2_scantableB);
40− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable,
41+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable,
4142 ff_wmv1_scantable[1]);
42− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable,
43+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable,
4344 ff_wmv1_scantable[2]);
44− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable,
45+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable,
4546 ff_wmv1_scantable[3]);
46− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable,
47+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable,
4748 ff_wmv1_scantable[0]);
48− s->dsp.idct_put = w->wdsp.idct_put;
49− s->dsp.idct_add = w->wdsp.idct_add;
50− s->dsp.idct = NULL;
49+ s->idsp.idct_put = w->wdsp.idct_put;
50+ s->idsp.idct_add = w->wdsp.idct_add;
51+ s->idsp.idct = NULL;
5152 }
5253
5354 static void wmv2_add_block(Wmv2Context *w, int16_t *block1, uint8_t *dst, int stride, int n){
libavcodec/wmv2dsp.c+1−1
@@ -19,7 +19,7 @@ · 18 unmodified lines
1919 #include "libavutil/attributes.h"
2020 #include "libavutil/common.h"
2121 #include "avcodec.h"
22−#include "dsputil.h"
22+#include "idctdsp.h"
2323 #include "mathops.h"
2424 #include "wmv2dsp.h"
2525
libavcodec/x86/Makefile+6−4
@@ -18,6 +18,7 @@ OBJS-$(CONFIG_H264QPEL) += x86/h264_qpel.o · 17 unmodified lines
1818 OBJS-$(CONFIG_HPELDSP) += x86/hpeldsp_init.o
1919 OBJS-$(CONFIG_HUFFYUVDSP) += x86/huffyuvdsp_init.o
2020 OBJS-$(CONFIG_HUFFYUVENCDSP) += x86/huffyuvencdsp_mmx.o
21+OBJS-$(CONFIG_IDCTDSP) += x86/idctdsp_init.o
2122 OBJS-$(CONFIG_LPC) += x86/lpc.o
2223 OBJS-$(CONFIG_MPEGAUDIODSP) += x86/mpegaudiodsp.o
2324 OBJS-$(CONFIG_MPEGVIDEO) += x86/mpegvideo.o \
@@ -49,13 +50,14 @@ OBJS-$(CONFIG_VP9_DECODER) += x86/vp9dsp_init.o · 25 unmodified lines
4950
5051 MMX-OBJS-$(CONFIG_AUDIODSP) += x86/audiodsp_mmx.o
5152 MMX-OBJS-$(CONFIG_BLOCKDSP) += x86/blockdsp_mmx.o
52−MMX-OBJS-$(CONFIG_DSPUTIL) += x86/dsputil_mmx.o \
53− x86/idct_mmx_xvid.o \
54− x86/idct_sse2_xvid.o \
55− x86/simple_idct.o
53+MMX-OBJS-$(CONFIG_DSPUTIL) += x86/dsputil_mmx.o
5654 MMX-OBJS-$(CONFIG_HPELDSP) += x86/fpel_mmx.o \
5755 x86/hpeldsp_mmx.o
5856 MMX-OBJS-$(CONFIG_HUFFYUVDSP) += x86/huffyuvdsp_mmx.o
57+MMX-OBJS-$(CONFIG_IDCTDSP) += x86/idctdsp_mmx.o \
58+ x86/idct_mmx_xvid.o \
59+ x86/idct_sse2_xvid.o \
60+ x86/simple_idct.o
5961 MMX-OBJS-$(CONFIG_QPELDSP) += x86/fpel_mmx.o
6062
6163 MMX-OBJS-$(CONFIG_SVQ1_ENCODER) += x86/svq1enc_mmx.o
libavcodec/x86/cavsdsp.c+2−1
@@ -28,9 +28,10 @@ · 27 unmodified lines
2828 #include "libavutil/x86/asm.h"
2929 #include "libavutil/x86/cpu.h"
3030 #include "libavcodec/cavsdsp.h"
31+#include "libavcodec/idctdsp.h"
3132 #include "constants.h"
32−#include "dsputil_x86.h"
3333 #include "fpel.h"
34+#include "idctdsp.h"
3435 #include "config.h"
3536
3637 #if HAVE_MMX_INLINE
libavcodec/x86/dsputil_init.c+0−85
@@ -22,97 +22,18 @@ · 21 unmodified lines
2222 #include "libavutil/x86/cpu.h"
2323 #include "libavcodec/avcodec.h"
2424 #include "libavcodec/dsputil.h"
25−#include "libavcodec/simple_idct.h"
2625 #include "dsputil_x86.h"
27−#include "idct_xvid.h"
28−
29−/* Input permutation for the simple_idct_mmx */
30−static const uint8_t simple_mmx_permutation[64] = {
31− 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
32− 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
33− 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
34− 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
35− 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
36− 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
37− 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
38− 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
39−};
40−
41−static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 };
42−
43−av_cold int ff_init_scantable_permutation_x86(uint8_t *idct_permutation,
44− int idct_permutation_type)
45−{
46− int i;
47−
48− switch (idct_permutation_type) {
49− case FF_SIMPLE_IDCT_PERM:
50− for (i = 0; i < 64; i++)
51− idct_permutation[i] = simple_mmx_permutation[i];
52− return 1;
53− case FF_SSE2_IDCT_PERM:
54− for (i = 0; i < 64; i++)
55− idct_permutation[i] = (i & 0x38) | idct_sse2_row_perm[i & 7];
56− return 1;
57− }
58−
59− return 0;
60−}
6126
6227 static av_cold void dsputil_init_mmx(DSPContext *c, AVCodecContext *avctx,
6328 int cpu_flags, unsigned high_bit_depth)
6429 {
6530 #if HAVE_MMX_INLINE
66− c->put_pixels_clamped = ff_put_pixels_clamped_mmx;
67− c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmx;
68− c->add_pixels_clamped = ff_add_pixels_clamped_mmx;
69−
7031 if (!high_bit_depth) {
7132 c->draw_edges = ff_draw_edges_mmx;
72−
73− switch (avctx->idct_algo) {
74− case FF_IDCT_AUTO:
75− case FF_IDCT_SIMPLEMMX:
76− c->idct_put = ff_simple_idct_put_mmx;
77− c->idct_add = ff_simple_idct_add_mmx;
78− c->idct = ff_simple_idct_mmx;
79− c->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
80− break;
81− case FF_IDCT_XVIDMMX:
82− c->idct_put = ff_idct_xvid_mmx_put;
83− c->idct_add = ff_idct_xvid_mmx_add;
84− c->idct = ff_idct_xvid_mmx;
85− break;
86− }
8733 }
8834 #endif /* HAVE_MMX_INLINE */
8935 }
9036
91−static av_cold void dsputil_init_mmxext(DSPContext *c, AVCodecContext *avctx,
92− int cpu_flags, unsigned high_bit_depth)
93−{
94−#if HAVE_MMXEXT_INLINE
95− if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX) {
96− c->idct_put = ff_idct_xvid_mmxext_put;
97− c->idct_add = ff_idct_xvid_mmxext_add;
98− c->idct = ff_idct_xvid_mmxext;
99− }
100−#endif /* HAVE_MMXEXT_INLINE */
101−}
102−
103−static av_cold void dsputil_init_sse2(DSPContext *c, AVCodecContext *avctx,
104− int cpu_flags, unsigned high_bit_depth)
105−{
106−#if HAVE_SSE2_INLINE
107− if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX) {
108− c->idct_put = ff_idct_xvid_sse2_put;
109− c->idct_add = ff_idct_xvid_sse2_add;
110− c->idct = ff_idct_xvid_sse2;
111− c->idct_permutation_type = FF_SSE2_IDCT_PERM;
112− }
113−#endif /* HAVE_SSE2_INLINE */
114−}
115−
11637 av_cold void ff_dsputil_init_x86(DSPContext *c, AVCodecContext *avctx,
11738 unsigned high_bit_depth)
11839 {
@@ -121,12 +42,6 @@ av_cold void ff_dsputil_init_x86(DSPContext *c, AVCodecContext *avctx, · 2 unmodified lines
12142 if (X86_MMX(cpu_flags))
12243 dsputil_init_mmx(c, avctx, cpu_flags, high_bit_depth);
12344
124− if (X86_MMXEXT(cpu_flags))
125− dsputil_init_mmxext(c, avctx, cpu_flags, high_bit_depth);
126−
127− if (X86_SSE2(cpu_flags))
128− dsputil_init_sse2(c, avctx, cpu_flags, high_bit_depth);
129−
13045 if (CONFIG_ENCODERS)
13146 ff_dsputilenc_init_mmx(c, avctx, high_bit_depth);
13247 }
libavcodec/x86/dsputil_mmx.c+0−135
@@ -30,141 +30,6 @@ · 29 unmodified lines
3030
3131 #if HAVE_INLINE_ASM
3232
33−void ff_put_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
34− int line_size)
35−{
36− const int16_t *p;
37− uint8_t *pix;
38−
39− /* read the pixels */
40− p = block;
41− pix = pixels;
42− /* unrolled loop */
43− __asm__ volatile (
44− "movq (%3), %%mm0 \n\t"
45− "movq 8(%3), %%mm1 \n\t"
46− "movq 16(%3), %%mm2 \n\t"
47− "movq 24(%3), %%mm3 \n\t"
48− "movq 32(%3), %%mm4 \n\t"
49− "movq 40(%3), %%mm5 \n\t"
50− "movq 48(%3), %%mm6 \n\t"
51− "movq 56(%3), %%mm7 \n\t"
52− "packuswb %%mm1, %%mm0 \n\t"
53− "packuswb %%mm3, %%mm2 \n\t"
54− "packuswb %%mm5, %%mm4 \n\t"
55− "packuswb %%mm7, %%mm6 \n\t"
56− "movq %%mm0, (%0) \n\t"
57− "movq %%mm2, (%0, %1) \n\t"
58− "movq %%mm4, (%0, %1, 2) \n\t"
59− "movq %%mm6, (%0, %2) \n\t"
60− :: "r" (pix), "r" ((x86_reg) line_size), "r" ((x86_reg) line_size * 3),
61− "r" (p)
62− : "memory");
63− pix += line_size * 4;
64− p += 32;
65−
66− // if here would be an exact copy of the code above
67− // compiler would generate some very strange code
68− // thus using "r"
69− __asm__ volatile (
70− "movq (%3), %%mm0 \n\t"
71− "movq 8(%3), %%mm1 \n\t"
72− "movq 16(%3), %%mm2 \n\t"
73− "movq 24(%3), %%mm3 \n\t"
74− "movq 32(%3), %%mm4 \n\t"
75− "movq 40(%3), %%mm5 \n\t"
76− "movq 48(%3), %%mm6 \n\t"
77− "movq 56(%3), %%mm7 \n\t"
78− "packuswb %%mm1, %%mm0 \n\t"
79− "packuswb %%mm3, %%mm2 \n\t"
80− "packuswb %%mm5, %%mm4 \n\t"
81− "packuswb %%mm7, %%mm6 \n\t"
82− "movq %%mm0, (%0) \n\t"
83− "movq %%mm2, (%0, %1) \n\t"
84− "movq %%mm4, (%0, %1, 2) \n\t"
85− "movq %%mm6, (%0, %2) \n\t"
86− :: "r" (pix), "r" ((x86_reg) line_size), "r" ((x86_reg) line_size * 3),
87− "r" (p)
88− : "memory");
89−}
90−
91−#define put_signed_pixels_clamped_mmx_half(off) \
92− "movq "#off"(%2), %%mm1 \n\t" \
93− "movq 16 + "#off"(%2), %%mm2 \n\t" \
94− "movq 32 + "#off"(%2), %%mm3 \n\t" \
95− "movq 48 + "#off"(%2), %%mm4 \n\t" \
96− "packsswb 8 + "#off"(%2), %%mm1 \n\t" \
97− "packsswb 24 + "#off"(%2), %%mm2 \n\t" \
98− "packsswb 40 + "#off"(%2), %%mm3 \n\t" \
99− "packsswb 56 + "#off"(%2), %%mm4 \n\t" \
100− "paddb %%mm0, %%mm1 \n\t" \
101− "paddb %%mm0, %%mm2 \n\t" \
102− "paddb %%mm0, %%mm3 \n\t" \
103− "paddb %%mm0, %%mm4 \n\t" \
104− "movq %%mm1, (%0) \n\t" \
105− "movq %%mm2, (%0, %3) \n\t" \
106− "movq %%mm3, (%0, %3, 2) \n\t" \
107− "movq %%mm4, (%0, %1) \n\t"
108−
109−void ff_put_signed_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
110− int line_size)
111−{
112− x86_reg line_skip = line_size;
113− x86_reg line_skip3;
114−
115− __asm__ volatile (
116− "movq "MANGLE(ff_pb_80)", %%mm0 \n\t"
117− "lea (%3, %3, 2), %1 \n\t"
118− put_signed_pixels_clamped_mmx_half(0)
119− "lea (%0, %3, 4), %0 \n\t"
120− put_signed_pixels_clamped_mmx_half(64)
121− : "+&r" (pixels), "=&r" (line_skip3)
122− : "r" (block), "r" (line_skip)
123− : "memory");
124−}
125−
126−void ff_add_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
127− int line_size)
128−{
129− const int16_t *p;
130− uint8_t *pix;
131− int i;
132−
133− /* read the pixels */
134− p = block;
135− pix = pixels;
136− MOVQ_ZERO(mm7);
137− i = 4;
138− do {
139− __asm__ volatile (
140− "movq (%2), %%mm0 \n\t"
141− "movq 8(%2), %%mm1 \n\t"
142− "movq 16(%2), %%mm2 \n\t"
143− "movq 24(%2), %%mm3 \n\t"
144− "movq %0, %%mm4 \n\t"
145− "movq %1, %%mm6 \n\t"
146− "movq %%mm4, %%mm5 \n\t"
147− "punpcklbw %%mm7, %%mm4 \n\t"
148− "punpckhbw %%mm7, %%mm5 \n\t"
149− "paddsw %%mm4, %%mm0 \n\t"
150− "paddsw %%mm5, %%mm1 \n\t"
151− "movq %%mm6, %%mm5 \n\t"
152− "punpcklbw %%mm7, %%mm6 \n\t"
153− "punpckhbw %%mm7, %%mm5 \n\t"
154− "paddsw %%mm6, %%mm2 \n\t"
155− "paddsw %%mm5, %%mm3 \n\t"
156− "packuswb %%mm1, %%mm0 \n\t"
157− "packuswb %%mm3, %%mm2 \n\t"
158− "movq %%mm0, %0 \n\t"
159− "movq %%mm2, %1 \n\t"
160− : "+m" (*pix), "+m" (*(pix + line_size))
161− : "r" (p)
162− : "memory");
163− pix += line_size * 2;
164− p += 16;
165− } while (--i);
166−}
167−
16833 /* Draw the edges of width 'w' of an image of size width, height
16934 * this MMX version can only handle w == 8 || w == 16. */
17035 void ff_draw_edges_mmx(uint8_t *buf, int wrap, int width, int height,
libavcodec/x86/dsputil_x86.h+0−7
@@ -31,13 +31,6 @@ void ff_dsputilenc_init_mmx(DSPContext *c, AVCodecContext *avctx, · 30 unmodified lines
3131 unsigned high_bit_depth);
3232 void ff_dsputil_init_pix_mmx(DSPContext *c, AVCodecContext *avctx);
3333
34−void ff_add_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
35− int line_size);
36−void ff_put_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
37− int line_size);
38−void ff_put_signed_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
39− int line_size);
40−
4134 void ff_draw_edges_mmx(uint8_t *buf, int wrap, int width, int height,
4235 int w, int h, int sides);
4336
libavcodec/x86/idct_mmx_xvid.c+1−1
@@ -44,8 +44,8 @@ · 43 unmodified lines
4444 #include "config.h"
4545 #include "libavcodec/avcodec.h"
4646 #include "libavutil/mem.h"
47−#include "dsputil_x86.h"
4847 #include "idct_xvid.h"
48+#include "idctdsp.h"
4949
5050 #if HAVE_MMX_INLINE
5151
libavcodec/x86/idct_sse2_xvid.c+1−1
@@ -42,7 +42,7 @@ · 41 unmodified lines
4242 #include "libavutil/mem.h"
4343 #include "libavutil/x86/asm.h"
4444 #include "idct_xvid.h"
45−#include "dsputil_x86.h"
45+#include "idctdsp.h"
4646
4747 #if HAVE_SSE2_INLINE
4848
libavcodec/x86/idctdsp.h+31−0
@@ -0,0 +1,31 @@
1+/*
2+ * This file is part of Libav.
3+ *
4+ * Libav is free software; you can redistribute it and/or
5+ * modify it under the terms of the GNU Lesser General Public
6+ * License as published by the Free Software Foundation; either
7+ * version 2.1 of the License, or (at your option) any later version.
8+ *
9+ * Libav is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+ * Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public
15+ * License along with Libav; if not, write to the Free Software
16+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17+ */
18+
19+#ifndef AVCODEC_X86_IDCTDSP_H
20+#define AVCODEC_X86_IDCTDSP_H
21+
22+#include <stdint.h>
23+
24+void ff_add_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
25+ int line_size);
26+void ff_put_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
27+ int line_size);
28+void ff_put_signed_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
29+ int line_size);
30+
31+#endif /* AVCODEC_X86_IDCTDSP_H */
libavcodec/x86/idctdsp_init.c+106−0
@@ -0,0 +1,106 @@
1+/*
2+ * This file is part of Libav.
3+ *
4+ * Libav is free software; you can redistribute it and/or
5+ * modify it under the terms of the GNU Lesser General Public
6+ * License as published by the Free Software Foundation; either
7+ * version 2.1 of the License, or (at your option) any later version.
8+ *
9+ * Libav is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+ * Lesser General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU Lesser General Public
15+ * License along with Libav; if not, write to the Free Software
16+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17+ */
18+
19+#include "config.h"
20+#include "libavutil/attributes.h"
21+#include "libavutil/cpu.h"
22+#include "libavutil/x86/cpu.h"
23+#include "libavcodec/avcodec.h"
24+#include "libavcodec/idctdsp.h"
25+#include "libavcodec/simple_idct.h"
26+#include "idct_xvid.h"
27+#include "idctdsp.h"
28+
29+/* Input permutation for the simple_idct_mmx */
30+static const uint8_t simple_mmx_permutation[64] = {
31+ 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
32+ 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
33+ 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
34+ 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
35+ 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
36+ 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
37+ 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
38+ 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
39+};
40+
41+static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 };
42+
43+av_cold int ff_init_scantable_permutation_x86(uint8_t *idct_permutation,
44+ int idct_permutation_type)
45+{
46+ int i;
47+
48+ switch (idct_permutation_type) {
49+ case FF_SIMPLE_IDCT_PERM:
50+ for (i = 0; i < 64; i++)
51+ idct_permutation[i] = simple_mmx_permutation[i];
52+ return 1;
53+ case FF_SSE2_IDCT_PERM:
54+ for (i = 0; i < 64; i++)
55+ idct_permutation[i] = (i & 0x38) | idct_sse2_row_perm[i & 7];
56+ return 1;
57+ }
58+
59+ return 0;
60+}
61+
62+av_cold void ff_idctdsp_init_x86(IDCTDSPContext *c, AVCodecContext *avctx,
63+ unsigned high_bit_depth)
64+{
65+ int cpu_flags = av_get_cpu_flags();
66+
67+ if (INLINE_MMX(cpu_flags)) {
68+ c->put_pixels_clamped = ff_put_pixels_clamped_mmx;
69+ c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmx;
70+ c->add_pixels_clamped = ff_add_pixels_clamped_mmx;
71+
72+ if (!high_bit_depth) {
73+ switch (avctx->idct_algo) {
74+ case FF_IDCT_AUTO:
75+ case FF_IDCT_SIMPLEMMX:
76+ c->idct_put = ff_simple_idct_put_mmx;
77+ c->idct_add = ff_simple_idct_add_mmx;
78+ c->idct = ff_simple_idct_mmx;
79+ c->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
80+ break;
81+ case FF_IDCT_XVIDMMX:
82+ c->idct_put = ff_idct_xvid_mmx_put;
83+ c->idct_add = ff_idct_xvid_mmx_add;
84+ c->idct = ff_idct_xvid_mmx;
85+ break;
86+ }
87+ }
88+ }
89+
90+ if (INLINE_MMXEXT(cpu_flags)) {
91+ if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX) {
92+ c->idct_put = ff_idct_xvid_mmxext_put;
93+ c->idct_add = ff_idct_xvid_mmxext_add;
94+ c->idct = ff_idct_xvid_mmxext;
95+ }
96+ }
97+
98+ if (INLINE_SSE2(cpu_flags)) {
99+ if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX) {
100+ c->idct_put = ff_idct_xvid_sse2_put;
101+ c->idct_add = ff_idct_xvid_sse2_add;
102+ c->idct = ff_idct_xvid_sse2;
103+ c->idct_permutation_type = FF_SSE2_IDCT_PERM;
104+ }
105+ }
106+}
libavcodec/x86/idctdsp_mmx.c+168−0
@@ -0,0 +1,168 @@
1+/*
2+ * SIMD-optimized IDCT-related routines
3+ * Copyright (c) 2000, 2001 Fabrice Bellard
4+ * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5+ *
6+ * MMX optimization by Nick Kurshev <nickols_k@mail.ru>
7+ *
8+ * This file is part of Libav.
9+ *
10+ * Libav is free software; you can redistribute it and/or
11+ * modify it under the terms of the GNU Lesser General Public
12+ * License as published by the Free Software Foundation; either
13+ * version 2.1 of the License, or (at your option) any later version.
14+ *
15+ * Libav is distributed in the hope that it will be useful,
16+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18+ * Lesser General Public License for more details.
19+ *
20+ * You should have received a copy of the GNU Lesser General Public
21+ * License along with Libav; if not, write to the Free Software
22+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23+ */
24+
25+#include "config.h"
26+#include "libavutil/cpu.h"
27+#include "libavutil/x86/asm.h"
28+#include "idctdsp.h"
29+#include "inline_asm.h"
30+
31+#if HAVE_INLINE_ASM
32+
33+void ff_put_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
34+ int line_size)
35+{
36+ const int16_t *p;
37+ uint8_t *pix;
38+
39+ /* read the pixels */
40+ p = block;
41+ pix = pixels;
42+ /* unrolled loop */
43+ __asm__ volatile (
44+ "movq (%3), %%mm0 \n\t"
45+ "movq 8(%3), %%mm1 \n\t"
46+ "movq 16(%3), %%mm2 \n\t"
47+ "movq 24(%3), %%mm3 \n\t"
48+ "movq 32(%3), %%mm4 \n\t"
49+ "movq 40(%3), %%mm5 \n\t"
50+ "movq 48(%3), %%mm6 \n\t"
51+ "movq 56(%3), %%mm7 \n\t"
52+ "packuswb %%mm1, %%mm0 \n\t"
53+ "packuswb %%mm3, %%mm2 \n\t"
54+ "packuswb %%mm5, %%mm4 \n\t"
55+ "packuswb %%mm7, %%mm6 \n\t"
56+ "movq %%mm0, (%0) \n\t"
57+ "movq %%mm2, (%0, %1) \n\t"
58+ "movq %%mm4, (%0, %1, 2) \n\t"
59+ "movq %%mm6, (%0, %2) \n\t"
60+ :: "r" (pix), "r" ((x86_reg) line_size), "r" ((x86_reg) line_size * 3),
61+ "r" (p)
62+ : "memory");
63+ pix += line_size * 4;
64+ p += 32;
65+
66+ // if here would be an exact copy of the code above
67+ // compiler would generate some very strange code
68+ // thus using "r"
69+ __asm__ volatile (
70+ "movq (%3), %%mm0 \n\t"
71+ "movq 8(%3), %%mm1 \n\t"
72+ "movq 16(%3), %%mm2 \n\t"
73+ "movq 24(%3), %%mm3 \n\t"
74+ "movq 32(%3), %%mm4 \n\t"
75+ "movq 40(%3), %%mm5 \n\t"
76+ "movq 48(%3), %%mm6 \n\t"
77+ "movq 56(%3), %%mm7 \n\t"
78+ "packuswb %%mm1, %%mm0 \n\t"
79+ "packuswb %%mm3, %%mm2 \n\t"
80+ "packuswb %%mm5, %%mm4 \n\t"
81+ "packuswb %%mm7, %%mm6 \n\t"
82+ "movq %%mm0, (%0) \n\t"
83+ "movq %%mm2, (%0, %1) \n\t"
84+ "movq %%mm4, (%0, %1, 2) \n\t"
85+ "movq %%mm6, (%0, %2) \n\t"
86+ :: "r" (pix), "r" ((x86_reg) line_size), "r" ((x86_reg) line_size * 3),
87+ "r" (p)
88+ : "memory");
89+}
90+
91+#define put_signed_pixels_clamped_mmx_half(off) \
92+ "movq "#off"(%2), %%mm1 \n\t" \
93+ "movq 16 + "#off"(%2), %%mm2 \n\t" \
94+ "movq 32 + "#off"(%2), %%mm3 \n\t" \
95+ "movq 48 + "#off"(%2), %%mm4 \n\t" \
96+ "packsswb 8 + "#off"(%2), %%mm1 \n\t" \
97+ "packsswb 24 + "#off"(%2), %%mm2 \n\t" \
98+ "packsswb 40 + "#off"(%2), %%mm3 \n\t" \
99+ "packsswb 56 + "#off"(%2), %%mm4 \n\t" \
100+ "paddb %%mm0, %%mm1 \n\t" \
101+ "paddb %%mm0, %%mm2 \n\t" \
102+ "paddb %%mm0, %%mm3 \n\t" \
103+ "paddb %%mm0, %%mm4 \n\t" \
104+ "movq %%mm1, (%0) \n\t" \
105+ "movq %%mm2, (%0, %3) \n\t" \
106+ "movq %%mm3, (%0, %3, 2) \n\t" \
107+ "movq %%mm4, (%0, %1) \n\t"
108+
109+void ff_put_signed_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
110+ int line_size)
111+{
112+ x86_reg line_skip = line_size;
113+ x86_reg line_skip3;
114+
115+ __asm__ volatile (
116+ "movq "MANGLE(ff_pb_80)", %%mm0 \n\t"
117+ "lea (%3, %3, 2), %1 \n\t"
118+ put_signed_pixels_clamped_mmx_half(0)
119+ "lea (%0, %3, 4), %0 \n\t"
120+ put_signed_pixels_clamped_mmx_half(64)
121+ : "+&r" (pixels), "=&r" (line_skip3)
122+ : "r" (block), "r" (line_skip)
123+ : "memory");
124+}
125+
126+void ff_add_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
127+ int line_size)
128+{
129+ const int16_t *p;
130+ uint8_t *pix;
131+ int i;
132+
133+ /* read the pixels */
134+ p = block;
135+ pix = pixels;
136+ MOVQ_ZERO(mm7);
137+ i = 4;
138+ do {
139+ __asm__ volatile (
140+ "movq (%2), %%mm0 \n\t"
141+ "movq 8(%2), %%mm1 \n\t"
142+ "movq 16(%2), %%mm2 \n\t"
143+ "movq 24(%2), %%mm3 \n\t"
144+ "movq %0, %%mm4 \n\t"
145+ "movq %1, %%mm6 \n\t"
146+ "movq %%mm4, %%mm5 \n\t"
147+ "punpcklbw %%mm7, %%mm4 \n\t"
148+ "punpckhbw %%mm7, %%mm5 \n\t"
149+ "paddsw %%mm4, %%mm0 \n\t"
150+ "paddsw %%mm5, %%mm1 \n\t"
151+ "movq %%mm6, %%mm5 \n\t"
152+ "punpcklbw %%mm7, %%mm6 \n\t"
153+ "punpckhbw %%mm7, %%mm5 \n\t"
154+ "paddsw %%mm6, %%mm2 \n\t"
155+ "paddsw %%mm5, %%mm3 \n\t"
156+ "packuswb %%mm1, %%mm0 \n\t"
157+ "packuswb %%mm3, %%mm2 \n\t"
158+ "movq %%mm0, %0 \n\t"
159+ "movq %%mm2, %1 \n\t"
160+ : "+m" (*pix), "+m" (*(pix + line_size))
161+ : "r" (p)
162+ : "memory");
163+ pix += line_size * 2;
164+ p += 16;
165+ } while (--i);
166+}
167+
168+#endif /* HAVE_INLINE_ASM */
libavcodec/x86/mpegvideoenc_template.c+1−1
@@ -229,7 +229,7 @@ static int RENAME(dct_quantize)(MpegEncContext *s, · 228 unmodified lines
229229 if(s->mb_intra) block[0]= level;
230230 else block[0]= temp_block[0];
231231
232− if(s->dsp.idct_permutation_type == FF_SIMPLE_IDCT_PERM){
232+ if (s->idsp.idct_permutation_type == FF_SIMPLE_IDCT_PERM) {
233233 if(last_non_zero_p1 <= 1) goto end;
234234 block[0x08] = temp_block[0x01]; block[0x10] = temp_block[0x08];
235235 block[0x20] = temp_block[0x10];
libavcodec/x86/proresdsp_init.c+1−1
@@ -22,7 +22,7 @@ · 21 unmodified lines
2222
2323 #include "libavutil/attributes.h"
2424 #include "libavutil/x86/cpu.h"
25−#include "libavcodec/dsputil.h"
25+#include "libavcodec/idctdsp.h"
2626 #include "libavcodec/proresdsp.h"
2727
2828 void ff_prores_idct_put_10_sse2(uint16_t *dst, int linesize,
libavcodec/x86/simple_idct.c+1−1
@@ -23,7 +23,7 @@ · 22 unmodified lines
2323 #include "libavutil/internal.h"
2424 #include "libavutil/mem.h"
2525 #include "libavutil/x86/asm.h"
26−#include "dsputil_x86.h"
26+#include "idctdsp.h"
2727
2828 #if HAVE_INLINE_ASM
2929

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t