Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
943f7902
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,发现更多精彩内容 >>
提交
943f7902
编写于
5月 03, 2018
作者:
P
Paul B Mahol
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
avfilter/vf_neighbor: add >8 depth suppport
Signed-off-by:
N
Paul B Mahol
<
onemda@gmail.com
>
上级
c8c2fb09
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
118 addition
and
24 deletion
+118
-24
libavfilter/vf_neighbor.c
libavfilter/vf_neighbor.c
+118
-24
未找到文件。
libavfilter/vf_neighbor.c
浏览文件 @
943f7902
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
*/
*/
#include "libavutil/imgutils.h"
#include "libavutil/imgutils.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixdesc.h"
#include "libavutil/opt.h"
#include "libavutil/opt.h"
#include "avfilter.h"
#include "avfilter.h"
...
@@ -39,6 +40,9 @@ typedef struct NContext {
...
@@ -39,6 +40,9 @@ typedef struct NContext {
int
threshold
[
4
];
int
threshold
[
4
];
int
coordinates
;
int
coordinates
;
int
depth
;
int
bpc
;
void
(
*
filter
)(
uint8_t
*
dst
,
const
uint8_t
*
p1
,
int
width
,
void
(
*
filter
)(
uint8_t
*
dst
,
const
uint8_t
*
p1
,
int
width
,
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
);
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
);
}
NContext
;
}
NContext
;
...
@@ -46,10 +50,24 @@ typedef struct NContext {
...
@@ -46,10 +50,24 @@ typedef struct NContext {
static
int
query_formats
(
AVFilterContext
*
ctx
)
static
int
query_formats
(
AVFilterContext
*
ctx
)
{
{
static
const
enum
AVPixelFormat
pix_fmts
[]
=
{
static
const
enum
AVPixelFormat
pix_fmts
[]
=
{
AV_PIX_FMT_YUVA444P
,
AV_PIX_FMT_YUVA422P
,
AV_PIX_FMT_YUVA420P
,
AV_PIX_FMT_YUVA444P
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV440P
,
AV_PIX_FMT_YUVJ444P
,
AV_PIX_FMT_YUVJ440P
,
AV_PIX_FMT_YUVJ422P
,
AV_PIX_FMT_YUVJ420P
,
AV_PIX_FMT_YUVJ411P
,
AV_PIX_FMT_YUVJ444P
,
AV_PIX_FMT_YUVJ440P
,
AV_PIX_FMT_YUV444P
,
AV_PIX_FMT_YUV440P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUVA422P
,
AV_PIX_FMT_YUV422P
,
AV_PIX_FMT_YUVA420P
,
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_GBRP
,
AV_PIX_FMT_GBRAP
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_NONE
AV_PIX_FMT_YUVJ422P
,
AV_PIX_FMT_YUVJ420P
,
AV_PIX_FMT_YUVJ411P
,
AV_PIX_FMT_YUV411P
,
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUV420P9
,
AV_PIX_FMT_YUV422P9
,
AV_PIX_FMT_YUV444P9
,
AV_PIX_FMT_YUV420P10
,
AV_PIX_FMT_YUV422P10
,
AV_PIX_FMT_YUV444P10
,
AV_PIX_FMT_YUV420P12
,
AV_PIX_FMT_YUV422P12
,
AV_PIX_FMT_YUV444P12
,
AV_PIX_FMT_YUV440P12
,
AV_PIX_FMT_YUV420P14
,
AV_PIX_FMT_YUV422P14
,
AV_PIX_FMT_YUV444P14
,
AV_PIX_FMT_YUV420P16
,
AV_PIX_FMT_YUV422P16
,
AV_PIX_FMT_YUV444P16
,
AV_PIX_FMT_YUVA420P9
,
AV_PIX_FMT_YUVA422P9
,
AV_PIX_FMT_YUVA444P9
,
AV_PIX_FMT_YUVA420P10
,
AV_PIX_FMT_YUVA422P10
,
AV_PIX_FMT_YUVA444P10
,
AV_PIX_FMT_YUVA420P16
,
AV_PIX_FMT_YUVA422P16
,
AV_PIX_FMT_YUVA444P16
,
AV_PIX_FMT_GBRP
,
AV_PIX_FMT_GBRP9
,
AV_PIX_FMT_GBRP10
,
AV_PIX_FMT_GBRP12
,
AV_PIX_FMT_GBRP14
,
AV_PIX_FMT_GBRP16
,
AV_PIX_FMT_GBRAP
,
AV_PIX_FMT_GBRAP10
,
AV_PIX_FMT_GBRAP12
,
AV_PIX_FMT_GBRAP16
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_GRAY9
,
AV_PIX_FMT_GRAY10
,
AV_PIX_FMT_GRAY12
,
AV_PIX_FMT_GRAY16
,
AV_PIX_FMT_NONE
};
};
return
ff_set_common_formats
(
ctx
,
ff_make_format_list
(
pix_fmts
));
return
ff_set_common_formats
(
ctx
,
ff_make_format_list
(
pix_fmts
));
...
@@ -75,6 +93,27 @@ static void erosion(uint8_t *dst, const uint8_t *p1, int width,
...
@@ -75,6 +93,27 @@ static void erosion(uint8_t *dst, const uint8_t *p1, int width,
}
}
}
}
static
void
erosion16
(
uint8_t
*
dstp
,
const
uint8_t
*
p1
,
int
width
,
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
{
uint16_t
*
dst
=
(
uint16_t
*
)
dstp
;
int
x
,
i
;
for
(
x
=
0
;
x
<
width
;
x
++
)
{
int
min
=
AV_RN16A
(
&
p1
[
2
*
x
]);
int
limit
=
FFMAX
(
min
-
threshold
,
0
);
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
coord
&
(
1
<<
i
))
{
min
=
FFMIN
(
min
,
AV_RN16A
(
coordinates
[
i
]
+
x
*
2
));
}
min
=
FFMAX
(
min
,
limit
);
}
dst
[
x
]
=
min
;
}
}
static
void
dilation
(
uint8_t
*
dst
,
const
uint8_t
*
p1
,
int
width
,
static
void
dilation
(
uint8_t
*
dst
,
const
uint8_t
*
p1
,
int
width
,
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
{
{
...
@@ -95,6 +134,27 @@ static void dilation(uint8_t *dst, const uint8_t *p1, int width,
...
@@ -95,6 +134,27 @@ static void dilation(uint8_t *dst, const uint8_t *p1, int width,
}
}
}
}
static
void
dilation16
(
uint8_t
*
dstp
,
const
uint8_t
*
p1
,
int
width
,
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
{
uint16_t
*
dst
=
(
uint16_t
*
)
dstp
;
int
x
,
i
;
for
(
x
=
0
;
x
<
width
;
x
++
)
{
int
max
=
AV_RN16A
(
&
p1
[
x
*
2
]);
int
limit
=
FFMIN
(
max
+
threshold
,
255
);
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
coord
&
(
1
<<
i
))
{
max
=
FFMAX
(
max
,
AV_RN16A
(
coordinates
[
i
]
+
x
*
2
));
}
max
=
FFMIN
(
max
,
limit
);
}
dst
[
x
]
=
max
;
}
}
static
void
deflate
(
uint8_t
*
dst
,
const
uint8_t
*
p1
,
int
width
,
static
void
deflate
(
uint8_t
*
dst
,
const
uint8_t
*
p1
,
int
width
,
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
{
{
...
@@ -110,6 +170,22 @@ static void deflate(uint8_t *dst, const uint8_t *p1, int width,
...
@@ -110,6 +170,22 @@ static void deflate(uint8_t *dst, const uint8_t *p1, int width,
}
}
}
}
static
void
deflate16
(
uint8_t
*
dstp
,
const
uint8_t
*
p1
,
int
width
,
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
{
uint16_t
*
dst
=
(
uint16_t
*
)
dstp
;
int
x
,
i
;
for
(
x
=
0
;
x
<
width
;
x
++
)
{
int
sum
=
0
;
int
limit
=
FFMAX
(
AV_RN16A
(
&
p1
[
2
*
x
])
-
threshold
,
0
);
for
(
i
=
0
;
i
<
8
;
sum
+=
AV_RN16A
(
coordinates
[
i
++
]
+
x
*
2
));
dst
[
x
]
=
FFMAX
(
FFMIN
(
sum
/
8
,
p1
[
x
]),
limit
);
}
}
static
void
inflate
(
uint8_t
*
dst
,
const
uint8_t
*
p1
,
int
width
,
static
void
inflate
(
uint8_t
*
dst
,
const
uint8_t
*
p1
,
int
width
,
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
{
{
...
@@ -125,29 +201,46 @@ static void inflate(uint8_t *dst, const uint8_t *p1, int width,
...
@@ -125,29 +201,46 @@ static void inflate(uint8_t *dst, const uint8_t *p1, int width,
}
}
}
}
static
void
inflate16
(
uint8_t
*
dstp
,
const
uint8_t
*
p1
,
int
width
,
int
threshold
,
const
uint8_t
*
coordinates
[],
int
coord
)
{
uint16_t
*
dst
=
(
uint16_t
*
)
dstp
;
int
x
,
i
;
for
(
x
=
0
;
x
<
width
;
x
++
)
{
int
sum
=
0
;
int
limit
=
FFMIN
(
AV_RN16A
(
&
p1
[
2
*
x
])
+
threshold
,
255
);
for
(
i
=
0
;
i
<
8
;
sum
+=
AV_RN16A
(
coordinates
[
i
++
]
+
x
*
2
));
dst
[
x
]
=
FFMIN
(
FFMAX
(
sum
/
8
,
p1
[
x
]),
limit
);
}
}
static
int
config_input
(
AVFilterLink
*
inlink
)
static
int
config_input
(
AVFilterLink
*
inlink
)
{
{
AVFilterContext
*
ctx
=
inlink
->
dst
;
AVFilterContext
*
ctx
=
inlink
->
dst
;
NContext
*
s
=
ctx
->
priv
;
NContext
*
s
=
ctx
->
priv
;
const
AVPixFmtDescriptor
*
desc
=
av_pix_fmt_desc_get
(
inlink
->
format
);
const
AVPixFmtDescriptor
*
desc
=
av_pix_fmt_desc_get
(
inlink
->
format
);
int
ret
;
if
((
ret
=
av_image_fill_linesizes
(
s
->
planewidth
,
inlink
->
format
,
inlink
->
w
))
<
0
)
s
->
depth
=
desc
->
comp
[
0
].
depth
;
return
ret
;
s
->
bpc
=
(
s
->
depth
+
7
)
/
8
;
s
->
planewidth
[
1
]
=
s
->
planewidth
[
2
]
=
AV_CEIL_RSHIFT
(
inlink
->
w
,
desc
->
log2_chroma_w
);
s
->
planewidth
[
0
]
=
s
->
planewidth
[
3
]
=
inlink
->
w
;
s
->
planeheight
[
1
]
=
s
->
planeheight
[
2
]
=
AV_CEIL_RSHIFT
(
inlink
->
h
,
desc
->
log2_chroma_h
);
s
->
planeheight
[
1
]
=
s
->
planeheight
[
2
]
=
AV_CEIL_RSHIFT
(
inlink
->
h
,
desc
->
log2_chroma_h
);
s
->
planeheight
[
0
]
=
s
->
planeheight
[
3
]
=
inlink
->
h
;
s
->
planeheight
[
0
]
=
s
->
planeheight
[
3
]
=
inlink
->
h
;
s
->
nb_planes
=
av_pix_fmt_count_planes
(
inlink
->
format
);
s
->
nb_planes
=
av_pix_fmt_count_planes
(
inlink
->
format
);
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"erosion"
))
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"erosion"
))
s
->
filter
=
erosion
;
s
->
filter
=
s
->
depth
>
8
?
erosion16
:
erosion
;
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"dilation"
))
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"dilation"
))
s
->
filter
=
dilation
;
s
->
filter
=
s
->
depth
>
8
?
dilation16
:
dilation
;
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"deflate"
))
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"deflate"
))
s
->
filter
=
deflate
;
s
->
filter
=
s
->
depth
>
8
?
deflate16
:
deflate
;
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"inflate"
))
else
if
(
!
strcmp
(
ctx
->
filter
->
name
,
"inflate"
))
s
->
filter
=
inflate
;
s
->
filter
=
s
->
depth
>
8
?
inflate16
:
inflate
;
return
0
;
return
0
;
}
}
...
@@ -161,6 +254,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
...
@@ -161,6 +254,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
int
plane
,
y
;
int
plane
,
y
;
for
(
plane
=
0
;
plane
<
s
->
nb_planes
;
plane
++
)
{
for
(
plane
=
0
;
plane
<
s
->
nb_planes
;
plane
++
)
{
const
int
bpc
=
s
->
bpc
;
const
int
threshold
=
s
->
threshold
[
plane
];
const
int
threshold
=
s
->
threshold
[
plane
];
const
int
stride
=
in
->
linesize
[
plane
];
const
int
stride
=
in
->
linesize
[
plane
];
const
int
dstride
=
out
->
linesize
[
plane
];
const
int
dstride
=
out
->
linesize
[
plane
];
...
@@ -172,28 +266,28 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
...
@@ -172,28 +266,28 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
uint8_t
*
dst
=
out
->
data
[
plane
]
+
slice_start
*
dstride
;
uint8_t
*
dst
=
out
->
data
[
plane
]
+
slice_start
*
dstride
;
if
(
!
threshold
)
{
if
(
!
threshold
)
{
av_image_copy_plane
(
dst
,
dstride
,
src
,
stride
,
width
,
slice_end
-
slice_start
);
av_image_copy_plane
(
dst
,
dstride
,
src
,
stride
,
width
*
bpc
,
slice_end
-
slice_start
);
continue
;
continue
;
}
}
for
(
y
=
slice_start
;
y
<
slice_end
;
y
++
)
{
for
(
y
=
slice_start
;
y
<
slice_end
;
y
++
)
{
const
int
nh
=
y
>
0
;
const
int
nh
=
y
>
0
;
const
int
ph
=
y
<
height
-
1
;
const
int
ph
=
y
<
height
-
1
;
const
uint8_t
*
coordinates
[]
=
{
src
-
nh
*
stride
,
src
+
1
-
nh
*
stride
,
src
+
2
-
nh
*
stride
,
const
uint8_t
*
coordinates
[]
=
{
src
-
nh
*
stride
,
src
+
1
*
bpc
-
nh
*
stride
,
src
+
2
*
bpc
-
nh
*
stride
,
src
,
src
+
2
,
src
,
src
+
2
*
bpc
,
src
+
ph
*
stride
,
src
+
1
+
ph
*
stride
,
src
+
2
+
ph
*
stride
};
src
+
ph
*
stride
,
src
+
1
*
bpc
+
ph
*
stride
,
src
+
2
*
bpc
+
ph
*
stride
};
const
uint8_t
*
coordinateslb
[]
=
{
src
-
nh
*
stride
,
src
-
nh
*
stride
,
src
+
1
-
nh
*
stride
,
const
uint8_t
*
coordinateslb
[]
=
{
src
+
1
*
bpc
-
nh
*
stride
,
src
-
nh
*
stride
,
src
+
1
*
bpc
-
nh
*
stride
,
src
,
src
+
1
,
src
+
1
*
bpc
,
src
+
1
*
bpc
,
src
+
ph
*
stride
,
src
+
ph
*
stride
,
src
+
1
+
ph
*
stride
};
src
+
1
*
bpc
+
ph
*
stride
,
src
+
ph
*
stride
,
src
+
1
*
bpc
+
ph
*
stride
};
const
uint8_t
*
coordinatesrb
[]
=
{
src
+
width
-
2
-
nh
*
stride
,
src
+
width
-
1
-
nh
*
stride
,
src
+
width
-
1
-
nh
*
stride
,
const
uint8_t
*
coordinatesrb
[]
=
{
src
+
(
width
-
2
)
*
bpc
-
nh
*
stride
,
src
+
(
width
-
1
)
*
bpc
-
nh
*
stride
,
src
+
(
width
-
2
)
*
bpc
-
nh
*
stride
,
src
+
width
-
2
,
src
+
width
-
1
,
src
+
(
width
-
2
)
*
bpc
,
src
+
(
width
-
2
)
*
bpc
,
src
+
width
-
2
+
ph
*
stride
,
src
+
width
-
1
+
ph
*
stride
,
src
+
width
-
1
+
ph
*
stride
};
src
+
(
width
-
2
)
*
bpc
+
ph
*
stride
,
src
+
(
width
-
1
)
*
bpc
+
ph
*
stride
,
src
+
(
width
-
2
)
*
bpc
+
ph
*
stride
};
s
->
filter
(
dst
,
src
,
1
,
threshold
,
coordinateslb
,
s
->
coordinates
);
s
->
filter
(
dst
,
src
,
1
,
threshold
,
coordinateslb
,
s
->
coordinates
);
s
->
filter
(
dst
+
1
,
src
+
1
,
width
-
2
,
threshold
,
coordinates
,
s
->
coordinates
);
s
->
filter
(
dst
+
1
*
bpc
,
src
+
1
*
bpc
,
width
-
2
,
threshold
,
coordinates
,
s
->
coordinates
);
s
->
filter
(
dst
+
width
-
1
,
src
+
width
-
1
,
1
,
threshold
,
coordinatesrb
,
s
->
coordinates
);
s
->
filter
(
dst
+
(
width
-
1
)
*
bpc
,
src
+
(
width
-
1
)
*
bpc
,
1
,
threshold
,
coordinatesrb
,
s
->
coordinates
);
src
+=
stride
;
src
+=
stride
;
dst
+=
dstride
;
dst
+=
dstride
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录