On Fri, Aug 31, 2018 at 06:30:56PM +0800, hwren wrote: > Signed-off-by: hwren <hwr...@126.com> > --- > Changelog | 1 + > configure | 4 + > doc/encoders.texi | 40 ++++++ > doc/general.texi | 14 +++ > libavcodec/Makefile | 1 + > libavcodec/allcodecs.c | 1 + > libavcodec/libxavs2.c | 330 > +++++++++++++++++++++++++++++++++++++++++++++++++ > libavcodec/version.h | 2 +- > 8 files changed, 392 insertions(+), 1 deletion(-) > create mode 100644 libavcodec/libxavs2.c > > diff --git a/Changelog b/Changelog > index 0975fee..8377956 100644 > --- a/Changelog > +++ b/Changelog > @@ -21,6 +21,7 @@ version <next>: > - Brooktree ProSumer video decoder > - MatchWare Screen Capture Codec decoder > - WinCam Motion Video decoder > +- AVS2 video encoder via libxavs2 > > > version 4.0: > diff --git a/configure b/configure > index 8bbcd53..c439d2a 100755 > --- a/configure > +++ b/configure > @@ -280,6 +280,7 @@ External library support: > --enable-libx264 enable H.264 encoding via x264 [no] > --enable-libx265 enable HEVC encoding via x265 [no] > --enable-libxavs enable AVS encoding via xavs [no] > + --enable-libxavs2 enable AVS2 encoding via xavs2 [no] > --enable-libxcb enable X11 grabbing using XCB [autodetect] > --enable-libxcb-shm enable X11 grabbing shm communication [autodetect] > --enable-libxcb-xfixes enable X11 grabbing mouse rendering [autodetect] > @@ -1667,6 +1668,7 @@ EXTERNAL_LIBRARY_GPL_LIST=" > libx264 > libx265 > libxavs > + libxavs2 > libxvid > " > > @@ -3132,6 +3134,7 @@ libx264rgb_encoder_deps="libx264 x264_csp_bgr" > libx264rgb_encoder_select="libx264_encoder" > libx265_encoder_deps="libx265" > libxavs_encoder_deps="libxavs" > +libxavs2_encoder_deps="libxavs2" > libxvid_encoder_deps="libxvid" > libzvbi_teletext_decoder_deps="libzvbi" > vapoursynth_demuxer_deps="vapoursynth" > @@ -6164,6 +6167,7 @@ enabled libx264 && { check_pkg_config libx264 > x264 "stdint.h x264.h" x > enabled libx265 && require_pkg_config libx265 x265 x265.h > x265_api_get && > require_cpp_condition x265.h "X265_BUILD >= 68" > enabled libxavs && require libxavs "stdint.h xavs.h" > xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs" > +enabled libxavs2 && require_pkg_config libxavs2 "xavs2 >= 1.2.77" > "stdint.h xavs2.h" xavs2_api_get > enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore > enabled libzimg && require_pkg_config libzimg "zimg >= 2.7.0" > zimg.h zimg_get_api_version > enabled libzmq && require_pkg_config libzmq libzmq zmq.h > zmq_ctx_new > diff --git a/doc/encoders.texi b/doc/encoders.texi > index 7b09575..b5f9c5e 100644 > --- a/doc/encoders.texi > +++ b/doc/encoders.texi > @@ -2726,6 +2726,46 @@ Reduces detail but attempts to preserve color at > extremely low bitrates. > > @end table > > +@section libxavs2 > + > +xavs2 AVS2-P2/IEEE1857.4 encoder wrapper. > + > +This encoder requires the presence of the libxavs2 headers and library > +during configuration. You need to explicitly configure the build with > +@option{--enable-libxavs2}. > + > +@subsection Options > + > +@table @option > +@item i_lcurow_threads > +Set the number of parallel threads for rows from 1 to 8 (default 5). > + > +@item i_initial_qp > +Set the xavs2 quantization parameter from 1 to 63 (default 34). > + > +@item preset_level > +Set the Speed level from 0 to 9 (default 0). > + > +@item intra_period > +Set the Intra period from 3 to 100 (default 4). > + > +@item hierarchical_ref > +Set the hierarchical reference from 0 to 1 (default 1). > + > +@item num_bframes > +Set the number of B frames from 0 to 15 (default 7). > + > +@item xavs2-params > +Set xavs2 options using a list of @var{key}=@var{value} couples separated > +by ":". > + > +For example to specify libxavs2 encoding options with @option{-xavs2-params}: > + > +@example > +ffmpeg -i input -c:v libxavs2 -xavs2-params -preset_level=5 output.avs2 > +@end example > +@end table > + > @c man end VIDEO ENCODERS > > @chapter Subtitles Encoders > diff --git a/doc/general.texi b/doc/general.texi > index 06f7a78..05f7bcd9 100644 > --- a/doc/general.texi > +++ b/doc/general.texi > @@ -17,6 +17,20 @@ for more formats. None of them are used by default, their > use has to be > explicitly requested by passing the appropriate flags to > @command{./configure}. > > +@section libxavs2 > + > +FFmpeg can make use of the xavs2 library for AVS2-P2/IEEE1857.4 video > encoding. > + > +Go to @url{https://github.com/pkuvcl/xavs2} and follow the instructions for > +installing the library. Then pass @code{--enable-libxavs2} to configure to > +enable it. > + > +@float NOTE > +libxavs2 is under the GNU Public License Version 2 or later > +(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for > +details), you must upgrade FFmpeg's license to GPL in order to use it. > +@end float > + > @section libdavs2 > > FFmpeg can make use of the davs2 library for AVS2-P2/IEEE1857.4 video > decoding. > diff --git a/libavcodec/Makefile b/libavcodec/Makefile > index f8673f0..bf17bf7 100644 > --- a/libavcodec/Makefile > +++ b/libavcodec/Makefile > @@ -992,6 +992,7 @@ OBJS-$(CONFIG_LIBX262_ENCODER) += libx264.o > OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o > OBJS-$(CONFIG_LIBX265_ENCODER) += libx265.o > OBJS-$(CONFIG_LIBXAVS_ENCODER) += libxavs.o > +OBJS-$(CONFIG_LIBXAVS2_ENCODER) += libxavs2.o > OBJS-$(CONFIG_LIBXVID_ENCODER) += libxvid.o > OBJS-$(CONFIG_LIBZVBI_TELETEXT_DECODER) += libzvbi-teletextdec.o ass.o > > diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c > index a461131..493ff8f 100644 > --- a/libavcodec/allcodecs.c > +++ b/libavcodec/allcodecs.c > @@ -711,6 +711,7 @@ extern AVCodec ff_libx264_encoder; > extern AVCodec ff_libx264rgb_encoder; > extern AVCodec ff_libx265_encoder; > extern AVCodec ff_libxavs_encoder; > +extern AVCodec ff_libxavs2_encoder; > extern AVCodec ff_libxvid_encoder; > extern AVCodec ff_libzvbi_teletext_decoder; > > diff --git a/libavcodec/libxavs2.c b/libavcodec/libxavs2.c > new file mode 100644 > index 0000000..c9e4863 > --- /dev/null > +++ b/libavcodec/libxavs2.c > @@ -0,0 +1,330 @@ > +/* > + * AVS2 encoding using the xavs2 library > + * > + * Copyright (C) 2018 Yiqun Xu, <yiqun...@vipl.ict.ac.cn> > + * Falei Luo, <falei....@gmail.com> > + * Huiwen Ren, <hwr...@gmail.com> > + * > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg 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 > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + */ > + > +#include <ctype.h> > + > +#include "xavs2.h" > +#include "avcodec.h" > +#include "mpeg12.h" > +#include "internal.h" > +#include "libavutil/internal.h" > +#include "libavutil/mem.h" > +#include "libavutil/opt.h" > +#include "libavutil/imgutils.h" > +#include "libavutil/avassert.h" > +#include "libavutil/avstring.h" > +#include "libavutil/common.h" > +#include "libavutil/avutil.h" > + > +#define DELAY_FRAMES 8 > + > +typedef struct XAVS2EContext { > + AVClass *class; > + > + void* handle; > + > + int i_lcurow_threads; > + int i_initial_qp; > + int preset_level; > + int intra_period; > + > + void *encoder; > + char *xavs2_opts; > + > + int b_hierarchical_reference; > + int num_b_frames; > + > + xavs2_outpacket_t packet; > + xavs2_param_t *param; > + > + const xavs2_api_t *api; > + > +} XAVS2EContext; > + > +static av_cold int xavs2_init(AVCodecContext *avctx) > +{ > + XAVS2EContext *cae= avctx->priv_data; > + > + char str_bd[16], str_iqp[16], str_w[16], str_h[16]; > + char str_preset[16], str_hr[16], str_bf[16]; > + char str_iv[16], str_TBR[16], str_fr[16]; > + > + if (avctx->pix_fmt == AV_PIX_FMT_YUV420P) { > + /* get API handler */ > + cae->api = xavs2_api_get(8); > + cae->param = cae->api->opt_alloc(); > + > + if (!cae->param) { > + av_log(avctx, AV_LOG_ERROR, "param alloc failed\n"); > + return AVERROR(EINVAL); > + } > +
> + sprintf(str_bd, "%d", 8); > + sprintf(str_iqp, "%d", 32); theres no need for sprintf() here, its just a constant string and if it was not a constant then sprintf() would be unsafe as it lacks a end of array check [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety -- Benjamin Franklin
signature.asc
Description: PGP signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel