FFmpeg
Loading...
Searching...
No Matches
dct.c
Go to the documentation of this file.
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 "config_components.h"
21
22#include "libavutil/cpu.h"
24
25#include "libavcodec/x86/fdct.h"
28
29#if CONFIG_PRORES_DECODER && ARCH_X86_64 && HAVE_X86ASM
30void ff_prores_idct_put_10_sse2(uint16_t *dst, ptrdiff_t linesize,
31 int16_t *block, const int16_t *qmat);
32
33#define PR_WRAP(INSN) \
34static void ff_prores_idct_put_10_##INSN##_wrap(int16_t *dst){ \
35 LOCAL_ALIGNED(16, int16_t, qmat, [64]); \
36 LOCAL_ALIGNED(16, int16_t, tmp, [64]); \
37 int i; \
38 \
39 for(i=0; i<64; i++){ \
40 qmat[i]=4; \
41 tmp[i]= dst[i]; \
42 } \
43 ff_prores_idct_put_10_##INSN (dst, 16, tmp, qmat); \
44 \
45 for(i=0; i<64; i++) { \
46 dst[i] -= 512; \
47 } \
48}
49
50PR_WRAP(sse2)
51
52# if HAVE_AVX_EXTERNAL
53void ff_prores_idct_put_10_avx(uint16_t *dst, ptrdiff_t linesize,
54 int16_t *block, const int16_t *qmat);
55PR_WRAP(avx)
56# endif
57
58#endif
59
60static const struct algo fdct_tab_arch[] = {
61#if HAVE_SSE2_INLINE
63#endif
64 { 0 }
65};
66
67static const struct algo idct_tab_arch[] = {
68#if CONFIG_MPEG4_DECODER && HAVE_X86ASM
69#if HAVE_SSE2_EXTERNAL
71#endif
72#endif /* CONFIG_MPEG4_DECODER && HAVE_X86ASM */
73#if CONFIG_PRORES_DECODER && ARCH_X86_64 && HAVE_X86ASM
74 { "PR-SSE2", ff_prores_idct_put_10_sse2_wrap, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_SSE2, 1 },
75# if HAVE_AVX_EXTERNAL
76 { "PR-AVX", ff_prores_idct_put_10_avx_wrap, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_AVX, 1 },
77# endif
78#endif
79#if HAVE_X86ASM
80#if ARCH_X86_64
81#if HAVE_SSE2_EXTERNAL
85#endif
86#if HAVE_AVX_EXTERNAL
90#endif
91#else
92#if HAVE_SSE2_EXTERNAL
94#endif
95#endif
96#endif
97 { 0 }
98};
99
100static const uint8_t idct_simple_mmx_perm[64] = {
101 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
102 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
103 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
104 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
105 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
106 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
107 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
108 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
109};
110
111static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 };
112
113static int permute_x86(int16_t dst[64], const int16_t src[64],
115{
116 int i;
117
118 switch (perm_type) {
120 for (i = 0; i < 64; i++)
122 return 1;
124 for (i = 0; i < 64; i++)
125 dst[(i & 0x38) | idct_sse2_row_perm[i & 7]] = src[i];
126 return 1;
127 }
128
129 return 0;
130}
static const struct algo fdct_tab_arch[]
Definition dct.c:25
static const struct algo idct_tab_arch[]
Definition dct.c:30
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int16_t block[64]
Definition dct.c:125
idct_permutation_type
Definition idctdsp.h:27
@ FF_IDCT_PERM_SIMPLE
Definition idctdsp.h:30
@ FF_IDCT_PERM_NONE
Definition idctdsp.h:28
@ FF_IDCT_PERM_TRANSPOSE
Definition idctdsp.h:31
@ FF_IDCT_PERM_SSE2
Definition idctdsp.h:33
#define AV_CPU_FLAG_SSE2
PIV SSE2 functions.
Definition cpu.h:37
#define AV_CPU_FLAG_AVX
AVX functions: requires OS support even if YMM registers aren't used.
Definition cpu.h:51
void ff_prores_idct_put_10_sse2(uint16_t *dst, ptrdiff_t linesize, int16_t *block, const int16_t *qmat)
void ff_prores_idct_put_10_avx(uint16_t *dst, ptrdiff_t linesize, int16_t *block, const int16_t *qmat)
Definition dct.c:58
enum idct_permutation_type perm_type
Definition dct.c:61
#define src
Definition vp8dsp.c:248
static const uint8_t idct_simple_mmx_perm[64]
Definition dct.c:100
static const uint8_t idct_sse2_row_perm[8]
Definition dct.c:111
static int permute_x86(int16_t dst[64], const int16_t src[64], enum idct_permutation_type perm_type)
Definition dct.c:113
void ff_fdct_sse2(int16_t *block)
void ff_simple_idct8_avx(int16_t *block)
void ff_simple_idct10_avx(int16_t *block)
void ff_simple_idct12_avx(int16_t *block)
void ff_simple_idct10_sse2(int16_t *block)
void ff_simple_idct_sse2(int16_t *block)
void ff_simple_idct8_sse2(int16_t *block)
void ff_simple_idct12_sse2(int16_t *block)
header for Xvid IDCT functions
void ff_xvid_idct_sse2(short *block)