History

Merge commit 'e3fcb14347466095839c2a3c47ebecff02da891e'

* commit 'e3fcb14347466095839c2a3c47ebecff02da891e': dsputil: Split off IDCT bits into their own context Conflicts: configure libavcodec/aic.c libavcodec/arm/Makefile libavcodec/arm/dsputil_init_arm.c libavcodec/arm/dsputil_init_armv6.c libavcodec/asvdec.c libavcodec/dnxhdenc.c libavcodec/dsputil.c libavcodec/dvdec.c libavcodec/dxva2_mpeg2.c libavcodec/intrax8.c libavcodec/mdec.c libavcodec/mjpegdec.c libavcodec/mjpegenc_common.h libavcodec/mpegvideo.c libavcodec/ppc/dsputil_altivec.h libavcodec/ppc/dsputil_ppc.c libavcodec/ppc/idctdsp.c libavcodec/x86/Makefile libavcodec/x86/dsputil_init.c libavcodec/x86/dsputil_mmx.c libavcodec/x86/dsputil_x86.h

Michael Niedermayer committed 12 years ago

Commit 581b5f02 parents 909f53f e3fcb1484 files · +1332 −996Browse files

Unified · Split

84 files
  1. configure +20 −18
  2. doc/optimization.txt +0 −3
  3. libavcodec/Makefile +3 −2
  4. libavcodec/aic.c +12 −13
  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 −276
  28. libavcodec/dsputil.h +0 −66
  29. libavcodec/dvdec.c +7 −6
  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 +311 −0
  37. libavcodec/idctdsp.h +104 −0
  38. libavcodec/intrax8.c +4 −3
  39. libavcodec/libavcodec.v +1 −0
  40. libavcodec/ljpegenc.c +5 −4
  41. libavcodec/mdec.c +11 −9
  42. libavcodec/mimic.c +5 −5
  43. libavcodec/mjpegdec.c +6 −4
  44. libavcodec/mjpegdec.h +2 −2
  45. libavcodec/mjpegenc_common.c +1 −1
  46. libavcodec/mjpegenc_common.h +1 −1
  47. libavcodec/mpeg12dec.c +15 −15
  48. libavcodec/mpeg4videodec.c +20 −19
  49. libavcodec/mpeg4videoenc.c +14 −14
  50. libavcodec/mpegvideo.c +27 −25
  51. libavcodec/mpegvideo.h +2 −0
  52. libavcodec/mpegvideo_enc.c +12 −10
  53. libavcodec/mpegvideo_xvmc.c +1 −1
  54. libavcodec/msmpeg4.c +5 −5
  55. libavcodec/nuv.c +1 −0
  56. libavcodec/ppc/Makefile +1 −1
  57. libavcodec/ppc/dsputil_altivec.h +0 −4
  58. libavcodec/ppc/dsputil_ppc.c +0 −9
  59. libavcodec/ppc/idctdsp.c +29 −4
  60. libavcodec/proresdec2.c +1 −0
  61. libavcodec/proresdec_lgpl.c +1 −1
  62. libavcodec/proresdsp.c +1 −1
  63. libavcodec/rtjpeg.c +4 −4
  64. libavcodec/rtjpeg.h +3 −2
  65. libavcodec/vaapi_mpeg2.c +1 −1
  66. libavcodec/vaapi_mpeg4.c +1 −1
  67. libavcodec/vc1dec.c +69 −47
  68. libavcodec/wmv2.c +12 −11
  69. libavcodec/wmv2dsp.c +1 −1
  70. libavcodec/x86/Makefile +5 −3
  71. libavcodec/x86/cavsdsp.c +2 −1
  72. libavcodec/x86/dsputil_init.c +0 −95
  73. libavcodec/x86/dsputil_mmx.c +0 −100
  74. libavcodec/x86/dsputil_x86.h +0 −9
  75. libavcodec/x86/idct_mmx_xvid.c +1 −1
  76. libavcodec/x86/idct_sse2_xvid.c +1 −1
  77. libavcodec/x86/idctdsp.h +33 −0
  78. libavcodec/x86/idctdsp_init.c +112 −0
  79. libavcodec/x86/idctdsp_mmx.c +133 −0
  80. libavcodec/x86/mpegvideoenc_template.c +2 −2
  81. libavcodec/x86/proresdsp_init.c +1 −1
  82. libavcodec/x86/simple_idct.c +1 −1
  83. libavfilter/vf_spp.c +3 −2
  84. libavfilter/vf_spp.h +2 −0
