Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
x86
huffyuvencdsp_mmx.c
Go to the documentation of this file.
1
/*
2
* SIMD-optimized HuffYUV encoding functions
3
* Copyright (c) 2000, 2001 Fabrice Bellard
4
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5
*
6
* MMX optimization by Nick Kurshev <nickols_k@mail.ru>
7
*
8
* This file is part of Libav.
9
*
10
* Libav is free software; you can redistribute it and/or
11
* modify it under the terms of the GNU Lesser General Public
12
* License as published by the Free Software Foundation; either
13
* version 2.1 of the License, or (at your option) any later version.
14
*
15
* Libav is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18
* Lesser General Public License for more details.
19
*
20
* You should have received a copy of the GNU Lesser General Public
21
* License along with Libav; if not, write to the Free Software
22
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
*/
24
25
#include "
libavutil/attributes.h
"
26
#include "
libavutil/cpu.h
"
27
#include "
libavutil/x86/asm.h
"
28
#include "
libavutil/x86/cpu.h
"
29
#include "
libavcodec/huffyuvencdsp.h
"
30
#include "
libavcodec/mathops.h
"
31
32
#if HAVE_INLINE_ASM
33
34
static
void
diff_bytes_mmx(
uint8_t
*dst,
uint8_t
*src1,
uint8_t
*src2,
int
w)
35
{
36
x86_reg
i = 0;
37
38
__asm__
volatile
(
39
"1: \n\t"
40
"movq (%2, %0), %%mm0 \n\t"
41
"movq (%1, %0), %%mm1 \n\t"
42
"psubb %%mm0, %%mm1 \n\t"
43
"movq %%mm1, (%3, %0) \n\t"
44
"movq 8(%2, %0), %%mm0 \n\t"
45
"movq 8(%1, %0), %%mm1 \n\t"
46
"psubb %%mm0, %%mm1 \n\t"
47
"movq %%mm1, 8(%3, %0) \n\t"
48
"add $16, %0 \n\t"
49
"cmp %4, %0 \n\t"
50
" jb 1b \n\t"
51
:
"+r"
(i)
52
:
"r"
(src1),
"r"
(src2),
"r"
(dst),
"r"
((
x86_reg
) w - 15));
53
54
for
(; i < w; i++)
55
dst[i + 0] = src1[i + 0] - src2[i + 0];
56
}
57
58
static
void
sub_hfyu_median_pred_mmxext(
uint8_t
*dst,
const
uint8_t
*src1,
59
const
uint8_t
*src2,
int
w,
60
int
*left,
int
*left_top)
61
{
62
x86_reg
i = 0;
63
uint8_t
l, lt;
64
65
__asm__
volatile
(
66
"movq (%1, %0), %%mm0 \n\t"
// LT
67
"psllq $8, %%mm0 \n\t"
68
"1: \n\t"
69
"movq (%1, %0), %%mm1 \n\t"
// T
70
"movq -1(%2, %0), %%mm2 \n\t"
// L
71
"movq (%2, %0), %%mm3 \n\t"
// X
72
"movq %%mm2, %%mm4 \n\t"
// L
73
"psubb %%mm0, %%mm2 \n\t"
74
"paddb %%mm1, %%mm2 \n\t"
// L + T - LT
75
"movq %%mm4, %%mm5 \n\t"
// L
76
"pmaxub %%mm1, %%mm4 \n\t"
// max(T, L)
77
"pminub %%mm5, %%mm1 \n\t"
// min(T, L)
78
"pminub %%mm2, %%mm4 \n\t"
79
"pmaxub %%mm1, %%mm4 \n\t"
80
"psubb %%mm4, %%mm3 \n\t"
// dst - pred
81
"movq %%mm3, (%3, %0) \n\t"
82
"add $8, %0 \n\t"
83
"movq -1(%1, %0), %%mm0 \n\t"
// LT
84
"cmp %4, %0 \n\t"
85
" jb 1b \n\t"
86
:
"+r"
(i)
87
:
"r"
(src1),
"r"
(src2),
"r"
(dst),
"r"
((
x86_reg
) w));
88
89
l = *left;
90
lt = *left_top;
91
92
dst[0] = src2[0] -
mid_pred
(l, src1[0], (l + src1[0] - lt) & 0xFF);
93
94
*left_top = src1[w - 1];
95
*left = src2[w - 1];
96
}
97
98
#endif
/* HAVE_INLINE_ASM */
99
100
av_cold
void
ff_huffyuvencdsp_init_x86
(
HuffYUVEncDSPContext
*c)
101
{
102
#if HAVE_INLINE_ASM
103
int
cpu_flags =
av_get_cpu_flags
();
104
105
if
(
INLINE_MMX
(cpu_flags)) {
106
c->
diff_bytes
= diff_bytes_mmx;
107
}
108
109
if
(
INLINE_MMXEXT
(cpu_flags)) {
110
c->
sub_hfyu_median_pred
= sub_hfyu_median_pred_mmxext;
111
}
112
#endif
/* HAVE_INLINE_ASM */
113
}
huffyuvencdsp.h
cpu.h
HuffYUVEncDSPContext::sub_hfyu_median_pred
void(* sub_hfyu_median_pred)(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w, int *left, int *left_top)
Subtract HuffYUV's variant of median prediction.
Definition:
huffyuvencdsp.h:33
attributes.h
Macro definitions for various function/variable attributes.
uint8_t
uint8_t
Definition:
audio_convert.c:194
av_cold
#define av_cold
Definition:
attributes.h:66
x86_reg
int x86_reg
Definition:
asm.h:70
HuffYUVEncDSPContext::diff_bytes
void(* diff_bytes)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w)
Definition:
huffyuvencdsp.h:25
INLINE_MMX
#define INLINE_MMX(flags)
Definition:
cpu.h:63
HuffYUVEncDSPContext
Definition:
huffyuvencdsp.h:24
asm.h
mathops.h
cpu.h
mid_pred
#define mid_pred
Definition:
mathops.h:98
av_get_cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition:
cpu.c:47
INLINE_MMXEXT
#define INLINE_MMXEXT(flags)
Definition:
cpu.h:64
ff_huffyuvencdsp_init_x86
av_cold void ff_huffyuvencdsp_init_x86(HuffYUVEncDSPContext *c)
Definition:
huffyuvencdsp_mmx.c:100
Generated on Sat May 23 2015 10:52:59 for Libav by
1.8.8