Paul B Mahol
d9a52b0bbf
avfilter/f_drawgraph: add rate/r option
2020-01-14 09:54:53 +01:00
Jun Zhao
722547996c
lavfi/volume: enable runtime change flag
...
enable runtime change flag.
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
b5cea39190
lavfi/zscale: enable runtime change flag
...
enable runtime change flag
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
a2619a473e
lavfi/firequalizer: enable runtime change flag
...
enable runtime change flag
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
b7bf55550c
lavfi/eq: enable runtime change flag
...
enable runtime change flag
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
419e47788a
lavfi/rotate: enable runtime change flag
...
enable runtime change flag
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
f2a095ac2a
lavfi/streamselect: enable runtime change flag
...
enable runtime change flag.
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
d9e78a723a
lavfi/scale: enable runtime change flag
...
enable runtime change flag.
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
8cebc8e479
lavfi/hue: enable runtime change flag
...
enable runtime change flag.
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
31b24588c5
lavfi/crop: enable runtime change flag
...
enable runtime change flag.
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
94004a8b65
lavfi/spp: enable runtime change flag
...
enable runtime change flag.
Reviewe-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Jun Zhao
692f0519bb
lavfi/spp: add "quality" option in runtime change path
...
it's stranage to use option "level" in runtime change path but used
"quality" in option, add "quality" in runtime change path, it's more
intuitive and keep the "level" for compatibility.
Reviewe-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-13 09:25:18 +08:00
Paul B Mahol
1a7f4a122e
avfilter: add freezeframes video filter
2020-01-11 19:05:17 +01:00
Paul B Mahol
b650046860
avfilter/af_dynaudnorm: use better limits for maximal amplification
...
Fixes regression in smoothness of amplification.
2020-01-11 14:08:52 +01:00
Limin Wang
dd39dbf983
avfilter/af_amix: change the max range of the number of inputs
...
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
2020-01-11 11:35:51 +01:00
Limin Wang
a144cd6a51
avfilter/vf_mix: change the max range of the number of inputs
...
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
2020-01-11 11:35:39 +01:00
Limin Wang
9519c8dbb7
avfilter/vf_showinfo: fix the integer handling issues
...
Fixes CID 1457606 and 1457607
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2020-01-10 17:52:14 +01:00
Gyan Doshi
22a06a539d
avfilter/f_metadata: allow direct flushing when printing to file
...
Useful for monitoring sparse data in realtime
2020-01-10 21:44:26 +05:30
Paul B Mahol
52bf43eb49
avfilter/af_afir: add support for switching impulse response streams at runtime
...
Currently, switching is not free of artifacts, to be resolved later.
2020-01-10 13:14:54 +01:00
Paul B Mahol
03a7240a73
avfilter/af_afir: add support for even smaller partition sizes
2020-01-10 13:05:21 +01:00
Paul B Mahol
e364fe4cca
avfilter/af_afir: split input frames from impulse response frames
2020-01-10 12:43:18 +01:00
Gyan Doshi
5bd001043d
avfilter/aformat: add shorthand names for options
2020-01-08 11:15:13 +05:30
Guo, Yejun
37d24a6c8f
vf_dnn_processing: add support for more formats gray8 and grayf32
...
The following is a python script to halve the value of the gray
image. It demos how to setup and execute dnn model with python+tensorflow.
It also generates .pb file which will be used by ffmpeg.
import tensorflow as tf
import numpy as np
from skimage import color
from skimage import io
in_img = io.imread('input.jpg')
in_img = color.rgb2gray(in_img)
io.imsave('ori_gray.jpg', np.squeeze(in_img))
in_data = np.expand_dims(in_img, axis=0)
in_data = np.expand_dims(in_data, axis=3)
filter_data = np.array([0.5]).reshape(1,1,1,1).astype(np.float32)
filter = tf.Variable(filter_data)
x = tf.placeholder(tf.float32, shape=[1, None, None, 1], name='dnn_in')
y = tf.nn.conv2d(x, filter, strides=[1, 1, 1, 1], padding='VALID', name='dnn_out')
sess=tf.Session()
sess.run(tf.global_variables_initializer())
graph_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, ['dnn_out'])
tf.train.write_graph(graph_def, '.', 'halve_gray_float.pb', as_text=False)
print("halve_gray_float.pb generated, please use \
path_to_ffmpeg/tools/python/convert.py to generate halve_gray_float.model\n")
output = sess.run(y, feed_dict={x: in_data})
output = output * 255.0
output = output.astype(np.uint8)
io.imsave("out.jpg", np.squeeze(output))
To do the same thing with ffmpeg:
- generate halve_gray_float.pb with the above script
- generate halve_gray_float.model with tools/python/convert.py
- try with following commands
./ffmpeg -i input.jpg -vf format=grayf32,dnn_processing=model=halve_gray_float.model:input=dnn_in:output=dnn_out:dnn_backend=native out.native.png
./ffmpeg -i input.jpg -vf format=grayf32,dnn_processing=model=halve_gray_float.pb:input=dnn_in:output=dnn_out:dnn_backend=tensorflow out.tf.png
Signed-off-by: Guo, Yejun <yejun.guo@intel.com>
Signed-off-by: Pedro Arthur <bygrandao@gmail.com>
2020-01-07 10:51:38 -03:00
Guo, Yejun
04e6f8a143
vf_dnn_processing: remove parameter 'fmt'
...
do not request AVFrame's format in vf_ddn_processing with 'fmt',
but to add another filter for the format.
command examples:
./ffmpeg -i input.jpg -vf format=bgr24,dnn_processing=model=halve_first_channel.model:input=dnn_in:output=dnn_out:dnn_backend=native -y out.native.png
./ffmpeg -i input.jpg -vf format=rgb24,dnn_processing=model=halve_first_channel.model:input=dnn_in:output=dnn_out:dnn_backend=native -y out.native.png
Signed-off-by: Guo, Yejun <yejun.guo@intel.com>
Signed-off-by: Pedro Arthur <bygrandao@gmail.com>
2020-01-07 10:35:59 -03:00
Limin Wang
d31a1266a7
avfilter/vf_showinfo: Fix erroneous results for mean and stdev with pixel bits >8
...
Have tested with be and le pixel format on be and le system for >8bit.
System:
lmwang@ubuntu:~/ffmpeg.git.mips$ grep HAVE_BIGENDIAN config.h
ffmpeg.git git:(showinfo) ✗ grep HAVE_BIGENDIAN config.h
Test result:
1, yuv420p
./ffmpeg -f lavfi -i color=black:duration=1:r=1:size=1280x720,format=yuv420p,showinfo
Master:
mean:[16 128 128] stdev:[0.0 0.0 0.0]
After applied the patch:
mean:[16 128 128] stdev:[0.0 0.0 0.0]
2, yuv420p10le
./ffmpeg -f lavfi -i color=black:duration=1:r=1:size=1280x720,format=yuv420p10le,showinfo
Master:
mean:[32 1 1] stdev:[32.0 1.0 1.0]
After applied the patch:
mean:[64 512 512] stdev:[0.0 0.0 0.0]
3, yuv420p10be
./ffmpeg -f lavfi -i color=black:duration=1:r=1:size=1280x720,format=yuv420p10be,showinfo
Master:
mean:[32 1 1] stdev:[32.0 1.0 1.0]
After applied the patch:
mean:[64 512 512] stdev:[0.0 0.0 0.0]
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2020-01-07 02:49:44 +01:00
Mark Thompson
f907eea863
vf_tonemap_vaapi: Fix memory leak in error case
...
Fixes CID 1457236.
2020-01-07 00:04:50 +00:00
Carl Eugen Hoyos
96fab29e96
Silence "string-plus-int" warning shown by clang.
...
libswscale/utils.c:89:42: warning: adding 'unsigned long' to a string does not append to the string [-Wstring-plus-int]
2020-01-06 22:38:56 +01:00
Paul B Mahol
e21ba176c9
avfilter/af_sidechaincompress: add support for commands
2020-01-06 19:40:07 +01:00
Paul B Mahol
27ec72db06
avfilter/af_dynaudnorm: add support for commands
2020-01-06 14:23:53 +01:00
Paul B Mahol
e26d66daaa
avfilter/af_dynaudnorm: use already available pointer
...
Instead of dereferencing same thing again.
2020-01-05 10:22:57 +01:00
Paul B Mahol
1187dbb7e9
avfilter/af_dynaudnorm: move channels variable setup first
2020-01-05 10:20:27 +01:00
Jun Zhao
304eaa63a9
lavfi/buffersrc: Remove redundant free after ff_filter_frame() failure
...
ff_filter_frame() always frees the frame in case of error, so we don't
need to free the frame after ff_filter_frame() fails.
Fix CID 1457230.
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-04 19:37:39 +01:00
Paul B Mahol
389865352d
avfilter/af_dynaudnorm: fix another clipping with custom peak value
...
This always happened at start with alternative boundary mode disabled.
The clipping only occurred if starting samples where high enough.
2020-01-04 19:34:50 +01:00
Paul B Mahol
c8253cb332
avfilter/af_dynaudnorm: implement threshold option
2020-01-04 18:17:32 +01:00
Paul B Mahol
6a1305e8b7
avfilter/af_dynaudnorm: do not clip audio
...
Clipping can happen when smoothed gain is higher than maximum
allowed gain factor for current frame and peak value option is
set to enough low value.
2020-01-04 10:27:46 +01:00
Jun Zhao
c8e72a6494
lavfi/coreimage: fix memory leak after av_dict_parse_string fail
...
In case of failure, all the successfully set entries are stored in
*pm. We need to manually free the created dictionary to avoid
memory leak.
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2020-01-04 09:05:09 +08:00
Paul B Mahol
81172b5e3a
avfilter/af_dynaudnorm: fix previous commit
...
We still need to analyze frame for amplification at EOF.
2020-01-02 17:24:01 +01:00
Paul B Mahol
ed02563ce0
avfilter/af_dynaudnorm: do not enqueue flush buffers
2020-01-02 16:28:38 +01:00
Paul B Mahol
d4d6280ab2
avfilter/af_dynaudnorm: do not hang forever if only EOF is received
2020-01-01 13:44:22 +01:00
Paul B Mahol
7bb09e57e0
avfilter/af_dynaudnorm: do not error out if even filter size was given
...
Instead issue a warning and make filter size odd number.
2020-01-01 13:44:22 +01:00
Paul B Mahol
f651b18c19
avfilter/vf_histogram: add envelope to thistogram filter
2019-12-30 17:21:35 +01:00
Zhao Zhili
b2491566a6
avfilter/buffersrc: deprecate sws_param option
2019-12-30 10:41:07 +01:00
Paul B Mahol
e20c6d95b2
avfilter/af_crystalizer: add support for commands
2019-12-29 15:33:55 +01:00
Paul B Mahol
22d3552f44
avfilter/af_crystalizer: add timeline support
2019-12-29 15:33:55 +01:00
Paul B Mahol
26eba8ca61
avfilter/vf_waveform: add support for 12bit yuva formats
2019-12-29 15:33:55 +01:00
Paul B Mahol
11f6657e92
avfilter/vf_vectorscope: add support for 12bit yuva formats
2019-12-29 15:33:55 +01:00
Paul B Mahol
612b5791b8
avfilter/vf_histogram: add support for 12bit yuva formats
2019-12-29 15:33:55 +01:00
Paul B Mahol
d3d6f5a76e
avfilter/vf_histogram: reindent after previous commit
2019-12-29 15:33:55 +01:00
Paul B Mahol
cc43c2f29a
avfilter: add thistogram video filter
2019-12-29 15:33:55 +01:00
James Almer
eb17a7906b
avfilter/vf_vectorscope: use av_clip_uint8()
...
Fixes fate-source
Signed-off-by: James Almer <jamrial@gmail.com>
2019-12-28 22:38:58 -03:00
Paul B Mahol
6399eed48a
avfilter/vf_waveform: implement tint options
2019-12-28 21:51:40 +01:00
Paul B Mahol
b3216f13ce
avfilter/vf_vectorscope: improve tint output for gbrp formats
2019-12-28 21:51:40 +01:00
Paul B Mahol
2736dc0564
avfilter/vf_vectorscope: rename gray mode to tint mode
2019-12-28 14:01:15 +01:00
Paul B Mahol
29b765d657
avfilter/vf_vectorscope: add invert graticule
2019-12-28 12:32:43 +01:00
Paul B Mahol
1669c970b1
avfilter/vf_vectorscope: use enum for graticule items
2019-12-28 12:32:43 +01:00
Michael Niedermayer
5c0d1f7896
avfilter/vf_geq: Add support for reading sample sums and means of rectangles
...
This allows integrating box blur style filters in geq.
Without this computing the mean of an area in geq would have been excessivly slow
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2019-12-28 11:20:48 +01:00
Michael Niedermayer
47fd73ace2
avfilter/vf_geq: Add NB_PLANES
...
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2019-12-28 11:20:48 +01:00
Michael Niedermayer
d5e7f01090
avfilter/vf_geq: Relicense to LGPL
...
All authors who have code in this under GPL agreed.
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2019-12-28 11:20:48 +01:00
Paul B Mahol
6c883e214a
avfilter/vf_vibrance: add support for commands
2019-12-27 21:31:04 +01:00
Paul B Mahol
50cfe9662d
avfilter/vf_il: add support for commands
2019-12-27 21:17:00 +01:00
Paul B Mahol
5fb37598ad
avfilter/af_stereowiden: add support for commands
2019-12-27 21:03:29 +01:00
Paul B Mahol
954637805d
avfilter/af_extrastereo: add support for commands
2019-12-27 20:57:06 +01:00
Paul B Mahol
fad62eebee
avfilter/vf_neighbor: add support for commands
2019-12-27 20:21:20 +01:00
Paul B Mahol
b5f0cea16c
avfilter/vf_histogram: use the name 's' for the pointer to the private context
...
This is consistent across filters.
2019-12-26 20:45:20 +01:00
Andreas Rheinhardt
398a5f5d8f
avfilter/buffersrc: Remove unused variables
...
Unused since f09ae730
.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2019-12-26 16:06:25 +01:00
Limin Wang
3dd6c4478b
avfilter/vf_yadif: cosmetics in the pix_fmts[] array
...
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2019-12-25 18:00:40 +01:00
Gyan Doshi
287620f59c
avfilter/drawtext: log why input pad failed to be configured
2019-12-24 11:04:52 +05:30
Paul B Mahol
547b0c61af
avfilter/vf_fade: reindent after previous commit
2019-12-23 20:24:36 +01:00
Paul B Mahol
6c9a9dd25a
avfilter/vf_fade: add support for gbrp/gbrap formats
2019-12-23 20:16:27 +01:00
Paul B Mahol
94ad5d0128
avfilter/vf_readeia608: factor some constants out
2019-12-23 20:09:20 +01:00
Paul B Mahol
94682555c6
avfilter/vf_readeia608: check if gaps between clock bits are big enough
...
Should help finding less false positives.
2019-12-23 19:56:05 +01:00
Paul B Mahol
16968b619d
avfilter/vf_readeia608: use special struct to hold line items
2019-12-23 18:02:38 +01:00
Zhao Zhili
0115dbd043
avfilter/avfilter: update documentation of avfilter_graph_create_filter
2019-12-23 17:02:55 +01:00
Zhao Zhili
61097535cd
avfilter/buffersink: deprecate AVBufferSinkParams and AVABufferSinkParams
2019-12-23 17:02:55 +01:00
Zhao Zhili
07ffdedf78
avfilter/buffersink: replace init_opaque by init
...
The argument 'opaque' is always NULL since 0acf7e2
(2013),
and avfilter_init_filter() was removed in 52067b3c0e
(2016).
2019-12-23 17:02:55 +01:00
Zhao Zhili
807e90d232
avfilter/buffersink: remove unused macros
2019-12-23 17:02:55 +01:00
Zhao Zhili
bf08264daa
avfilter/buffersrc: remove redundant flag
...
!(c->pix_fmt != AV_PIX_FMT_NONE || c->got_format_from_params)
equals
(c->pix_fmt == AV_PIX_FMT_NONE) && !c->got_format_from_params
1. When (c->pix_fmt == AV_PIX_FMT_NONE) is true, got_format_from_params is
always false, the flag doesn't contribute to the result.
2. When the first part is false, the second part doesn't matter, the flag
doesn't contribute to the result.
The result only depends on c->pix_fmt.
2019-12-23 17:02:55 +01:00
Nicolas George
f09ae7309d
lavfi/buffersrc: push frame directly.
...
This allows to remove the queued frame entirely.
2019-12-23 13:03:38 +01:00
Nicolas George
02daafb45c
lavfi: remove AVFilterPad.poll_frame().
...
This design is no longer used and was replaced a long time ago.
2019-12-23 13:03:38 +01:00
Nicolas George
f3a6ef69bf
lavfi/buffersrc: remove poll_frame.
2019-12-23 13:03:38 +01:00
Nicolas George
65e6850c56
lavfi: remove ff_poll_frame().
...
It is never used.
2019-12-23 13:03:38 +01:00
Nicolas George
9ea7e68907
lavfi/buffersrc: remove fifo.
...
The frame is immediately pushed, the fifo has never more than one.
2019-12-23 13:03:38 +01:00
Limin Wang
03eb96f9b7
avfilter/vf_readeia608: fix check for failed av_calloc
...
Signed-off-by: Limin Wang <lance.lmwang@gmail.com>
2019-12-23 10:26:36 +01:00
Paul B Mahol
e890ce62ef
avfilter/af_adeclick: implement timeline support
2019-12-21 20:02:04 +01:00
Paul B Mahol
26f4ee37f7
avfilter/vf_readeia608: if parity bit check fails, set correct value
...
As described in U.S. Federal Register, Volume 56, Number 114, June 13, 1991, pages 27204-27205.
2019-12-21 12:11:38 +01:00
Paul B Mahol
786a2daa3d
avfilter/vf_readeia608: rewrite processing, make extracting more robust
...
Lots of options are now obsolete.
2019-12-20 18:08:46 +01:00
Paul B Mahol
3530fdc78e
avfilter/vf_stack: set framerate to VFR when inputs frame rates differs
2019-12-17 13:30:16 +01:00
Xinpeng Sun
2e2dfe6673
avfilter: Add tonemap vaapi filter for H2S
...
It performs HDR(High Dynamic Range) to SDR(Standard Dynamic Range) conversion
with tone-mapping. It only supports HDR10 as input temporarily.
An example command to use this filter with vaapi codecs:
FFMPEG -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
-i INPUT -vf 'tonemap_vaapi=format=p010' -c:v hevc_vaapi -profile 2 OUTPUT
Signed-off-by: Xinpeng Sun <xinpeng.sun@intel.com>
Signed-off-by: Zachary Zhou <zachary.zhou@intel.com>
Signed-off-by: Ruiling Song <ruiling.song@intel.com>
2019-12-17 07:49:49 +08:00
Marton Balint
1f8e43938b
avfilter/x86/vf_interlace: always use unaligned movs
...
Fixes crashes in command lines such as:
ffmpeg -f lavfi -i testsrc2=704x576:r=50,interlace,pad=720:576:8 -f null none
Related to ticket #6491 .
Signed-off-by: Marton Balint <cus@passwd.hu>
2019-12-15 00:23:03 +01:00
Marton Balint
4cd2cee7ed
avfilter/vf_interlace: do not interlace already interlaced frames
...
The filter used to work this way before it was merged into tinterlace.
Signed-off-by: Marton Balint <cus@passwd.hu>
2019-12-15 00:23:03 +01:00
Marton Balint
6498522bef
avfilter/vf_tinterlace: add support for bypassing already interlaced frames
...
The old interlace filter worked this way before it was merged with tinterlace.
Signed-off-by: Marton Balint <cus@passwd.hu>
2019-12-15 00:23:01 +01:00
Marton Balint
28b5dc6199
avfilter/vf_interlace: restore lowpass mode constants
...
The documentation still mentions numerical constants in addition to textual
ones. It is also wrong to use distinct modes as flags and it disallows us to
actually use the flags field for real flags in the future.
Signed-off-by: Marton Balint <cus@passwd.hu>
2019-12-14 22:53:56 +01:00
Guo, Yejun
ed9fc2e3c5
avfilter/vf_dnn_processing: refine code for better naming
...
Signed-off-by: Guo, Yejun <yejun.guo@intel.com>
Signed-off-by: Pedro Arthur <bygrandao@gmail.com>
2019-12-13 11:41:10 -03:00
Paul B Mahol
824324db41
avfilter/vf_datascope: add decimal output
2019-12-13 12:51:47 +01:00
Michael Niedermayer
9d1f7870a9
avfilter: Fix type in av_log for random_seed in cellauto and life
...
Fixes CID 1456556 / 1456555
Reviewed-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2019-12-12 21:40:53 +01:00
Gyan Doshi
78676ee8f8
avfilter/scale_eval: remove redundant mathematical constants
...
Even though removed from vf_scale in 3b316f9f22
, they were reintroduced
when scale.c, now scale_eval.c, was split off in 037bb4021c
2019-12-11 16:08:53 +05:30
Michael Niedermayer
a0ae4b7df9
Remove redundant ;
...
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2019-12-10 16:09:14 +01:00
Gyan Doshi
e73688eff4
avfilter: rename scale.c,h to scale_eval
...
scale.c is too generic; scale_eval is more representative
2019-12-10 12:55:48 +05:30
Gyan Doshi
1b4f473d18
avfilter/scale.c: factorize ff_scale_eval_dimensions
...
Adjustment of evaluated values shifted to ff_adjust_scale_dimensions
Shifted code for force_original_aspect_ratio and force_divisble_by from
vf_scale so it is now available for scale_cuda, scale_npp and
scale_vaapi as well.
2019-12-08 16:12:31 +05:30
Jun Zhao
46d2a67f80
lavfi/avf_showspectrum: Fix the memory leak in error handle path
...
Fix the memory leak in error handle path.
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
2019-12-07 14:08:08 +08:00