FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
arm
vp56_arith.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2010 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_VP56_ARITH_H
22
#define AVCODEC_ARM_VP56_ARITH_H
23
24
#if CONFIG_THUMB
25
# define A(x)
26
# define T(x) x
27
#else
28
# define A(x) x
29
# define T(x)
30
#endif
31
32
#if CONFIG_THUMB || defined __clang__
33
# define L(x)
34
# define U(x) x
35
#else
36
# define L(x) x
37
# define U(x)
38
#endif
39
40
#if HAVE_ARMV6_INLINE
41
42
#define vp56_rac_get_prob vp56_rac_get_prob_armv6
43
static
inline
int
vp56_rac_get_prob_armv6(
VP56RangeCoder
*
c
,
int
pr)
44
{
45
unsigned
shift
=
ff_vp56_norm_shift
[c->
high
];
46
unsigned
code_word = c->
code_word
<<
shift
;
47
unsigned
high = c->
high
<<
shift
;
48
unsigned
bit;
49
50
__asm__ (
"adds %3, %3, %0 \n"
51
"itt cs \n"
52
"cmpcs %7, %4 \n"
53
L
(
"ldrcsh %2, [%4], #2 \n"
)
54
U
(
"ldrhcs %2, [%4], #2 \n"
)
55
"rsb %0, %6, #256 \n"
56
"smlabb %0, %5, %6, %0 \n"
57
T
(
"itttt cs \n"
)
58
"rev16cs %2, %2 \n"
59
T
(
"lslcs %2, %2, %3 \n"
)
60
T
(
"orrcs %1, %1, %2 \n"
)
61
A
(
"orrcs %1, %1, %2, lsl %3 \n"
)
62
"subcs %3, %3, #16 \n"
63
"lsr %0, %0, #8 \n"
64
"cmp %1, %0, lsl #16 \n"
65
"ittte ge \n"
66
"subge %1, %1, %0, lsl #16 \n"
67
"subge %0, %5, %0 \n"
68
"movge %2, #1 \n"
69
"movlt %2, #0 \n"
70
:
"=&r"
(c->
high
),
"=&r"
(c->
code_word
),
"=&r"
(bit),
71
"+&r"
(c->
bits
),
"+&r"
(c->
buffer
)
72
:
"r"
(high),
"r"
(pr),
"r"
(c->
end
- 1),
73
"0"
(shift),
"1"
(code_word)
74
:
"cc"
);
75
76
return
bit;
77
}
78
79
#define vp56_rac_get_prob_branchy vp56_rac_get_prob_branchy_armv6
80
static
inline
int
vp56_rac_get_prob_branchy_armv6(
VP56RangeCoder
*
c
,
int
pr)
81
{
82
unsigned
shift
=
ff_vp56_norm_shift
[c->
high
];
83
unsigned
code_word = c->
code_word
<<
shift
;
84
unsigned
high = c->
high
<<
shift
;
85
unsigned
low;
86
unsigned
tmp;
87
88
__asm__ (
"adds %3, %3, %0 \n"
89
"itt cs \n"
90
"cmpcs %7, %4 \n"
91
L
(
"ldrcsh %2, [%4], #2 \n"
)
92
U
(
"ldrhcs %2, [%4], #2 \n"
)
93
"rsb %0, %6, #256 \n"
94
"smlabb %0, %5, %6, %0 \n"
95
T
(
"itttt cs \n"
)
96
"rev16cs %2, %2 \n"
97
T
(
"lslcs %2, %2, %3 \n"
)
98
T
(
"orrcs %1, %1, %2 \n"
)
99
A
(
"orrcs %1, %1, %2, lsl %3 \n"
)
100
"subcs %3, %3, #16 \n"
101
"lsr %0, %0, #8 \n"
102
"lsl %2, %0, #16 \n"
103
:
"=&r"
(low),
"+&r"
(code_word),
"=&r"
(tmp),
104
"+&r"
(c->
bits
),
"+&r"
(c->
buffer
)
105
:
"r"
(high),
"r"
(pr),
"r"
(c->
end
- 1),
"0"
(shift)
106
:
"cc"
);
107
108
if
(code_word >= tmp) {
109
c->
high
= high - low;
110
c->
code_word
= code_word - tmp;
111
return
1;
112
}
113
114
c->
high
= low;
115
c->
code_word
= code_word;
116
return
0;
117
}
118
119
#endif
120
121
#endif
/* AVCODEC_ARM_VP56_ARITH_H */
Generated on Sat May 25 2013 03:58:31 for FFmpeg by
1.8.2