Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
e9d0fdef
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e9d0fdef
编写于
11月 23, 2008
作者:
K
Kostya Shishkov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Strong filtering function for future RV40 loop filter
Originally committed as revision 15918 to
svn://svn.ffmpeg.org/ffmpeg/trunk
上级
d270cb4a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
104 addition
and
0 deletion
+104
-0
libavcodec/rv40.c
libavcodec/rv40.c
+104
-0
未找到文件。
libavcodec/rv40.c
浏览文件 @
e9d0fdef
...
...
@@ -285,6 +285,110 @@ static inline void rv40_weak_loop_filter(uint8_t *src, const int step,
}
}
static
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
);
}
/**
* Initialize decoder.
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录