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 */ 30static 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 41static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 }; 42 43av_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 62av_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} 113