@@ -57,7 +57,8 @@ version 5.0:
- VideoToolbox ProRes encoder
- anlmf audio filter
- IMF demuxer (experimental)
-
+- eXtra-fast Essential Video Encoder (XEVE)
+- eXtra-fast Essential Video Decoder (XEVD)
version 4.4:
- AudioToolbox output device
@@ -204,6 +204,7 @@ Codecs:
libvpx* James Zern
libxavs.c Stefan Gehrer
libxavs2.c Huiwen Ren
+ libxev*.c, evc_parser.c Dawid Kozinski
libzvbi-teletextdec.c Marton Balint
lzo.h, lzo.c Reimar Doeffinger
mdec.c Michael Niedermayer
@@ -424,6 +425,7 @@ Muxers/Demuxers:
dv.c Roman Shaposhnik
electronicarts.c Peter Ross
epafdec.c Paul B Mahol
+ evcdec.c Dawid Kozinski
ffm* Baptiste Coudurier
flic.c Mike Melanson
flvdec.c Michael Niedermayer
@@ -1870,6 +1870,14 @@ static const AVCodecDescriptor codec_descriptors[] =
{
.long_name = NULL_IF_CONFIG_SMALL("Vizrt Binary Image"),
.props = AV_CODEC_PROP_LOSSY,
},
+ {
+ .id = AV_CODEC_ID_EVC,
+ .type = AVMEDIA_TYPE_VIDEO,
+ .name = "evc",
+ .long_name = NULL_IF_CONFIG_SMALL("MPEG-5 EVC (Essential Video
Coding)"),
+ .props = AV_CODEC_PROP_LOSSY | AV_CODEC_PROP_REORDER,
+ .profiles = NULL_IF_CONFIG_SMALL(ff_evc_profiles),
+ },
/* various PCM "codecs" */
{
@@ -309,6 +309,7 @@ enum AVCodecID {
AV_CODEC_ID_SGA_VIDEO,
AV_CODEC_ID_GEM,
AV_CODEC_ID_VBN,
+ AV_CODEC_ID_EVC,
/* various PCM "codecs" */
AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the
start of audio codecs
@@ -181,4 +181,10 @@ const AVProfile ff_arib_caption_profiles[] = {
{ FF_PROFILE_UNKNOWN }
};
+const AVProfile ff_evc_profiles[] = {
+ { FF_PROFILE_EVC_BASELINE, "Baseline" },
+ { FF_PROFILE_EVC_MAIN, "Main" },
+ { FF_PROFILE_UNKNOWN },
+};
+
#endif /* !CONFIG_SMALL */
@@ -72,5 +72,6 @@ extern const AVProfile ff_sbc_profiles[];
extern const AVProfile ff_prores_profiles[];
extern const AVProfile ff_mjpeg_profiles[];
extern const AVProfile ff_arib_caption_profiles[];
+extern const AVProfile ff_evc_profiles[];
#endif /* AVCODEC_PROFILES_H */
@@ -29,7 +29,8 @@
#include "version_major.h"
-#define LIBAVCODEC_VERSION_MINOR 26
+#define LIBAVCODEC_VERSION_MINOR 27
+
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
####################################### 1. Genaral info ####################################### The patch provided below contains an integration layer between ffmpeg framework and EVC codec implementation. In nutshell, it enables using EVC codec (encoding, decoding) by the means of ffmpeg API. I'd like to emphasize one more time, that (as mentioned before) it isn't codec implementation. The provided implementation serves as an integration layer between ffmpeg framework and the EVC codec. EVC codec has been published as two separate libraries. The first one called XEVE (eXtra-fast Essential Video Encoder) is an opensource MPEG-5 EVC encoder. The second one called XEVD (eXtra-fast Essential Video Decoder ) is an opensource MPEG-5 EVC decoder. For more information on both libraries please follow the links below: * https://github.com/mpeg5/xeve * https://github.com/mpeg5/xevd The patch provided below should be apply to FFmpeg 5.0 release (commit b655beb025cb54ba19cad89e731990910643f208 release/5.0) ####################################### 2. Building ####################################### 3.1. Download, build and install dependencies Dependencies: * eXtra-fast Essential Video Encoder (XEVE) (https://github.com/mpeg5/xeve) * eXtra-fast Essential Video Decoder (XEVD) (https://github.com/mpeg5/xevd) ------------------- 2.1.1. XEVE ------------------- git clone git@github.com:mpeg5/xeve.git cd xeve ------------------- base profile ------------------- mkdir build_base cd buid_base cmake .. -DSET_PROF=BASE make make install ------------------- main profile ------------------- mkdir build_main cd buid_base cmake .. -DSET_PROF=MAIN make make install ------------------- 2.1.2. XEVD ------------------- git clone git@github.com:mpeg5/xeve.git cd xeve ------------------- base profile ------------------- mkdir build_base cd buid_base cmake .. -DSET_PROF=BASE make make install ------------------- main profile ------------------- mkdir build_main cd buid_base cmake .. -DSET_PROF=MAIN make make install --------------------------------------- 2.2. Build ffmpeg with libxeve and libxevd --------------------------------------- It is required ffmpeg to be configfured with --enable-libxeve and --enable- libxevd Please find below exaple configuration. PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \ --prefix="$HOME/ffmpeg_build" \ --pkg-config-flags="--static" \ --extra-cflags="-I$HOME/ffmpeg_build/include" \ --extra-ldflags="- L$HOME/ffmpeg_build/lib" \ --extra-libs="-lpthread -lm" \ -- bindir="$HOME/bin" \ --enable-gpl \ --enable-gnutls \ --enable-libaom \ -- enable-libass \ --enable-libfdk-aac \ --enable-libfreetype \ --enable- libmp3lame \ --enable-libopus \ --enable-libdav1d \ --enable-libvorbis \ -- enable-libvpx \ --enable-libx264 \ --enable-libx265 \ --enable-libxeve \ --enable-libxevd \ --enable-nonfree && \ PATH="$HOME/bin:$PATH" make -j $(nproc) make install ####################################### 3. Examples ####################################### Please find below examples on how to use EVC coded with ffmpeg commandline tool. (All samples are available in https://drive.google.com/drive/folders/1YtCLlSuTAjpLziTKI_QBuQrIOm2ss9LB?usp =sharing ) #!/bin/bash #======================================= #(YUV420P) -> (EVC) #======================================= ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 352x288 -r 30 -i Test_Video_cif.yuv -c:v libxeve -f rawvideo Test_Video_cif.yuv.evc ffplay - autoexit Test_Video_cif.yuv.evc #======================================= #(YUV420P10LE) -> (EVC) #======================================= ffmpeg -f rawvideo -pix_fmt yuv420p10le -s:v 352x288 -r 30 -i Test_Video_cif_10le.yuv -c:v libxeve -f rawvideo Test_Video_cif_10le.yuv.evc ffplay -autoexit Test_Video_cif_10le.yuv.evc #======================================= #(EVC) -> (YUV420P) #======================================= ffmpeg -i Test_Video_cif.yuv.evc -pix_fmt yuv420p Test_Video_cif.evc.yuv ffplay -autoexit -f rawvideo -pixel_format yuv420p -video_size 352x288 Test_Video_cif.evc.yuv #======================================= #(EVC) -> (YUV420Pi10LE) #======================================= ffmpeg -i Test_Video_cif_10le.yuv.evc -pix_fmt yuv420p10le Test_Video_cif_10le.evc.yuv ffplay -autoexit -f rawvideo -pixel_format yuv420p10le -video_size 352x288 Test_Video_cif_10le.evc.yuv #======================================= #(YUV420P) -> (MP4) #======================================= ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 352x288 -r 30 -i Test_Video_cif.yuv -c:v libxeve -f rawvideo Test_Video_cif.yuv.mp4 ffplay - autoexit Test_Video_cif.yuv.mp4 #======================================= #(YUV420P10LE) -> (MP4) #======================================= ffmpeg -f rawvideo -pix_fmt yuv420p10le -s:v 352x288 -r 30 -i Test_Video_cif_10le.yuv -c:v libxeve -f rawvideo Test_Video_cif_10le.yuv.mp4 ffplay -autoexit Test_Video_cif_10le.yuv.mp4 #======================================= #(MP4) -> (YUV420P) #======================================= ffmpeg -i Test_Video_cif.yuv.mp4 -f rawvideo -pix_fmt yuv420p Test_Video_cif.mp4.yuv ffplay -autoexit -f rawvideo -pixel_format yuv420p - video_size 352x288 Test_Video_cif.mp4.yuv #======================================= #(MP4) -> (YUV420P10LE) #======================================= ffmpeg -i Test_Video_cif_10le.yuv.mp4 -f rawvideo -pix_fmt yuv420p10le Test_Video_cif_10le.mp4.yuv ffplay -autoexit -f rawvideo -pixel_format yuv420p10le -video_size 352x288 Test_Video_cif_10le.mp4.yuv #======================================= #(EVC) -> (MP4) #======================================= ffmpeg -i Test_Video_cif.yuv.evc -c:v copy Test_Video_cif.evc.mp4 ffplay - autoexit Test_Video_cif.evc.mp4 #======================================= #(MP4) -> (EVC) #======================================= ffmpeg -i Test_Video_cif.evc.mp4 -vcodec copy -an -f rawvideo Test_Video_cif.evc.mp4.evc ffplay -autoexit Test_Video_cif.evc.mp4.evc #======================================= #(MP4 [h264,aac]) -> (MP4 [evc,aac]) #======================================= ffmpeg -i Test_Video_cif.mp4 -c:v libxeve Test_Video_cif_evc.mp4 ffplay - autoexit Test_Video_cif_evc.mp4 Prerequisites that must be met before adding new codec - Added new entry to codec IDs list - Added new entry to the codec descriptor list - Bumped libavcodec minor version - Changes in Changelog and MAINTAINERS files Signed-off-by: Dawid Kozinski <d.kozinski@samsung.com> --- Changelog | 3 ++- MAINTAINERS | 2 ++ libavcodec/codec_desc.c | 8 ++++++++ libavcodec/codec_id.h | 1 + libavcodec/profiles.c | 6 ++++++ libavcodec/profiles.h | 1 + libavcodec/version.h | 3 ++- 7 files changed, 22 insertions(+), 2 deletions(-)