Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
cc8b3492
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,发现更多精彩内容 >>
提交
cc8b3492
编写于
12月 15, 2014
作者:
M
Matt Oliver
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'upstream/master'
上级
d0a3c1ab
3b537eab
变更
21
隐藏空白更改
内联
并排
Showing
21 changed file
with
99 addition
and
447 deletion
+99
-447
doc/fftools-common-opts.texi
doc/fftools-common-opts.texi
+13
-5
doc/filters.texi
doc/filters.texi
+0
-1
ffmpeg.c
ffmpeg.c
+1
-0
libavcodec/avcodec.h
libavcodec/avcodec.h
+1
-1
libavcodec/avpacket.c
libavcodec/avpacket.c
+4
-1
libavcodec/dvdsubdec.c
libavcodec/dvdsubdec.c
+1
-1
libavcodec/libxvid_rc.c
libavcodec/libxvid_rc.c
+1
-1
libavfilter/Makefile
libavfilter/Makefile
+0
-1
libavfilter/libmpcodecs/vf_uspp.c
libavfilter/libmpcodecs/vf_uspp.c
+0
-394
libavfilter/version.h
libavfilter/version.h
+1
-1
libavfilter/vf_kerndeint.c
libavfilter/vf_kerndeint.c
+1
-1
libavfilter/vf_mp.c
libavfilter/vf_mp.c
+0
-4
libavfilter/vf_spp.c
libavfilter/vf_spp.c
+12
-8
libavfilter/vf_unsharp.c
libavfilter/vf_unsharp.c
+1
-1
libavfilter/vf_uspp.c
libavfilter/vf_uspp.c
+27
-12
libavformat/mov.c
libavformat/mov.c
+9
-9
libavformat/nutenc.c
libavformat/nutenc.c
+4
-1
libavformat/utils.c
libavformat/utils.c
+11
-1
libavformat/version.h
libavformat/version.h
+1
-1
libavutil/dict.c
libavutil/dict.c
+5
-1
libswresample/soxr_resample.c
libswresample/soxr_resample.c
+6
-2
未找到文件。
doc/fftools-common-opts.texi
浏览文件 @
cc8b3492
...
...
@@ -204,21 +204,29 @@ directory.
This file can be useful for bug reports.
It also implies @code{-loglevel verbose}.
Setting the environment variable @
code
{FFREPORT} to any value has the
Setting the environment variable @
env
{FFREPORT} to any value has the
same effect. If the value is a ':'-separated key=value sequence, these
options will affect the report; option
s
values must be escaped if they
options will affect the report; option values must be escaped if they
contain special characters or the options delimiter ':' (see the
``Quoting and escaping'' section in the ffmpeg-utils manual). The
following option is recognized:
``Quoting and escaping'' section in the ffmpeg-utils manual).
The following options are recognized:
@table @option
@item file
set the file name to use for the report; @code{%p} is expanded to the name
of the program, @code{%t} is expanded to a timestamp, @code{%%} is expanded
to a plain @code{%}
@item level
set the log
level
set the log
verbosity level using a numerical value (see @code{-loglevel}).
@end table
For example, to output a report to a file named @file{ffreport.log}
using a log level of @code{32} (alias for log level @code{info}):
@example
FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
@end example
Errors in parsing the environment variable are not fatal, and will not
appear in the report.
...
...
doc/filters.texi
浏览文件 @
cc8b3492
...
...
@@ -6120,7 +6120,6 @@ The list of the currently supported filters follows:
@item ilpack
@item pp7
@item softpulldown
@item uspp
@end table
The parameter syntax and behavior for the listed filters are the same
...
...
ffmpeg.c
浏览文件 @
cc8b3492
...
...
@@ -2740,6 +2740,7 @@ static int transcode_init(void)
sar
=
dec_ctx
->
sample_aspect_ratio
;
ost
->
st
->
sample_aspect_ratio
=
enc_ctx
->
sample_aspect_ratio
=
sar
;
ost
->
st
->
avg_frame_rate
=
ist
->
st
->
avg_frame_rate
;
ost
->
st
->
r_frame_rate
=
ist
->
st
->
r_frame_rate
;
break
;
case
AVMEDIA_TYPE_SUBTITLE
:
enc_ctx
->
width
=
dec_ctx
->
width
;
...
...
libavcodec/avcodec.h
浏览文件 @
cc8b3492
...
...
@@ -3451,7 +3451,7 @@ typedef struct AVSubtitleRect {
/**
* data+linesize for the bitmap of this subtitle.
* can be set for text/ass as well once they
whe
re rendered
* can be set for text/ass as well once they
a
re rendered
*/
AVPicture
pict
;
enum
AVSubtitleType
type
;
...
...
libavcodec/avpacket.c
浏览文件 @
cc8b3492
...
...
@@ -546,8 +546,11 @@ int av_packet_ref(AVPacket *dst, const AVPacket *src)
if
(
ret
<
0
)
goto
fail
;
memcpy
(
dst
->
buf
->
data
,
src
->
data
,
src
->
size
);
}
else
}
else
{
dst
->
buf
=
av_buffer_ref
(
src
->
buf
);
if
(
!
dst
->
buf
)
goto
fail
;
}
dst
->
size
=
src
->
size
;
dst
->
data
=
dst
->
buf
->
data
;
...
...
libavcodec/dvdsubdec.c
浏览文件 @
cc8b3492
...
...
@@ -597,7 +597,7 @@ static int parse_ifo_palette(DVDSubContext *ctx, char *p)
ctx
->
has_palette
=
0
;
if
((
ifo
=
fopen
(
p
,
"r"
))
==
NULL
)
{
av_log
(
ctx
,
AV_LOG_WARNING
,
"Unable to open IFO file
\"
%s
\"
: %s
\n
"
,
p
,
strerror
(
errno
));
av_log
(
ctx
,
AV_LOG_WARNING
,
"Unable to open IFO file
\"
%s
\"
: %s
\n
"
,
p
,
av_err2str
(
AVERROR
(
errno
)
));
return
AVERROR_EOF
;
}
if
(
fread
(
ifostr
,
12
,
1
,
ifo
)
!=
1
||
memcmp
(
ifostr
,
"DVDVIDEO-VTS"
,
12
))
{
...
...
libavcodec/libxvid_rc.c
浏览文件 @
cc8b3492
...
...
@@ -69,7 +69,7 @@ av_cold int ff_xvid_rate_control_init(MpegEncContext *s)
if
(
write
(
fd
,
tmp
,
strlen
(
tmp
))
<
0
)
{
int
ret
=
AVERROR
(
errno
);
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error %s writing 2pass logfile
\n
"
,
strerror
(
errno
));
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error %s writing 2pass logfile
\n
"
,
av_err2str
(
ret
));
av_free
(
tmp_name
);
close
(
fd
);
return
ret
;
...
...
libavfilter/Makefile
浏览文件 @
cc8b3492
...
...
@@ -227,7 +227,6 @@ OBJS-$(CONFIG_MP_FILTER) += libmpcodecs/vf_fspp.o
OBJS-$(CONFIG_MP_FILTER)
+=
libmpcodecs/vf_ilpack.o
OBJS-$(CONFIG_MP_FILTER)
+=
libmpcodecs/vf_pp7.o
OBJS-$(CONFIG_MP_FILTER)
+=
libmpcodecs/vf_softpulldown.o
OBJS-$(CONFIG_MP_FILTER)
+=
libmpcodecs/vf_uspp.o
# multimedia filters
OBJS-$(CONFIG_AVECTORSCOPE_FILTER)
+=
avf_avectorscope.o
...
...
libavfilter/libmpcodecs/vf_uspp.c
已删除
100644 → 0
浏览文件 @
d0a3c1ab
/*
* Copyright (C) 2005 Michael Niedermayer <michaelni@gmx.at>
*
* This file is part of MPlayer.
*
* MPlayer is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* MPlayer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <math.h>
#include <assert.h>
#include "config.h"
#include "mp_msg.h"
#include "cpudetect.h"
#include "libavutil/mem.h"
#include "libavcodec/avcodec.h"
#include "img_format.h"
#include "mp_image.h"
#include "vf.h"
#include "av_helpers.h"
#include "libvo/fastmemcpy.h"
#define XMIN(a,b) ((a) < (b) ? (a) : (b))
#define BLOCK 16
//===========================================================================//
DECLARE_ALIGNED
(
8
,
static
const
uint8_t
,
dither
)[
8
][
8
]
=
{
{
0
*
4
,
48
*
4
,
12
*
4
,
60
*
4
,
3
*
4
,
51
*
4
,
15
*
4
,
63
*
4
,
},
{
32
*
4
,
16
*
4
,
44
*
4
,
28
*
4
,
35
*
4
,
19
*
4
,
47
*
4
,
31
*
4
,
},
{
8
*
4
,
56
*
4
,
4
*
4
,
52
*
4
,
11
*
4
,
59
*
4
,
7
*
4
,
55
*
4
,
},
{
40
*
4
,
24
*
4
,
36
*
4
,
20
*
4
,
43
*
4
,
27
*
4
,
39
*
4
,
23
*
4
,
},
{
2
*
4
,
50
*
4
,
14
*
4
,
62
*
4
,
1
*
4
,
49
*
4
,
13
*
4
,
61
*
4
,
},
{
34
*
4
,
18
*
4
,
46
*
4
,
30
*
4
,
33
*
4
,
17
*
4
,
45
*
4
,
29
*
4
,
},
{
10
*
4
,
58
*
4
,
6
*
4
,
54
*
4
,
9
*
4
,
57
*
4
,
5
*
4
,
53
*
4
,
},
{
42
*
4
,
26
*
4
,
38
*
4
,
22
*
4
,
41
*
4
,
25
*
4
,
37
*
4
,
21
*
4
,
},
};
static
const
uint8_t
offset
[
511
][
2
]
=
{
{
0
,
0
},
{
0
,
0
},
{
8
,
8
},
{
0
,
0
},
{
4
,
4
},
{
12
,
8
},
{
8
,
12
},
{
0
,
0
},
{
10
,
2
},
{
4
,
4
},
{
14
,
6
},
{
8
,
8
},
{
2
,
10
},
{
12
,
12
},
{
6
,
14
},
{
0
,
0
},
{
10
,
2
},
{
4
,
4
},
{
14
,
6
},
{
8
,
8
},
{
2
,
10
},
{
12
,
12
},
{
6
,
14
},
{
5
,
1
},
{
15
,
3
},
{
9
,
5
},
{
3
,
7
},
{
13
,
9
},
{
7
,
11
},
{
1
,
13
},
{
11
,
15
},
{
0
,
0
},
{
8
,
0
},
{
0
,
8
},
{
8
,
8
},
{
5
,
1
},
{
13
,
1
},
{
5
,
9
},
{
13
,
9
},
{
2
,
2
},
{
10
,
2
},
{
2
,
10
},
{
10
,
10
},
{
7
,
3
},
{
15
,
3
},
{
7
,
11
},
{
15
,
11
},
{
4
,
4
},
{
12
,
4
},
{
4
,
12
},
{
12
,
12
},
{
1
,
5
},
{
9
,
5
},
{
1
,
13
},
{
9
,
13
},
{
6
,
6
},
{
14
,
6
},
{
6
,
14
},
{
14
,
14
},
{
3
,
7
},
{
11
,
7
},
{
3
,
15
},
{
11
,
15
},
{
0
,
0
},
{
8
,
0
},
{
0
,
8
},
{
8
,
8
},
{
4
,
0
},
{
12
,
0
},
{
4
,
8
},
{
12
,
8
},
{
1
,
1
},
{
9
,
1
},
{
1
,
9
},
{
9
,
9
},
{
5
,
1
},
{
13
,
1
},
{
5
,
9
},
{
13
,
9
},
{
3
,
2
},
{
11
,
2
},
{
3
,
10
},
{
11
,
10
},
{
7
,
2
},
{
15
,
2
},
{
7
,
10
},
{
15
,
10
},
{
2
,
3
},
{
10
,
3
},
{
2
,
11
},
{
10
,
11
},
{
6
,
3
},
{
14
,
3
},
{
6
,
11
},
{
14
,
11
},
{
0
,
4
},
{
8
,
4
},
{
0
,
12
},
{
8
,
12
},
{
4
,
4
},
{
12
,
4
},
{
4
,
12
},
{
12
,
12
},
{
1
,
5
},
{
9
,
5
},
{
1
,
13
},
{
9
,
13
},
{
5
,
5
},
{
13
,
5
},
{
5
,
13
},
{
13
,
13
},
{
3
,
6
},
{
11
,
6
},
{
3
,
14
},
{
11
,
14
},
{
7
,
6
},
{
15
,
6
},
{
7
,
14
},
{
15
,
14
},
{
2
,
7
},
{
10
,
7
},
{
2
,
15
},
{
10
,
15
},
{
6
,
7
},
{
14
,
7
},
{
6
,
15
},
{
14
,
15
},
{
0
,
0
},
{
8
,
0
},
{
0
,
8
},
{
8
,
8
},
{
0
,
2
},
{
8
,
2
},
{
0
,
10
},
{
8
,
10
},
{
0
,
4
},
{
8
,
4
},
{
0
,
12
},
{
8
,
12
},
{
0
,
6
},
{
8
,
6
},
{
0
,
14
},
{
8
,
14
},
{
1
,
1
},
{
9
,
1
},
{
1
,
9
},
{
9
,
9
},
{
1
,
3
},
{
9
,
3
},
{
1
,
11
},
{
9
,
11
},
{
1
,
5
},
{
9
,
5
},
{
1
,
13
},
{
9
,
13
},
{
1
,
7
},
{
9
,
7
},
{
1
,
15
},
{
9
,
15
},
{
2
,
0
},
{
10
,
0
},
{
2
,
8
},
{
10
,
8
},
{
2
,
2
},
{
10
,
2
},
{
2
,
10
},
{
10
,
10
},
{
2
,
4
},
{
10
,
4
},
{
2
,
12
},
{
10
,
12
},
{
2
,
6
},
{
10
,
6
},
{
2
,
14
},
{
10
,
14
},
{
3
,
1
},
{
11
,
1
},
{
3
,
9
},
{
11
,
9
},
{
3
,
3
},
{
11
,
3
},
{
3
,
11
},
{
11
,
11
},
{
3
,
5
},
{
11
,
5
},
{
3
,
13
},
{
11
,
13
},
{
3
,
7
},
{
11
,
7
},
{
3
,
15
},
{
11
,
15
},
{
4
,
0
},
{
12
,
0
},
{
4
,
8
},
{
12
,
8
},
{
4
,
2
},
{
12
,
2
},
{
4
,
10
},
{
12
,
10
},
{
4
,
4
},
{
12
,
4
},
{
4
,
12
},
{
12
,
12
},
{
4
,
6
},
{
12
,
6
},
{
4
,
14
},
{
12
,
14
},
{
5
,
1
},
{
13
,
1
},
{
5
,
9
},
{
13
,
9
},
{
5
,
3
},
{
13
,
3
},
{
5
,
11
},
{
13
,
11
},
{
5
,
5
},
{
13
,
5
},
{
5
,
13
},
{
13
,
13
},
{
5
,
7
},
{
13
,
7
},
{
5
,
15
},
{
13
,
15
},
{
6
,
0
},
{
14
,
0
},
{
6
,
8
},
{
14
,
8
},
{
6
,
2
},
{
14
,
2
},
{
6
,
10
},
{
14
,
10
},
{
6
,
4
},
{
14
,
4
},
{
6
,
12
},
{
14
,
12
},
{
6
,
6
},
{
14
,
6
},
{
6
,
14
},
{
14
,
14
},
{
7
,
1
},
{
15
,
1
},
{
7
,
9
},
{
15
,
9
},
{
7
,
3
},
{
15
,
3
},
{
7
,
11
},
{
15
,
11
},
{
7
,
5
},
{
15
,
5
},
{
7
,
13
},
{
15
,
13
},
{
7
,
7
},
{
15
,
7
},
{
7
,
15
},
{
15
,
15
},
{
0
,
0
},
{
8
,
0
},
{
0
,
8
},
{
8
,
8
},
{
4
,
4
},
{
12
,
4
},
{
4
,
12
},
{
12
,
12
},
{
0
,
4
},
{
8
,
4
},
{
0
,
12
},
{
8
,
12
},
{
4
,
0
},
{
12
,
0
},
{
4
,
8
},
{
12
,
8
},
{
2
,
2
},
{
10
,
2
},
{
2
,
10
},
{
10
,
10
},
{
6
,
6
},
{
14
,
6
},
{
6
,
14
},
{
14
,
14
},
{
2
,
6
},
{
10
,
6
},
{
2
,
14
},
{
10
,
14
},
{
6
,
2
},
{
14
,
2
},
{
6
,
10
},
{
14
,
10
},
{
0
,
2
},
{
8
,
2
},
{
0
,
10
},
{
8
,
10
},
{
4
,
6
},
{
12
,
6
},
{
4
,
14
},
{
12
,
14
},
{
0
,
6
},
{
8
,
6
},
{
0
,
14
},
{
8
,
14
},
{
4
,
2
},
{
12
,
2
},
{
4
,
10
},
{
12
,
10
},
{
2
,
0
},
{
10
,
0
},
{
2
,
8
},
{
10
,
8
},
{
6
,
4
},
{
14
,
4
},
{
6
,
12
},
{
14
,
12
},
{
2
,
4
},
{
10
,
4
},
{
2
,
12
},
{
10
,
12
},
{
6
,
0
},
{
14
,
0
},
{
6
,
8
},
{
14
,
8
},
{
1
,
1
},
{
9
,
1
},
{
1
,
9
},
{
9
,
9
},
{
5
,
5
},
{
13
,
5
},
{
5
,
13
},
{
13
,
13
},
{
1
,
5
},
{
9
,
5
},
{
1
,
13
},
{
9
,
13
},
{
5
,
1
},
{
13
,
1
},
{
5
,
9
},
{
13
,
9
},
{
3
,
3
},
{
11
,
3
},
{
3
,
11
},
{
11
,
11
},
{
7
,
7
},
{
15
,
7
},
{
7
,
15
},
{
15
,
15
},
{
3
,
7
},
{
11
,
7
},
{
3
,
15
},
{
11
,
15
},
{
7
,
3
},
{
15
,
3
},
{
7
,
11
},
{
15
,
11
},
{
1
,
3
},
{
9
,
3
},
{
1
,
11
},
{
9
,
11
},
{
5
,
7
},
{
13
,
7
},
{
5
,
15
},
{
13
,
15
},
{
1
,
7
},
{
9
,
7
},
{
1
,
15
},
{
9
,
15
},
{
5
,
3
},
{
13
,
3
},
{
5
,
11
},
{
13
,
11
},
{
3
,
1
},
{
11
,
1
}
,
{
3
,
9
},
{
11
,
9
},
{
7
,
5
},
{
15
,
5
},
{
7
,
13
},
{
15
,
13
},
{
3
,
5
},
{
11
,
5
},
{
3
,
13
},
{
11
,
13
},
{
7
,
1
},
{
15
,
1
},
{
7
,
9
},
{
15
,
9
},
{
0
,
1
},
{
8
,
1
},
{
0
,
9
},
{
8
,
9
},
{
4
,
5
},
{
12
,
5
},
{
4
,
13
},
{
12
,
13
},
{
0
,
5
},
{
8
,
5
},
{
0
,
13
},
{
8
,
13
},
{
4
,
1
},
{
12
,
1
},
{
4
,
9
},
{
12
,
9
},
{
2
,
3
},
{
10
,
3
},
{
2
,
11
},
{
10
,
11
},
{
6
,
7
},
{
14
,
7
},
{
6
,
15
},
{
14
,
15
},
{
2
,
7
},
{
10
,
7
},
{
2
,
15
},
{
10
,
15
},
{
6
,
3
},
{
14
,
3
},
{
6
,
11
},
{
14
,
11
},
{
0
,
3
},
{
8
,
3
},
{
0
,
11
},
{
8
,
11
},
{
4
,
7
},
{
12
,
7
},
{
4
,
15
},
{
12
,
15
},
{
0
,
7
},
{
8
,
7
},
{
0
,
15
},
{
8
,
15
},
{
4
,
3
},
{
12
,
3
},
{
4
,
11
},
{
12
,
11
},
{
2
,
1
},
{
10
,
1
},
{
2
,
9
},
{
10
,
9
},
{
6
,
5
},
{
14
,
5
},
{
6
,
13
},
{
14
,
13
},
{
2
,
5
},
{
10
,
5
},
{
2
,
13
},
{
10
,
13
},
{
6
,
1
},
{
14
,
1
},
{
6
,
9
},
{
14
,
9
},
{
1
,
0
},
{
9
,
0
},
{
1
,
8
},
{
9
,
8
},
{
5
,
4
},
{
13
,
4
},
{
5
,
12
},
{
13
,
12
},
{
1
,
4
},
{
9
,
4
},
{
1
,
12
},
{
9
,
12
},
{
5
,
0
},
{
13
,
0
},
{
5
,
8
},
{
13
,
8
},
{
3
,
2
},
{
11
,
2
},
{
3
,
10
},
{
11
,
10
},
{
7
,
6
},
{
15
,
6
},
{
7
,
14
},
{
15
,
14
},
{
3
,
6
},
{
11
,
6
},
{
3
,
14
},
{
11
,
14
},
{
7
,
2
},
{
15
,
2
},
{
7
,
10
},
{
15
,
10
},
{
1
,
2
},
{
9
,
2
},
{
1
,
10
},
{
9
,
10
},
{
5
,
6
},
{
13
,
6
},
{
5
,
14
},
{
13
,
14
},
{
1
,
6
},
{
9
,
6
},
{
1
,
14
},
{
9
,
14
},
{
5
,
2
},
{
13
,
2
},
{
5
,
10
},
{
13
,
10
},
{
3
,
0
},
{
11
,
0
},
{
3
,
8
},
{
11
,
8
},
{
7
,
4
},
{
15
,
4
},
{
7
,
12
},
{
15
,
12
},
{
3
,
4
},
{
11
,
4
},
{
3
,
12
},
{
11
,
12
},
{
7
,
0
},
{
15
,
0
},
{
7
,
8
},
{
15
,
8
},
};
struct
vf_priv_s
{
int
log2_count
;
int
qp
;
int
mode
;
int
mpeg2
;
int
temp_stride
[
3
];
uint8_t
*
src
[
3
];
int16_t
*
temp
[
3
];
int
outbuf_size
;
uint8_t
*
outbuf
;
AVCodecContext
*
avctx_enc
[
BLOCK
*
BLOCK
];
AVFrame
*
frame
;
AVFrame
*
frame_dec
;
};
static
void
store_slice_c
(
uint8_t
*
dst
,
int16_t
*
src
,
int
dst_stride
,
int
src_stride
,
int
width
,
int
height
,
int
log2_scale
){
int
y
,
x
;
#define STORE(pos) \
temp= ((src[x + y*src_stride + pos]<<log2_scale) + d[pos])>>8;\
if(temp & 0x100) temp= ~(temp>>31);\
dst[x + y*dst_stride + pos]= temp;
for
(
y
=
0
;
y
<
height
;
y
++
){
const
uint8_t
*
d
=
dither
[
y
&
7
];
for
(
x
=
0
;
x
<
width
;
x
+=
8
){
int
temp
;
STORE
(
0
);
STORE
(
1
);
STORE
(
2
);
STORE
(
3
);
STORE
(
4
);
STORE
(
5
);
STORE
(
6
);
STORE
(
7
);
}
}
}
static
void
filter
(
struct
vf_priv_s
*
p
,
uint8_t
*
dst
[
3
],
uint8_t
*
src
[
3
],
int
dst_stride
[
3
],
int
src_stride
[
3
],
int
width
,
int
height
,
uint8_t
*
qp_store
,
int
qp_stride
){
int
x
,
y
,
i
,
j
;
const
int
count
=
1
<<
p
->
log2_count
;
for
(
i
=
0
;
i
<
3
;
i
++
){
int
is_chroma
=
!!
i
;
int
w
=
width
>>
is_chroma
;
int
h
=
height
>>
is_chroma
;
int
stride
=
p
->
temp_stride
[
i
];
int
block
=
BLOCK
>>
is_chroma
;
if
(
!
src
[
i
]
||
!
dst
[
i
])
continue
;
// HACK avoid crash for Y8 colourspace
for
(
y
=
0
;
y
<
h
;
y
++
){
int
index
=
block
+
block
*
stride
+
y
*
stride
;
fast_memcpy
(
p
->
src
[
i
]
+
index
,
src
[
i
]
+
y
*
src_stride
[
i
],
w
);
for
(
x
=
0
;
x
<
block
;
x
++
){
p
->
src
[
i
][
index
-
x
-
1
]
=
p
->
src
[
i
][
index
+
x
];
p
->
src
[
i
][
index
+
w
+
x
]
=
p
->
src
[
i
][
index
+
w
-
x
-
1
];
}
}
for
(
y
=
0
;
y
<
block
;
y
++
){
fast_memcpy
(
p
->
src
[
i
]
+
(
block
-
1
-
y
)
*
stride
,
p
->
src
[
i
]
+
(
y
+
block
)
*
stride
,
stride
);
fast_memcpy
(
p
->
src
[
i
]
+
(
h
+
block
+
y
)
*
stride
,
p
->
src
[
i
]
+
(
h
-
y
+
block
-
1
)
*
stride
,
stride
);
}
p
->
frame
->
linesize
[
i
]
=
stride
;
memset
(
p
->
temp
[
i
],
0
,
(
h
+
2
*
block
)
*
stride
*
sizeof
(
int16_t
));
}
if
(
p
->
qp
)
p
->
frame
->
quality
=
p
->
qp
*
FF_QP2LAMBDA
;
else
p
->
frame
->
quality
=
norm_qscale
(
qp_store
[
0
],
p
->
mpeg2
)
*
FF_QP2LAMBDA
;
// init per MB qscale stuff FIXME
for
(
i
=
0
;
i
<
count
;
i
++
){
const
int
x1
=
offset
[
i
+
count
-
1
][
0
];
const
int
y1
=
offset
[
i
+
count
-
1
][
1
];
int
offset
;
p
->
frame
->
data
[
0
]
=
p
->
src
[
0
]
+
x1
+
y1
*
p
->
frame
->
linesize
[
0
];
p
->
frame
->
data
[
1
]
=
p
->
src
[
1
]
+
x1
/
2
+
y1
/
2
*
p
->
frame
->
linesize
[
1
];
p
->
frame
->
data
[
2
]
=
p
->
src
[
2
]
+
x1
/
2
+
y1
/
2
*
p
->
frame
->
linesize
[
2
];
avcodec_encode_video
(
p
->
avctx_enc
[
i
],
p
->
outbuf
,
p
->
outbuf_size
,
p
->
frame
);
p
->
frame_dec
=
p
->
avctx_enc
[
i
]
->
coded_frame
;
offset
=
(
BLOCK
-
x1
)
+
(
BLOCK
-
y1
)
*
p
->
frame_dec
->
linesize
[
0
];
//FIXME optimize
for
(
y
=
0
;
y
<
height
;
y
++
){
for
(
x
=
0
;
x
<
width
;
x
++
){
p
->
temp
[
0
][
x
+
y
*
p
->
temp_stride
[
0
]
]
+=
p
->
frame_dec
->
data
[
0
][
x
+
y
*
p
->
frame_dec
->
linesize
[
0
]
+
offset
];
}
}
offset
=
(
BLOCK
/
2
-
x1
/
2
)
+
(
BLOCK
/
2
-
y1
/
2
)
*
p
->
frame_dec
->
linesize
[
1
];
for
(
y
=
0
;
y
<
height
/
2
;
y
++
){
for
(
x
=
0
;
x
<
width
/
2
;
x
++
){
p
->
temp
[
1
][
x
+
y
*
p
->
temp_stride
[
1
]
]
+=
p
->
frame_dec
->
data
[
1
][
x
+
y
*
p
->
frame_dec
->
linesize
[
1
]
+
offset
];
p
->
temp
[
2
][
x
+
y
*
p
->
temp_stride
[
2
]
]
+=
p
->
frame_dec
->
data
[
2
][
x
+
y
*
p
->
frame_dec
->
linesize
[
2
]
+
offset
];
}
}
}
for
(
j
=
0
;
j
<
3
;
j
++
){
int
is_chroma
=
!!
j
;
if
(
!
dst
[
j
])
continue
;
// HACK avoid crash for Y8 colourspace
store_slice_c
(
dst
[
j
],
p
->
temp
[
j
],
dst_stride
[
j
],
p
->
temp_stride
[
j
],
width
>>
is_chroma
,
height
>>
is_chroma
,
8
-
p
->
log2_count
);
}
}
static
int
config
(
struct
vf_instance
*
vf
,
int
width
,
int
height
,
int
d_width
,
int
d_height
,
unsigned
int
flags
,
unsigned
int
outfmt
){
int
i
;
AVCodec
*
enc
=
avcodec_find_encoder
(
AV_CODEC_ID_SNOW
);
for
(
i
=
0
;
i
<
3
;
i
++
){
int
is_chroma
=
!!
i
;
int
w
=
((
width
+
4
*
BLOCK
-
1
)
&
(
~
(
2
*
BLOCK
-
1
)))
>>
is_chroma
;
int
h
=
((
height
+
4
*
BLOCK
-
1
)
&
(
~
(
2
*
BLOCK
-
1
)))
>>
is_chroma
;
vf
->
priv
->
temp_stride
[
i
]
=
w
;
vf
->
priv
->
temp
[
i
]
=
malloc
(
vf
->
priv
->
temp_stride
[
i
]
*
h
*
sizeof
(
int16_t
));
vf
->
priv
->
src
[
i
]
=
malloc
(
vf
->
priv
->
temp_stride
[
i
]
*
h
*
sizeof
(
uint8_t
));
}
for
(
i
=
0
;
i
<
(
1
<<
vf
->
priv
->
log2_count
);
i
++
){
AVCodecContext
*
avctx_enc
;
AVDictionary
*
opts
=
NULL
;
avctx_enc
=
vf
->
priv
->
avctx_enc
[
i
]
=
avcodec_alloc_context3
(
NULL
);
avctx_enc
->
width
=
width
+
BLOCK
;
avctx_enc
->
height
=
height
+
BLOCK
;
avctx_enc
->
time_base
=
(
AVRational
){
1
,
25
};
// meaningless
avctx_enc
->
gop_size
=
300
;
avctx_enc
->
max_b_frames
=
0
;
avctx_enc
->
pix_fmt
=
AV_PIX_FMT_YUV420P
;
avctx_enc
->
flags
=
CODEC_FLAG_QSCALE
|
CODEC_FLAG_LOW_DELAY
;
avctx_enc
->
strict_std_compliance
=
FF_COMPLIANCE_EXPERIMENTAL
;
avctx_enc
->
global_quality
=
123
;
av_dict_set
(
&
opts
,
"no_bitstream"
,
"1"
,
0
);
if
(
avcodec_open2
(
avctx_enc
,
enc
,
&
opts
)
<
0
)
return
0
;
av_dict_free
(
&
opts
);
assert
(
avctx_enc
->
codec
);
}
vf
->
priv
->
frame
=
av_frame_alloc
();
vf
->
priv
->
frame_dec
=
av_frame_alloc
();
vf
->
priv
->
outbuf_size
=
(
width
+
BLOCK
)
*
(
height
+
BLOCK
)
*
10
;
vf
->
priv
->
outbuf
=
malloc
(
vf
->
priv
->
outbuf_size
);
return
ff_vf_next_config
(
vf
,
width
,
height
,
d_width
,
d_height
,
flags
,
outfmt
);
}
static
void
get_image
(
struct
vf_instance
*
vf
,
mp_image_t
*
mpi
){
if
(
mpi
->
flags
&
MP_IMGFLAG_PRESERVE
)
return
;
// don't change
// ok, we can do pp in-place (or pp disabled):
vf
->
dmpi
=
ff_vf_get_image
(
vf
->
next
,
mpi
->
imgfmt
,
mpi
->
type
,
mpi
->
flags
|
MP_IMGFLAG_READABLE
,
mpi
->
width
,
mpi
->
height
);
mpi
->
planes
[
0
]
=
vf
->
dmpi
->
planes
[
0
];
mpi
->
stride
[
0
]
=
vf
->
dmpi
->
stride
[
0
];
mpi
->
width
=
vf
->
dmpi
->
width
;
if
(
mpi
->
flags
&
MP_IMGFLAG_PLANAR
){
mpi
->
planes
[
1
]
=
vf
->
dmpi
->
planes
[
1
];
mpi
->
planes
[
2
]
=
vf
->
dmpi
->
planes
[
2
];
mpi
->
stride
[
1
]
=
vf
->
dmpi
->
stride
[
1
];
mpi
->
stride
[
2
]
=
vf
->
dmpi
->
stride
[
2
];
}
mpi
->
flags
|=
MP_IMGFLAG_DIRECT
;
}
static
int
put_image
(
struct
vf_instance
*
vf
,
mp_image_t
*
mpi
,
double
pts
){
mp_image_t
*
dmpi
;
if
(
!
(
mpi
->
flags
&
MP_IMGFLAG_DIRECT
)){
// no DR, so get a new image! hope we'll get DR buffer:
dmpi
=
ff_vf_get_image
(
vf
->
next
,
mpi
->
imgfmt
,
MP_IMGTYPE_TEMP
,
MP_IMGFLAG_ACCEPT_STRIDE
|
MP_IMGFLAG_PREFER_ALIGNED_STRIDE
,
mpi
->
width
,
mpi
->
height
);
ff_vf_clone_mpi_attributes
(
dmpi
,
mpi
);
}
else
{
dmpi
=
vf
->
dmpi
;
}
vf
->
priv
->
mpeg2
=
mpi
->
qscale_type
;
if
(
vf
->
priv
->
log2_count
||
!
(
mpi
->
flags
&
MP_IMGFLAG_DIRECT
)){
if
(
mpi
->
qscale
||
vf
->
priv
->
qp
){
filter
(
vf
->
priv
,
dmpi
->
planes
,
mpi
->
planes
,
dmpi
->
stride
,
mpi
->
stride
,
mpi
->
w
,
mpi
->
h
,
mpi
->
qscale
,
mpi
->
qstride
);
}
else
{
memcpy_pic
(
dmpi
->
planes
[
0
],
mpi
->
planes
[
0
],
mpi
->
w
,
mpi
->
h
,
dmpi
->
stride
[
0
],
mpi
->
stride
[
0
]);
memcpy_pic
(
dmpi
->
planes
[
1
],
mpi
->
planes
[
1
],
mpi
->
w
>>
mpi
->
chroma_x_shift
,
mpi
->
h
>>
mpi
->
chroma_y_shift
,
dmpi
->
stride
[
1
],
mpi
->
stride
[
1
]);
memcpy_pic
(
dmpi
->
planes
[
2
],
mpi
->
planes
[
2
],
mpi
->
w
>>
mpi
->
chroma_x_shift
,
mpi
->
h
>>
mpi
->
chroma_y_shift
,
dmpi
->
stride
[
2
],
mpi
->
stride
[
2
]);
}
}
#if HAVE_MMX_INLINE
if
(
ff_gCpuCaps
.
hasMMX
)
__asm__
volatile
(
"emms
\n\t
"
);
#endif
#if HAVE_MMXEXT_INLINE
if
(
ff_gCpuCaps
.
hasMMX2
)
__asm__
volatile
(
"sfence
\n\t
"
);
#endif
return
ff_vf_next_put_image
(
vf
,
dmpi
,
pts
);
}
static
void
uninit
(
struct
vf_instance
*
vf
){
int
i
;
if
(
!
vf
->
priv
)
return
;
for
(
i
=
0
;
i
<
3
;
i
++
){
free
(
vf
->
priv
->
temp
[
i
]);
vf
->
priv
->
temp
[
i
]
=
NULL
;
free
(
vf
->
priv
->
src
[
i
]);
vf
->
priv
->
src
[
i
]
=
NULL
;
}
for
(
i
=
0
;
i
<
BLOCK
*
BLOCK
;
i
++
){
av_freep
(
&
vf
->
priv
->
avctx_enc
[
i
]);
}
free
(
vf
->
priv
);
vf
->
priv
=
NULL
;
}
//===========================================================================//
static
int
query_format
(
struct
vf_instance
*
vf
,
unsigned
int
fmt
){
switch
(
fmt
){
case
IMGFMT_YV12
:
case
IMGFMT_I420
:
case
IMGFMT_IYUV
:
case
IMGFMT_Y800
:
case
IMGFMT_Y8
:
return
ff_vf_next_query_format
(
vf
,
fmt
);
}
return
0
;
}
static
int
control
(
struct
vf_instance
*
vf
,
int
request
,
void
*
data
){
switch
(
request
){
case
VFCTRL_QUERY_MAX_PP_LEVEL
:
return
8
;
case
VFCTRL_SET_PP_LEVEL
:
vf
->
priv
->
log2_count
=
*
((
unsigned
int
*
)
data
);
//FIXME we have to realloc a few things here
return
CONTROL_TRUE
;
}
return
ff_vf_next_control
(
vf
,
request
,
data
);
}
static
int
vf_open
(
vf_instance_t
*
vf
,
char
*
args
){
int
log2c
=-
1
;
vf
->
config
=
config
;
vf
->
put_image
=
put_image
;
vf
->
get_image
=
get_image
;
vf
->
query_format
=
query_format
;
vf
->
uninit
=
uninit
;
vf
->
control
=
control
;
vf
->
priv
=
malloc
(
sizeof
(
struct
vf_priv_s
));
memset
(
vf
->
priv
,
0
,
sizeof
(
struct
vf_priv_s
));
ff_init_avcodec
();
vf
->
priv
->
log2_count
=
4
;
if
(
args
)
sscanf
(
args
,
"%d:%d:%d"
,
&
log2c
,
&
vf
->
priv
->
qp
,
&
vf
->
priv
->
mode
);
if
(
log2c
>=
0
&&
log2c
<=
8
)
vf
->
priv
->
log2_count
=
log2c
;
if
(
vf
->
priv
->
qp
<
0
)
vf
->
priv
->
qp
=
0
;
// #if HAVE_MMX_INLINE
// if(ff_gCpuCaps.hasMMX){
// store_slice= store_slice_mmx;
// }
// #endif
return
1
;
}
const
vf_info_t
ff_vf_info_uspp
=
{
"ultra simple/slow postprocess"
,
"uspp"
,
"Michael Niedermayer"
,
""
,
vf_open
,
NULL
};
libavfilter/version.h
浏览文件 @
cc8b3492
...
...
@@ -31,7 +31,7 @@
#define LIBAVFILTER_VERSION_MAJOR 5
#define LIBAVFILTER_VERSION_MINOR 3
#define LIBAVFILTER_VERSION_MICRO 10
0
#define LIBAVFILTER_VERSION_MICRO 10
1
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \
...
...
libavfilter/vf_kerndeint.c
浏览文件 @
cc8b3492
...
...
@@ -63,7 +63,7 @@ static av_cold void uninit(AVFilterContext *ctx)
{
KerndeintContext
*
kerndeint
=
ctx
->
priv
;
av_free
(
kerndeint
->
tmp_data
[
0
]);
av_free
p
(
&
kerndeint
->
tmp_data
[
0
]);
}
static
int
query_formats
(
AVFilterContext
*
ctx
)
...
...
libavfilter/vf_mp.c
浏览文件 @
cc8b3492
...
...
@@ -131,8 +131,6 @@ extern const vf_info_t ff_vf_info_fspp;
extern
const
vf_info_t
ff_vf_info_ilpack
;
extern
const
vf_info_t
ff_vf_info_pp7
;
extern
const
vf_info_t
ff_vf_info_softpulldown
;
extern
const
vf_info_t
ff_vf_info_uspp
;
static
const
vf_info_t
*
const
filters
[]
=
{
&
ff_vf_info_eq2
,
...
...
@@ -141,8 +139,6 @@ static const vf_info_t* const filters[]={
&
ff_vf_info_ilpack
,
&
ff_vf_info_pp7
,
&
ff_vf_info_softpulldown
,
&
ff_vf_info_uspp
,
NULL
};
...
...
libavfilter/vf_spp.c
浏览文件 @
cc8b3492
...
...
@@ -290,13 +290,7 @@ static int config_input(AVFilterLink *inlink)
spp
->
temp_linesize
=
FFALIGN
(
inlink
->
w
+
16
,
16
);
spp
->
temp
=
av_malloc_array
(
spp
->
temp_linesize
,
h
*
sizeof
(
*
spp
->
temp
));
spp
->
src
=
av_malloc_array
(
spp
->
temp_linesize
,
h
*
sizeof
(
*
spp
->
src
));
if
(
!
spp
->
use_bframe_qp
)
{
/* we are assuming here the qp blocks will not be smaller that 16x16 */
spp
->
non_b_qp_alloc_size
=
FF_CEIL_RSHIFT
(
inlink
->
w
,
4
)
*
FF_CEIL_RSHIFT
(
inlink
->
h
,
4
);
spp
->
non_b_qp_table
=
av_calloc
(
spp
->
non_b_qp_alloc_size
,
sizeof
(
*
spp
->
non_b_qp_table
));
if
(
!
spp
->
non_b_qp_table
)
return
AVERROR
(
ENOMEM
);
}
if
(
!
spp
->
temp
||
!
spp
->
src
)
return
AVERROR
(
ENOMEM
);
return
0
;
...
...
@@ -327,9 +321,19 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
w
=
FF_CEIL_RSHIFT
(
inlink
->
w
,
4
);
h
=
1
;
}
else
{
w
=
FF_CEIL_RSHIFT
(
qp_stride
,
4
)
;
w
=
qp_stride
;
h
=
FF_CEIL_RSHIFT
(
inlink
->
h
,
4
);
}
if
(
w
*
h
>
spp
->
non_b_qp_alloc_size
)
{
int
ret
=
av_reallocp_array
(
&
spp
->
non_b_qp_table
,
w
,
h
);
if
(
ret
<
0
)
{
spp
->
non_b_qp_alloc_size
=
0
;
return
ret
;
}
spp
->
non_b_qp_alloc_size
=
w
*
h
;
}
av_assert0
(
w
*
h
<=
spp
->
non_b_qp_alloc_size
);
memcpy
(
spp
->
non_b_qp_table
,
qp_table
,
w
*
h
);
}
...
...
libavfilter/vf_unsharp.c
浏览文件 @
cc8b3492
...
...
@@ -215,7 +215,7 @@ static void free_filter_param(UnsharpFilterParam *fp)
int
z
;
for
(
z
=
0
;
z
<
2
*
fp
->
steps_y
;
z
++
)
av_free
(
fp
->
sc
[
z
]);
av_free
p
(
&
fp
->
sc
[
z
]);
}
static
av_cold
void
uninit
(
AVFilterContext
*
ctx
)
...
...
libavfilter/vf_uspp.c
浏览文件 @
cc8b3492
...
...
@@ -41,6 +41,7 @@
typedef
struct
{
const
AVClass
*
av_class
;
int
log2_count
;
int
hsub
,
vsub
;
int
qp
;
int
qscale_type
;
int
temp_stride
[
3
];
...
...
@@ -187,6 +188,7 @@ static inline int norm_qscale(int qscale, int type)
case
FF_QSCALE_TYPE_MPEG2
:
return
qscale
>>
1
;
case
FF_QSCALE_TYPE_H264
:
return
qscale
>>
2
;
case
FF_QSCALE_TYPE_VP56
:
return
(
63
-
qscale
+
2
)
>>
2
;
default:
av_assert0
(
0
);
}
return
qscale
;
}
...
...
@@ -200,10 +202,10 @@ static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
for
(
i
=
0
;
i
<
3
;
i
++
)
{
int
is_chroma
=
!!
i
;
int
w
=
width
>>
is_chroma
;
int
h
=
height
>>
is_chroma
;
int
w
=
width
>>
(
is_chroma
?
p
->
hsub
:
0
)
;
int
h
=
height
>>
(
is_chroma
?
p
->
vsub
:
0
)
;
int
stride
=
p
->
temp_stride
[
i
];
int
block
=
BLOCK
>>
is_chroma
;
int
block
=
BLOCK
>>
(
is_chroma
?
p
->
hsub
:
0
)
;
if
(
!
src
[
i
]
||
!
dst
[
i
])
continue
;
...
...
@@ -244,6 +246,9 @@ static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
for
(
i
=
0
;
i
<
count
;
i
++
)
{
const
int
x1
=
offset
[
i
+
count
-
1
][
0
];
const
int
y1
=
offset
[
i
+
count
-
1
][
1
];
const
int
x1c
=
x1
>>
p
->
hsub
;
const
int
y1c
=
y1
>>
p
->
vsub
;
const
int
BLOCKc
=
BLOCK
>>
p
->
hsub
;
int
offset
;
AVPacket
pkt
;
int
got_pkt_ptr
;
...
...
@@ -253,8 +258,8 @@ static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
pkt
.
size
=
p
->
outbuf_size
;
p
->
frame
->
data
[
0
]
=
p
->
src
[
0
]
+
x1
+
y1
*
p
->
frame
->
linesize
[
0
];
p
->
frame
->
data
[
1
]
=
p
->
src
[
1
]
+
x1
/
2
+
y1
/
2
*
p
->
frame
->
linesize
[
1
];
p
->
frame
->
data
[
2
]
=
p
->
src
[
2
]
+
x1
/
2
+
y1
/
2
*
p
->
frame
->
linesize
[
2
];
p
->
frame
->
data
[
1
]
=
p
->
src
[
1
]
+
x1
c
+
y1c
*
p
->
frame
->
linesize
[
1
];
p
->
frame
->
data
[
2
]
=
p
->
src
[
2
]
+
x1
c
+
y1c
*
p
->
frame
->
linesize
[
2
];
p
->
frame
->
format
=
p
->
avctx_enc
[
i
]
->
pix_fmt
;
avcodec_encode_video2
(
p
->
avctx_enc
[
i
],
&
pkt
,
p
->
frame
,
&
got_pkt_ptr
);
...
...
@@ -266,10 +271,13 @@ static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
for
(
x
=
0
;
x
<
width
;
x
++
)
p
->
temp
[
0
][
x
+
y
*
p
->
temp_stride
[
0
]]
+=
p
->
frame_dec
->
data
[
0
][
x
+
y
*
p
->
frame_dec
->
linesize
[
0
]
+
offset
];
offset
=
(
BLOCK
/
2
-
x1
/
2
)
+
(
BLOCK
/
2
-
y1
/
2
)
*
p
->
frame_dec
->
linesize
[
1
];
if
(
!
src
[
2
]
||
!
dst
[
2
])
continue
;
offset
=
(
BLOCKc
-
x1c
)
+
(
BLOCKc
-
y1c
)
*
p
->
frame_dec
->
linesize
[
1
];
for
(
y
=
0
;
y
<
height
/
2
;
y
++
)
{
for
(
x
=
0
;
x
<
width
/
2
;
x
++
)
{
for
(
y
=
0
;
y
<
height
>>
p
->
vsub
;
y
++
)
{
for
(
x
=
0
;
x
<
width
>>
p
->
hsub
;
x
++
)
{
p
->
temp
[
1
][
x
+
y
*
p
->
temp_stride
[
1
]]
+=
p
->
frame_dec
->
data
[
1
][
x
+
y
*
p
->
frame_dec
->
linesize
[
1
]
+
offset
];
p
->
temp
[
2
][
x
+
y
*
p
->
temp_stride
[
2
]]
+=
p
->
frame_dec
->
data
[
2
][
x
+
y
*
p
->
frame_dec
->
linesize
[
2
]
+
offset
];
}
...
...
@@ -281,7 +289,9 @@ static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],
if
(
!
dst
[
j
])
continue
;
store_slice_c
(
dst
[
j
],
p
->
temp
[
j
],
dst_stride
[
j
],
p
->
temp_stride
[
j
],
width
>>
is_chroma
,
height
>>
is_chroma
,
8
-
p
->
log2_count
);
width
>>
(
is_chroma
?
p
->
hsub
:
0
),
height
>>
(
is_chroma
?
p
->
vsub
:
0
),
8
-
p
->
log2_count
);
}
}
...
...
@@ -293,6 +303,7 @@ static int query_formats(AVFilterContext *ctx)
AV_PIX_FMT_YUV410P
,
AV_PIX_FMT_YUVJ444P
,
AV_PIX_FMT_YUVJ420P
,
AV_PIX_FMT_GRAY8
,
AV_PIX_FMT_NONE
};
ff_set_common_formats
(
ctx
,
ff_make_format_list
(
pix_fmts
));
...
...
@@ -306,6 +317,7 @@ static int config_input(AVFilterLink *inlink)
USPPContext
*
uspp
=
ctx
->
priv
;
const
int
height
=
inlink
->
h
;
const
int
width
=
inlink
->
w
;
const
AVPixFmtDescriptor
*
desc
=
av_pix_fmt_desc_get
(
inlink
->
format
);
int
i
;
AVCodec
*
enc
=
avcodec_find_encoder
(
AV_CODEC_ID_SNOW
);
...
...
@@ -314,10 +326,13 @@ static int config_input(AVFilterLink *inlink)
return
AVERROR
(
EINVAL
);
}
uspp
->
hsub
=
desc
->
log2_chroma_w
;
uspp
->
vsub
=
desc
->
log2_chroma_h
;
for
(
i
=
0
;
i
<
3
;
i
++
)
{
int
is_chroma
=
!!
i
;
int
w
=
((
width
+
4
*
BLOCK
-
1
)
&
(
~
(
2
*
BLOCK
-
1
)))
>>
is_chroma
;
int
h
=
((
height
+
4
*
BLOCK
-
1
)
&
(
~
(
2
*
BLOCK
-
1
)))
>>
is_chroma
;
int
w
=
((
width
+
4
*
BLOCK
-
1
)
&
(
~
(
2
*
BLOCK
-
1
)))
>>
(
is_chroma
?
uspp
->
hsub
:
0
)
;
int
h
=
((
height
+
4
*
BLOCK
-
1
)
&
(
~
(
2
*
BLOCK
-
1
)))
>>
(
is_chroma
?
uspp
->
vsub
:
0
)
;
uspp
->
temp_stride
[
i
]
=
w
;
if
(
!
(
uspp
->
temp
[
i
]
=
av_malloc
(
uspp
->
temp_stride
[
i
]
*
h
*
sizeof
(
int16_t
))))
...
...
@@ -340,7 +355,7 @@ static int config_input(AVFilterLink *inlink)
avctx_enc
->
time_base
=
(
AVRational
){
1
,
25
};
// meaningless
avctx_enc
->
gop_size
=
300
;
avctx_enc
->
max_b_frames
=
0
;
avctx_enc
->
pix_fmt
=
AV_PIX_FMT_YUV420P
;
avctx_enc
->
pix_fmt
=
inlink
->
format
;
avctx_enc
->
flags
=
CODEC_FLAG_QSCALE
|
CODEC_FLAG_LOW_DELAY
;
avctx_enc
->
strict_std_compliance
=
FF_COMPLIANCE_EXPERIMENTAL
;
avctx_enc
->
global_quality
=
123
;
...
...
libavformat/mov.c
浏览文件 @
cc8b3492
...
...
@@ -4221,21 +4221,21 @@ static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
static
const
AVOption
mov_options
[]
=
{
{
"use_absolute_path"
,
"allow using absolute path when opening alias, this is a possible security issue"
,
offsetof
(
MOVContext
,
use_absolute_path
),
FF_OPT_TYPE_INT
,
{.
i64
=
0
},
0
,
1
,
AV_OPT_FLAG_VIDEO_PARAM
|
AV_OPT_FLAG_DECODING_PARAM
},
{
"ignore_editlist"
,
""
,
offsetof
(
MOVContext
,
ignore_editlist
),
FF_OPT_TYPE_INT
,
{.
i64
=
0
},
0
,
1
,
AV_OPT_FLAG_VIDEO_PARAM
|
AV_OPT_FLAG_DECODING_PARAM
},
OFFSET
(
use_absolute_path
),
FF_OPT_TYPE_INT
,
{.
i64
=
0
},
0
,
1
,
FLAGS
},
{
"ignore_editlist"
,
""
,
OFFSET
(
ignore_editlist
),
FF_OPT_TYPE_INT
,
{.
i64
=
0
},
0
,
1
,
FLAGS
},
{
"use_mfra_for"
,
"use mfra for fragment timestamps"
,
offsetof
(
MOVContext
,
use_mfra_for
),
FF_OPT_TYPE_INT
,
{.
i64
=
FF_MOV_FLAG_MFRA_AUTO
},
-
1
,
FF_MOV_FLAG_MFRA_PTS
,
AV_OPT_FLAG_VIDEO_PARAM
|
AV_OPT_FLAG_DECODING_PARAM
,
OFFSET
(
use_mfra_for
),
FF_OPT_TYPE_INT
,
{.
i64
=
FF_MOV_FLAG_MFRA_AUTO
},
-
1
,
FF_MOV_FLAG_MFRA_PTS
,
FLAGS
,
"use_mfra_for"
},
{
"auto"
,
"auto"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
FF_MOV_FLAG_MFRA_AUTO
},
0
,
0
,
AV_OPT_FLAG_VIDEO_PARAM
|
AV_OPT_FLAG_DECODING_PARAM
,
"use_mfra_for"
},
FLAGS
,
"use_mfra_for"
},
{
"dts"
,
"dts"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
FF_MOV_FLAG_MFRA_DTS
},
0
,
0
,
AV_OPT_FLAG_VIDEO_PARAM
|
AV_OPT_FLAG_DECODING_PARAM
,
"use_mfra_for"
},
FLAGS
,
"use_mfra_for"
},
{
"pts"
,
"pts"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
FF_MOV_FLAG_MFRA_PTS
},
0
,
0
,
AV_OPT_FLAG_VIDEO_PARAM
|
AV_OPT_FLAG_DECODING_PARAM
,
"use_mfra_for"
},
FLAGS
,
"use_mfra_for"
},
{
"export_all"
,
"Export unrecognized metadata entries"
,
OFFSET
(
export_all
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
1
,
.
flags
=
FLAGS
},
{
"export_xmp"
,
"Export full XMP metadata"
,
OFFSET
(
export_xmp
),
...
...
libavformat/nutenc.c
浏览文件 @
cc8b3492
...
...
@@ -524,7 +524,10 @@ static int write_streaminfo(NUTContext *nut, AVIOContext *bc, int stream_id) {
}
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_VIDEO
)
{
uint8_t
buf
[
256
];
snprintf
(
buf
,
sizeof
(
buf
),
"%d/%d"
,
st
->
codec
->
time_base
.
den
,
st
->
codec
->
time_base
.
num
);
if
(
st
->
r_frame_rate
.
num
>
0
&&
st
->
r_frame_rate
.
den
>
0
)
snprintf
(
buf
,
sizeof
(
buf
),
"%d/%d"
,
st
->
r_frame_rate
.
num
,
st
->
r_frame_rate
.
den
);
else
snprintf
(
buf
,
sizeof
(
buf
),
"%d/%d"
,
st
->
codec
->
time_base
.
den
,
st
->
codec
->
time_base
.
num
);
count
+=
add_info
(
dyn_bc
,
"r_frame_rate"
,
buf
);
}
dyn_size
=
avio_close_dyn_buf
(
dyn_bc
,
&
dyn_buf
);
...
...
libavformat/utils.c
浏览文件 @
cc8b3492
...
...
@@ -745,7 +745,7 @@ void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStrea
*
pden
=
0
;
switch
(
st
->
codec
->
codec_type
)
{
case
AVMEDIA_TYPE_VIDEO
:
if
(
st
->
r_frame_rate
.
num
&&
!
pc
)
{
if
(
st
->
r_frame_rate
.
num
&&
!
pc
&&
s
->
iformat
)
{
*
pnum
=
st
->
r_frame_rate
.
den
;
*
pden
=
st
->
r_frame_rate
.
num
;
}
else
if
(
st
->
time_base
.
num
*
1000LL
>
st
->
time_base
.
den
)
{
...
...
@@ -2328,6 +2328,11 @@ static void estimate_timings_from_bit_rate(AVFormatContext *ic)
break
;
}
bit_rate
+=
st
->
codec
->
bit_rate
;
}
else
if
(
st
->
codec
->
codec_type
==
AVMEDIA_TYPE_VIDEO
&&
st
->
codec_info_nb_frames
>
1
)
{
// If we have a videostream with packets but without a bitrate
// then consider the sum not known
bit_rate
=
0
;
break
;
}
}
ic
->
bit_rate
=
bit_rate
;
...
...
@@ -3652,6 +3657,11 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
st
->
info
->
last_dts
=
AV_NOPTS_VALUE
;
st
->
codec
=
avcodec_alloc_context3
(
c
);
if
(
!
st
->
codec
)
{
av_free
(
st
->
info
);
av_free
(
st
);
return
NULL
;
}
if
(
s
->
iformat
)
{
/* no default bitrate if decoding */
st
->
codec
->
bit_rate
=
0
;
...
...
libavformat/version.h
浏览文件 @
cc8b3492
...
...
@@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 56
#define LIBAVFORMAT_VERSION_MINOR 15
#define LIBAVFORMAT_VERSION_MICRO 10
4
#define LIBAVFORMAT_VERSION_MICRO 10
5
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
...
...
libavutil/dict.c
浏览文件 @
cc8b3492
...
...
@@ -75,6 +75,8 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value,
if
(
!
m
)
m
=
*
pm
=
av_mallocz
(
sizeof
(
*
m
));
if
(
!
m
)
goto
err_out
;
if
(
tag
)
{
if
(
flags
&
AV_DICT_DONT_OVERWRITE
)
{
...
...
@@ -100,6 +102,8 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value,
m
->
elems
[
m
->
count
].
key
=
(
char
*
)(
intptr_t
)
key
;
else
m
->
elems
[
m
->
count
].
key
=
av_strdup
(
key
);
if
(
!
m
->
elems
[
m
->
count
].
key
)
goto
err_out
;
if
(
flags
&
AV_DICT_DONT_STRDUP_VAL
)
{
m
->
elems
[
m
->
count
].
value
=
(
char
*
)(
intptr_t
)
value
;
}
else
if
(
oldval
&&
flags
&
AV_DICT_APPEND
)
{
...
...
@@ -123,7 +127,7 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value,
return
0
;
err_out:
if
(
!
m
->
count
)
{
if
(
m
&&
!
m
->
count
)
{
av_free
(
m
->
elems
);
av_freep
(
pm
);
}
...
...
libswresample/soxr_resample.c
浏览文件 @
cc8b3492
...
...
@@ -76,8 +76,12 @@ static int process(
AudioData
*
src
,
int
src_size
,
int
*
consumed
){
size_t
idone
,
odone
;
soxr_error_t
error
=
soxr_set_error
((
soxr_t
)
c
,
soxr_set_num_channels
((
soxr_t
)
c
,
src
->
ch_count
));
error
=
soxr_process
((
soxr_t
)
c
,
src
->
ch
,
(
size_t
)
src_size
,
&
idone
,
dst
->
ch
,
(
size_t
)
dst_size
,
&
odone
);
if
(
!
error
)
error
=
soxr_process
((
soxr_t
)
c
,
src
->
ch
,
(
size_t
)
src_size
,
&
idone
,
dst
->
ch
,
(
size_t
)
dst_size
,
&
odone
);
else
idone
=
0
;
*
consumed
=
(
int
)
idone
;
return
error
?
-
1
:
odone
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录