FFmpeg
Loading...
Searching...
No Matches
libavcodec
ppc
hevcdsp_altivec.c
Go to the documentation of this file.
1
/*
2
* SIMD-optimized IDCT functions for HEVC decoding
3
* Copyright (c) Alexandra Hajkova
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 "config.h"
23
24
#include "
libavutil/attributes.h
"
25
#include "
libavutil/ppc/util_altivec.h
"
26
27
#include "
libavcodec/hevc/dsp.h
"
28
29
#include "
hevcdsp_altivec.h
"
30
31
static
const
vec_s16
trans4
[4] = {
32
{ 64, 64, 64, 64, 64, 64, 64, 64 },
33
{ 83, 36, 83, 36, 83, 36, 83, 36 },
34
{ 64, -64, 64, -64, 64, -64, 64, -64 },
35
{ 36, -83, 36, -83, 36, -83, 36, -83 },
36
};
37
38
static
const
vec_u8
mask
[2] = {
39
{ 0x00, 0x01, 0x08, 0x09, 0x10, 0x11, 0x18, 0x19, 0x02, 0x03, 0x0A, 0x0B, 0x12, 0x13, 0x1A, 0x1B },
40
{ 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D, 0x06, 0x07, 0x0E, 0x0F, 0x16, 0x17, 0x1E, 0x1F },
41
};
42
43
static
av_always_inline
void
transform4x4
(
vec_s16
src_01,
vec_s16
src_23,
44
vec_s32
res[4],
const
int
shift
,
45
int16_t *coeffs)
46
{
47
vec_s16
src_02, src_13;
48
vec_s32
zero
= vec_splat_s32(0);
49
vec_s32
e0, o0, e1, o1;
50
vec_s32
add;
51
52
src_13 = vec_mergel(src_01, src_23);
53
src_02 = vec_mergeh(src_01, src_23);
54
55
e0 = vec_msums(src_02,
trans4
[0],
zero
);
56
o0 = vec_msums(src_13,
trans4
[1],
zero
);
57
e1 = vec_msums(src_02,
trans4
[2],
zero
);
58
o1 = vec_msums(src_13,
trans4
[3],
zero
);
59
60
switch
(
shift
) {
61
case
7: add = vec_sl(vec_splat_s32(1), vec_splat_u32( 7 - 1));
break
;
62
case
10: add = vec_sl(vec_splat_s32(1), vec_splat_u32(10 - 1));
break
;
63
case
12: add = vec_sl(vec_splat_s32(1), vec_splat_u32(12 - 1));
break
;
64
default
:
abort
();
65
}
66
67
e0 = vec_add(e0, add);
68
e1 = vec_add(e1, add);
69
70
res[0] = vec_add(e0, o0);
71
res[1] = vec_add(e1, o1);
72
res[2] = vec_sub(e1, o1);
73
res[3] = vec_sub(e0, o0);
74
}
75
76
static
av_always_inline
void
scale
(
vec_s32
res[4],
vec_s16
res_packed[2],
77
const
int
shift
)
78
{
79
int
i
;
80
vec_u32
v_shift;
81
82
switch
(
shift
) {
83
case
7: v_shift = vec_splat_u32(7) ;
break
;
84
case
10: v_shift = vec_splat_u32(10);
break
;
85
case
12: v_shift = vec_splat_u32(12);
break
;
86
default
:
abort
();
87
}
88
89
for
(
i
= 0;
i
< 4;
i
++)
90
res[
i
] = vec_sra(res[
i
], v_shift);
91
92
// clip16
93
res_packed[0] = vec_packs(res[0], res[1]);
94
res_packed[1] = vec_packs(res[2], res[3]);
95
}
96
97
#define FUNCDECL(a, depth) a ## _ ## depth ## _altivec
98
#define FUNC(a, b) FUNCDECL(a, b)
99
100
#define BIT_DEPTH 8
101
#include "
hevcdsp_template.c
"
102
#undef BIT_DEPTH
103
104
#define BIT_DEPTH 10
105
#include "
hevcdsp_template.c
"
106
#undef BIT_DEPTH
107
108
av_cold
void
ff_hevc_dsp_init_altivec
(
HEVCDSPContext
*
c
,
const
int
bit_depth
)
109
{
110
if
(
bit_depth
== 8)
111
c
->idct[0] = ff_hevc_idct_4x4_8_altivec;
112
if
(
bit_depth
== 10)
113
c
->idct[0] = ff_hevc_idct_4x4_10_altivec;
114
}
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition
af_astats.c:246
i
#define i(width, name, range_min, range_max)
Definition
cbs_h264.c:63
abort
SDL_atomic_t abort
Definition
ffplay.c:389
dsp.h
scale
static av_always_inline void scale(vec_s32 res[4], vec_s16 res_packed[2], const int shift)
Definition
hevcdsp_altivec.c:76
ff_hevc_dsp_init_altivec
av_cold void ff_hevc_dsp_init_altivec(HEVCDSPContext *c, const int bit_depth)
Definition
hevcdsp_altivec.c:108
transform4x4
static av_always_inline void transform4x4(vec_s16 src_01, vec_s16 src_23, vec_s32 res[4], const int shift, int16_t *coeffs)
Definition
hevcdsp_altivec.c:43
trans4
static const vec_s16 trans4[4]
Definition
hevcdsp_altivec.c:31
hevcdsp_altivec.h
hevcdsp_template.c
zero
static int zero(InterplayACMContext *s, unsigned ind, unsigned col)
Definition
interplayacm.c:121
shift
static int shift(int a, int b)
Definition
bonk.c:261
attributes.h
Macro definitions for various function/variable attributes.
av_always_inline
#define av_always_inline
Definition
attributes.h:72
av_cold
#define av_cold
Definition
attributes.h:117
mask
static const uint16_t mask[17]
Definition
lzw.c:38
HEVCDSPContext
Definition
dsp.h:47
util_altivec.h
Contains misc utility macros and inline functions.
vec_s16
#define vec_s16
Definition
util_altivec.h:37
vec_u8
#define vec_u8
Definition
util_altivec.h:34
vec_u32
#define vec_u32
Definition
util_altivec.h:38
vec_s32
#define vec_s32
Definition
util_altivec.h:39
c
static double c[64]
Definition
vsrc_mptestsrc.c:89
Generated on Mon Nov 2 2026 19:20:55 for FFmpeg by
1.13.2