configure+20−18
@@ -1814,6 +1814,7 @@ CONFIG_EXTRA=" · 1813 unmodified lines
18141814 huffman
18151815 huffyuvdsp
18161816 huffyuvencdsp
1817+ idctdsp
18171818 intrax8
18181819 lgplv3
18191820 llauddsp
@@ -1992,6 +1993,7 @@ threads_if_any="$THREADS_LIST" · 172 unmodified lines
19921993
19931994 # subsystems
19941995 dct_select="rdft"
1996+dsputil_select="idctdsp"
19951997 error_resilience_select="dsputil"
19961998 frame_thread_encoder_deps="encoders threads"
19971999 intrax8_select="error_resilience"
@@ -2000,7 +2002,7 @@ rdft_select="fft" · 2 unmodified lines
20002002 mpeg_er_select="error_resilience"
20012003 mpegaudio_select="mpegaudiodsp"
20022004 mpegaudiodsp_select="dct"
2003−mpegvideo_select="blockdsp dsputil h264chroma hpeldsp videodsp"
2005+mpegvideo_select="blockdsp dsputil h264chroma hpeldsp idctdsp videodsp"
20042006 mpegvideoenc_select="dsputil mpegvideo qpeldsp"
20052007
20062008 # decoders / encoders
@@ -2011,7 +2013,7 @@ ac3_decoder_select="ac3_parser ac3dsp bswapdsp mdct" · 4 unmodified lines
20112013 ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
20122014 ac3_encoder_select="ac3dsp audiodsp dsputil mdct"
20132015 ac3_fixed_encoder_select="ac3dsp audiodsp dsputil mdct"
2014−aic_decoder_select="dsputil golomb"
2016+aic_decoder_select="golomb idctdsp"
20152017 alac_encoder_select="lpc"
20162018 als_decoder_select="bswapdsp"
20172019 amrnb_decoder_select="lsp"
@@ -2019,9 +2021,9 @@ amrwb_decoder_select="lsp" · 1 unmodified line
20192021 amv_decoder_select="sp5x_decoder exif"
20202022 amv_encoder_select="aandcttables"
20212023 ape_decoder_select="bswapdsp llauddsp"
2022−asv1_decoder_select="blockdsp bswapdsp dsputil"
2024+asv1_decoder_select="blockdsp bswapdsp idctdsp"
20232025 asv1_encoder_select="bswapdsp dsputil"
2024−asv2_decoder_select="blockdsp bswapdsp dsputil"
2026+asv2_decoder_select="blockdsp bswapdsp idctdsp"
20252027 asv2_encoder_select="bswapdsp dsputil"
20262028 atrac1_decoder_select="mdct sinewin"
20272029 atrac3_decoder_select="mdct"
@@ -2030,7 +2032,7 @@ avrn_decoder_select="exif" · 2 unmodified lines
20302032 bink_decoder_select="blockdsp hpeldsp"
20312033 binkaudio_dct_decoder_select="mdct rdft dct sinewin"
20322034 binkaudio_rdft_decoder_select="mdct rdft sinewin"
2033−cavs_decoder_select="blockdsp dsputil golomb h264chroma qpeldsp videodsp"
2035+cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
20342036 cllc_decoder_select="bswapdsp"
20352037 comfortnoise_encoder_select="lpc"
20362038 cook_decoder_select="audiodsp mdct sinewin"
@@ -2038,16 +2040,16 @@ cscd_decoder_select="lzo" · 1 unmodified line
20382040 cscd_decoder_suggest="zlib"
20392041 dca_decoder_select="mdct"
20402042 dirac_decoder_select="dsputil dwt golomb videodsp"
2041−dnxhd_decoder_select="blockdsp dsputil"
2042−dnxhd_encoder_select="aandcttables blockdsp dsputil mpegvideoenc"
2043−dvvideo_decoder_select="dsputil"
2043+dnxhd_decoder_select="blockdsp idctdsp"
2044+dnxhd_encoder_select="aandcttables blockdsp dsputil idctdsp mpegvideoenc"
2045+dvvideo_decoder_select="idctdsp"
20442046 dvvideo_encoder_select="dsputil"
20452047 dxa_decoder_select="zlib"
20462048 eac3_decoder_select="ac3_decoder"
20472049 eac3_encoder_select="ac3_encoder"
2048−eamad_decoder_select="aandcttables blockdsp bswapdsp dsputil mpegvideo"
2050+eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
20492051 eatgq_decoder_select="aandcttables"
2050−eatqi_decoder_select="aandcttables blockdsp bswapdsp dsputil mpeg1video_decoder"
2052+eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpeg1video_decoder"
20512053 exr_decoder_select="zlib"
20522054 ffv1_decoder_select="golomb rangecoder"
20532055 ffv1_encoder_select="rangecoder"
@@ -2064,7 +2066,7 @@ flv_decoder_select="h263_decoder" · 10 unmodified lines
20642066 flv_encoder_select="h263_encoder"
20652067 fourxm_decoder_select="blockdsp bswapdsp"
20662068 fraps_decoder_select="bswapdsp huffman"
2067−g2m_decoder_select="blockdsp dsputil zlib"
2069+g2m_decoder_select="blockdsp idctdsp zlib"
20682070 g729_decoder_select="audiodsp"
20692071 h261_decoder_select="mpeg_er mpegvideo"
20702072 h261_encoder_select="aandcttables mpegvideoenc"
@@ -2085,12 +2087,12 @@ jpegls_decoder_select="golomb mjpeg_decoder" · 14 unmodified lines
20852087 jpegls_encoder_select="golomb"
20862088 jv_decoder_select="blockdsp"
20872089 lagarith_decoder_select="huffyuvdsp"
2088−ljpeg_encoder_select="aandcttables dsputil"
2090+ljpeg_encoder_select="aandcttables idctdsp"
20892091 loco_decoder_select="golomb"
2090−mdec_decoder_select="blockdsp dsputil mpegvideo"
2092+mdec_decoder_select="blockdsp idctdsp mpegvideo"
20912093 metasound_decoder_select="lsp mdct sinewin"
2092−mimic_decoder_select="blockdsp bswapdsp dsputil hpeldsp"
2093−mjpeg_decoder_select="blockdsp dsputil hpeldsp exif"
2094+mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
2095+mjpeg_decoder_select="blockdsp hpeldsp exif idctdsp"
20942096 mjpeg_encoder_select="aandcttables mpegvideoenc"
20952097 mjpegb_decoder_select="mjpeg_decoder"
20962098 mlp_decoder_select="mlp_parser"
@@ -2124,12 +2126,12 @@ mss2_decoder_select="error_resilience mpeg_er qpeldsp vc1_decoder" · 27 unmodified lines
21242126 mxpeg_decoder_select="mjpeg_decoder"
21252127 nellymoser_decoder_select="mdct sinewin"
21262128 nellymoser_encoder_select="audio_frame_queue mdct sinewin"
2127−nuv_decoder_select="dsputil lzo"
2129+nuv_decoder_select="idctdsp lzo"
21282130 on2avc_decoder_select="mdct"
21292131 opus_decoder_deps="swresample"
21302132 png_decoder_select="zlib"
21312133 png_encoder_select="huffyuvencdsp zlib"
2132−prores_decoder_select="blockdsp dsputil"
2134+prores_decoder_select="blockdsp idctdsp"
21332135 prores_encoder_select="dsputil"
21342136 qcelp_decoder_select="lsp"
21352137 qdm2_decoder_select="mdct rdft mpegaudiodsp"
@@ -2191,7 +2193,7 @@ wmav2_encoder_select="mdct sinewin" · 55 unmodified lines
21912193 wmavoice_decoder_select="lsp rdft dct mdct sinewin"
21922194 wmv1_decoder_select="h263_decoder"
21932195 wmv1_encoder_select="h263_encoder"
2194−wmv2_decoder_select="blockdsp h263_decoder intrax8 videodsp"
2196+wmv2_decoder_select="blockdsp h263_decoder idctdsp intrax8 videodsp"
21952197 wmv2_encoder_select="h263_encoder"
21962198 wmv3_decoder_select="vc1_decoder"
21972199 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
@@ -39,9 +39,8 @@ OBJS-$(CONFIG_BSWAPDSP) += bswapdsp.o · 38 unmodified lines
3939 OBJS-$(CONFIG_CABAC) += cabac.o
4040 OBJS-$(CONFIG_CRYSTALHD) += crystalhd.o
4141 OBJS-$(CONFIG_DCT) += dct.o dct32_fixed.o dct32_float.o
42+OBJS-$(CONFIG_DSPUTIL) += dsputil.o
4243 OBJS-$(CONFIG_DXVA2) += dxva2.o
43−OBJS-$(CONFIG_DSPUTIL) += dsputil.o faanidct.o \
44− simple_idct.o jrevdct.o
4544 OBJS-$(CONFIG_ENCODERS) += faandct.o jfdctfst.o jfdctint.o
4645 OBJS-$(CONFIG_ERROR_RESILIENCE) += error_resilience.o
4746 OBJS-$(CONFIG_EXIF) += exif.o tiff_common.o
@@ -59,6 +58,8 @@ OBJS-$(CONFIG_HPELDSP) += hpeldsp.o · 11 unmodified lines
5958 OBJS-$(CONFIG_HUFFMAN) += huffman.o
6059 OBJS-$(CONFIG_HUFFYUVDSP) += huffyuvdsp.o
6160 OBJS-$(CONFIG_HUFFYUVENCDSP) += huffyuvencdsp.o
61+OBJS-$(CONFIG_IDCTDSP) += idctdsp.o faanidct.o \
62+ simple_idct.o jrevdct.o
6263 OBJS-$(CONFIG_INTRAX8) += intrax8.o intrax8dsp.o
6364 OBJS-$(CONFIG_LIBXVID) += libxvid_rc.o
6465 OBJS-$(CONFIG_LLAUDDSP) += lossless_audiodsp.o
libavcodec/aic.c+12−13
@@ -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;
@@ -338,16 +338,15 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, · 192 unmodified lines
338338 recombine_block_il(ctx->block, ctx->scantable.permutated,
339339 &base_y, &ext_y, blk);
340340 unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
341− ctx->dsp.idct(ctx->block);
341+ ctx->idsp.idct(ctx->block);
342342
343343 if (!ctx->interlaced) {
344344 dst = Y + (blk >> 1) * 8 * ystride + (blk & 1) * 8;
345− ctx->dsp.put_signed_pixels_clamped(ctx->block, dst,
346− ystride);
345+ ctx->idsp.put_signed_pixels_clamped(ctx->block, dst, ystride);
347346 } else {
348347 dst = Y + (blk & 1) * 8 + (blk >> 1) * ystride;
349− ctx->dsp.put_signed_pixels_clamped(ctx->block, dst,
350− ystride * 2);
348+ ctx->idsp.put_signed_pixels_clamped(ctx->block, dst,
349+ ystride * 2);
351350 }
352351 }
353352 Y += 16;
@@ -356,9 +355,9 @@ static int aic_decode_slice(AICContext *ctx, int mb_x, int mb_y, · 2 unmodified lines
356355 recombine_block(ctx->block, ctx->scantable.permutated,
357356 &base_c, &ext_c);
358357 unquant_block(ctx->block, ctx->quant, ctx->quant_matrix);
359− ctx->dsp.idct(ctx->block);
360− ctx->dsp.put_signed_pixels_clamped(ctx->block, C[blk],
361− ctx->frame->linesize[blk + 1]);
358+ ctx->idsp.idct(ctx->block);
359+ ctx->idsp.put_signed_pixels_clamped(ctx->block, C[blk],
360+ ctx->frame->linesize[blk + 1]);
362361 C[blk] += 8;
363362 }
364363 }
@@ -428,13 +427,13 @@ static av_cold int aic_decode_init(AVCodecContext *avctx) · 63 unmodified lines
428427
429428 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
430429
431− ff_dsputil_init(&ctx->dsp, avctx);
430+ ff_idctdsp_init(&ctx->idsp, avctx);
432431
433432 for (i = 0; i < 64; i++)
434433 scan[i] = i;
435− ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, scan);
434+ ff_init_scantable(ctx->idsp.idct_permutation, &ctx->scantable, scan);
436435 for (i = 0; i < 64; i++)
437− ctx->quant_matrix[ctx->dsp.idct_permutation[i]] = aic_quant_matrix[i];
436+ ctx->quant_matrix[ctx->idsp.idct_permutation[i]] = aic_quant_matrix[i];
438437
439438 ctx->mb_width = FFALIGN(avctx->width, 16) >> 4;
440439 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_LLAUDDSP) += arm/lossless_audiodsp_init_arm.o
2223 OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_init_arm.o
2324 OBJS-$(CONFIG_MPEGVIDEO) += arm/mpegvideo_arm.o
@@ -41,7 +42,7 @@ OBJS-$(CONFIG_RV30_DECODER) += arm/rv34dsp_init_arm.o · 17 unmodified lines
4142 OBJS-$(CONFIG_RV40_DECODER) += arm/rv34dsp_init_arm.o \
4243 arm/rv40dsp_init_arm.o
4344
44−ARMV5TE-OBJS-$(CONFIG_DSPUTIL) += arm/dsputil_init_armv5te.o \
45+ARMV5TE-OBJS-$(CONFIG_IDCTDSP) += arm/idctdsp_init_armv5te.o \
4546 arm/simple_idct_armv5te.o
4647 ARMV5TE-OBJS-$(CONFIG_MPEGVIDEO) += arm/mpegvideo_armv5te.o \
4748 arm/mpegvideo_armv5te_s.o
@@ -52,11 +53,13 @@ ARMV5TE-OBJS-$(CONFIG_MLP_DECODER) += arm/mlpdsp_armv5te.o · 4 unmodified lines
5253
5354 ARMV6-OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_armv6.o
5455 ARMV6-OBJS-$(CONFIG_DSPUTIL) += arm/dsputil_init_armv6.o \
55− arm/dsputil_armv6.o \
56− arm/simple_idct_armv6.o
56+ arm/dsputil_armv6.o
5757 ARMV6-OBJS-$(CONFIG_H264DSP) += arm/startcode_armv6.o
5858 ARMV6-OBJS-$(CONFIG_HPELDSP) += arm/hpeldsp_init_armv6.o \
5959 arm/hpeldsp_armv6.o
60+ARMV6-OBJS-$(CONFIG_IDCTDSP) += arm/idctdsp_init_armv6.o \
61+ arm/idctdsp_armv6.o \
62+ arm/simple_idct_armv6.o
6063 ARMV6-OBJS-$(CONFIG_MPEGAUDIODSP) += arm/mpegaudiodsp_fixed_armv6.o
6164
6265 ARMV6-OBJS-$(CONFIG_MLP_DECODER) += arm/mlpdsp_armv6.o
@@ -86,9 +89,6 @@ NEON-OBJS-$(CONFIG_AUDIODSP) += arm/audiodsp_init_neon.o \ · 23 unmodified lines
8689 arm/int_neon.o
8790 NEON-OBJS-$(CONFIG_BLOCKDSP) += arm/blockdsp_init_neon.o \
8891 arm/blockdsp_neon.o
89−NEON-OBJS-$(CONFIG_DSPUTIL) += arm/dsputil_init_neon.o \
90− arm/dsputil_neon.o \
91− arm/simple_idct_neon.o
9292 NEON-OBJS-$(CONFIG_FFT) += arm/fft_neon.o \
9393 arm/fft_fixed_neon.o
9494 NEON-OBJS-$(CONFIG_H264CHROMA) += arm/h264cmc_neon.o
@@ -99,6 +99,9 @@ NEON-OBJS-$(CONFIG_H264QPEL) += arm/h264qpel_neon.o \ · 4 unmodified lines
9999 arm/hpeldsp_neon.o
100100 NEON-OBJS-$(CONFIG_HPELDSP) += arm/hpeldsp_init_neon.o \
101101 arm/hpeldsp_neon.o
102+NEON-OBJS-$(CONFIG_IDCTDSP) += arm/idctdsp_init_neon.o \
103+ arm/idctdsp_neon.o \
104+ arm/simple_idct_neon.o
102105 NEON-OBJS-$(CONFIG_MDCT) += arm/mdct_neon.o \
103106 arm/mdct_fixed_neon.o
104107 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 (!avctx->lowres && !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 (!avctx->lowres && !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 FFmpeg.
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 FFmpeg.
5+ *
6+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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 FFmpeg.
5+ *
6+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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 FFmpeg.
6+ *
7+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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 (!avctx->lowres && !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 (!avctx->lowres && !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 FFmpeg.
5+ *
6+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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 (!avctx->lowres && !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 FFmpeg.
@@ -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 (!avctx->lowres && !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 FFmpeg.
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
@@ -29,6 +29,7 @@ · 28 unmodified lines
2929 #include "asv.h"
3030 #include "avcodec.h"
3131 #include "blockdsp.h"
32+#include "idctdsp.h"
3233 #include "internal.h"
3334 #include "mathops.h"
3435 #include "mpeg12data.h"
@@ -189,14 +190,14 @@ static inline void idct_put(ASV1Context *a, AVFrame *frame, int mb_x, int mb_y) · 154 unmodified lines
189190 uint8_t *dest_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8;
190191 uint8_t *dest_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8;
191192
192− a->dsp.idct_put(dest_y , linesize, block[0]);
193− a->dsp.idct_put(dest_y + 8, linesize, block[1]);
194− a->dsp.idct_put(dest_y + 8*linesize , linesize, block[2]);
195− a->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
193+ a->idsp.idct_put(dest_y, linesize, block[0]);
194+ a->idsp.idct_put(dest_y + 8, linesize, block[1]);
195+ a->idsp.idct_put(dest_y + 8 * linesize, linesize, block[2]);
196+ a->idsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]);
196197
197198 if (!(a->avctx->flags&CODEC_FLAG_GRAY)) {
198− a->dsp.idct_put(dest_cb, frame->linesize[1], block[4]);
199− a->dsp.idct_put(dest_cr, frame->linesize[2], block[5]);
199+ a->idsp.idct_put(dest_cb, frame->linesize[1], block[4]);
200+ a->idsp.idct_put(dest_cr, frame->linesize[2], block[5]);
200201 }
201202 }
202203
@@ -279,8 +280,9 @@ static av_cold int decode_init(AVCodecContext *avctx) · 76 unmodified lines
279280
280281 ff_asv_common_init(avctx);
281282 ff_blockdsp_init(&a->bdsp, avctx);
283+ ff_idctdsp_init(&a->idsp, avctx);
282284 init_vlcs(a);
283− ff_init_scantable(a->dsp.idct_permutation, &a->scantable, ff_asv_scantab);
285+ ff_init_scantable(a->idsp.idct_permutation, &a->scantable, ff_asv_scantab);
284286 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
285287
286288 if (avctx->extradata_size < 1 || (a->inv_qscale = avctx->extradata[0]) == 0) {
libavcodec/asvenc.c+1−0
@@ -281,6 +281,7 @@ static av_cold int encode_init(AVCodecContext *avctx){ · 280 unmodified lines
281281 const int scale= avctx->codec_id == AV_CODEC_ID_ASV1 ? 1 : 2;
282282
283283 ff_asv_common_init(avctx);
284+ ff_dsputil_init(&a->dsp, avctx);
284285
285286 if(avctx->global_quality <= 0) avctx->global_quality= 4*FF_QUALITY_SCALE;
286287
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"
@@ -772,13 +773,13 @@ av_cold int ff_cavs_init(AVCodecContext *avctx) · 737 unmodified lines
772773 AVSContext *h = avctx->priv_data;
773774
774775 ff_blockdsp_init(&h->bdsp, avctx);
775− ff_dsputil_init(&h->dsp, avctx);
776776 ff_h264chroma_init(&h->h264chroma, 8);
777+ ff_idctdsp_init(&h->idsp, avctx);
777778 ff_videodsp_init(&h->vdsp, 8);
778779 ff_cavsdsp_init(&h->cdsp, avctx);
779− ff_init_scantable_permutation(h->dsp.idct_permutation,
780+ ff_init_scantable_permutation(h->idsp.idct_permutation,
780781 h->cdsp.idct_perm);
781− ff_init_scantable(h->dsp.idct_permutation, &h->scantable, ff_zigzag_direct);
782+ ff_init_scantable(h->idsp.idct_permutation, &h->scantable, ff_zigzag_direct);
782783
783784 h->avctx = avctx;
784785 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 #include "thread.h"
3434
@@ -43,7 +43,7 @@ typedef struct DNXHDContext { · 8 unmodified lines
4343 int cur_field; ///< current interlaced field
4444 VLC ac_vlc, dc_vlc, run_vlc;
4545 int last_dc[3];
46− DSPContext dsp;
46+ IDCTDSPContext idsp;
4747 DECLARE_ALIGNED(16, int16_t, blocks)[12][64];
4848 ScanTable scantable;
4949 const CIDEntry *cid_table;
@@ -104,7 +104,7 @@ static int dnxhd_init_vlc(DNXHDContext *ctx, uint32_t cid) · 54 unmodified lines
104104 ctx->cid_table->run_bits, 1, 1,
105105 ctx->cid_table->run_codes, 2, 2, 0);
106106
107− ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable,
107+ ff_init_scantable(ctx->idsp.idct_permutation, &ctx->scantable,
108108 ff_zigzag_direct);
109109 ctx->cid = cid;
110110 }
@@ -145,7 +145,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, · 34 unmodified lines
145145 ctx->avctx->bits_per_raw_sample = 10;
146146 if (ctx->bit_depth != 10) {
147147 ff_blockdsp_init(&ctx->bdsp, ctx->avctx);
148− ff_dsputil_init(&ctx->dsp, ctx->avctx);
148+ ff_idctdsp_init(&ctx->idsp, ctx->avctx);
149149 ctx->bit_depth = 10;
150150 ctx->decode_dct_block = dnxhd_decode_dct_block_10_444;
151151 }
@@ -155,7 +155,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, · 3 unmodified lines
155155 ctx->avctx->bits_per_raw_sample = 10;
156156 if (ctx->bit_depth != 10) {
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 = 10;
160160 ctx->decode_dct_block = dnxhd_decode_dct_block_10;
161161 }
@@ -164,7 +164,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, · 2 unmodified lines
164164 ctx->avctx->bits_per_raw_sample = 8;
165165 if (ctx->bit_depth != 8) {
166166 ff_blockdsp_init(&ctx->bdsp, ctx->avctx);
167− ff_dsputil_init(&ctx->dsp, ctx->avctx);
167+ ff_idctdsp_init(&ctx->idsp, ctx->avctx);
168168 ctx->bit_depth = 8;
169169 ctx->decode_dct_block = dnxhd_decode_dct_block_8;
170170 }
@@ -371,34 +371,34 @@ static int dnxhd_decode_macroblock(DNXHDContext *ctx, AVFrame *frame, · 200 unmodified lines
371371 dct_y_offset = dct_linesize_luma << 3;
372372 dct_x_offset = 8 << shift1;
373373 if (!ctx->is_444) {
374− ctx->dsp.idct_put(dest_y, dct_linesize_luma, ctx->blocks[0]);
375− ctx->dsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, ctx->blocks[1]);
376− ctx->dsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, ctx->blocks[4]);
377− ctx->dsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->blocks[5]);
374+ ctx->idsp.idct_put(dest_y, dct_linesize_luma, ctx->blocks[0]);
375+ ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, ctx->blocks[1]);
376+ ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, ctx->blocks[4]);
377+ ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->blocks[5]);
378378
379379 if (!(ctx->avctx->flags & CODEC_FLAG_GRAY)) {
380380 dct_y_offset = dct_linesize_chroma << 3;
381− ctx->dsp.idct_put(dest_u, dct_linesize_chroma, ctx->blocks[2]);
382− ctx->dsp.idct_put(dest_v, dct_linesize_chroma, ctx->blocks[3]);
383− ctx->dsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, ctx->blocks[6]);
384− ctx->dsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, ctx->blocks[7]);
381+ ctx->idsp.idct_put(dest_u, dct_linesize_chroma, ctx->blocks[2]);
382+ ctx->idsp.idct_put(dest_v, dct_linesize_chroma, ctx->blocks[3]);
383+ ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, ctx->blocks[6]);
384+ ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, ctx->blocks[7]);
385385 }
386386 } else {
387− ctx->dsp.idct_put(dest_y, dct_linesize_luma, ctx->blocks[0]);
388− ctx->dsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, ctx->blocks[1]);
389− ctx->dsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, ctx->blocks[6]);
390− ctx->dsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->blocks[7]);
387+ ctx->idsp.idct_put(dest_y, dct_linesize_luma, ctx->blocks[0]);
388+ ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, ctx->blocks[1]);
389+ ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, ctx->blocks[6]);
390+ ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->blocks[7]);
391391
392392 if (!(ctx->avctx->flags & CODEC_FLAG_GRAY)) {
393393 dct_y_offset = dct_linesize_chroma << 3;
394− ctx->dsp.idct_put(dest_u, dct_linesize_chroma, ctx->blocks[2]);
395− ctx->dsp.idct_put(dest_u + dct_x_offset, dct_linesize_chroma, ctx->blocks[3]);
396− ctx->dsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, ctx->blocks[8]);
397− ctx->dsp.idct_put(dest_u + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->blocks[9]);
398− ctx->dsp.idct_put(dest_v, dct_linesize_chroma, ctx->blocks[4]);
399− ctx->dsp.idct_put(dest_v + dct_x_offset, dct_linesize_chroma, ctx->blocks[5]);
400− ctx->dsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, ctx->blocks[10]);
401− ctx->dsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->blocks[11]);
394+ ctx->idsp.idct_put(dest_u, dct_linesize_chroma, ctx->blocks[2]);
395+ ctx->idsp.idct_put(dest_u + dct_x_offset, dct_linesize_chroma, ctx->blocks[3]);
396+ ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, ctx->blocks[8]);
397+ ctx->idsp.idct_put(dest_u + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->blocks[9]);
398+ ctx->idsp.idct_put(dest_v, dct_linesize_chroma, ctx->blocks[4]);
399+ ctx->idsp.idct_put(dest_v + dct_x_offset, dct_linesize_chroma, ctx->blocks[5]);
400+ ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, ctx->blocks[10]);
401+ ctx->idsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->blocks[11]);
402402 }
403403 }
404404
libavcodec/dnxhdenc.c+5−4
@@ -209,14 +209,14 @@ static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias) · 208 unmodified lines
209209
210210 if (ctx->cid_table->bit_depth == 8) {
211211 for (i = 1; i < 64; i++) {
212− int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
212+ int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
213213 weight_matrix[j] = ctx->cid_table->luma_weight[i];
214214 }
215215 ff_convert_matrix(&ctx->m, ctx->qmatrix_l, ctx->qmatrix_l16,
216216 weight_matrix, ctx->m.intra_quant_bias, 1,
217217 ctx->m.avctx->qmax, 1);
218218 for (i = 1; i < 64; i++) {
219− int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
219+ int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
220220 weight_matrix[j] = ctx->cid_table->chroma_weight[i];
221221 }
222222 ff_convert_matrix(&ctx->m, ctx->qmatrix_c, ctx->qmatrix_c16,
@@ -237,7 +237,7 @@ static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias) · 14 unmodified lines
237237 // 10-bit
238238 for (qscale = 1; qscale <= ctx->m.avctx->qmax; qscale++) {
239239 for (i = 1; i < 64; i++) {
240− int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
240+ int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
241241
242242 /* The quantization formula from the VC-3 standard is:
243243 * quantized = sign(block[i]) * floor(abs(block[i]/s) * p /
@@ -322,6 +322,7 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx) · 78 unmodified lines
322322 avctx->bits_per_raw_sample = ctx->cid_table->bit_depth;
323323
324324 ff_blockdsp_init(&ctx->bdsp, avctx);
325+ ff_idctdsp_init(&ctx->m.idsp, avctx);
325326 ff_dct_common_init(&ctx->m);
326327 ff_dct_encode_init(&ctx->m);
327328
@@ -648,7 +649,7 @@ static int dnxhd_calc_bits_thread(AVCodecContext *avctx, void *arg, · 320 unmodified lines
648649
649650 if (avctx->mb_decision == FF_MB_DECISION_RD || !RC_VARIANCE) {
650651 dnxhd_unquantize_c(ctx, block, i, qscale, last_index);
651− ctx->m.dsp.idct(block);
652+ ctx->m.idsp.idct(block);
652653 ssd += dnxhd_ssd_block(block, src_block);
653654 }
654655 }
libavcodec/dsputil.c+1−276
@@ -34,7 +34,6 @@ · 33 unmodified lines
3434 #include "dsputil.h"
3535 #include "simple_idct.h"
3636 #include "faandct.h"
37−#include "faanidct.h"
3837 #include "imgconvert.h"
3938 #include "mathops.h"
4039 #include "mpegvideo.h"
@@ -49,60 +48,6 @@ uint32_t ff_square_tab[512] = { 0, }; · 8 unmodified lines
4948 #define BIT_DEPTH 8
5049 #include "dsputilenc_template.c"
5150
52−av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st,
53− const uint8_t *src_scantable)
54−{
55− int i, end;
56−
57− st->scantable = src_scantable;
58−
59− for (i = 0; i < 64; i++) {
60− int j = src_scantable[i];
61− st->permutated[i] = permutation[j];
62− }
63−
64− end = -1;
65− for (i = 0; i < 64; i++) {
66− int j = st->permutated[i];
67− if (j > end)
68− end = j;
69− st->raster_end[i] = end;
70− }
71−}
72−
73−av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation,
74− int idct_permutation_type)
75−{
76− int i;
77−
78− if (ARCH_X86)
79− if (ff_init_scantable_permutation_x86(idct_permutation,
80− idct_permutation_type))
81− return;
82−
83− switch (idct_permutation_type) {
84− case FF_NO_IDCT_PERM:
85− for (i = 0; i < 64; i++)
86− idct_permutation[i] = i;
87− break;
88− case FF_LIBMPEG2_IDCT_PERM:
89− for (i = 0; i < 64; i++)
90− idct_permutation[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
91− break;
92− case FF_TRANSPOSE_IDCT_PERM:
93− for (i = 0; i < 64; i++)
94− idct_permutation[i] = ((i & 7) << 3) | (i >> 3);
95− break;
96− case FF_PARTTRANS_IDCT_PERM:
97− for (i = 0; i < 64; i++)
98− idct_permutation[i] = (i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3);
99− break;
100− default:
101− av_log(NULL, AV_LOG_ERROR,
102− "Internal error, IDCT permutation not set\n");
103− }
104−}
105−
10651 static int pix_sum_c(uint8_t *pix, int line_size)
10752 {
10853 int s = 0, i, j;
@@ -260,130 +205,6 @@ static void diff_pixels_c(int16_t *av_restrict block, const uint8_t *s1, · 151 unmodified lines
260205 }
261206 }
262207
263−static void put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
264− int line_size)
265−{
266− int i;
267−
268− /* read the pixels */
269− for (i = 0; i < 8; i++) {
270− pixels[0] = av_clip_uint8(block[0]);
271− pixels[1] = av_clip_uint8(block[1]);
272− pixels[2] = av_clip_uint8(block[2]);
273− pixels[3] = av_clip_uint8(block[3]);
274− pixels[4] = av_clip_uint8(block[4]);
275− pixels[5] = av_clip_uint8(block[5]);
276− pixels[6] = av_clip_uint8(block[6]);
277− pixels[7] = av_clip_uint8(block[7]);
278−
279− pixels += line_size;
280− block += 8;
281− }
282−}
283−
284−static void put_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels,
285− int line_size)
286−{
287− int i;
288−
289− /* read the pixels */
290− for(i=0;i<4;i++) {
291− pixels[0] = av_clip_uint8(block[0]);
292− pixels[1] = av_clip_uint8(block[1]);
293− pixels[2] = av_clip_uint8(block[2]);
294− pixels[3] = av_clip_uint8(block[3]);
295−
296− pixels += line_size;
297− block += 8;
298− }
299−}
300−
301−static void put_pixels_clamped2_c(const int16_t *block, uint8_t *av_restrict pixels,
302− int line_size)
303−{
304− int i;
305−
306− /* read the pixels */
307− for(i=0;i<2;i++) {
308− pixels[0] = av_clip_uint8(block[0]);
309− pixels[1] = av_clip_uint8(block[1]);
310−
311− pixels += line_size;
312− block += 8;
313− }
314−}
315−
316−static void put_signed_pixels_clamped_c(const int16_t *block,
317− uint8_t *av_restrict pixels,
318− int line_size)
319−{
320− int i, j;
321−
322− for (i = 0; i < 8; i++) {
323− for (j = 0; j < 8; j++) {
324− if (*block < -128)
325− *pixels = 0;
326− else if (*block > 127)
327− *pixels = 255;
328− else
329− *pixels = (uint8_t) (*block + 128);
330− block++;
331− pixels++;
332− }
333− pixels += (line_size - 8);
334− }
335−}
336−
337−static void add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
338− int line_size)
339−{
340− int i;
341−
342− /* read the pixels */
343− for (i = 0; i < 8; i++) {
344− pixels[0] = av_clip_uint8(pixels[0] + block[0]);
345− pixels[1] = av_clip_uint8(pixels[1] + block[1]);
346− pixels[2] = av_clip_uint8(pixels[2] + block[2]);
347− pixels[3] = av_clip_uint8(pixels[3] + block[3]);
348− pixels[4] = av_clip_uint8(pixels[4] + block[4]);
349− pixels[5] = av_clip_uint8(pixels[5] + block[5]);
350− pixels[6] = av_clip_uint8(pixels[6] + block[6]);
351− pixels[7] = av_clip_uint8(pixels[7] + block[7]);
352− pixels += line_size;
353− block += 8;
354− }
355−}
356−
357−static void add_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels,
358− int line_size)
359−{
360− int i;
361−
362− /* read the pixels */
363− for(i=0;i<4;i++) {
364− pixels[0] = av_clip_uint8(pixels[0] + block[0]);
365− pixels[1] = av_clip_uint8(pixels[1] + block[1]);
366− pixels[2] = av_clip_uint8(pixels[2] + block[2]);
367− pixels[3] = av_clip_uint8(pixels[3] + block[3]);
368− pixels += line_size;
369− block += 8;
370− }
371−}
372−
373−static void add_pixels_clamped2_c(const int16_t *block, uint8_t *av_restrict pixels,
374− int line_size)
375−{
376− int i;
377−
378− /* read the pixels */
379− for(i=0;i<2;i++) {
380− pixels[0] = av_clip_uint8(pixels[0] + block[0]);
381− pixels[1] = av_clip_uint8(pixels[1] + block[1]);
382− pixels += line_size;
383− block += 8;
384− }
385−}
386−
387208 static int sum_abs_dctelem_c(int16_t *block)
388209 {
389210 int sum = 0, i;
@@ -1038,7 +859,7 @@ static int rd8x8_c(MpegEncContext *s, uint8_t *src1, uint8_t *src2, · 648 unmodified lines
1038859 s->dct_unquantize_inter(s, temp, 0, s->qscale);
1039860 }
1040861
1041− s->dsp.idct_add(lsrc2, 8, temp);
862+ s->idsp.idct_add(lsrc2, 8, temp);
1042863
1043864 distortion = s->dsp.sse[1](NULL, lsrc2, lsrc1, 8, 8);
1044865
@@ -1216,49 +1037,6 @@ WRAPPER8_16_SQ(quant_psnr8x8_c, quant_psnr16_c) · 171 unmodified lines
12161037 WRAPPER8_16_SQ(rd8x8_c, rd16_c)
12171038 WRAPPER8_16_SQ(bit8x8_c, bit16_c)
12181039
1219−static void jref_idct_put(uint8_t *dest, int line_size, int16_t *block)
1220−{
1221− ff_j_rev_dct(block);
1222− put_pixels_clamped_c(block, dest, line_size);
1223−}
1224−
1225−static void jref_idct_add(uint8_t *dest, int line_size, int16_t *block)
1226−{
1227− ff_j_rev_dct(block);
1228− add_pixels_clamped_c(block, dest, line_size);
1229−}
1230−
1231−static void ff_jref_idct4_put(uint8_t *dest, int line_size, int16_t *block)
1232−{
1233− ff_j_rev_dct4 (block);
1234− put_pixels_clamped4_c(block, dest, line_size);
1235−}
1236−static void ff_jref_idct4_add(uint8_t *dest, int line_size, int16_t *block)
1237−{
1238− ff_j_rev_dct4 (block);
1239− add_pixels_clamped4_c(block, dest, line_size);
1240−}
1241−
1242−static void ff_jref_idct2_put(uint8_t *dest, int line_size, int16_t *block)
1243−{
1244− ff_j_rev_dct2 (block);
1245− put_pixels_clamped2_c(block, dest, line_size);
1246−}
1247−static void ff_jref_idct2_add(uint8_t *dest, int line_size, int16_t *block)
1248−{
1249− ff_j_rev_dct2 (block);
1250− add_pixels_clamped2_c(block, dest, line_size);
1251−}
1252−
1253−static void ff_jref_idct1_put(uint8_t *dest, int line_size, int16_t *block)
1254−{
1255− dest[0] = av_clip_uint8((block[0] + 4)>>3);
1256−}
1257−static void ff_jref_idct1_add(uint8_t *dest, int line_size, int16_t *block)
1258−{
1259− dest[0] = av_clip_uint8(dest[0] + ((block[0] + 4)>>3));
1260−}
1261−
12621040 /* draw the edges of width 'w' of an image of size width, height */
12631041 // FIXME: Check that this is OK for MPEG-4 interlaced.
12641042 static void draw_edges_8_c(uint8_t *buf, int wrap, int width, int height,
@@ -1341,58 +1119,8 @@ av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx) · 76 unmodified lines
13411119 }
13421120 #endif /* CONFIG_ENCODERS */
13431121
1344− if (avctx->lowres==1) {
1345− c->idct_put = ff_jref_idct4_put;
1346− c->idct_add = ff_jref_idct4_add;
1347− c->idct = ff_j_rev_dct4;
1348− c->idct_permutation_type = FF_NO_IDCT_PERM;
1349− } else if (avctx->lowres==2) {
1350− c->idct_put = ff_jref_idct2_put;
1351− c->idct_add = ff_jref_idct2_add;
1352− c->idct = ff_j_rev_dct2;
1353− c->idct_permutation_type = FF_NO_IDCT_PERM;
1354− } else if (avctx->lowres==3) {
1355− c->idct_put = ff_jref_idct1_put;
1356− c->idct_add = ff_jref_idct1_add;
1357− c->idct = ff_j_rev_dct1;
1358− c->idct_permutation_type = FF_NO_IDCT_PERM;
1359− } else {
1360− if (avctx->bits_per_raw_sample == 10) {
1361− c->idct_put = ff_simple_idct_put_10;
1362− c->idct_add = ff_simple_idct_add_10;
1363− c->idct = ff_simple_idct_10;
1364− c->idct_permutation_type = FF_NO_IDCT_PERM;
1365− } else if (avctx->bits_per_raw_sample == 12) {
1366− c->idct_put = ff_simple_idct_put_12;
1367− c->idct_add = ff_simple_idct_add_12;
1368− c->idct = ff_simple_idct_12;
1369− c->idct_permutation_type = FF_NO_IDCT_PERM;
1370− } else {
1371− if (avctx->idct_algo == FF_IDCT_INT) {
1372− c->idct_put = jref_idct_put;
1373− c->idct_add = jref_idct_add;
1374− c->idct = ff_j_rev_dct;
1375− c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
1376− } else if (avctx->idct_algo == FF_IDCT_FAAN) {
1377− c->idct_put = ff_faanidct_put;
1378− c->idct_add = ff_faanidct_add;
1379− c->idct = ff_faanidct;
1380− c->idct_permutation_type = FF_NO_IDCT_PERM;
1381− } else { // accurate/default
1382− c->idct_put = ff_simple_idct_put_8;
1383− c->idct_add = ff_simple_idct_add_8;
1384− c->idct = ff_simple_idct_8;
1385− c->idct_permutation_type = FF_NO_IDCT_PERM;
1386− }
1387− }
1388− }
1389−
13901122 c->diff_pixels = diff_pixels_c;
13911123
1392− c->put_pixels_clamped = put_pixels_clamped_c;
1393− c->put_signed_pixels_clamped = put_signed_pixels_clamped_c;
1394− c->add_pixels_clamped = add_pixels_clamped_c;
1395−
13961124 c->sum_abs_dctelem = sum_abs_dctelem_c;
13971125
13981126 c->pix_sum = pix_sum_c;
@@ -1475,9 +1203,6 @@ av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx) · 76 unmodified lines
14751203 ff_dsputil_init_ppc(c, avctx, high_bit_depth);
14761204 if (ARCH_X86)
14771205 ff_dsputil_init_x86(c, avctx, high_bit_depth);
1478−
1479− ff_init_scantable_permutation(c->idct_permutation,
1480− c->idct_permutation_type);
14811206 }
14821207
14831208 av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx)
libavcodec/dsputil.h+0−66
@@ -58,22 +58,6 @@ typedef int (*me_cmp_func)(struct MpegEncContext *c, · 57 unmodified lines
5858 uint8_t *blk1 /* align width (8 or 16) */,
5959 uint8_t *blk2 /* align 1 */, int line_size, int h);
6060
61−/**
62− * Scantable.
63− */
64−typedef struct ScanTable {
65− const uint8_t *scantable;
66− uint8_t permutated[64];
67− uint8_t raster_end[64];
68−} ScanTable;
69−
70−void ff_init_scantable(uint8_t *permutation, ScanTable *st,
71− const uint8_t *src_scantable);
72−void ff_init_scantable_permutation(uint8_t *idct_permutation,
73− int idct_permutation_type);
74−int ff_init_scantable_permutation_x86(uint8_t *idct_permutation,
75− int idct_permutation_type);
76−
7761 /**
7862 * DSPContext.
7963 */
@@ -86,15 +70,6 @@ typedef struct DSPContext { · 6 unmodified lines
8670 const uint8_t *s1 /* align 8 */,
8771 const uint8_t *s2 /* align 8 */,
8872 int stride);
89− void (*put_pixels_clamped)(const int16_t *block /* align 16 */,
90− uint8_t *pixels /* align 8 */,
91− int line_size);
92− void (*put_signed_pixels_clamped)(const int16_t *block /* align 16 */,
93− uint8_t *pixels /* align 8 */,
94− int line_size);
95− void (*add_pixels_clamped)(const int16_t *block /* align 16 */,
96− uint8_t *pixels /* align 8 */,
97− int line_size);
9873 int (*sum_abs_dctelem)(int16_t *block /* align 16 */);
9974
10075 int (*pix_sum)(uint8_t *pix, int line_size);
@@ -128,47 +103,6 @@ typedef struct DSPContext { · 27 unmodified lines
128103 void (*fdct)(int16_t *block /* align 16 */);
129104 void (*fdct248)(int16_t *block /* align 16 */);
130105
131− /* IDCT really */
132− void (*idct)(int16_t *block /* align 16 */);
133−
134− /**
135− * block -> idct -> clip to unsigned 8 bit -> dest.
136− * (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...)
137− * @param line_size size in bytes of a horizontal line of dest
138− */
139− void (*idct_put)(uint8_t *dest /* align 8 */,
140− int line_size, int16_t *block /* align 16 */);
141−
142− /**
143− * block -> idct -> add dest -> clip to unsigned 8 bit -> dest.
144− * @param line_size size in bytes of a horizontal line of dest
145− */
146− void (*idct_add)(uint8_t *dest /* align 8 */,
147− int line_size, int16_t *block /* align 16 */);
148−
149− /**
150− * IDCT input permutation.
151− * Several optimized IDCTs need a permutated input (relative to the
152− * normal order of the reference IDCT).
153− * This permutation must be performed before the idct_put/add.
154− * Note, normally this can be merged with the zigzag/alternate scan<br>
155− * An example to avoid confusion:
156− * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...)
157− * - (x -> reference DCT -> reference IDCT -> x)
158− * - (x -> reference DCT -> simple_mmx_perm = idct_permutation
159− * -> simple_idct_mmx -> x)
160− * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant
161− * -> simple_idct_mmx -> ...)
162− */
163− uint8_t idct_permutation[64];
164− int idct_permutation_type;
165−#define FF_NO_IDCT_PERM 1
166−#define FF_LIBMPEG2_IDCT_PERM 2
167−#define FF_SIMPLE_IDCT_PERM 3
168−#define FF_TRANSPOSE_IDCT_PERM 4
169−#define FF_PARTTRANS_IDCT_PERM 5
170−#define FF_SSE2_IDCT_PERM 6
171−
172106 int (*try_8x8basis)(int16_t rem[64], int16_t weight[64],
173107 int16_t basis[64], int scale);
174108 void (*add_8x8basis)(int16_t rem[64], int16_t basis[64], int scale);
libavcodec/dvdec.c+7−6
@@ -40,6 +40,7 @@ · 39 unmodified lines
4040 #include "libavutil/imgutils.h"
4141 #include "libavutil/pixdesc.h"
4242 #include "avcodec.h"
43+#include "idctdsp.h"
4344 #include "internal.h"
4445 #include "get_bits.h"
4546 #include "put_bits.h"
@@ -62,24 +63,24 @@ static const int dv_iweight_bits = 14; · 16 unmodified lines
6263 static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
6364 {
6465 DVVideoContext *s = avctx->priv_data;
65− DSPContext dsp;
66+ IDCTDSPContext idsp;
6667 int i;
6768
68− memset(&dsp,0, sizeof(dsp));
69− ff_dsputil_init(&dsp, avctx);
69+ memset(&idsp,0, sizeof(idsp));
70+ ff_idctdsp_init(&idsp, avctx);
7071
7172 for (i = 0; i < 64; i++)
72− s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
73+ s->dv_zigzag[0][i] = idsp.idct_permutation[ff_zigzag_direct[i]];
7374
7475 if (avctx->lowres){
7576 for (i = 0; i < 64; i++){
7677 int j = ff_dv_zigzag248_direct[i];
77− s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
78+ s->dv_zigzag[1][i] = idsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
7879 }
7980 }else
8081 memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1]));
8182
82− s->idct_put[0] = dsp.idct_put;
83+ s->idct_put[0] = idsp.idct_put;
8384 s->idct_put[1] = ff_simple_idct248_put;
8485
8586 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+311−0
@@ -0,0 +1,311 @@
1+/*
2+ * This file is part of FFmpeg.
3+ *
4+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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 *av_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_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels,
104+ int line_size)
105+{
106+ int i;
107+
108+ /* read the pixels */
109+ for(i=0;i<4;i++) {
110+ pixels[0] = av_clip_uint8(block[0]);
111+ pixels[1] = av_clip_uint8(block[1]);
112+ pixels[2] = av_clip_uint8(block[2]);
113+ pixels[3] = av_clip_uint8(block[3]);
114+
115+ pixels += line_size;
116+ block += 8;
117+ }
118+}
119+
120+static void put_pixels_clamped2_c(const int16_t *block, uint8_t *av_restrict pixels,
121+ int line_size)
122+{
123+ int i;
124+
125+ /* read the pixels */
126+ for(i=0;i<2;i++) {
127+ pixels[0] = av_clip_uint8(block[0]);
128+ pixels[1] = av_clip_uint8(block[1]);
129+
130+ pixels += line_size;
131+ block += 8;
132+ }
133+}
134+
135+static void put_signed_pixels_clamped_c(const int16_t *block,
136+ uint8_t *av_restrict pixels,
137+ int line_size)
138+{
139+ int i, j;
140+
141+ for (i = 0; i < 8; i++) {
142+ for (j = 0; j < 8; j++) {
143+ if (*block < -128)
144+ *pixels = 0;
145+ else if (*block > 127)
146+ *pixels = 255;
147+ else
148+ *pixels = (uint8_t) (*block + 128);
149+ block++;
150+ pixels++;
151+ }
152+ pixels += (line_size - 8);
153+ }
154+}
155+
156+static void add_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels,
157+ int line_size)
158+{
159+ int i;
160+
161+ /* read the pixels */
162+ for (i = 0; i < 8; i++) {
163+ pixels[0] = av_clip_uint8(pixels[0] + block[0]);
164+ pixels[1] = av_clip_uint8(pixels[1] + block[1]);
165+ pixels[2] = av_clip_uint8(pixels[2] + block[2]);
166+ pixels[3] = av_clip_uint8(pixels[3] + block[3]);
167+ pixels[4] = av_clip_uint8(pixels[4] + block[4]);
168+ pixels[5] = av_clip_uint8(pixels[5] + block[5]);
169+ pixels[6] = av_clip_uint8(pixels[6] + block[6]);
170+ pixels[7] = av_clip_uint8(pixels[7] + block[7]);
171+ pixels += line_size;
172+ block += 8;
173+ }
174+}
175+
176+static void add_pixels_clamped4_c(const int16_t *block, uint8_t *av_restrict pixels,
177+ int line_size)
178+{
179+ int i;
180+
181+ /* read the pixels */
182+ for(i=0;i<4;i++) {
183+ pixels[0] = av_clip_uint8(pixels[0] + block[0]);
184+ pixels[1] = av_clip_uint8(pixels[1] + block[1]);
185+ pixels[2] = av_clip_uint8(pixels[2] + block[2]);
186+ pixels[3] = av_clip_uint8(pixels[3] + block[3]);
187+ pixels += line_size;
188+ block += 8;
189+ }
190+}
191+
192+static void add_pixels_clamped2_c(const int16_t *block, uint8_t *av_restrict pixels,
193+ int line_size)
194+{
195+ int i;
196+
197+ /* read the pixels */
198+ for(i=0;i<2;i++) {
199+ pixels[0] = av_clip_uint8(pixels[0] + block[0]);
200+ pixels[1] = av_clip_uint8(pixels[1] + block[1]);
201+ pixels += line_size;
202+ block += 8;
203+ }
204+}
205+
206+static void jref_idct_put(uint8_t *dest, int line_size, int16_t *block)
207+{
208+ ff_j_rev_dct(block);
209+ put_pixels_clamped_c(block, dest, line_size);
210+}
211+
212+static void jref_idct_add(uint8_t *dest, int line_size, int16_t *block)
213+{
214+ ff_j_rev_dct(block);
215+ add_pixels_clamped_c(block, dest, line_size);
216+}
217+static void ff_jref_idct4_put(uint8_t *dest, int line_size, int16_t *block)
218+{
219+ ff_j_rev_dct4 (block);
220+ put_pixels_clamped4_c(block, dest, line_size);
221+}
222+static void ff_jref_idct4_add(uint8_t *dest, int line_size, int16_t *block)
223+{
224+ ff_j_rev_dct4 (block);
225+ add_pixels_clamped4_c(block, dest, line_size);
226+}
227+
228+static void ff_jref_idct2_put(uint8_t *dest, int line_size, int16_t *block)
229+{
230+ ff_j_rev_dct2 (block);
231+ put_pixels_clamped2_c(block, dest, line_size);
232+}
233+static void ff_jref_idct2_add(uint8_t *dest, int line_size, int16_t *block)
234+{
235+ ff_j_rev_dct2 (block);
236+ add_pixels_clamped2_c(block, dest, line_size);
237+}
238+
239+static void ff_jref_idct1_put(uint8_t *dest, int line_size, int16_t *block)
240+{
241+ dest[0] = av_clip_uint8((block[0] + 4)>>3);
242+}
243+static void ff_jref_idct1_add(uint8_t *dest, int line_size, int16_t *block)
244+{
245+ dest[0] = av_clip_uint8(dest[0] + ((block[0] + 4)>>3));
246+}
247+
248+av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
249+{
250+ const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;
251+
252+ if (avctx->lowres==1) {
253+ c->idct_put = ff_jref_idct4_put;
254+ c->idct_add = ff_jref_idct4_add;
255+ c->idct = ff_j_rev_dct4;
256+ c->idct_permutation_type = FF_NO_IDCT_PERM;
257+ } else if (avctx->lowres==2) {
258+ c->idct_put = ff_jref_idct2_put;
259+ c->idct_add = ff_jref_idct2_add;
260+ c->idct = ff_j_rev_dct2;
261+ c->idct_permutation_type = FF_NO_IDCT_PERM;
262+ } else if (avctx->lowres==3) {
263+ c->idct_put = ff_jref_idct1_put;
264+ c->idct_add = ff_jref_idct1_add;
265+ c->idct = ff_j_rev_dct1;
266+ c->idct_permutation_type = FF_NO_IDCT_PERM;
267+ } else {
268+ if (avctx->bits_per_raw_sample == 10) {
269+ c->idct_put = ff_simple_idct_put_10;
270+ c->idct_add = ff_simple_idct_add_10;
271+ c->idct = ff_simple_idct_10;
272+ c->idct_permutation_type = FF_NO_IDCT_PERM;
273+ } else if (avctx->bits_per_raw_sample == 12) {
274+ c->idct_put = ff_simple_idct_put_12;
275+ c->idct_add = ff_simple_idct_add_12;
276+ c->idct = ff_simple_idct_12;
277+ c->idct_permutation_type = FF_NO_IDCT_PERM;
278+ } else {
279+ if (avctx->idct_algo == FF_IDCT_INT) {
280+ c->idct_put = jref_idct_put;
281+ c->idct_add = jref_idct_add;
282+ c->idct = ff_j_rev_dct;
283+ c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
284+ } else if (avctx->idct_algo == FF_IDCT_FAAN) {
285+ c->idct_put = ff_faanidct_put;
286+ c->idct_add = ff_faanidct_add;
287+ c->idct = ff_faanidct;
288+ c->idct_permutation_type = FF_NO_IDCT_PERM;
289+ } else { // accurate/default
290+ c->idct_put = ff_simple_idct_put_8;
291+ c->idct_add = ff_simple_idct_add_8;
292+ c->idct = ff_simple_idct_8;
293+ c->idct_permutation_type = FF_NO_IDCT_PERM;
294+ }
295+ }
296+ }
297+
298+ c->put_pixels_clamped = put_pixels_clamped_c;
299+ c->put_signed_pixels_clamped = put_signed_pixels_clamped_c;
300+ c->add_pixels_clamped = add_pixels_clamped_c;
301+
302+ if (ARCH_ARM)
303+ ff_idctdsp_init_arm(c, avctx, high_bit_depth);
304+ if (ARCH_PPC)
305+ ff_idctdsp_init_ppc(c, avctx, high_bit_depth);
306+ if (ARCH_X86)
307+ ff_idctdsp_init_x86(c, avctx, high_bit_depth);
308+
309+ ff_init_scantable_permutation(c->idct_permutation,
310+ c->idct_permutation_type);
311+}
libavcodec/idctdsp.h+104−0
@@ -0,0 +1,104 @@
1+/*
2+ * This file is part of FFmpeg.
3+ *
4+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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+4−3
@@ -25,6 +25,7 @@ · 24 unmodified lines
2525 #include "avcodec.h"
2626 #include "error_resilience.h"
2727 #include "get_bits.h"
28+#include "idctdsp.h"
2829 #include "mpegvideo.h"
2930 #include "msmpeg4data.h"
3031 #include "intrax8huf.h"
@@ -643,9 +644,9 @@ static int x8_decode_intra_mb(IntraX8Context* const w, const int chroma){ · 612 unmodified lines
643644 s->current_picture.f->linesize[!!chroma] );
644645 }
645646 if(!zeros_only)
646− w->wdsp.idct_add (s->dest[chroma],
647− s->current_picture.f->linesize[!!chroma],
648− s->block[0] );
647+ w->wdsp.idct_add(s->dest[chroma],
648+ s->current_picture.f->linesize[!!chroma],
649+ s->block[0]);
649650
650651 block_placed:
651652
libavcodec/libavcodec.v+1−0
@@ -27,5 +27,6 @@ LIBAVCODEC_$MAJOR { · 26 unmodified lines
2727 ff_jpeg_fdct*;
2828 ff_dnxhd_get_cid_table;
2929 ff_dnxhd_cid_table;
30+ ff_idctdsp_init;
3031 local: *;
3132 };
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
@@ -294,8 +294,9 @@ static av_cold int ljpeg_encode_init(AVCodecContext *avctx) · 244 unmodified lines
294294
295295 s->scratch = av_malloc_array(avctx->width + 1, sizeof(*s->scratch));
296296
297− ff_dsputil_init(&s->dsp, avctx);
298− ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
297+ ff_idctdsp_init(&s->idsp, avctx);
298+ ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
299+ ff_zigzag_direct);
299300
300301 ff_mjpeg_init_hvsample(avctx, s->hsample, s->vsample);
301302
libavcodec/mdec.c+11−9
@@ -30,6 +30,7 @@ · 29 unmodified lines
3030 #include "avcodec.h"
3131 #include "blockdsp.h"
3232 #include "bswapdsp.h"
33+#include "idctdsp.h"
3334 #include "mpegvideo.h"
3435 #include "mpeg12.h"
3536 #include "thread.h"
@@ -38,7 +39,7 @@ typedef struct MDECContext { · 2 unmodified lines
3839 AVCodecContext *avctx;
3940 BlockDSPContext bdsp;
4041 BswapDSPContext bbdsp;
41− DSPContext dsp;
42+ IDCTDSPContext idsp;
4243 ThreadFrame frame;
4344 GetBitContext gb;
4445 ScanTable scantable;
@@ -148,14 +149,14 @@ static inline void idct_put(MDECContext *a, AVFrame *frame, int mb_x, int mb_y) · 103 unmodified lines
148149 uint8_t *dest_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8;
149150 uint8_t *dest_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8;
150151
151− a->dsp.idct_put(dest_y, linesize, block[0]);
152− a->dsp.idct_put(dest_y + 8, linesize, block[1]);
153− a->dsp.idct_put(dest_y + 8 * linesize, linesize, block[2]);
154− a->dsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]);
152+ a->idsp.idct_put(dest_y, linesize, block[0]);
153+ a->idsp.idct_put(dest_y + 8, linesize, block[1]);
154+ a->idsp.idct_put(dest_y + 8 * linesize, linesize, block[2]);
155+ a->idsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]);
155156
156157 if (!(a->avctx->flags & CODEC_FLAG_GRAY)) {
157− a->dsp.idct_put(dest_cb, frame->linesize[1], block[4]);
158− a->dsp.idct_put(dest_cr, frame->linesize[2], block[5]);
158+ a->idsp.idct_put(dest_cb, frame->linesize[1], block[4]);
159+ a->idsp.idct_put(dest_cr, frame->linesize[2], block[5]);
159160 }
160161 }
161162
@@ -214,9 +215,10 @@ static av_cold int decode_init(AVCodecContext *avctx) · 52 unmodified lines
214215
215216 ff_blockdsp_init(&a->bdsp, avctx);
216217 ff_bswapdsp_init(&a->bbdsp);
217− ff_dsputil_init(&a->dsp, avctx);
218+ ff_idctdsp_init(&a->idsp, avctx);
218219 ff_mpeg12_init_vlcs();
219− ff_init_scantable(a->dsp.idct_permutation, &a->scantable, ff_zigzag_direct);
220+ ff_init_scantable(a->idsp.idct_permutation, &a->scantable,
221+ ff_zigzag_direct);
220222
221223 if (avctx->idct_algo == FF_IDCT_AUTO)
222224 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 */
@@ -152,9 +152,9 @@ static av_cold int mimic_decode_init(AVCodecContext *avctx) · 88 unmodified lines
152152 }
153153 ff_blockdsp_init(&ctx->bdsp, avctx);
154154 ff_bswapdsp_init(&ctx->bbdsp);
155− ff_dsputil_init(&ctx->dsp, avctx);
156155 ff_hpeldsp_init(&ctx->hdsp, avctx->flags);
157− ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, col_zag);
156+ ff_idctdsp_init(&ctx->idsp, avctx);
157+ ff_init_scantable(ctx->idsp.idct_permutation, &ctx->scantable, col_zag);
158158
159159 for (i = 0; i < FF_ARRAY_ELEMS(ctx->frames); i++) {
160160 ctx->frames[i].f = av_frame_alloc();
@@ -303,7 +303,7 @@ static int decode(MimicContext *ctx, int quality, int num_coeffs, · 142 unmodified lines
303303 "block.\n");
304304 return ret;
305305 }
306− ctx->dsp.idct_put(dst, stride, ctx->dct_block);
306+ ctx->idsp.idct_put(dst, stride, ctx->dct_block);
307307 } else {
308308 unsigned int backref = get_bits(&ctx->gb, 4);
309309 int index = (ctx->cur_index + backref) & 15;
libavcodec/mjpegdec.c+6−4
@@ -36,6 +36,7 @@ · 35 unmodified lines
3636 #include "avcodec.h"
3737 #include "blockdsp.h"
3838 #include "copy_block.h"
39+#include "idctdsp.h"
3940 #include "internal.h"
4041 #include "mjpeg.h"
4142 #include "mjpegdec.h"
@@ -109,8 +110,9 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) · 67 unmodified lines
109110 s->avctx = avctx;
110111 ff_blockdsp_init(&s->bdsp, avctx);
111112 ff_hpeldsp_init(&s->hdsp, avctx->flags);
112− ff_dsputil_init(&s->dsp, avctx);
113− ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
113+ ff_idctdsp_init(&s->idsp, avctx);
114+ ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
115+ ff_zigzag_direct);
114116 s->buffer_size = 0;
115117 s->buffer = NULL;
116118 s->start_code = -1;
@@ -1228,7 +1230,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah, · 1111 unmodified lines
12281230 "error y=%d x=%d\n", mb_y, mb_x);
12291231 return AVERROR_INVALIDDATA;
12301232 }
1231− s->dsp.idct_put(ptr, linesize[c], s->block);
1233+ s->idsp.idct_put(ptr, linesize[c], s->block);
12321234 if (s->bits & 7)
12331235 shift_output(s, ptr, linesize[c]);
12341236 }
@@ -1315,7 +1317,7 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss, · 80 unmodified lines
13151317 }
13161318
13171319 if (last_scan) {
1318− s->dsp.idct_put(ptr, linesize, *block);
1320+ s->idsp.idct_put(ptr, linesize, *block);
13191321 if (s->bits & 7)
13201322 shift_output(s, ptr, linesize);
13211323 ptr += bytes_per_pixel*8 >> s->avctx->lowres;
libavcodec/mjpegdec.h+2−2
@@ -36,8 +36,8 @@ · 35 unmodified lines
3636 #include "avcodec.h"
3737 #include "blockdsp.h"
3838 #include "get_bits.h"
39−#include "dsputil.h"
4039 #include "hpeldsp.h"
40+#include "idctdsp.h"
4141
4242 #define MAX_COMPONENTS 4
4343
@@ -106,8 +106,8 @@ typedef struct MJpegDecodeContext { · 62 unmodified lines
106106 int palette_index;
107107 ScanTable scantable;
108108 BlockDSPContext bdsp;
109− DSPContext dsp;
110109 HpelDSPContext hdsp;
110+ IDCTDSPContext idsp;
111111
112112 int restart_interval;
113113 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 "mpegvideo.h"
2929 #include "put_bits.h"
3030
libavcodec/mpeg12dec.c+15−15
@@ -34,8 +34,8 @@ · 33 unmodified lines
3434
3535 #include "avcodec.h"
3636 #include "bytestream.h"
37−#include "dsputil.h"
3837 #include "error_resilience.h"
38+#include "idctdsp.h"
3939 #include "internal.h"
4040 #include "mpeg_er.h"
4141 #include "mpeg12.h"
@@ -1121,7 +1121,7 @@ static av_cold int mpeg_decode_init(AVCodecContext *avctx) · 1079 unmodified lines
11211121 /* we need some permutation to store matrices,
11221122 * until MPV_common_init() sets the real permutation. */
11231123 for (i = 0; i < 64; i++)
1124− s2->dsp.idct_permutation[i] = i;
1124+ s2->idsp.idct_permutation[i] = i;
11251125
11261126 ff_MPV_decode_defaults(s2);
11271127
@@ -1355,15 +1355,15 @@ static int mpeg_decode_postinit(AVCodecContext *avctx) · 227 unmodified lines
13551355
13561356 /* Quantization matrices may need reordering
13571357 * if DCT permutation is changed. */
1358− memcpy(old_permutation, s->dsp.idct_permutation, 64 * sizeof(uint8_t));
1358+ memcpy(old_permutation, s->idsp.idct_permutation, 64 * sizeof(uint8_t));
13591359
13601360 if (ff_MPV_common_init(s) < 0)
13611361 return -2;
13621362
1363− quant_matrix_rebuild(s->intra_matrix, old_permutation, s->dsp.idct_permutation);
1364− quant_matrix_rebuild(s->inter_matrix, old_permutation, s->dsp.idct_permutation);
1365− quant_matrix_rebuild(s->chroma_intra_matrix, old_permutation, s->dsp.idct_permutation);
1366− quant_matrix_rebuild(s->chroma_inter_matrix, old_permutation, s->dsp.idct_permutation);
1363+ quant_matrix_rebuild(s->intra_matrix, old_permutation, s->idsp.idct_permutation);
1364+ quant_matrix_rebuild(s->inter_matrix, old_permutation, s->idsp.idct_permutation);
1365+ quant_matrix_rebuild(s->chroma_intra_matrix, old_permutation, s->idsp.idct_permutation);
1366+ quant_matrix_rebuild(s->chroma_inter_matrix, old_permutation, s->idsp.idct_permutation);
13671367
13681368 s1->mpeg_enc_ctx_allocated = 1;
13691369 }
@@ -1518,7 +1518,7 @@ static int load_matrix(MpegEncContext *s, uint16_t matrix0[64], · 148 unmodified lines
15181518 int i;
15191519
15201520 for (i = 0; i < 64; i++) {
1521− int j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1521+ int j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
15221522 int v = get_bits(&s->gb, 8);
15231523 if (v == 0) {
15241524 av_log(s->avctx, AV_LOG_ERROR, "matrix damaged\n");
@@ -1589,11 +1589,11 @@ static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1) · 64 unmodified lines
15891589 s->progressive_frame = get_bits1(&s->gb);
15901590
15911591 if (s->alternate_scan) {
1592− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
1593− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
1592+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
1593+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
15941594 } else {
1595− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
1596− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
1595+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
1596+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
15971597 }
15981598
15991599 /* composite display not parsed */
@@ -2096,7 +2096,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, · 496 unmodified lines
20962096 load_matrix(s, s->chroma_intra_matrix, s->intra_matrix, 1);
20972097 } else {
20982098 for (i = 0; i < 64; i++) {
2099− j = s->dsp.idct_permutation[i];
2099+ j = s->idsp.idct_permutation[i];
21002100 v = ff_mpeg1_default_intra_matrix[i];
21012101 s->intra_matrix[j] = v;
21022102 s->chroma_intra_matrix[j] = v;
@@ -2106,7 +2106,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, · 3 unmodified lines
21062106 load_matrix(s, s->chroma_inter_matrix, s->inter_matrix, 0);
21072107 } else {
21082108 for (i = 0; i < 64; i++) {
2109− int j = s->dsp.idct_permutation[i];
2109+ int j = s->idsp.idct_permutation[i];
21102110 v = ff_mpeg1_default_non_intra_matrix[i];
21112111 s->inter_matrix[j] = v;
21122112 s->chroma_inter_matrix[j] = v;
@@ -2164,7 +2164,7 @@ static int vcr2_init_sequence(AVCodecContext *avctx) · 51 unmodified lines
21642164 s1->mpeg_enc_ctx_allocated = 1;
21652165
21662166 for (i = 0; i < 64; i++) {
2167− int j = s->dsp.idct_permutation[i];
2167+ int j = s->idsp.idct_permutation[i];
21682168 v = ff_mpeg1_default_intra_matrix[i];
21692169 s->intra_matrix[j] = v;
21702170 s->chroma_intra_matrix[j] = v;
libavcodec/mpeg4videodec.c+20−19
@@ -24,6 +24,7 @@ · 23 unmodified lines
2424
2525 #include "libavutil/opt.h"
2626 #include "error_resilience.h"
27+#include "idctdsp.h"
2728 #include "internal.h"
2829 #include "mpegutils.h"
2930 #include "mpegvideo.h"
@@ -74,11 +75,11 @@ void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir) · 44 unmodified lines
7475 n == 1 || n == 3) {
7576 /* same qscale */
7677 for (i = 1; i < 8; i++)
77− block[s->dsp.idct_permutation[i << 3]] += ac_val[i];
78+ block[s->idsp.idct_permutation[i << 3]] += ac_val[i];
7879 } else {
7980 /* different qscale, we must rescale */
8081 for (i = 1; i < 8; i++)
81− block[s->dsp.idct_permutation[i << 3]] += ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale);
82+ block[s->idsp.idct_permutation[i << 3]] += ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale);
8283 }
8384 } else {
8485 const int xy = s->mb_x + s->mb_y * s->mb_stride - s->mb_stride;
@@ -89,21 +90,21 @@ void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir) · 4 unmodified lines
8990 n == 2 || n == 3) {
9091 /* same qscale */
9192 for (i = 1; i < 8; i++)
92− block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
93+ block[s->idsp.idct_permutation[i]] += ac_val[i + 8];
9394 } else {
9495 /* different qscale, we must rescale */
9596 for (i = 1; i < 8; i++)
96− block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale);
97+ block[s->idsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale);
9798 }
9899 }
99100 }
100101 /* left copy */
101102 for (i = 1; i < 8; i++)
102− ac_val1[i] = block[s->dsp.idct_permutation[i << 3]];
103+ ac_val1[i] = block[s->idsp.idct_permutation[i << 3]];
103104
104105 /* top copy */
105106 for (i = 1; i < 8; i++)
106− ac_val1[8 + i] = block[s->dsp.idct_permutation[i]];
107+ ac_val1[8 + i] = block[s->idsp.idct_permutation[i]];
107108 }
108109
109110 /**
@@ -1856,7 +1857,7 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) · 1746 unmodified lines
18561857
18571858 /* load default matrixes */
18581859 for (i = 0; i < 64; i++) {
1859− int j = s->dsp.idct_permutation[i];
1860+ int j = s->idsp.idct_permutation[i];
18601861 v = ff_mpeg4_default_intra_matrix[i];
18611862 s->intra_matrix[j] = v;
18621863 s->chroma_intra_matrix[j] = v;
@@ -1876,14 +1877,14 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) · 13 unmodified lines
18761877 break;
18771878
18781879 last = v;
1879− j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1880+ j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
18801881 s->intra_matrix[j] = last;
18811882 s->chroma_intra_matrix[j] = last;
18821883 }
18831884
18841885 /* replicate last value */
18851886 for (; i < 64; i++) {
1886− int j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1887+ int j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
18871888 s->intra_matrix[j] = last;
18881889 s->chroma_intra_matrix[j] = last;
18891890 }
@@ -1899,14 +1900,14 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) · 9 unmodified lines
18991900 break;
19001901
19011902 last = v;
1902− j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1903+ j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
19031904 s->inter_matrix[j] = v;
19041905 s->chroma_inter_matrix[j] = v;
19051906 }
19061907
19071908 /* replicate last value */
19081909 for (; i < 64; i++) {
1909− int j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
1910+ int j = s->idsp.idct_permutation[ff_zigzag_direct[i]];
19101911 s->inter_matrix[j] = last;
19111912 s->chroma_inter_matrix[j] = last;
19121913 }
@@ -2382,15 +2383,15 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) · 469 unmodified lines
23822383 }
23832384
23842385 if (s->alternate_scan) {
2385− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
2386− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
2387− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
2388− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
2386+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
2387+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
2388+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
2389+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
23892390 } else {
2390− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
2391− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
2392− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
2393− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
2391+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
2392+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
2393+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
2394+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
23942395 }
23952396
23962397 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,8 +34,8 @@ · 33 unmodified lines
3434 #include "libavutil/timer.h"
3535 #include "avcodec.h"
3636 #include "blockdsp.h"
37−#include "dsputil.h"
3837 #include "h264chroma.h"
38+#include "idctdsp.h"
3939 #include "internal.h"
4040 #include "mathops.h"
4141 #include "mpegutils.h"
@@ -383,6 +383,7 @@ av_cold int ff_dct_common_init(MpegEncContext *s) · 341 unmodified lines
383383 ff_dsputil_init(&s->dsp, s->avctx);
384384 ff_h264chroma_init(&s->h264chroma, 8); //for lowres
385385 ff_hpeldsp_init(&s->hdsp, s->avctx->flags);
386+ ff_idctdsp_init(&s->idsp, s->avctx);
386387 ff_mpegvideodsp_init(&s->mdsp);
387388 ff_videodsp_init(&s->vdsp, s->avctx->bits_per_raw_sample);
388389
@@ -421,14 +422,14 @@ av_cold int ff_dct_common_init(MpegEncContext *s) · 32 unmodified lines
421422 * note: only wmv uses different ones
422423 */
423424 if (s->alternate_scan) {
424− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
425− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
425+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
426+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
426427 } else {
427− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
428− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
428+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
429+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
429430 }
430− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
431− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
431+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
432+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
432433
433434 return 0;
434435 }
@@ -2797,7 +2798,7 @@ static inline void put_dct(MpegEncContext *s, · 2362 unmodified lines
27972798 int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
27982799 {
27992800 s->dct_unquantize_intra(s, block, i, qscale);
2800− s->dsp.idct_put (dest, line_size, block);
2801+ s->idsp.idct_put(dest, line_size, block);
28012802 }
28022803
28032804 /* add block[] to dest[] */
@@ -2805,7 +2806,7 @@ static inline void add_dct(MpegEncContext *s, · 1 unmodified line
28052806 int16_t *block, int i, uint8_t *dest, int line_size)
28062807 {
28072808 if (s->block_last_index[i] >= 0) {
2808− s->dsp.idct_add (dest, line_size, block);
2809+ s->idsp.idct_add(dest, line_size, block);
28092810 }
28102811 }
28112812
@@ -2815,7 +2816,7 @@ static inline void add_dequant_dct(MpegEncContext *s, · 3 unmodified lines
28152816 if (s->block_last_index[i] >= 0) {
28162817 s->dct_unquantize_inter(s, block, i, qscale);
28172818
2818− s->dsp.idct_add (dest, line_size, block);
2819+ s->idsp.idct_add(dest, line_size, block);
28192820 }
28202821 }
28212822
@@ -2880,7 +2881,8 @@ void MPV_decode_mb_internal(MpegEncContext *s, int16_t block[12][64], · 58 unmodified lines
28802881 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
28812882 for(i=0; i<6; i++){
28822883 for(j=0; j<64; j++){
2883− av_log(s->avctx, AV_LOG_DEBUG, "%5d", block[i][s->dsp.idct_permutation[j]]);
2884+ av_log(s->avctx, AV_LOG_DEBUG, "%5d",
2885+ block[i][s->idsp.idct_permutation[j]]);
28842886 }
28852887 av_log(s->avctx, AV_LOG_DEBUG, "\n");
28862888 }
@@ -3071,29 +3073,29 @@ void MPV_decode_mb_internal(MpegEncContext *s, int16_t block[12][64], · 184 unmodified lines
30713073 }
30723074 }
30733075 }else{
3074− s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3075− s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
3076− s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3077− s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
3076+ s->idsp.idct_put(dest_y, dct_linesize, block[0]);
3077+ s->idsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
3078+ s->idsp.idct_put(dest_y + dct_offset, dct_linesize, block[2]);
3079+ s->idsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
30783080
30793081 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
30803082 if(s->chroma_y_shift){
3081− s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3082− s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3083+ s->idsp.idct_put(dest_cb, uvlinesize, block[4]);
3084+ s->idsp.idct_put(dest_cr, uvlinesize, block[5]);
30833085 }else{
30843086
30853087 dct_linesize = uvlinesize << s->interlaced_dct;
30863088 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
30873089
3088− s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
3089− s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
3090− s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3091− s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3090+ s->idsp.idct_put(dest_cb, dct_linesize, block[4]);
3091+ s->idsp.idct_put(dest_cr, dct_linesize, block[5]);
3092+ s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3093+ s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
30923094 if(!s->chroma_x_shift){//Chroma444
3093− s->dsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
3094− s->dsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
3095− s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
3096− s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
3095+ s->idsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
3096+ s->idsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
3097+ s->idsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
3098+ s->idsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
30973099 }
30983100 }
30993101 }//gray
libavcodec/mpegvideo.h+2−0
@@ -36,6 +36,7 @@ · 35 unmodified lines
3636 #include "h264chroma.h"
3737 #include "h263dsp.h"
3838 #include "hpeldsp.h"
39+#include "idctdsp.h"
3940 #include "mpegvideodsp.h"
4041 #include "put_bits.h"
4142 #include "ratecontrol.h"
@@ -362,6 +363,7 @@ typedef struct MpegEncContext { · 320 unmodified lines
362363 DSPContext dsp; ///< pointers for accelerated dsp functions
363364 H264ChromaContext h264chroma;
364365 HpelDSPContext hdsp;
366+ IDCTDSPContext idsp;
365367 MpegVideoDSPContext mdsp;
366368 QpelDSPContext qdsp;
367369 VideoDSPContext vdsp;
libavcodec/mpegvideo_enc.c+12−10
@@ -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"
@@ -87,7 +88,7 @@ void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], · 43 unmodified lines
8788 dsp->fdct == ff_jpeg_fdct_islow_10 ||
8889 dsp->fdct == ff_faandct) {
8990 for (i = 0; i < 64; i++) {
90− const int j = dsp->idct_permutation[i];
91+ const int j = s->idsp.idct_permutation[i];
9192 /* 16 <= qscale * quant_matrix[i] <= 7905
9293 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
9394 * 19952 <= x <= 249205026
@@ -99,7 +100,7 @@ void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], · 5 unmodified lines
99100 }
100101 } else if (dsp->fdct == ff_fdct_ifast) {
101102 for (i = 0; i < 64; i++) {
102− const int j = dsp->idct_permutation[i];
103+ const int j = s->idsp.idct_permutation[i];
103104 /* 16 <= qscale * quant_matrix[i] <= 7905
104105 * Assume x = ff_aanscales[i] * qscale * quant_matrix[i]
105106 * 19952 <= x <= 249205026
@@ -111,7 +112,7 @@ void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], · 5 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
@@ -866,7 +867,7 @@ av_cold int ff_MPV_encode_init(AVCodecContext *avctx) · 748 unmodified lines
866867
867868 /* init q matrix */
868869 for (i = 0; i < 64; i++) {
869− int j = s->dsp.idct_permutation[i];
870+ int j = s->idsp.idct_permutation[i];
870871 if (CONFIG_MPEG4_ENCODER && s->codec_id == AV_CODEC_ID_MPEG4 &&
871872 s->mpeg_quant) {
872873 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
@@ -3553,7 +3554,7 @@ static int encode_picture(MpegEncContext *s, int picture_number) · 2680 unmodified lines
35533554
35543555 /* for mjpeg, we do include qscale in the matrix */
35553556 for(i=1;i<64;i++){
3556− int j= s->dsp.idct_permutation[i];
3557+ int j = s->idsp.idct_permutation[i];
35573558
35583559 s->chroma_intra_matrix[j] = av_clip_uint8((chroma_matrix[i] * s->qscale) >> 3);
35593560 s-> intra_matrix[j] = av_clip_uint8(( luma_matrix[i] * s->qscale) >> 3);
@@ -3572,7 +3573,7 @@ static int encode_picture(MpegEncContext *s, int picture_number) · 12 unmodified lines
35723573 static const uint8_t y[32]={13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13};
35733574 static const uint8_t c[32]={14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14};
35743575 for(i=1;i<64;i++){
3575− int j= s->dsp.idct_permutation[ff_zigzag_direct[i]];
3576+ int j= s->idsp.idct_permutation[ff_zigzag_direct[i]];
35763577
35773578 s->intra_matrix[j] = sp5x_quant_table[5*2+0][i];
35783579 s->chroma_intra_matrix[j] = sp5x_quant_table[5*2+1][i];
@@ -3806,7 +3807,7 @@ static int dct_quantize_trellis_c(MpegEncContext *s, · 227 unmodified lines
38063807 if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
38073808 unquant_coeff= alevel*qmul + qadd;
38083809 }else{ //MPEG1
3809− j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
3810+ j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
38103811 if(s->mb_intra){
38113812 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
38123813 unquant_coeff = (unquant_coeff - 1) | 1;
@@ -4012,7 +4013,7 @@ static int messed_sign=0; · 199 unmodified lines
40124013 #endif
40134014
40144015 if(basis[0][0] == 0)
4015− build_basis(s->dsp.idct_permutation);
4016+ build_basis(s->idsp.idct_permutation);
40164017
40174018 qmul= qscale*2;
40184019 qadd= (qscale-1)|1;
@@ -4431,8 +4432,9 @@ int ff_dct_quantize_c(MpegEncContext *s, · 412 unmodified lines
44314432 *overflow= s->max_qcoeff < max; //overflow might have happened
44324433
44334434 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
4434− if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
4435− ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
4435+ if (s->idsp.idct_permutation_type != FF_NO_IDCT_PERM)
4436+ ff_block_permute(block, s->idsp.idct_permutation,
4437+ scantable, last_non_zero);
44364438
44374439 return last_non_zero;
44384440 }
libavcodec/mpegvideo_xvmc.c+1−1
@@ -320,7 +320,7 @@ static void ff_xvmc_decode_mb(struct MpegEncContext *s) · 319 unmodified lines
320320 if (s->mb_intra && (render->idct || !render->unsigned_intra))
321321 *s->pblocks[i][0] -= 1 << 10;
322322 if (!render->idct) {
323− s->dsp.idct(*s->pblocks[i]);
323+ s->idsp.idct(*s->pblocks[i]);
324324 /* It is unclear if MC hardware requires pixel diff values to be
325325 * in the range [-255;255]. TODO: Clipping if such hardware is
326326 * 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"
@@ -138,10 +138,10 @@ av_cold void ff_msmpeg4_common_init(MpegEncContext *s) · 103 unmodified lines
138138
139139
140140 if(s->msmpeg4_version>=4){
141− ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_wmv1_scantable[1]);
142− ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_wmv1_scantable[2]);
143− ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_wmv1_scantable[3]);
144− ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_wmv1_scantable[0]);
141+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_wmv1_scantable[1]);
142+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_wmv1_scantable[2]);
143+ ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_wmv1_scantable[3]);
144+ ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_wmv1_scantable[0]);
145145 }
146146 //Note the default tables are set in common_init in mpegvideo.c
147147
libavcodec/nuv.c+1−0
@@ -29,6 +29,7 @@ · 28 unmodified lines
2929 #include "libavutil/lzo.h"
3030 #include "libavutil/imgutils.h"
3131 #include "avcodec.h"
32+#include "idctdsp.h"
3233 #include "internal.h"
3334 #include "rtjpeg.h"
3435
libavcodec/ppc/Makefile+1−1
@@ -9,6 +9,7 @@ OBJS-$(CONFIG_H264DSP) += ppc/h264dsp.o ppc/hpeldsp_altivec.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 FFT-OBJS-$(HAVE_VSX) += ppc/fft_vsx.o
libavcodec/ppc/dsputil_altivec.h+0−4
@@ -29,10 +29,6 @@ · 28 unmodified lines
2929
3030 void ff_fdct_altivec(int16_t *block);
3131
32−void ff_idct_altivec(int16_t *block);
33−void ff_idct_put_altivec(uint8_t *dest, int line_size, int16_t *block);
34−void ff_idct_add_altivec(uint8_t *dest, int line_size, int16_t *block);
35−
3632 void ff_dsputil_init_altivec(DSPContext *c, AVCodecContext *avctx,
3733 unsigned high_bit_depth);
3834
libavcodec/ppc/dsputil_ppc.c+0−9
@@ -43,15 +43,6 @@ av_cold void ff_dsputil_init_ppc(DSPContext *c, AVCodecContext *avctx, · 42 unmodified lines
4343 c->fdct = ff_fdct_altivec;
4444 }
4545 #endif //CONFIG_ENCODERS
46− if (avctx->lowres == 0) {
47− if ((avctx->idct_algo == FF_IDCT_AUTO) ||
48− (avctx->idct_algo == FF_IDCT_ALTIVEC)) {
49− c->idct = ff_idct_altivec;
50− c->idct_put = ff_idct_put_altivec;
51− c->idct_add = ff_idct_add_altivec;
52− c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
53− }
54− }
5546 }
5647 }
5748 }
libavcodec/ppc/idctdsp.crenamed from libavcodec/ppc/idct_altivec.c+29−4
@@ -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_altivec(int16_t *blk)
156+static void idct_altivec(int16_t *blk)
152157 {
153158 vec_s16 *block = (vec_s16 *) blk;
154159
@@ -164,7 +169,7 @@ void ff_idct_altivec(int16_t *blk) · 9 unmodified lines
164169 block[7] = vx7;
165170 }
166171
167−void ff_idct_put_altivec(uint8_t *dest, int stride, int16_t *blk)
172+static void idct_put_altivec(uint8_t *dest, int stride, int16_t *blk)
168173 {
169174 vec_s16 *block = (vec_s16 *) blk;
170175 vec_u8 tmp;
@@ -193,7 +198,7 @@ void ff_idct_put_altivec(uint8_t *dest, int stride, int16_t *blk) · 22 unmodified lines
193198 COPY(dest, vx7);
194199 }
195200
196−void ff_idct_add_altivec(uint8_t *dest, int stride, int16_t *blk)
201+static void idct_add_altivec(uint8_t *dest, int stride, int16_t *blk)
197202 {
198203 vec_s16 *block = (vec_s16 *) blk;
199204 vec_u8 tmp;
@@ -235,3 +240,23 @@ void ff_idct_add_altivec(uint8_t *dest, int stride, int16_t *blk) · 35 unmodified lines
235240 dest += stride;
236241 ADD(dest, vx7, perm1);
237242 }
243+
244+#endif /* HAVE_ALTIVEC */
245+
246+av_cold void ff_idctdsp_init_ppc(IDCTDSPContext *c, AVCodecContext *avctx,
247+ unsigned high_bit_depth)
248+{
249+#if HAVE_ALTIVEC
250+ if (PPC_ALTIVEC(av_get_cpu_flags())) {
251+ if (!high_bit_depth && avctx->lowres == 0) {
252+ if ((avctx->idct_algo == FF_IDCT_AUTO) ||
253+ (avctx->idct_algo == FF_IDCT_ALTIVEC)) {
254+ c->idct = idct_altivec;
255+ c->idct_add = idct_add_altivec;
256+ c->idct_put = idct_put_altivec;
257+ c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
258+ }
259+ }
260+ }
261+#endif /* HAVE_ALTIVEC */
262+}
libavcodec/proresdec2.c+1−0
@@ -30,6 +30,7 @@ · 29 unmodified lines
3030
3131 #include "avcodec.h"
3232 #include "get_bits.h"
33+#include "idctdsp.h"
3334 #include "internal.h"
3435 #include "simple_idct.h"
3536 #include "proresdec.h"
libavcodec/proresdec_lgpl.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/vaapi_mpeg2.c+1−1
@@ -90,7 +90,7 @@ static int vaapi_mpeg2_start_frame(AVCodecContext *avctx, av_unused const uint8_ · 89 unmodified lines
9090 iq_matrix->load_chroma_non_intra_quantiser_matrix = 1;
9191
9292 for (i = 0; i < 64; i++) {
93− int n = s->dsp.idct_permutation[ff_zigzag_direct[i]];
93+ int n = s->idsp.idct_permutation[ff_zigzag_direct[i]];
9494 iq_matrix->intra_quantiser_matrix[i] = s->intra_matrix[n];
9595 iq_matrix->non_intra_quantiser_matrix[i] = s->inter_matrix[n];
9696 iq_matrix->chroma_intra_quantiser_matrix[i] = s->chroma_intra_matrix[n];
libavcodec/vaapi_mpeg4.c+1−1
@@ -109,7 +109,7 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx, av_unused const uint8_ · 108 unmodified lines
109109 iq_matrix->load_non_intra_quant_mat = 1;
110110
111111 for (i = 0; i < 64; i++) {
112− int n = s->dsp.idct_permutation[ff_zigzag_direct[i]];
112+ int n = s->idsp.idct_permutation[ff_zigzag_direct[i]];
113113 iq_matrix->intra_quant_mat[i] = s->intra_matrix[n];
114114 iq_matrix->non_intra_quant_mat[i] = s->inter_matrix[n];
115115 }
libavcodec/vc1dec.c+69−47
@@ -97,24 +97,24 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) · 96 unmodified lines
9797 fieldtx = v->fieldtx_plane[topleft_mb_pos];
9898 stride_y = s->linesize << fieldtx;
9999 v_dist = (16 - fieldtx) >> (fieldtx == 0);
100− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
101− s->dest[0] - 16 * s->linesize - 16,
102− stride_y);
103− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
104− s->dest[0] - 16 * s->linesize - 8,
105− stride_y);
106− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
107− s->dest[0] - v_dist * s->linesize - 16,
108− stride_y);
109− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
110− s->dest[0] - v_dist * s->linesize - 8,
111− stride_y);
112− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
113− s->dest[1] - 8 * s->uvlinesize - 8,
114− s->uvlinesize);
115− s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
116− s->dest[2] - 8 * s->uvlinesize - 8,
117− s->uvlinesize);
100+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
101+ s->dest[0] - 16 * s->linesize - 16,
102+ stride_y);
103+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
104+ s->dest[0] - 16 * s->linesize - 8,
105+ stride_y);
106+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
107+ s->dest[0] - v_dist * s->linesize - 16,
108+ stride_y);
109+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
110+ s->dest[0] - v_dist * s->linesize - 8,
111+ stride_y);
112+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
113+ s->dest[1] - 8 * s->uvlinesize - 8,
114+ s->uvlinesize);
115+ s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
116+ s->dest[2] - 8 * s->uvlinesize - 8,
117+ s->uvlinesize);
118118 }
119119 if (s->mb_x == s->mb_width - 1) {
120120 top_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x;
@@ -122,24 +122,24 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) · 1 unmodified line
122122 fieldtx = v->fieldtx_plane[top_mb_pos];
123123 stride_y = s->linesize << fieldtx;
124124 v_dist = fieldtx ? 15 : 8;
125− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
126− s->dest[0] - 16 * s->linesize,
127− stride_y);
128− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
129− s->dest[0] - 16 * s->linesize + 8,
130− stride_y);
131− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
132− s->dest[0] - v_dist * s->linesize,
133− stride_y);
134− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
135− s->dest[0] - v_dist * s->linesize + 8,
136− stride_y);
137− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
138− s->dest[1] - 8 * s->uvlinesize,
139− s->uvlinesize);
140− s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
141− s->dest[2] - 8 * s->uvlinesize,
142− s->uvlinesize);
125+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
126+ s->dest[0] - 16 * s->linesize,
127+ stride_y);
128+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
129+ s->dest[0] - 16 * s->linesize + 8,
130+ stride_y);
131+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
132+ s->dest[0] - v_dist * s->linesize,
133+ stride_y);
134+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
135+ s->dest[0] - v_dist * s->linesize + 8,
136+ stride_y);
137+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
138+ s->dest[1] - 8 * s->uvlinesize,
139+ s->uvlinesize);
140+ s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
141+ s->dest[2] - 8 * s->uvlinesize,
142+ s->uvlinesize);
143143 }
144144 }
145145
@@ -3277,7 +3277,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, · 3131 unmodified lines
32773277 v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
32783278 else {
32793279 v->vc1dsp.vc1_inv_trans_8x8(block);
3280− s->dsp.add_pixels_clamped(block, dst, linesize);
3280+ s->idsp.add_pixels_clamped(block, dst, linesize);
32813281 }
32823282 }
32833283 break;
@@ -3608,7 +3608,10 @@ static int vc1_decode_p_mb(VC1Context *v) · 324 unmodified lines
36083608 if (v->rangeredfrm)
36093609 for (j = 0; j < 64; j++)
36103610 s->block[i][j] <<= 1;
3611− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
3611+ s->idsp.put_signed_pixels_clamped(s->block[i],
3612+ s->dest[dst_idx] + off,
3613+ i & 4 ? s->uvlinesize
3614+ : s->linesize);
36123615 if (v->pq >= 9 && v->overlap) {
36133616 if (v->c_avail)
36143617 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
@@ -3716,8 +3719,10 @@ static int vc1_decode_p_mb(VC1Context *v) · 101 unmodified lines
37163719 if (v->rangeredfrm)
37173720 for (j = 0; j < 64; j++)
37183721 s->block[i][j] <<= 1;
3719− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off,
3720− (i & 4) ? s->uvlinesize : s->linesize);
3722+ s->idsp.put_signed_pixels_clamped(s->block[i],
3723+ s->dest[dst_idx] + off,
3724+ (i & 4) ? s->uvlinesize
3725+ : s->linesize);
37213726 if (v->pq >= 9 && v->overlap) {
37223727 if (v->c_avail)
37233728 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
@@ -3866,7 +3871,9 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) · 142 unmodified lines
38663871 stride_y = s->uvlinesize;
38673872 off = 0;
38683873 }
3869− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
3874+ s->idsp.put_signed_pixels_clamped(s->block[i],
3875+ s->dest[dst_idx] + off,
3876+ stride_y);
38703877 //TODO: loop filter
38713878 }
38723879
@@ -4028,7 +4035,10 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) · 155 unmodified lines
40284035 continue;
40294036 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
40304037 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4031− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4038+ s->idsp.put_signed_pixels_clamped(s->block[i],
4039+ s->dest[dst_idx] + off,
4040+ (i & 4) ? s->uvlinesize
4041+ : s->linesize);
40324042 // TODO: loop filter
40334043 }
40344044 } else {
@@ -4230,7 +4240,10 @@ static void vc1_decode_b_mb(VC1Context *v) · 195 unmodified lines
42304240 if (v->rangeredfrm)
42314241 for (j = 0; j < 64; j++)
42324242 s->block[i][j] <<= 1;
4233− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
4243+ s->idsp.put_signed_pixels_clamped(s->block[i],
4244+ s->dest[dst_idx] + off,
4245+ i & 4 ? s->uvlinesize
4246+ : s->linesize);
42344247 } else if (val) {
42354248 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
42364249 first_block, s->dest[dst_idx] + off,
@@ -4302,7 +4315,10 @@ static void vc1_decode_b_mb_intfi(VC1Context *v) · 65 unmodified lines
43024315 for (j = 0; j < 64; j++)
43034316 s->block[i][j] <<= 1;
43044317 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
4305− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
4318+ s->idsp.put_signed_pixels_clamped(s->block[i],
4319+ s->dest[dst_idx] + off,
4320+ (i & 4) ? s->uvlinesize
4321+ : s->linesize);
43064322 // TODO: yet to perform loop filter
43074323 }
43084324 } else {
@@ -4528,7 +4544,9 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) · 219 unmodified lines
45284544 stride_y = s->uvlinesize;
45294545 off = 0;
45304546 }
4531− s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
4547+ s->idsp.put_signed_pixels_clamped(s->block[i],
4548+ s->dest[dst_idx] + off,
4549+ stride_y);
45324550 }
45334551 } else {
45344552 s->mb_intra = v->is_intra[s->mb_x] = 0;
@@ -4832,12 +4850,16 @@ static void vc1_decode_i_blocks(VC1Context *v) · 297 unmodified lines
48324850 if (v->rangeredfrm)
48334851 for (j = 0; j < 64; j++)
48344852 s->block[k][j] <<= 1;
4835− s->dsp.put_signed_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4853+ s->idsp.put_signed_pixels_clamped(s->block[k], dst[k],
4854+ k & 4 ? s->uvlinesize
4855+ : s->linesize);
48364856 } else {
48374857 if (v->rangeredfrm)
48384858 for (j = 0; j < 64; j++)
48394859 s->block[k][j] = (s->block[k][j] - 64) << 1;
4840− s->dsp.put_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
4860+ s->idsp.put_pixels_clamped(s->block[k], dst[k],
4861+ k & 4 ? s->uvlinesize
4862+ : s->linesize);
48414863 }
48424864 }
48434865
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+5−3
@@ -24,6 +24,7 @@ OBJS-$(CONFIG_LLAUDDSP) += x86/lossless_audiodsp_init.o · 23 unmodified lines
2424 OBJS-$(CONFIG_LLVIDDSP) += x86/lossless_videodsp_init.o
2525 OBJS-$(CONFIG_HUFFYUVDSP) += x86/huffyuvdsp_init.o
2626 OBJS-$(CONFIG_HUFFYUVENCDSP) += x86/huffyuvencdsp_mmx.o
27+OBJS-$(CONFIG_IDCTDSP) += x86/idctdsp_init.o
2728 OBJS-$(CONFIG_LPC) += x86/lpc.o
2829 OBJS-$(CONFIG_MPEGAUDIODSP) += x86/mpegaudiodsp.o
2930 OBJS-$(CONFIG_MPEGVIDEO) += x86/mpegvideo.o \
@@ -57,12 +58,13 @@ OBJS-$(CONFIG_VP8_DECODER) += x86/vp8dsp_init.o · 27 unmodified lines
5758 OBJS-$(CONFIG_VP9_DECODER) += x86/vp9dsp_init.o
5859 OBJS-$(CONFIG_WEBP_DECODER) += x86/vp8dsp_init.o
5960
60−MMX-OBJS-$(CONFIG_DSPUTIL) += x86/dsputil_mmx.o \
61+MMX-OBJS-$(CONFIG_DSPUTIL) += x86/dsputil_mmx.o
62+MMX-OBJS-$(CONFIG_DIRAC_DECODER) += x86/dirac_dwt.o
63+MMX-OBJS-$(CONFIG_HUFFYUVDSP) += x86/huffyuvdsp_mmx.o
64+MMX-OBJS-$(CONFIG_IDCTDSP) += x86/idctdsp_mmx.o \
6165 x86/idct_mmx_xvid.o \
6266 x86/idct_sse2_xvid.o \
6367 x86/simple_idct.o
64−MMX-OBJS-$(CONFIG_DIRAC_DECODER) += x86/dirac_dwt.o
65−MMX-OBJS-$(CONFIG_HUFFYUVDSP) += x86/huffyuvdsp_mmx.o
6668
6769 MMX-OBJS-$(CONFIG_SNOW_DECODER) += x86/snowdsp.o
6870 MMX-OBJS-$(CONFIG_SNOW_ENCODER) += x86/snowdsp.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−95
@@ -25,106 +25,17 @@ · 24 unmodified lines
2525 #include "libavutil/x86/cpu.h"
2626 #include "libavcodec/avcodec.h"
2727 #include "libavcodec/dsputil.h"
28−#include "libavcodec/simple_idct.h"
2928 #include "dsputil_x86.h"
30−#include "idct_xvid.h"
31−
32−/* Input permutation for the simple_idct_mmx */
33−static const uint8_t simple_mmx_permutation[64] = {
34− 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
35− 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
36− 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
37− 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
38− 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
39− 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
40− 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
41− 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
42−};
43−
44−static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 };
45−
46−av_cold int ff_init_scantable_permutation_x86(uint8_t *idct_permutation,
47− int idct_permutation_type)
48−{
49− int i;
50−
51− switch (idct_permutation_type) {
52− case FF_SIMPLE_IDCT_PERM:
53− for (i = 0; i < 64; i++)
54− idct_permutation[i] = simple_mmx_permutation[i];
55− return 1;
56− case FF_SSE2_IDCT_PERM:
57− for (i = 0; i < 64; i++)
58− idct_permutation[i] = (i & 0x38) | idct_sse2_row_perm[i & 7];
59− return 1;
60− }
61−
62− return 0;
63−}
6429
6530 static av_cold void dsputil_init_mmx(DSPContext *c, AVCodecContext *avctx,
6631 int cpu_flags, unsigned high_bit_depth)
6732 {
6833 #if HAVE_MMX_INLINE
69− c->put_pixels_clamped = ff_put_pixels_clamped_mmx;
70− c->add_pixels_clamped = ff_add_pixels_clamped_mmx;
71−
7234 if (!high_bit_depth) {
7335 c->draw_edges = ff_draw_edges_mmx;
7436 }
7537
76− if (avctx->lowres == 0 && !high_bit_depth) {
77− switch (avctx->idct_algo) {
78− case FF_IDCT_AUTO:
79− case FF_IDCT_SIMPLEAUTO:
80− case FF_IDCT_SIMPLEMMX:
81− c->idct_put = ff_simple_idct_put_mmx;
82− c->idct_add = ff_simple_idct_add_mmx;
83− c->idct = ff_simple_idct_mmx;
84− c->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
85− break;
86− case FF_IDCT_XVIDMMX:
87− c->idct_put = ff_idct_xvid_mmx_put;
88− c->idct_add = ff_idct_xvid_mmx_add;
89− c->idct = ff_idct_xvid_mmx;
90− break;
91− }
92− }
93−
9438 #endif /* HAVE_MMX_INLINE */
95−
96−#if HAVE_MMX_EXTERNAL
97− c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmx;
98−#endif /* HAVE_MMX_EXTERNAL */
99−}
100−
101−static av_cold void dsputil_init_mmxext(DSPContext *c, AVCodecContext *avctx,
102− int cpu_flags, unsigned high_bit_depth)
103−{
104−#if HAVE_MMXEXT_INLINE
105− if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX && avctx->lowres == 0) {
106− c->idct_put = ff_idct_xvid_mmxext_put;
107− c->idct_add = ff_idct_xvid_mmxext_add;
108− c->idct = ff_idct_xvid_mmxext;
109− }
110−#endif /* HAVE_MMXEXT_INLINE */
111−}
112−
113−static av_cold void dsputil_init_sse2(DSPContext *c, AVCodecContext *avctx,
114− int cpu_flags, unsigned high_bit_depth)
115−{
116−#if HAVE_SSE2_INLINE
117− if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX && avctx->lowres == 0) {
118− c->idct_put = ff_idct_xvid_sse2_put;
119− c->idct_add = ff_idct_xvid_sse2_add;
120− c->idct = ff_idct_xvid_sse2;
121− c->idct_permutation_type = FF_SSE2_IDCT_PERM;
122− }
123−#endif /* HAVE_SSE2_INLINE */
124−
125−#if HAVE_SSE2_EXTERNAL
126− c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_sse2;
127−#endif /* HAVE_SSE2_EXTERNAL */
12839 }
12940
13041 av_cold void ff_dsputil_init_x86(DSPContext *c, AVCodecContext *avctx,
@@ -135,12 +46,6 @@ av_cold void ff_dsputil_init_x86(DSPContext *c, AVCodecContext *avctx, · 4 unmodified lines
13546 if (X86_MMX(cpu_flags))
13647 dsputil_init_mmx(c, avctx, cpu_flags, high_bit_depth);
13748
138− if (X86_MMXEXT(cpu_flags))
139− dsputil_init_mmxext(c, avctx, cpu_flags, high_bit_depth);
140−
141− if (X86_SSE2(cpu_flags))
142− dsputil_init_sse2(c, avctx, cpu_flags, high_bit_depth);
143−
14449 if (CONFIG_ENCODERS)
14550 ff_dsputilenc_init_mmx(c, avctx, high_bit_depth);
14651 }
libavcodec/x86/dsputil_mmx.c+0−100
@@ -33,106 +33,6 @@ · 32 unmodified lines
3333
3434 #if HAVE_INLINE_ASM
3535
36−void ff_put_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
37− int line_size)
38−{
39− const int16_t *p;
40− uint8_t *pix;
41−
42− /* read the pixels */
43− p = block;
44− pix = pixels;
45− /* unrolled loop */
46− __asm__ volatile (
47− "movq (%3), %%mm0 \n\t"
48− "movq 8(%3), %%mm1 \n\t"
49− "movq 16(%3), %%mm2 \n\t"
50− "movq 24(%3), %%mm3 \n\t"
51− "movq 32(%3), %%mm4 \n\t"
52− "movq 40(%3), %%mm5 \n\t"
53− "movq 48(%3), %%mm6 \n\t"
54− "movq 56(%3), %%mm7 \n\t"
55− "packuswb %%mm1, %%mm0 \n\t"
56− "packuswb %%mm3, %%mm2 \n\t"
57− "packuswb %%mm5, %%mm4 \n\t"
58− "packuswb %%mm7, %%mm6 \n\t"
59− "movq %%mm0, (%0) \n\t"
60− "movq %%mm2, (%0, %1) \n\t"
61− "movq %%mm4, (%0, %1, 2) \n\t"
62− "movq %%mm6, (%0, %2) \n\t"
63− :: "r" (pix), "r" ((x86_reg) line_size), "r" ((x86_reg) line_size * 3),
64− "r" (p)
65− : "memory");
66− pix += line_size * 4;
67− p += 32;
68−
69− // if here would be an exact copy of the code above
70− // compiler would generate some very strange code
71− // thus using "r"
72− __asm__ volatile (
73− "movq (%3), %%mm0 \n\t"
74− "movq 8(%3), %%mm1 \n\t"
75− "movq 16(%3), %%mm2 \n\t"
76− "movq 24(%3), %%mm3 \n\t"
77− "movq 32(%3), %%mm4 \n\t"
78− "movq 40(%3), %%mm5 \n\t"
79− "movq 48(%3), %%mm6 \n\t"
80− "movq 56(%3), %%mm7 \n\t"
81− "packuswb %%mm1, %%mm0 \n\t"
82− "packuswb %%mm3, %%mm2 \n\t"
83− "packuswb %%mm5, %%mm4 \n\t"
84− "packuswb %%mm7, %%mm6 \n\t"
85− "movq %%mm0, (%0) \n\t"
86− "movq %%mm2, (%0, %1) \n\t"
87− "movq %%mm4, (%0, %1, 2) \n\t"
88− "movq %%mm6, (%0, %2) \n\t"
89− :: "r" (pix), "r" ((x86_reg) line_size), "r" ((x86_reg) line_size * 3),
90− "r" (p)
91− : "memory");
92−}
93−
94−void ff_add_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
95− int line_size)
96−{
97− const int16_t *p;
98− uint8_t *pix;
99− int i;
100−
101− /* read the pixels */
102− p = block;
103− pix = pixels;
104− MOVQ_ZERO(mm7);
105− i = 4;
106− do {
107− __asm__ volatile (
108− "movq (%2), %%mm0 \n\t"
109− "movq 8(%2), %%mm1 \n\t"
110− "movq 16(%2), %%mm2 \n\t"
111− "movq 24(%2), %%mm3 \n\t"
112− "movq %0, %%mm4 \n\t"
113− "movq %1, %%mm6 \n\t"
114− "movq %%mm4, %%mm5 \n\t"
115− "punpcklbw %%mm7, %%mm4 \n\t"
116− "punpckhbw %%mm7, %%mm5 \n\t"
117− "paddsw %%mm4, %%mm0 \n\t"
118− "paddsw %%mm5, %%mm1 \n\t"
119− "movq %%mm6, %%mm5 \n\t"
120− "punpcklbw %%mm7, %%mm6 \n\t"
121− "punpckhbw %%mm7, %%mm5 \n\t"
122− "paddsw %%mm6, %%mm2 \n\t"
123− "paddsw %%mm5, %%mm3 \n\t"
124− "packuswb %%mm1, %%mm0 \n\t"
125− "packuswb %%mm3, %%mm2 \n\t"
126− "movq %%mm0, %0 \n\t"
127− "movq %%mm2, %1 \n\t"
128− : "+m" (*pix), "+m" (*(pix + line_size))
129− : "r" (p)
130− : "memory");
131− pix += line_size * 2;
132− p += 16;
133− } while (--i);
134−}
135−
13636 /* Draw the edges of width 'w' of an image of size width, height
13737 * this MMX version can only handle w == 8 || w == 16. */
13838 void ff_draw_edges_mmx(uint8_t *buf, int wrap, int width, int height,
libavcodec/x86/dsputil_x86.h+0−9
@@ -31,15 +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−void ff_put_signed_pixels_clamped_sse2(const int16_t *block, uint8_t *pixels,
41− int line_size);
42−
4334 void ff_draw_edges_mmx(uint8_t *buf, int wrap, int width, int height,
4435 int w, int h, int sides);
4536
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
@@ -41,7 +41,7 @@ · 40 unmodified lines
4141 #include "libavutil/mem.h"
4242 #include "libavutil/x86/asm.h"
4343 #include "idct_xvid.h"
44−#include "dsputil_x86.h"
44+#include "idctdsp.h"
4545
4646 #if HAVE_SSE2_INLINE
4747
libavcodec/x86/idctdsp.h+33−0
@@ -0,0 +1,33 @@
1+/*
2+ * This file is part of FFmpeg.
3+ *
4+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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+void ff_put_signed_pixels_clamped_sse2(const int16_t *block, uint8_t *pixels,
31+ int line_size);
32+
33+#endif /* AVCODEC_X86_IDCTDSP_H */
libavcodec/x86/idctdsp_init.c+112−0
@@ -0,0 +1,112 @@
1+/*
2+ * This file is part of FFmpeg.
3+ *
4+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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->add_pixels_clamped = ff_add_pixels_clamped_mmx;
70+
71+ if (avctx->lowres == 0 && !high_bit_depth) {
72+ switch (avctx->idct_algo) {
73+ case FF_IDCT_AUTO:
74+ case FF_IDCT_SIMPLEAUTO:
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+ if (EXTERNAL_MMX(cpu_flags)) {
90+ c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_mmx;
91+ }
92+
93+ if (INLINE_MMXEXT(cpu_flags)) {
94+ if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX && avctx->lowres == 0) {
95+ c->idct_put = ff_idct_xvid_mmxext_put;
96+ c->idct_add = ff_idct_xvid_mmxext_add;
97+ c->idct = ff_idct_xvid_mmxext;
98+ }
99+ }
100+
101+ if (INLINE_SSE2(cpu_flags)) {
102+ if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX && avctx->lowres == 0) {
103+ c->idct_put = ff_idct_xvid_sse2_put;
104+ c->idct_add = ff_idct_xvid_sse2_add;
105+ c->idct = ff_idct_xvid_sse2;
106+ c->idct_permutation_type = FF_SSE2_IDCT_PERM;
107+ }
108+ }
109+ if (EXTERNAL_SSE2(cpu_flags)) {
110+ c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_sse2;
111+ }
112+}
libavcodec/x86/idctdsp_mmx.c+133−0
@@ -0,0 +1,133 @@
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 FFmpeg.
9+ *
10+ * FFmpeg 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+ * FFmpeg 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 FFmpeg; 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+void ff_add_pixels_clamped_mmx(const int16_t *block, uint8_t *pixels,
92+ int line_size)
93+{
94+ const int16_t *p;
95+ uint8_t *pix;
96+ int i;
97+
98+ /* read the pixels */
99+ p = block;
100+ pix = pixels;
101+ MOVQ_ZERO(mm7);
102+ i = 4;
103+ do {
104+ __asm__ volatile (
105+ "movq (%2), %%mm0 \n\t"
106+ "movq 8(%2), %%mm1 \n\t"
107+ "movq 16(%2), %%mm2 \n\t"
108+ "movq 24(%2), %%mm3 \n\t"
109+ "movq %0, %%mm4 \n\t"
110+ "movq %1, %%mm6 \n\t"
111+ "movq %%mm4, %%mm5 \n\t"
112+ "punpcklbw %%mm7, %%mm4 \n\t"
113+ "punpckhbw %%mm7, %%mm5 \n\t"
114+ "paddsw %%mm4, %%mm0 \n\t"
115+ "paddsw %%mm5, %%mm1 \n\t"
116+ "movq %%mm6, %%mm5 \n\t"
117+ "punpcklbw %%mm7, %%mm6 \n\t"
118+ "punpckhbw %%mm7, %%mm5 \n\t"
119+ "paddsw %%mm6, %%mm2 \n\t"
120+ "paddsw %%mm5, %%mm3 \n\t"
121+ "packuswb %%mm1, %%mm0 \n\t"
122+ "packuswb %%mm3, %%mm2 \n\t"
123+ "movq %%mm0, %0 \n\t"
124+ "movq %%mm2, %1 \n\t"
125+ : "+m" (*pix), "+m" (*(pix + line_size))
126+ : "r" (p)
127+ : "memory");
128+ pix += line_size * 2;
129+ p += 16;
130+ } while (--i);
131+}
132+
133+#endif /* HAVE_INLINE_ASM */
libavcodec/x86/mpegvideoenc_template.c+2−2
@@ -232,7 +232,7 @@ static int RENAME(dct_quantize)(MpegEncContext *s, · 231 unmodified lines
232232 if(s->mb_intra) block[0]= level;
233233 else block[0]= temp_block[0];
234234
235− if(s->dsp.idct_permutation_type == FF_SIMPLE_IDCT_PERM){
235+ if (s->idsp.idct_permutation_type == FF_SIMPLE_IDCT_PERM) {
236236 if(last_non_zero_p1 <= 1) goto end;
237237 block[0x08] = temp_block[0x01]; block[0x10] = temp_block[0x08];
238238 block[0x20] = temp_block[0x10];
@@ -276,7 +276,7 @@ static int RENAME(dct_quantize)(MpegEncContext *s, · 37 unmodified lines
276276 block[0x3E] = temp_block[0x3D]; block[0x27] = temp_block[0x36];
277277 block[0x3D] = temp_block[0x2F]; block[0x2F] = temp_block[0x37];
278278 block[0x37] = temp_block[0x3E]; block[0x3F] = temp_block[0x3F];
279− }else if(s->dsp.idct_permutation_type == FF_LIBMPEG2_IDCT_PERM){
279+ }else if(s->idsp.idct_permutation_type == FF_LIBMPEG2_IDCT_PERM){
280280 if(last_non_zero_p1 <= 1) goto end;
281281 block[0x04] = temp_block[0x01];
282282 block[0x08] = temp_block[0x08]; block[0x10] = 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
@@ -22,7 +22,7 @@ · 21 unmodified lines
2222 #include "libavcodec/simple_idct.h"
2323 #include "libavutil/mem.h"
2424 #include "libavutil/x86/asm.h"
25−#include "dsputil_x86.h"
25+#include "idctdsp.h"
2626
2727 #if HAVE_INLINE_ASM
2828
libavfilter/vf_spp.c+3−2
@@ -234,8 +234,8 @@ static void filter(SPPContext *p, uint8_t *dst, uint8_t *src, · 233 unmodified lines
234234 const int index = x1 + y1*linesize;
235235 p->dsp.get_pixels(block, p->src + index, linesize);
236236 p->dsp.fdct(block);
237− p->requantize(block2, block, qp, p->dsp.idct_permutation);
238− p->dsp.idct(block2);
237+ p->requantize(block2, block, qp, p->idsp.idct_permutation);
238+ p->idsp.idct(block2);
239239 add_block(p->temp + index, linesize, block2);
240240 }
241241 }
@@ -381,6 +381,7 @@ static av_cold int init(AVFilterContext *ctx) · 139 unmodified lines
381381 if (!spp->avctx)
382382 return AVERROR(ENOMEM);
383383 avpriv_dsputil_init(&spp->dsp, spp->avctx);
384+ ff_idctdsp_init(&spp->idsp, spp->avctx);
384385 spp->store_slice = store_slice_c;
385386 switch (spp->mode) {
386387 case MODE_HARD: spp->requantize = hardthresh_c; break;
libavfilter/vf_spp.h+2−0
@@ -24,6 +24,7 @@ · 23 unmodified lines
2424
2525 #include "libavcodec/avcodec.h"
2626 #include "libavcodec/dsputil.h"
27+#include "libavcodec/idctdsp.h"
2728 #include "avfilter.h"
2829
2930 #define MAX_LEVEL 6 /* quality levels */
@@ -40,6 +41,7 @@ typedef struct { · 10 unmodified lines
4041 int16_t *temp;
4142 AVCodecContext *avctx;
4243 DSPContext dsp;
44+ IDCTDSPContext idsp;
4345 int8_t *non_b_qp_table;
4446 int non_b_qp_alloc_size;
4547 int use_bframe_qp;

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