Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
bb8a6e03
Commit
bb8a6e03
authored
Oct 05, 2011
by
Janne Grunau
Committed by
Mans Rullgard
Nov 30, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rv40: move loop filter to rv34dsp context
Signed-off-by:
Mans Rullgard
<
mans@mansr.com
>
parent
c3f9ebf7
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
176 additions
and
164 deletions
+176
-164
rv34dsp.h
libavcodec/rv34dsp.h
+7
-0
rv40.c
libavcodec/rv40.c
+8
-150
rv40data.h
libavcodec/rv40data.h
+0
-14
rv40dsp.c
libavcodec/rv40dsp.c
+161
-0
No files found.
libavcodec/rv34dsp.h
View file @
bb8a6e03
...
...
@@ -36,6 +36,11 @@ typedef void (*rv40_weight_func)(uint8_t *dst/*align width (8 or 16)*/,
typedef
void
(
*
rv34_inv_transform_func
)(
DCTELEM
*
block
);
typedef
void
(
*
rv40_loop_filter_func
)(
uint8_t
*
src
,
int
stride
,
int
dmode
,
int
lim_q1
,
int
lim_p1
,
int
alpha
,
int
beta
,
int
beta2
,
int
chroma
,
int
edge
);
typedef
struct
RV34DSPContext
{
qpel_mc_func
put_pixels_tab
[
4
][
16
];
qpel_mc_func
avg_pixels_tab
[
4
][
16
];
...
...
@@ -43,6 +48,8 @@ typedef struct RV34DSPContext {
h264_chroma_mc_func
avg_chroma_pixels_tab
[
3
];
rv40_weight_func
rv40_weight_pixels_tab
[
2
];
rv34_inv_transform_func
rv34_inv_transform_tab
[
2
];
rv40_loop_filter_func
rv40_h_loop_filter
;
rv40_loop_filter_func
rv40_v_loop_filter
;
}
RV34DSPContext
;
void
ff_rv30dsp_init
(
RV34DSPContext
*
c
,
DSPContext
*
dsp
);
...
...
libavcodec/rv40.c
View file @
bb8a6e03
...
...
@@ -271,148 +271,6 @@ static int rv40_decode_mb_info(RV34DecContext *r)
return
0
;
}
#define CLIP_SYMM(a, b) av_clip(a, -(b), b)
/**
* weaker deblocking very similar to the one described in 4.4.2 of JVT-A003r1
*/
static
inline
void
rv40_weak_loop_filter
(
uint8_t
*
src
,
const
int
step
,
const
int
filter_p1
,
const
int
filter_q1
,
const
int
alpha
,
const
int
beta
,
const
int
lim_p0q0
,
const
int
lim_q1
,
const
int
lim_p1
,
const
int
diff_p1p0
,
const
int
diff_q1q0
,
const
int
diff_p1p2
,
const
int
diff_q1q2
)
{
uint8_t
*
cm
=
ff_cropTbl
+
MAX_NEG_CROP
;
int
t
,
u
,
diff
;
t
=
src
[
0
*
step
]
-
src
[
-
1
*
step
];
if
(
!
t
)
return
;
u
=
(
alpha
*
FFABS
(
t
))
>>
7
;
if
(
u
>
3
-
(
filter_p1
&&
filter_q1
))
return
;
t
<<=
2
;
if
(
filter_p1
&&
filter_q1
)
t
+=
src
[
-
2
*
step
]
-
src
[
1
*
step
];
diff
=
CLIP_SYMM
((
t
+
4
)
>>
3
,
lim_p0q0
);
src
[
-
1
*
step
]
=
cm
[
src
[
-
1
*
step
]
+
diff
];
src
[
0
*
step
]
=
cm
[
src
[
0
*
step
]
-
diff
];
if
(
FFABS
(
diff_p1p2
)
<=
beta
&&
filter_p1
){
t
=
(
diff_p1p0
+
diff_p1p2
-
diff
)
>>
1
;
src
[
-
2
*
step
]
=
cm
[
src
[
-
2
*
step
]
-
CLIP_SYMM
(
t
,
lim_p1
)];
}
if
(
FFABS
(
diff_q1q2
)
<=
beta
&&
filter_q1
){
t
=
(
diff_q1q0
+
diff_q1q2
+
diff
)
>>
1
;
src
[
1
*
step
]
=
cm
[
src
[
1
*
step
]
-
CLIP_SYMM
(
t
,
lim_q1
)];
}
}
static
av_always_inline
void
rv40_adaptive_loop_filter
(
uint8_t
*
src
,
const
int
step
,
const
int
stride
,
const
int
dmode
,
const
int
lim_q1
,
const
int
lim_p1
,
const
int
alpha
,
const
int
beta
,
const
int
beta2
,
const
int
chroma
,
const
int
edge
)
{
int
diff_p1p0
[
4
],
diff_q1q0
[
4
],
diff_p1p2
[
4
],
diff_q1q2
[
4
];
int
sum_p1p0
=
0
,
sum_q1q0
=
0
,
sum_p1p2
=
0
,
sum_q1q2
=
0
;
uint8_t
*
ptr
;
int
flag_strong0
=
1
,
flag_strong1
=
1
;
int
filter_p1
,
filter_q1
;
int
i
;
int
lims
;
for
(
i
=
0
,
ptr
=
src
;
i
<
4
;
i
++
,
ptr
+=
stride
){
diff_p1p0
[
i
]
=
ptr
[
-
2
*
step
]
-
ptr
[
-
1
*
step
];
diff_q1q0
[
i
]
=
ptr
[
1
*
step
]
-
ptr
[
0
*
step
];
sum_p1p0
+=
diff_p1p0
[
i
];
sum_q1q0
+=
diff_q1q0
[
i
];
}
filter_p1
=
FFABS
(
sum_p1p0
)
<
(
beta
<<
2
);
filter_q1
=
FFABS
(
sum_q1q0
)
<
(
beta
<<
2
);
if
(
!
filter_p1
&&
!
filter_q1
)
return
;
for
(
i
=
0
,
ptr
=
src
;
i
<
4
;
i
++
,
ptr
+=
stride
){
diff_p1p2
[
i
]
=
ptr
[
-
2
*
step
]
-
ptr
[
-
3
*
step
];
diff_q1q2
[
i
]
=
ptr
[
1
*
step
]
-
ptr
[
2
*
step
];
sum_p1p2
+=
diff_p1p2
[
i
];
sum_q1q2
+=
diff_q1q2
[
i
];
}
if
(
edge
){
flag_strong0
=
filter_p1
&&
(
FFABS
(
sum_p1p2
)
<
beta2
);
flag_strong1
=
filter_q1
&&
(
FFABS
(
sum_q1q2
)
<
beta2
);
}
else
{
flag_strong0
=
flag_strong1
=
0
;
}
lims
=
filter_p1
+
filter_q1
+
((
lim_q1
+
lim_p1
)
>>
1
)
+
1
;
if
(
flag_strong0
&&
flag_strong1
){
/* strong filtering */
for
(
i
=
0
;
i
<
4
;
i
++
,
src
+=
stride
){
int
sflag
,
p0
,
q0
,
p1
,
q1
;
int
t
=
src
[
0
*
step
]
-
src
[
-
1
*
step
];
if
(
!
t
)
continue
;
sflag
=
(
alpha
*
FFABS
(
t
))
>>
7
;
if
(
sflag
>
1
)
continue
;
p0
=
(
25
*
src
[
-
3
*
step
]
+
26
*
src
[
-
2
*
step
]
+
26
*
src
[
-
1
*
step
]
+
26
*
src
[
0
*
step
]
+
25
*
src
[
1
*
step
]
+
rv40_dither_l
[
dmode
+
i
])
>>
7
;
q0
=
(
25
*
src
[
-
2
*
step
]
+
26
*
src
[
-
1
*
step
]
+
26
*
src
[
0
*
step
]
+
26
*
src
[
1
*
step
]
+
25
*
src
[
2
*
step
]
+
rv40_dither_r
[
dmode
+
i
])
>>
7
;
if
(
sflag
){
p0
=
av_clip
(
p0
,
src
[
-
1
*
step
]
-
lims
,
src
[
-
1
*
step
]
+
lims
);
q0
=
av_clip
(
q0
,
src
[
0
*
step
]
-
lims
,
src
[
0
*
step
]
+
lims
);
}
p1
=
(
25
*
src
[
-
4
*
step
]
+
26
*
src
[
-
3
*
step
]
+
26
*
src
[
-
2
*
step
]
+
26
*
p0
+
25
*
src
[
0
*
step
]
+
rv40_dither_l
[
dmode
+
i
])
>>
7
;
q1
=
(
25
*
src
[
-
1
*
step
]
+
26
*
q0
+
26
*
src
[
1
*
step
]
+
26
*
src
[
2
*
step
]
+
25
*
src
[
3
*
step
]
+
rv40_dither_r
[
dmode
+
i
])
>>
7
;
if
(
sflag
){
p1
=
av_clip
(
p1
,
src
[
-
2
*
step
]
-
lims
,
src
[
-
2
*
step
]
+
lims
);
q1
=
av_clip
(
q1
,
src
[
1
*
step
]
-
lims
,
src
[
1
*
step
]
+
lims
);
}
src
[
-
2
*
step
]
=
p1
;
src
[
-
1
*
step
]
=
p0
;
src
[
0
*
step
]
=
q0
;
src
[
1
*
step
]
=
q1
;
if
(
!
chroma
){
src
[
-
3
*
step
]
=
(
25
*
src
[
-
1
*
step
]
+
26
*
src
[
-
2
*
step
]
+
51
*
src
[
-
3
*
step
]
+
26
*
src
[
-
4
*
step
]
+
64
)
>>
7
;
src
[
2
*
step
]
=
(
25
*
src
[
0
*
step
]
+
26
*
src
[
1
*
step
]
+
51
*
src
[
2
*
step
]
+
26
*
src
[
3
*
step
]
+
64
)
>>
7
;
}
}
}
else
if
(
filter_p1
&&
filter_q1
){
for
(
i
=
0
;
i
<
4
;
i
++
,
src
+=
stride
)
rv40_weak_loop_filter
(
src
,
step
,
1
,
1
,
alpha
,
beta
,
lims
,
lim_q1
,
lim_p1
,
diff_p1p0
[
i
],
diff_q1q0
[
i
],
diff_p1p2
[
i
],
diff_q1q2
[
i
]);
}
else
{
for
(
i
=
0
;
i
<
4
;
i
++
,
src
+=
stride
)
rv40_weak_loop_filter
(
src
,
step
,
filter_p1
,
filter_q1
,
alpha
,
beta
,
lims
>>
1
,
lim_q1
>>
1
,
lim_p1
>>
1
,
diff_p1p0
[
i
],
diff_q1q0
[
i
],
diff_p1p2
[
i
],
diff_q1q2
[
i
]);
}
}
static
void
rv40_v_loop_filter
(
uint8_t
*
src
,
int
stride
,
int
dmode
,
int
lim_q1
,
int
lim_p1
,
int
alpha
,
int
beta
,
int
beta2
,
int
chroma
,
int
edge
){
rv40_adaptive_loop_filter
(
src
,
1
,
stride
,
dmode
,
lim_q1
,
lim_p1
,
alpha
,
beta
,
beta2
,
chroma
,
edge
);
}
static
void
rv40_h_loop_filter
(
uint8_t
*
src
,
int
stride
,
int
dmode
,
int
lim_q1
,
int
lim_p1
,
int
alpha
,
int
beta
,
int
beta2
,
int
chroma
,
int
edge
){
rv40_adaptive_loop_filter
(
src
,
stride
,
1
,
dmode
,
lim_q1
,
lim_p1
,
alpha
,
beta
,
beta2
,
chroma
,
edge
);
}
enum
RV40BlockPos
{
POS_CUR
,
POS_TOP
,
...
...
@@ -572,7 +430,7 @@ static void rv40_loop_filter(RV34DecContext *r, int row)
// if bottom block is coded then we can filter its top edge
// (or bottom edge of this block, which is the same)
if
(
y_h_deblock
&
(
MASK_BOTTOM
<<
ij
)){
rv40_h_loop_filter
(
Y
+
4
*
s
->
linesize
,
s
->
linesize
,
dither
,
r
->
rdsp
.
r
v40_h_loop_filter
(
Y
+
4
*
s
->
linesize
,
s
->
linesize
,
dither
,
y_to_deblock
&
(
MASK_BOTTOM
<<
ij
)
?
clip
[
POS_CUR
]
:
0
,
clip_cur
,
alpha
,
beta
,
betaY
,
0
,
0
);
...
...
@@ -583,14 +441,14 @@ static void rv40_loop_filter(RV34DecContext *r, int row)
clip_left
=
mvmasks
[
POS_LEFT
]
&
(
MASK_RIGHT
<<
j
)
?
clip
[
POS_LEFT
]
:
0
;
else
clip_left
=
y_to_deblock
&
(
MASK_CUR
<<
(
ij
-
1
))
?
clip
[
POS_CUR
]
:
0
;
rv40_v_loop_filter
(
Y
,
s
->
linesize
,
dither
,
r
->
rdsp
.
r
v40_v_loop_filter
(
Y
,
s
->
linesize
,
dither
,
clip_cur
,
clip_left
,
alpha
,
beta
,
betaY
,
0
,
0
);
}
// filter top edge of the current macroblock when filtering strength is high
if
(
!
j
&&
y_h_deblock
&
(
MASK_CUR
<<
i
)
&&
(
mb_strong
[
POS_CUR
]
||
mb_strong
[
POS_TOP
])){
rv40_h_loop_filter
(
Y
,
s
->
linesize
,
dither
,
r
->
rdsp
.
r
v40_h_loop_filter
(
Y
,
s
->
linesize
,
dither
,
clip_cur
,
mvmasks
[
POS_TOP
]
&
(
MASK_TOP
<<
i
)
?
clip
[
POS_TOP
]
:
0
,
alpha
,
beta
,
betaY
,
0
,
1
);
...
...
@@ -598,7 +456,7 @@ static void rv40_loop_filter(RV34DecContext *r, int row)
// filter left block edge in edge mode (with high filtering strength)
if
(
y_v_deblock
&
(
MASK_CUR
<<
ij
)
&&
!
i
&&
(
mb_strong
[
POS_CUR
]
||
mb_strong
[
POS_LEFT
])){
clip_left
=
mvmasks
[
POS_LEFT
]
&
(
MASK_RIGHT
<<
j
)
?
clip
[
POS_LEFT
]
:
0
;
rv40_v_loop_filter
(
Y
,
s
->
linesize
,
dither
,
r
->
rdsp
.
r
v40_v_loop_filter
(
Y
,
s
->
linesize
,
dither
,
clip_cur
,
clip_left
,
alpha
,
beta
,
betaY
,
0
,
1
);
...
...
@@ -613,7 +471,7 @@ static void rv40_loop_filter(RV34DecContext *r, int row)
int
clip_cur
=
c_to_deblock
[
k
]
&
(
MASK_CUR
<<
ij
)
?
clip
[
POS_CUR
]
:
0
;
if
(
c_h_deblock
[
k
]
&
(
MASK_CUR
<<
(
ij
+
2
))){
int
clip_bot
=
c_to_deblock
[
k
]
&
(
MASK_CUR
<<
(
ij
+
2
))
?
clip
[
POS_CUR
]
:
0
;
rv40_h_loop_filter
(
C
+
4
*
s
->
uvlinesize
,
s
->
uvlinesize
,
i
*
8
,
r
->
rdsp
.
r
v40_h_loop_filter
(
C
+
4
*
s
->
uvlinesize
,
s
->
uvlinesize
,
i
*
8
,
clip_bot
,
clip_cur
,
alpha
,
beta
,
betaC
,
1
,
0
);
...
...
@@ -623,21 +481,21 @@ static void rv40_loop_filter(RV34DecContext *r, int row)
clip_left
=
uvcbp
[
POS_LEFT
][
k
]
&
(
MASK_CUR
<<
(
2
*
j
+
1
))
?
clip
[
POS_LEFT
]
:
0
;
else
clip_left
=
c_to_deblock
[
k
]
&
(
MASK_CUR
<<
(
ij
-
1
))
?
clip
[
POS_CUR
]
:
0
;
rv40_v_loop_filter
(
C
,
s
->
uvlinesize
,
j
*
8
,
r
->
rdsp
.
r
v40_v_loop_filter
(
C
,
s
->
uvlinesize
,
j
*
8
,
clip_cur
,
clip_left
,
alpha
,
beta
,
betaC
,
1
,
0
);
}
if
(
!
j
&&
c_h_deblock
[
k
]
&
(
MASK_CUR
<<
ij
)
&&
(
mb_strong
[
POS_CUR
]
||
mb_strong
[
POS_TOP
])){
int
clip_top
=
uvcbp
[
POS_TOP
][
k
]
&
(
MASK_CUR
<<
(
ij
+
2
))
?
clip
[
POS_TOP
]
:
0
;
rv40_h_loop_filter
(
C
,
s
->
uvlinesize
,
i
*
8
,
r
->
rdsp
.
r
v40_h_loop_filter
(
C
,
s
->
uvlinesize
,
i
*
8
,
clip_cur
,
clip_top
,
alpha
,
beta
,
betaC
,
1
,
1
);
}
if
(
c_v_deblock
[
k
]
&
(
MASK_CUR
<<
ij
)
&&
!
i
&&
(
mb_strong
[
POS_CUR
]
||
mb_strong
[
POS_LEFT
])){
clip_left
=
uvcbp
[
POS_LEFT
][
k
]
&
(
MASK_CUR
<<
(
2
*
j
+
1
))
?
clip
[
POS_LEFT
]
:
0
;
rv40_v_loop_filter
(
C
,
s
->
uvlinesize
,
j
*
8
,
r
->
rdsp
.
r
v40_v_loop_filter
(
C
,
s
->
uvlinesize
,
j
*
8
,
clip_cur
,
clip_left
,
alpha
,
beta
,
betaC
,
1
,
1
);
...
...
libavcodec/rv40data.h
View file @
bb8a6e03
...
...
@@ -68,20 +68,6 @@ static const uint8_t rv40_luma_dc_quant[2][32] = {
* @name Coefficients used by the RV40 loop filter
* @{
*/
/**
* dither values for deblocking filter - left/top values
*/
static
const
uint8_t
rv40_dither_l
[
16
]
=
{
0x40
,
0x50
,
0x20
,
0x60
,
0x30
,
0x50
,
0x40
,
0x30
,
0x50
,
0x40
,
0x50
,
0x30
,
0x60
,
0x20
,
0x50
,
0x40
};
/**
* dither values for deblocking filter - right/bottom values
*/
static
const
uint8_t
rv40_dither_r
[
16
]
=
{
0x40
,
0x30
,
0x60
,
0x20
,
0x50
,
0x30
,
0x30
,
0x40
,
0x40
,
0x40
,
0x50
,
0x30
,
0x20
,
0x60
,
0x30
,
0x40
};
/** alpha parameter for RV40 loop filter - almost the same as in JVT-A003r1 */
static
const
uint8_t
rv40_alpha_tab
[
32
]
=
{
...
...
libavcodec/rv40dsp.c
View file @
bb8a6e03
...
...
@@ -294,6 +294,164 @@ static void rv40_weight_func_ ## size (uint8_t *dst, uint8_t *src1, uint8_t *src
RV40_WEIGHT_FUNC
(
16
)
RV40_WEIGHT_FUNC
(
8
)
/**
* dither values for deblocking filter - left/top values
*/
static
const
uint8_t
rv40_dither_l
[
16
]
=
{
0x40
,
0x50
,
0x20
,
0x60
,
0x30
,
0x50
,
0x40
,
0x30
,
0x50
,
0x40
,
0x50
,
0x30
,
0x60
,
0x20
,
0x50
,
0x40
};
/**
* dither values for deblocking filter - right/bottom values
*/
static
const
uint8_t
rv40_dither_r
[
16
]
=
{
0x40
,
0x30
,
0x60
,
0x20
,
0x50
,
0x30
,
0x30
,
0x40
,
0x40
,
0x40
,
0x50
,
0x30
,
0x20
,
0x60
,
0x30
,
0x40
};
#define CLIP_SYMM(a, b) av_clip(a, -(b), b)
/**
* weaker deblocking very similar to the one described in 4.4.2 of JVT-A003r1
*/
static
inline
void
rv40_weak_loop_filter
(
uint8_t
*
src
,
const
int
step
,
const
int
filter_p1
,
const
int
filter_q1
,
const
int
alpha
,
const
int
beta
,
const
int
lim_p0q0
,
const
int
lim_q1
,
const
int
lim_p1
,
const
int
diff_p1p0
,
const
int
diff_q1q0
,
const
int
diff_p1p2
,
const
int
diff_q1q2
)
{
uint8_t
*
cm
=
ff_cropTbl
+
MAX_NEG_CROP
;
int
t
,
u
,
diff
;
t
=
src
[
0
*
step
]
-
src
[
-
1
*
step
];
if
(
!
t
)
return
;
u
=
(
alpha
*
FFABS
(
t
))
>>
7
;
if
(
u
>
3
-
(
filter_p1
&&
filter_q1
))
return
;
t
<<=
2
;
if
(
filter_p1
&&
filter_q1
)
t
+=
src
[
-
2
*
step
]
-
src
[
1
*
step
];
diff
=
CLIP_SYMM
((
t
+
4
)
>>
3
,
lim_p0q0
);
src
[
-
1
*
step
]
=
cm
[
src
[
-
1
*
step
]
+
diff
];
src
[
0
*
step
]
=
cm
[
src
[
0
*
step
]
-
diff
];
if
(
FFABS
(
diff_p1p2
)
<=
beta
&&
filter_p1
){
t
=
(
diff_p1p0
+
diff_p1p2
-
diff
)
>>
1
;
src
[
-
2
*
step
]
=
cm
[
src
[
-
2
*
step
]
-
CLIP_SYMM
(
t
,
lim_p1
)];
}
if
(
FFABS
(
diff_q1q2
)
<=
beta
&&
filter_q1
){
t
=
(
diff_q1q0
+
diff_q1q2
+
diff
)
>>
1
;
src
[
1
*
step
]
=
cm
[
src
[
1
*
step
]
-
CLIP_SYMM
(
t
,
lim_q1
)];
}
}
static
av_always_inline
void
rv40_adaptive_loop_filter
(
uint8_t
*
src
,
const
int
step
,
const
int
stride
,
const
int
dmode
,
const
int
lim_q1
,
const
int
lim_p1
,
const
int
alpha
,
const
int
beta
,
const
int
beta2
,
const
int
chroma
,
const
int
edge
)
{
int
diff_p1p0
[
4
],
diff_q1q0
[
4
],
diff_p1p2
[
4
],
diff_q1q2
[
4
];
int
sum_p1p0
=
0
,
sum_q1q0
=
0
,
sum_p1p2
=
0
,
sum_q1q2
=
0
;
uint8_t
*
ptr
;
int
flag_strong0
=
1
,
flag_strong1
=
1
;
int
filter_p1
,
filter_q1
;
int
i
;
int
lims
;
for
(
i
=
0
,
ptr
=
src
;
i
<
4
;
i
++
,
ptr
+=
stride
){
diff_p1p0
[
i
]
=
ptr
[
-
2
*
step
]
-
ptr
[
-
1
*
step
];
diff_q1q0
[
i
]
=
ptr
[
1
*
step
]
-
ptr
[
0
*
step
];
sum_p1p0
+=
diff_p1p0
[
i
];
sum_q1q0
+=
diff_q1q0
[
i
];
}
filter_p1
=
FFABS
(
sum_p1p0
)
<
(
beta
<<
2
);
filter_q1
=
FFABS
(
sum_q1q0
)
<
(
beta
<<
2
);
if
(
!
filter_p1
&&
!
filter_q1
)
return
;
for
(
i
=
0
,
ptr
=
src
;
i
<
4
;
i
++
,
ptr
+=
stride
){
diff_p1p2
[
i
]
=
ptr
[
-
2
*
step
]
-
ptr
[
-
3
*
step
];
diff_q1q2
[
i
]
=
ptr
[
1
*
step
]
-
ptr
[
2
*
step
];
sum_p1p2
+=
diff_p1p2
[
i
];
sum_q1q2
+=
diff_q1q2
[
i
];
}
if
(
edge
){
flag_strong0
=
filter_p1
&&
(
FFABS
(
sum_p1p2
)
<
beta2
);
flag_strong1
=
filter_q1
&&
(
FFABS
(
sum_q1q2
)
<
beta2
);
}
else
{
flag_strong0
=
flag_strong1
=
0
;
}
lims
=
filter_p1
+
filter_q1
+
((
lim_q1
+
lim_p1
)
>>
1
)
+
1
;
if
(
flag_strong0
&&
flag_strong1
){
/* strong filtering */
for
(
i
=
0
;
i
<
4
;
i
++
,
src
+=
stride
){
int
sflag
,
p0
,
q0
,
p1
,
q1
;
int
t
=
src
[
0
*
step
]
-
src
[
-
1
*
step
];
if
(
!
t
)
continue
;
sflag
=
(
alpha
*
FFABS
(
t
))
>>
7
;
if
(
sflag
>
1
)
continue
;
p0
=
(
25
*
src
[
-
3
*
step
]
+
26
*
src
[
-
2
*
step
]
+
26
*
src
[
-
1
*
step
]
+
26
*
src
[
0
*
step
]
+
25
*
src
[
1
*
step
]
+
rv40_dither_l
[
dmode
+
i
])
>>
7
;
q0
=
(
25
*
src
[
-
2
*
step
]
+
26
*
src
[
-
1
*
step
]
+
26
*
src
[
0
*
step
]
+
26
*
src
[
1
*
step
]
+
25
*
src
[
2
*
step
]
+
rv40_dither_r
[
dmode
+
i
])
>>
7
;
if
(
sflag
){
p0
=
av_clip
(
p0
,
src
[
-
1
*
step
]
-
lims
,
src
[
-
1
*
step
]
+
lims
);
q0
=
av_clip
(
q0
,
src
[
0
*
step
]
-
lims
,
src
[
0
*
step
]
+
lims
);
}
p1
=
(
25
*
src
[
-
4
*
step
]
+
26
*
src
[
-
3
*
step
]
+
26
*
src
[
-
2
*
step
]
+
26
*
p0
+
25
*
src
[
0
*
step
]
+
rv40_dither_l
[
dmode
+
i
])
>>
7
;
q1
=
(
25
*
src
[
-
1
*
step
]
+
26
*
q0
+
26
*
src
[
1
*
step
]
+
26
*
src
[
2
*
step
]
+
25
*
src
[
3
*
step
]
+
rv40_dither_r
[
dmode
+
i
])
>>
7
;
if
(
sflag
){
p1
=
av_clip
(
p1
,
src
[
-
2
*
step
]
-
lims
,
src
[
-
2
*
step
]
+
lims
);
q1
=
av_clip
(
q1
,
src
[
1
*
step
]
-
lims
,
src
[
1
*
step
]
+
lims
);
}
src
[
-
2
*
step
]
=
p1
;
src
[
-
1
*
step
]
=
p0
;
src
[
0
*
step
]
=
q0
;
src
[
1
*
step
]
=
q1
;
if
(
!
chroma
){
src
[
-
3
*
step
]
=
(
25
*
src
[
-
1
*
step
]
+
26
*
src
[
-
2
*
step
]
+
51
*
src
[
-
3
*
step
]
+
26
*
src
[
-
4
*
step
]
+
64
)
>>
7
;
src
[
2
*
step
]
=
(
25
*
src
[
0
*
step
]
+
26
*
src
[
1
*
step
]
+
51
*
src
[
2
*
step
]
+
26
*
src
[
3
*
step
]
+
64
)
>>
7
;
}
}
}
else
if
(
filter_p1
&&
filter_q1
){
for
(
i
=
0
;
i
<
4
;
i
++
,
src
+=
stride
)
rv40_weak_loop_filter
(
src
,
step
,
1
,
1
,
alpha
,
beta
,
lims
,
lim_q1
,
lim_p1
,
diff_p1p0
[
i
],
diff_q1q0
[
i
],
diff_p1p2
[
i
],
diff_q1q2
[
i
]);
}
else
{
for
(
i
=
0
;
i
<
4
;
i
++
,
src
+=
stride
)
rv40_weak_loop_filter
(
src
,
step
,
filter_p1
,
filter_q1
,
alpha
,
beta
,
lims
>>
1
,
lim_q1
>>
1
,
lim_p1
>>
1
,
diff_p1p0
[
i
],
diff_q1q0
[
i
],
diff_p1p2
[
i
],
diff_q1q2
[
i
]);
}
}
static
void
rv40_v_loop_filter
(
uint8_t
*
src
,
int
stride
,
int
dmode
,
int
lim_q1
,
int
lim_p1
,
int
alpha
,
int
beta
,
int
beta2
,
int
chroma
,
int
edge
){
rv40_adaptive_loop_filter
(
src
,
1
,
stride
,
dmode
,
lim_q1
,
lim_p1
,
alpha
,
beta
,
beta2
,
chroma
,
edge
);
}
static
void
rv40_h_loop_filter
(
uint8_t
*
src
,
int
stride
,
int
dmode
,
int
lim_q1
,
int
lim_p1
,
int
alpha
,
int
beta
,
int
beta2
,
int
chroma
,
int
edge
){
rv40_adaptive_loop_filter
(
src
,
stride
,
1
,
dmode
,
lim_q1
,
lim_p1
,
alpha
,
beta
,
beta2
,
chroma
,
edge
);
}
av_cold
void
ff_rv40dsp_init
(
RV34DSPContext
*
c
,
DSPContext
*
dsp
)
{
ff_rv34dsp_init
(
c
,
dsp
);
...
...
@@ -371,6 +529,9 @@ av_cold void ff_rv40dsp_init(RV34DSPContext *c, DSPContext* dsp) {
c
->
rv40_weight_pixels_tab
[
0
]
=
rv40_weight_func_16
;
c
->
rv40_weight_pixels_tab
[
1
]
=
rv40_weight_func_8
;
c
->
rv40_h_loop_filter
=
rv40_h_loop_filter
;
c
->
rv40_v_loop_filter
=
rv40_v_loop_filter
;
if
(
HAVE_MMX
)
ff_rv40dsp_init_x86
(
c
,
dsp
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment