diff options
author | Nathaniel Chin | 2022-07-30 17:21:42 +0800 |
---|---|---|
committer | Nathaniel Chin | 2022-07-30 17:21:42 +0800 |
commit | 30b7764f4463d5498ce307d74897b1d73d94bda3 (patch) | |
tree | 3fd6faa93f91add4f19333272d965fdcc7dbe043 | |
parent | 0c3efb91c8cdbaa430bf863e974e39b73bf6f1f8 (diff) | |
download | aur-30b7764f4463d5498ce307d74897b1d73d94bda3.tar.gz |
Update to 5.1
-rw-r--r-- | .SRCINFO | 31 | ||||
-rw-r--r-- | 010-ffmpeg-vmaf2.x.patch | 955 | ||||
-rw-r--r-- | 040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch | 29 | ||||
-rw-r--r-- | 050-add-av_stream_get_first_dts-for-chromium.patch | 44 | ||||
-rw-r--r-- | 060-ffmpeg-fix-segfault-with-avisynthplus.patch | 11 | ||||
-rw-r--r-- | PKGBUILD | 78 |
6 files changed, 100 insertions, 1048 deletions
@@ -1,6 +1,6 @@ pkgbase = ffmpeg-amd-full pkgdesc = Complete solution to record, convert and stream audio and video (all possible features for AMD) - pkgver = 5.0.1 + pkgver = 5.1 pkgrel = 1 url = https://www.ffmpeg.org/ arch = x86_64 @@ -19,15 +19,15 @@ pkgbase = ffmpeg-amd-full depends = gmp depends = gnutls depends = ladspa - depends = libass + depends = lcms2 depends = aom depends = aribb24 + depends = libass depends = libbluray depends = libbs2b depends = libcaca depends = celt depends = libcdio-paranoia - depends = chromaprint depends = codec2 depends = dav1d depends = libdc1394 @@ -43,13 +43,14 @@ pkgbase = ffmpeg-amd-full depends = libiec61883 depends = libilbc depends = jack + depends = libjxl-git depends = kvazaar depends = libmodplug depends = lame depends = opencore-amr depends = openjpeg2 - depends = libopenmpt depends = opus + depends = libplacebo depends = libpulse depends = librabbitmq-c depends = rav1e @@ -62,8 +63,8 @@ pkgbase = ffmpeg-amd-full depends = speex depends = srt depends = libssh - depends = svt-hevc depends = svt-av1 + depends = svt-hevc depends = svt-vp9 depends = tesseract depends = libtheora @@ -101,10 +102,12 @@ pkgbase = ffmpeg-amd-full depends = libdrm depends = libva depends = libvdpau + depends = chromaprint-fftw depends = davs2 depends = flite1 depends = libklvanc-git depends = openh264 + depends = libopenmpt depends = librist depends = shine depends = uavs3d-git @@ -124,16 +127,20 @@ pkgbase = ffmpeg-amd-full provides = ffmpeg provides = ffmpeg-full conflicts = ffmpeg - source = https://ffmpeg.org/releases/ffmpeg-5.0.1.tar.xz - source = https://ffmpeg.org/releases/ffmpeg-5.0.1.tar.xz.asc - source = 010-ffmpeg-vmaf2.x.patch - source = 050-add-av_stream_get_first_dts-for-chromium.patch + source = https://ffmpeg.org/releases/ffmpeg-5.1.tar.xz + source = https://ffmpeg.org/releases/ffmpeg-5.1.tar.xz.asc + source = 010-ffmpeg-add-svt-hevc-gb62f72e.patch::https://raw.githubusercontent.com/OpenVisualCloud/SVT-HEVC/b62f72e752243cee4104cfb41dc7ee409d3ac3e9/ffmpeg_plugin/master-0001-lavc-svt_hevc-add-libsvt-hevc-encoder-wrapper.patch + source = 030-ffmpeg-add-svt-vp9-gd9ef3cc.patch::https://raw.githubusercontent.com/OpenVisualCloud/SVT-VP9/d9ef3cc13159143b9afc776c04f67cdfa6284046/ffmpeg_plugin/master-0001-Add-ability-for-ffmpeg-to-run-svt-vp9.patch + source = 040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch + source = 060-ffmpeg-fix-segfault-with-avisynthplus.patch source = LICENSE validpgpkeys = FCF986EA15E6E293A5644F10B4322F04D67658D8 - sha256sums = ef2efae259ce80a240de48ec85ecb062cecca26e4352ffb3fda562c21a93007b + sha256sums = 55eb6aab5ee235550fa54a33eaf8bf1b4ec66c01453182b12f6a993d75698b03 sha256sums = SKIP - sha256sums = 42bd572442a4eba4e9559953c72f9e980b78286ab288ac01e659be39d8bc7298 - sha256sums = 91973c465f01446a999f278f0c2a3763304994dba1ac35de0e4c72f12f39409e + sha256sums = 4da3826aa370572273ef9fb4c0bf2c93a840595b07a671a0412ad0dc9ed8d689 + sha256sums = e310eedb3dc88c8ad6ffcd6cb6bde1f593ded330ea99b0356724c9d22bcfde4c + sha256sums = 2df82046908015bf26bc1303275cf52ba01fa380029a54ea6415373e389e423c + sha256sums = b1d68f626168f2409a4b0987acf5b208e7ced2ddab49b11990a10f458d377e9a sha256sums = 04a7176400907fd7db0d69116b99de49e582a6e176b3bfb36a03e50a4cb26a36 pkgname = ffmpeg-amd-full diff --git a/010-ffmpeg-vmaf2.x.patch b/010-ffmpeg-vmaf2.x.patch deleted file mode 100644 index 52ed69fffc4e..000000000000 --- a/010-ffmpeg-vmaf2.x.patch +++ /dev/null @@ -1,955 +0,0 @@ -diff --git a/configure b/configure -index 94f513288a..493493b4c5 100755 ---- a/configure -+++ b/configure -@@ -3751,7 +3751,7 @@ vaguedenoiser_filter_deps="gpl" - vflip_vulkan_filter_deps="vulkan spirv_compiler" - vidstabdetect_filter_deps="libvidstab" - vidstabtransform_filter_deps="libvidstab" --libvmaf_filter_deps="libvmaf pthreads" -+libvmaf_filter_deps="libvmaf" - zmq_filter_deps="libzmq" - zoompan_filter_deps="swscale" - zscale_filter_deps="libzimg const_nan" -@@ -6626,7 +6626,7 @@ enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame - enabled libuavs3d && require_pkg_config libuavs3d "uavs3d >= 1.1.41" uavs3d.h uavs3d_decode - enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl - enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit --enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 1.5.2" libvmaf.h compute_vmaf -+enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 2.0.0" libvmaf.h vmaf_init - enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc - enabled libvorbis && require_pkg_config libvorbis vorbis vorbis/codec.h vorbis_info_init && - require_pkg_config libvorbisenc vorbisenc vorbis/vorbisenc.h vorbis_encode_init -diff --git a/doc/filters.texi b/doc/filters.texi -index 248c09caf8..9a890d1555 100644 ---- a/doc/filters.texi -+++ b/doc/filters.texi -@@ -14666,68 +14666,60 @@ ffmpeg -i input.mov -vf lensfun=make=Canon:model="Canon EOS 100D":lens_model="Ca - - @section libvmaf - --Obtain the VMAF (Video Multi-Method Assessment Fusion) --score between two input videos. -+Calulate the VMAF (Video Multi-Method Assessment Fusion) score for a -+reference/distorted pair of input videos. - --The first input is the encoded video, and the second input is the reference video. -+The first input is the distorted video, and the second input is the reference video. - - The obtained VMAF score is printed through the logging system. - - It requires Netflix's vmaf library (libvmaf) as a pre-requisite. - After installing the library it can be enabled using: - @code{./configure --enable-libvmaf}. --If no model path is specified it uses the default model: @code{vmaf_v0.6.1.pkl}. - - The filter has following options: - - @table @option --@item model_path --Set the model path which is to be used for SVM. --Default value: @code{"/usr/local/share/model/vmaf_v0.6.1.pkl"} -- --@item log_path --Set the file path to be used to store logs. -+@item model -+A `|` delimited list of vmaf models. Each model can be configured with a number of parameters. -+Default value: @code{"version=vmaf_v0.6.1"} - --@item log_fmt --Set the format of the log file (csv, json or xml). -+@item model_path -+Deprecated, use model='path=...'. - - @item enable_transform --This option can enable/disable the @code{score_transform} applied to the final predicted VMAF score, --if you have specified score_transform option in the input parameter file passed to @code{run_vmaf_training.py} --Default value: @code{false} -+Deprecated, use model='enable_transform=true'. - - @item phone_model --Invokes the phone model which will generate VMAF scores higher than in the --regular model, which is more suitable for laptop, TV, etc. viewing conditions. --Default value: @code{false} -+Deprecated, use model='enable_transform=true'. -+ -+@item enable_conf_interval -+Deprecated, use model='enable_conf_interval=true'. -+ -+@item feature -+A `|` delimited list of features. Each feature can be configured with a number of parameters. - - @item psnr --Enables computing psnr along with vmaf. --Default value: @code{false} -+Deprecated, use feature='name=psnr'. - - @item ssim --Enables computing ssim along with vmaf. --Default value: @code{false} -+Deprecated, use feature='name=ssim'. - - @item ms_ssim --Enables computing ms_ssim along with vmaf. --Default value: @code{false} -+Deprecated, use feature='name=ms_ssim'. - --@item pool --Set the pool method to be used for computing vmaf. --Options are @code{min}, @code{harmonic_mean} or @code{mean} (default). -+@item log_path -+Set the file path to be used to store log files. -+ -+@item log_fmt -+Set the format of the log file (xml, json, csv, or sub). - - @item n_threads --Set number of threads to be used when computing vmaf. --Default value: @code{0}, which makes use of all available logical processors. -+Set number of threads to be used when initializing libvmaf. -+Default value: @code{0}, no threads. - - @item n_subsample --Set interval for frame subsampling used when computing vmaf. --Default value: @code{1} -- --@item enable_conf_interval --Enables confidence interval. --Default value: @code{false} -+Set frame subsampling interval to be used. - @end table - - This filter also supports the @ref{framesync} options. -@@ -14735,23 +14727,31 @@ This filter also supports the @ref{framesync} options. - @subsection Examples - @itemize - @item --On the below examples the input file @file{main.mpg} being processed is --compared with the reference file @file{ref.mpg}. -+In the examples below, a distorted video @file{distorted.mpg} is -+compared with a reference file @file{reference.mpg}. - -+@item -+Basic usage: -+@example -+ffmpeg -i distorted.mpg -i reference.mpg -lavfi libvmaf=log_path=output.xml -f null - -+@end example -+ -+@item -+Example with multiple models: - @example --ffmpeg -i main.mpg -i ref.mpg -lavfi libvmaf -f null - -+ffmpeg -i distorted.mpg -i reference.mpg -lavfi libvmaf='model=version=vmaf_v0.6.1\\:name=vmaf|version=vmaf_v0.6.1neg\\:name=vmaf_neg' -f null - - @end example - - @item --Example with options: -+Example with multiple addtional features: - @example --ffmpeg -i main.mpg -i ref.mpg -lavfi libvmaf="psnr=1:log_fmt=json" -f null - -+ffmpeg -i distorted.mpg -i reference.mpg -lavfi libvmaf='feature=name=psnr|name=ciede' -f null - - @end example - - @item - Example with options and different containers: - @example --ffmpeg -i main.mpg -i ref.mkv -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]libvmaf=psnr=1:log_fmt=json" -f null - -+ffmpeg -i distorted.mpg -i reference.mkv -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]libvmaf=log_fmt=json:log_path=output.json" -f null - - @end example - @end itemize - -diff --git a/libavfilter/vf_libvmaf.c b/libavfilter/vf_libvmaf.c -index 5d492126eb..eee1c280ef 100644 ---- a/libavfilter/vf_libvmaf.c -+++ b/libavfilter/vf_libvmaf.c -@@ -24,8 +24,8 @@ - * Calculate the VMAF between two input videos. - */ - --#include <pthread.h> - #include <libvmaf.h> -+ - #include "libavutil/avstring.h" - #include "libavutil/opt.h" - #include "libavutil/pixdesc.h" -@@ -39,23 +39,9 @@ - typedef struct LIBVMAFContext { - const AVClass *class; - FFFrameSync fs; -- const AVPixFmtDescriptor *desc; -- int width; -- int height; -- double vmaf_score; -- int vmaf_thread_created; -- pthread_t vmaf_thread; -- pthread_mutex_t lock; -- pthread_cond_t cond; -- int eof; -- AVFrame *gmain; -- AVFrame *gref; -- int frame_set; - char *model_path; - char *log_path; - char *log_fmt; -- int disable_clip; -- int disable_avx; - int enable_transform; - int phone_model; - int psnr; -@@ -65,184 +51,487 @@ typedef struct LIBVMAFContext { - int n_threads; - int n_subsample; - int enable_conf_interval; -- int error; -+ char *model_cfg; -+ char *feature_cfg; -+ VmafContext *vmaf; -+ VmafModel **model; -+ unsigned model_cnt; -+ unsigned frame_cnt; -+ unsigned bpc; - } LIBVMAFContext; - - #define OFFSET(x) offsetof(LIBVMAFContext, x) - #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM - - static const AVOption libvmaf_options[] = { -- {"model_path", "Set the model to be used for computing vmaf.", OFFSET(model_path), AV_OPT_TYPE_STRING, {.str="/usr/local/share/model/vmaf_v0.6.1.pkl"}, 0, 1, FLAGS}, -- {"log_path", "Set the file path to be used to store logs.", OFFSET(log_path), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS}, -- {"log_fmt", "Set the format of the log (csv, json or xml).", OFFSET(log_fmt), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS}, -- {"enable_transform", "Enables transform for computing vmaf.", OFFSET(enable_transform), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, -- {"phone_model", "Invokes the phone model that will generate higher VMAF scores.", OFFSET(phone_model), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, -- {"psnr", "Enables computing psnr along with vmaf.", OFFSET(psnr), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, -- {"ssim", "Enables computing ssim along with vmaf.", OFFSET(ssim), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, -- {"ms_ssim", "Enables computing ms-ssim along with vmaf.", OFFSET(ms_ssim), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, -+ {"model_path", "use model='path=...'.", OFFSET(model_path), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS|AV_OPT_FLAG_DEPRECATED}, -+ {"log_path", "Set the file path to be used to write log.", OFFSET(log_path), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS}, -+ {"log_fmt", "Set the format of the log (csv, json, xml, or sub).", OFFSET(log_fmt), AV_OPT_TYPE_STRING, {.str="xml"}, 0, 1, FLAGS}, -+ {"enable_transform", "use model='enable_transform=true'.", OFFSET(enable_transform), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS|AV_OPT_FLAG_DEPRECATED}, -+ {"phone_model", "use model='enable_transform=true'.", OFFSET(phone_model), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS|AV_OPT_FLAG_DEPRECATED}, -+ {"psnr", "use feature='name=psnr'.", OFFSET(psnr), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS|AV_OPT_FLAG_DEPRECATED}, -+ {"ssim", "use feature='name=ssim'.", OFFSET(ssim), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS|AV_OPT_FLAG_DEPRECATED}, -+ {"ms_ssim", "use feature='name=ms_ssim'.", OFFSET(ms_ssim), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS|AV_OPT_FLAG_DEPRECATED}, - {"pool", "Set the pool method to be used for computing vmaf.", OFFSET(pool), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS}, - {"n_threads", "Set number of threads to be used when computing vmaf.", OFFSET(n_threads), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT_MAX, FLAGS}, - {"n_subsample", "Set interval for frame subsampling used when computing vmaf.", OFFSET(n_subsample), AV_OPT_TYPE_INT, {.i64=1}, 1, UINT_MAX, FLAGS}, -- {"enable_conf_interval", "Enables confidence interval.", OFFSET(enable_conf_interval), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, -+ {"enable_conf_interval", "model='enable_conf_interval=true'.", OFFSET(enable_conf_interval), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS|AV_OPT_FLAG_DEPRECATED}, -+ {"model", "Set the model to be used for computing vmaf.", OFFSET(model_cfg), AV_OPT_TYPE_STRING, {.str="version=vmaf_v0.6.1"}, 0, 1, FLAGS}, -+ {"feature", "Set the feature to be used for computing vmaf.", OFFSET(feature_cfg), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS}, - { NULL } - }; - - FRAMESYNC_DEFINE_CLASS(libvmaf, LIBVMAFContext, fs); - --#define read_frame_fn(type, bits) \ -- static int read_frame_##bits##bit(float *ref_data, float *main_data, \ -- float *temp_data, int stride, void *ctx) \ --{ \ -- LIBVMAFContext *s = (LIBVMAFContext *) ctx; \ -- int ret; \ -- \ -- pthread_mutex_lock(&s->lock); \ -- \ -- while (!s->frame_set && !s->eof) { \ -- pthread_cond_wait(&s->cond, &s->lock); \ -- } \ -- \ -- if (s->frame_set) { \ -- int ref_stride = s->gref->linesize[0]; \ -- int main_stride = s->gmain->linesize[0]; \ -- \ -- const type *ref_ptr = (const type *) s->gref->data[0]; \ -- const type *main_ptr = (const type *) s->gmain->data[0]; \ -- \ -- float *ptr = ref_data; \ -- float factor = 1.f / (1 << (bits - 8)); \ -- \ -- int h = s->height; \ -- int w = s->width; \ -- \ -- int i,j; \ -- \ -- for (i = 0; i < h; i++) { \ -- for ( j = 0; j < w; j++) { \ -- ptr[j] = ref_ptr[j] * factor; \ -- } \ -- ref_ptr += ref_stride / sizeof(*ref_ptr); \ -- ptr += stride / sizeof(*ptr); \ -- } \ -- \ -- ptr = main_data; \ -- \ -- for (i = 0; i < h; i++) { \ -- for (j = 0; j < w; j++) { \ -- ptr[j] = main_ptr[j] * factor; \ -- } \ -- main_ptr += main_stride / sizeof(*main_ptr); \ -- ptr += stride / sizeof(*ptr); \ -- } \ -- } \ -- \ -- ret = !s->frame_set; \ -- \ -- av_frame_unref(s->gref); \ -- av_frame_unref(s->gmain); \ -- s->frame_set = 0; \ -- \ -- pthread_cond_signal(&s->cond); \ -- pthread_mutex_unlock(&s->lock); \ -- \ -- if (ret) { \ -- return 2; \ -- } \ -- \ -- return 0; \ -+static enum VmafPixelFormat pix_fmt_map(enum AVPixelFormat av_pix_fmt) -+{ -+ switch (av_pix_fmt) { -+ case AV_PIX_FMT_YUV420P: -+ case AV_PIX_FMT_YUV420P10LE: -+ case AV_PIX_FMT_YUV420P12LE: -+ case AV_PIX_FMT_YUV420P16LE: -+ return VMAF_PIX_FMT_YUV420P; -+ case AV_PIX_FMT_YUV422P: -+ case AV_PIX_FMT_YUV422P10LE: -+ case AV_PIX_FMT_YUV422P12LE: -+ case AV_PIX_FMT_YUV422P16LE: -+ return VMAF_PIX_FMT_YUV422P; -+ case AV_PIX_FMT_YUV444P: -+ case AV_PIX_FMT_YUV444P10LE: -+ case AV_PIX_FMT_YUV444P12LE: -+ case AV_PIX_FMT_YUV444P16LE: -+ return VMAF_PIX_FMT_YUV444P; -+ default: -+ return VMAF_PIX_FMT_UNKNOWN; -+ } - } - --read_frame_fn(uint8_t, 8); --read_frame_fn(uint16_t, 10); -+static int copy_picture_data(AVFrame *src, VmafPicture *dst, unsigned bpc) -+{ -+ int err = vmaf_picture_alloc(dst, pix_fmt_map(src->format), bpc, -+ src->width, src->height); -+ if (err) -+ return AVERROR(ENOMEM); -+ -+ for (unsigned i = 0; i < 3; i++) { -+ uint8_t *src_data = src->data[i]; -+ uint8_t *dst_data = dst->data[i]; -+ for (unsigned j = 0; j < dst->h[i]; j++) { -+ memcpy(dst_data, src_data, sizeof(*dst_data) * dst->w[i]); -+ src_data += src->linesize[i]; -+ dst_data += dst->stride[i]; -+ } -+ } -+ -+ return 0; -+} - --static void compute_vmaf_score(LIBVMAFContext *s) -+static int do_vmaf(FFFrameSync *fs) - { -- int (*read_frame)(float *ref_data, float *main_data, float *temp_data, -- int stride, void *ctx); -- char *format; -+ AVFilterContext *ctx = fs->parent; -+ LIBVMAFContext *s = ctx->priv; -+ VmafPicture pic_ref, pic_dist; -+ AVFrame *ref, *dist; -+ int err = 0; - -- if (s->desc->comp[0].depth <= 8) { -- read_frame = read_frame_8bit; -- } else { -- read_frame = read_frame_10bit; -+ int ret = ff_framesync_dualinput_get(fs, &dist, &ref); -+ if (ret < 0) -+ return ret; -+ if (ctx->is_disabled || !ref) -+ return ff_filter_frame(ctx->outputs[0], dist); -+ -+ err = copy_picture_data(ref, &pic_ref, s->bpc); -+ if (err) { -+ av_log(s, AV_LOG_ERROR, "problem during vmaf_picture_alloc.\n"); -+ return AVERROR(ENOMEM); -+ } -+ -+ err = copy_picture_data(dist, &pic_dist, s->bpc); -+ if (err) { -+ av_log(s, AV_LOG_ERROR, "problem during vmaf_picture_alloc.\n"); -+ vmaf_picture_unref(&pic_ref); -+ return AVERROR(ENOMEM); - } - -- format = (char *) s->desc->name; -+ err = vmaf_read_pictures(s->vmaf, &pic_ref, &pic_dist, s->frame_cnt++); -+ if (err) { -+ av_log(s, AV_LOG_ERROR, "problem during vmaf_read_pictures.\n"); -+ return AVERROR(EINVAL); -+ } - -- s->error = compute_vmaf(&s->vmaf_score, format, s->width, s->height, -- read_frame, s, s->model_path, s->log_path, -- s->log_fmt, 0, 0, s->enable_transform, -- s->phone_model, s->psnr, s->ssim, -- s->ms_ssim, s->pool, -- s->n_threads, s->n_subsample, s->enable_conf_interval); -+ return ff_filter_frame(ctx->outputs[0], dist); - } - --static void *call_vmaf(void *ctx) -+ -+static AVDictionary **delimited_dict_parse(char *str, unsigned *cnt) - { -- LIBVMAFContext *s = (LIBVMAFContext *) ctx; -- compute_vmaf_score(s); -- if (!s->error) { -- av_log(ctx, AV_LOG_INFO, "VMAF score: %f\n",s->vmaf_score); -- } else { -- pthread_mutex_lock(&s->lock); -- pthread_cond_signal(&s->cond); -- pthread_mutex_unlock(&s->lock); -+ AVDictionary **dict = NULL; -+ char *str_copy = NULL; -+ char *saveptr = NULL; -+ unsigned cnt2; -+ int err = 0; -+ -+ if (!str) -+ return NULL; -+ -+ cnt2 = 1; -+ for (char *p = str; *p; p++) { -+ if (*p == '|') -+ cnt2++; -+ } -+ -+ dict = av_calloc(cnt2, sizeof(*dict)); -+ if (!dict) -+ goto fail; -+ -+ str_copy = av_strdup(str); -+ if (!str_copy) -+ goto fail; -+ -+ *cnt = 0; -+ for (unsigned i = 0; i < cnt2; i++) { -+ char *s = av_strtok(i == 0 ? str_copy : NULL, "|", &saveptr); -+ if (!s) -+ continue; -+ err = av_dict_parse_string(&dict[(*cnt)++], s, "=", ":", 0); -+ if (err) -+ goto fail; -+ } -+ -+ av_free(str_copy); -+ return dict; -+ -+fail: -+ if (dict) { -+ for (unsigned i = 0; i < *cnt; i++) { -+ if (dict[i]) -+ av_dict_free(&dict[i]); -+ } -+ av_free(dict); - } -- pthread_exit(NULL); -+ -+ av_free(str_copy); -+ *cnt = 0; - return NULL; - } - --static int do_vmaf(FFFrameSync *fs) -+static int parse_features(AVFilterContext *ctx) - { -- AVFilterContext *ctx = fs->parent; - LIBVMAFContext *s = ctx->priv; -- AVFrame *master, *ref; -- int ret; -+ AVDictionary **dict = NULL; -+ unsigned dict_cnt; -+ int err = 0; - -- ret = ff_framesync_dualinput_get(fs, &master, &ref); -- if (ret < 0) -- return ret; -- if (!ref) -- return ff_filter_frame(ctx->outputs[0], master); -+ if (!s->feature_cfg) -+ return 0; -+ -+ dict = delimited_dict_parse(s->feature_cfg, &dict_cnt); -+ if (!dict) { -+ av_log(ctx, AV_LOG_ERROR, -+ "could not parse feature config: %s\n", s->feature_cfg); -+ return AVERROR(EINVAL); -+ } - -- pthread_mutex_lock(&s->lock); -+ for (unsigned i = 0; i < dict_cnt; i++) { -+ char *feature_name = NULL; -+ VmafFeatureDictionary *feature_opts_dict = NULL; -+ AVDictionaryEntry *e = NULL; -+ -+ while (e = av_dict_get(dict[i], "", e, AV_DICT_IGNORE_SUFFIX)) { -+ if (av_stristr(e->key, "name")) { -+ feature_name = e->value; -+ continue; -+ } -+ -+ err = vmaf_feature_dictionary_set(&feature_opts_dict, e->key, -+ e->value); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "could not set feature option: %s.%s=%s\n", -+ feature_name, e->key, e->value); -+ goto exit; -+ } -+ } -+ -+ err = vmaf_use_feature(s->vmaf, feature_name, feature_opts_dict); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem during vmaf_use_feature: %s\n", feature_name); -+ goto exit; -+ } -+ } - -- while (s->frame_set && !s->error) { -- pthread_cond_wait(&s->cond, &s->lock); -+exit: -+ for (unsigned i = 0; i < dict_cnt; i++) { -+ if (dict[i]) -+ av_dict_free(&dict[i]); - } -+ av_free(dict); -+ return err; -+} -+ -+static int parse_models(AVFilterContext *ctx) -+{ -+ LIBVMAFContext *s = ctx->priv; -+ AVDictionary **dict; -+ unsigned dict_cnt; -+ int err = 0; -+ -+ if (!s->model_cfg) return 0; - -- if (s->error) { -+ dict_cnt = 0; -+ dict = delimited_dict_parse(s->model_cfg, &dict_cnt); -+ if (!dict) { - av_log(ctx, AV_LOG_ERROR, -- "libvmaf encountered an error, check log for details\n"); -- pthread_mutex_unlock(&s->lock); -+ "could not parse model config: %s\n", s->model_cfg); - return AVERROR(EINVAL); - } - -- av_frame_ref(s->gref, ref); -- av_frame_ref(s->gmain, master); -+ s->model_cnt = dict_cnt; -+ s->model = av_calloc(s->model_cnt, sizeof(*s->model)); -+ if (!s->model) -+ return AVERROR(ENOMEM); -+ -+ for (unsigned i = 0; i < dict_cnt; i++) { -+ VmafModelConfig model_cfg = { 0 }; -+ AVDictionaryEntry *e = NULL; -+ char *version = NULL; -+ char *path = NULL; -+ -+ while (e = av_dict_get(dict[i], "", e, AV_DICT_IGNORE_SUFFIX)) { -+ if (av_stristr(e->key, "disable_clip")) { -+ model_cfg.flags |= av_stristr(e->value, "true") ? -+ VMAF_MODEL_FLAG_DISABLE_CLIP : 0; -+ continue; -+ } -+ -+ if (av_stristr(e->key, "enable_transform")) { -+ model_cfg.flags |= av_stristr(e->value, "true") ? -+ VMAF_MODEL_FLAG_ENABLE_TRANSFORM : 0; -+ continue; -+ } -+ -+ if (av_stristr(e->key, "name")) { -+ model_cfg.name = e->value; -+ continue; -+ } -+ -+ if (av_stristr(e->key, "version")) { -+ version = e->value; -+ continue; -+ } -+ -+ if (av_stristr(e->key, "path")) { -+ path = e->value; -+ continue; -+ } -+ } -+ -+ if (version) { -+ err = vmaf_model_load(&s->model[i], &model_cfg, version); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "could not load libvmaf model with version: %s\n", -+ version); -+ goto exit; -+ } -+ } -+ -+ if (path && !s->model[i]) { -+ err = vmaf_model_load_from_path(&s->model[i], &model_cfg, path); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "could not load libvmaf model with path: %s\n", -+ path); -+ goto exit; -+ } -+ } -+ -+ if (!s->model[i]) { -+ av_log(ctx, AV_LOG_ERROR, -+ "could not load libvmaf model with config: %s\n", -+ s->model_cfg); -+ goto exit; -+ } -+ -+ while (e = av_dict_get(dict[i], "", e, AV_DICT_IGNORE_SUFFIX)) { -+ VmafFeatureDictionary *feature_opts_dict = NULL; -+ char *feature_opt = NULL; -+ -+ char *feature_name = av_strtok(e->key, ".", &feature_opt); -+ if (!feature_opt) -+ continue; -+ -+ err = vmaf_feature_dictionary_set(&feature_opts_dict, -+ feature_opt, e->value); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "could not set feature option: %s.%s=%s\n", -+ feature_name, feature_opt, e->value); -+ err = AVERROR(EINVAL); -+ goto exit; -+ } -+ -+ err = vmaf_model_feature_overload(s->model[i], feature_name, -+ feature_opts_dict); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "could not overload feature: %s\n", feature_name); -+ err = AVERROR(EINVAL); -+ goto exit; -+ } -+ } -+ } -+ -+ for (unsigned i = 0; i < s->model_cnt; i++) { -+ err = vmaf_use_features_from_model(s->vmaf, s->model[i]); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem during vmaf_use_features_from_model\n"); -+ err = AVERROR(EINVAL); -+ goto exit; -+ } -+ } -+ -+exit: -+ for (unsigned i = 0; i < dict_cnt; i++) { -+ if (dict[i]) -+ av_dict_free(&dict[i]); -+ } -+ av_free(dict); -+ return err; -+} -+ -+static enum VmafLogLevel log_level_map(int log_level) -+{ -+ switch (log_level) { -+ case AV_LOG_QUIET: -+ return VMAF_LOG_LEVEL_NONE; -+ case AV_LOG_ERROR: -+ return VMAF_LOG_LEVEL_ERROR; -+ case AV_LOG_WARNING: -+ return VMAF_LOG_LEVEL_WARNING; -+ case AV_LOG_INFO: -+ return VMAF_LOG_LEVEL_INFO; -+ case AV_LOG_DEBUG: -+ return VMAF_LOG_LEVEL_DEBUG; -+ default: -+ return VMAF_LOG_LEVEL_INFO; -+ } -+} -+ -+static int parse_deprecated_options(AVFilterContext *ctx) -+{ -+ LIBVMAFContext *s = ctx->priv; -+ VmafModel *model = NULL; -+ VmafModelCollection *model_collection = NULL; -+ enum VmafModelFlags flags = VMAF_MODEL_FLAGS_DEFAULT; -+ int err = 0; -+ -+ VmafModelConfig model_cfg = { -+ .name = "vmaf", -+ .flags = flags, -+ }; -+ -+ if (s->enable_transform || s->phone_model) -+ flags |= VMAF_MODEL_FLAG_ENABLE_TRANSFORM; -+ -+ if (!s->model_path) -+ goto extra_metrics_only; -+ -+ if (s->enable_conf_interval) { -+ err = vmaf_model_collection_load_from_path(&model, &model_collection, -+ &model_cfg, s->model_path); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem loading model file: %s\n", s->model_path); -+ goto exit; -+ } -+ -+ err = vmaf_use_features_from_model_collection(s->vmaf, model_collection); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem loading feature extractors from model file: %s\n", -+ s->model_path); -+ goto exit; -+ } -+ } else { -+ err = vmaf_model_load_from_path(&model, &model_cfg, s->model_path); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem loading model file: %s\n", s->model_path); -+ goto exit; -+ } -+ err = vmaf_use_features_from_model(s->vmaf, model); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem loading feature extractors from model file: %s\n", -+ s->model_path); -+ goto exit; -+ } -+ } -+ -+extra_metrics_only: -+ if (s->psnr) { -+ VmafFeatureDictionary *d = NULL; -+ vmaf_feature_dictionary_set(&d, "enable_chroma", "false"); -+ -+ err = vmaf_use_feature(s->vmaf, "psnr", d); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem loading feature extractor: psnr\n"); -+ goto exit; -+ } -+ } - -- s->frame_set = 1; -+ if (s->ssim) { -+ err = vmaf_use_feature(s->vmaf, "float_ssim", NULL); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem loading feature extractor: ssim\n"); -+ goto exit; -+ } -+ } - -- pthread_cond_signal(&s->cond); -- pthread_mutex_unlock(&s->lock); -+ if (s->ms_ssim) { -+ err = vmaf_use_feature(s->vmaf, "float_ms_ssim", NULL); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem loading feature extractor: ms_ssim\n"); -+ goto exit; -+ } -+ } - -- return ff_filter_frame(ctx->outputs[0], master); -+exit: -+ return err; - } - - static av_cold int init(AVFilterContext *ctx) - { - LIBVMAFContext *s = ctx->priv; -+ int err = 0; - -- s->gref = av_frame_alloc(); -- s->gmain = av_frame_alloc(); -- if (!s->gref || !s->gmain) -- return AVERROR(ENOMEM); -+ VmafConfiguration cfg = { -+ .log_level = log_level_map(av_log_get_level()), -+ .n_subsample = s->n_subsample, -+ .n_threads = s->n_threads, -+ }; -+ -+ err = vmaf_init(&s->vmaf, cfg); -+ if (err) -+ return AVERROR(EINVAL); -+ -+ err = parse_deprecated_options(ctx); -+ if (err) -+ return err; - -- s->error = 0; -+ err = parse_models(ctx); -+ if (err) -+ return err; - -- s->vmaf_thread_created = 0; -- pthread_mutex_init(&s->lock, NULL); -- pthread_cond_init (&s->cond, NULL); -+ err = parse_features(ctx); -+ if (err) -+ return err; - - s->fs.on_event = do_vmaf; - return 0; -@@ -256,26 +545,31 @@ static const enum AVPixelFormat pix_fmts[] = { - - static int config_input_ref(AVFilterLink *inlink) - { -- AVFilterContext *ctx = inlink->dst; -+ AVFilterContext *ctx = inlink->dst; - LIBVMAFContext *s = ctx->priv; -- int th; -+ const AVPixFmtDescriptor *desc; -+ int err = 0; - -- if (ctx->inputs[0]->w != ctx->inputs[1]->w || -- ctx->inputs[0]->h != ctx->inputs[1]->h) { -- av_log(ctx, AV_LOG_ERROR, "Width and height of input videos must be same.\n"); -- return AVERROR(EINVAL); -+ if (ctx->inputs[0]->w != ctx->inputs[1]->w) { -+ av_log(ctx, AV_LOG_ERROR, "input width must match.\n"); -+ err |= AVERROR(EINVAL); - } - -- s->desc = av_pix_fmt_desc_get(inlink->format); -- s->width = ctx->inputs[0]->w; -- s->height = ctx->inputs[0]->h; -+ if (ctx->inputs[0]->h != ctx->inputs[1]->h) { -+ av_log(ctx, AV_LOG_ERROR, "input height must match.\n"); -+ err |= AVERROR(EINVAL); -+ } - -- th = pthread_create(&s->vmaf_thread, NULL, call_vmaf, (void *) s); -- if (th) { -- av_log(ctx, AV_LOG_ERROR, "Thread creation failed.\n"); -- return AVERROR(EINVAL); -+ if (ctx->inputs[0]->format != ctx->inputs[1]->format) { -+ av_log(ctx, AV_LOG_ERROR, "input pix_fmt must match.\n"); -+ err |= AVERROR(EINVAL); - } -- s->vmaf_thread_created = 1; -+ -+ if (err) -+ return err; -+ -+ desc = av_pix_fmt_desc_get(inlink->format); -+ s->bpc = desc->comp[0].depth; - - return 0; - } -@@ -307,28 +601,80 @@ static int activate(AVFilterContext *ctx) - return ff_framesync_activate(&s->fs); - } - -+static enum VmafOutputFormat log_fmt_map(const char *log_fmt) -+{ -+ if (log_fmt) { -+ if (av_stristr(log_fmt, "xml")) -+ return VMAF_OUTPUT_FORMAT_XML; -+ if (av_stristr(log_fmt, "json")) -+ return VMAF_OUTPUT_FORMAT_JSON; -+ if (av_stristr(log_fmt, "csv")) -+ return VMAF_OUTPUT_FORMAT_CSV; -+ if (av_stristr(log_fmt, "sub")) -+ return VMAF_OUTPUT_FORMAT_SUB; -+ } -+ -+ return VMAF_OUTPUT_FORMAT_XML; -+} -+ -+static enum VmafPoolingMethod pool_method_map(const char *pool_method) -+{ -+ if (pool_method) { -+ if (av_stristr(pool_method, "min")) -+ return VMAF_POOL_METHOD_MIN; -+ if (av_stristr(pool_method, "mean")) -+ return VMAF_POOL_METHOD_MEAN; -+ if (av_stristr(pool_method, "harmonic_mean")) -+ return VMAF_POOL_METHOD_HARMONIC_MEAN; -+ } -+ -+ return VMAF_POOL_METHOD_MEAN; -+} -+ - static av_cold void uninit(AVFilterContext *ctx) - { - LIBVMAFContext *s = ctx->priv; -+ int err = 0; - - ff_framesync_uninit(&s->fs); - -- pthread_mutex_lock(&s->lock); -- s->eof = 1; -- pthread_cond_signal(&s->cond); -- pthread_mutex_unlock(&s->lock); -+ if (!s->frame_cnt) -+ goto clean_up; - -- if (s->vmaf_thread_created) -- { -- pthread_join(s->vmaf_thread, NULL); -- s->vmaf_thread_created = 0; -+ err = vmaf_read_pictures(s->vmaf, NULL, NULL, 0); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem flushing libvmaf context.\n"); - } - -- av_frame_free(&s->gref); -- av_frame_free(&s->gmain); -+ for (unsigned i = 0; i < s->model_cnt; i++) { -+ double vmaf_score; -+ err = vmaf_score_pooled(s->vmaf, s->model[i], pool_method_map(s->pool), -+ &vmaf_score, 0, s->frame_cnt - 1); -+ if (err) { -+ av_log(ctx, AV_LOG_ERROR, -+ "problem getting pooled vmaf score.\n"); -+ } -+ -+ av_log(ctx, AV_LOG_INFO, "VMAF score: %f\n", vmaf_score); -+ } -+ -+ if (s->vmaf) { -+ if (s->log_path && !err) -+ vmaf_write_output(s->vmaf, s->log_path, log_fmt_map(s->log_fmt)); -+ } -+ -+clean_up: -+ if (s->model) { -+ for (unsigned i = 0; i < s->model_cnt; i++) { -+ if (s->model[i]) -+ vmaf_model_destroy(s->model[i]); -+ } -+ av_free(s->model); -+ } - -- pthread_mutex_destroy(&s->lock); -- pthread_cond_destroy(&s->cond); -+ if (s->vmaf) -+ vmaf_close(s->vmaf); - } - - static const AVFilterPad libvmaf_inputs[] = { --- -2.20.1 - diff --git a/040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch b/040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch new file mode 100644 index 000000000000..83fd707e65d0 --- /dev/null +++ b/040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch @@ -0,0 +1,29 @@ +--- a/libavformat/avformat.h ++++ b/libavformat/avformat.h +@@ -1128,6 +1128,10 @@ struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); + */ + int64_t av_stream_get_end_pts(const AVStream *st); + ++// Chromium: We use the internal field first_dts vvv ++int64_t av_stream_get_first_dts(const AVStream *st); ++// Chromium: We use the internal field first_dts ^^^ ++ + #define AV_PROGRAM_RUNNING 1 + + /** +--- a/libavformat/utils.c ++++ b/libavformat/utils.c +@@ -55,6 +55,13 @@ int ff_unlock_avformat(void) + return ff_mutex_unlock(&avformat_mutex) ? -1 : 0; + } + ++// Chromium: We use the internal field first_dts vvv ++int64_t av_stream_get_first_dts(const AVStream *st) ++{ ++ return ffstream(st)->first_dts; ++} ++// Chromium: We use the internal field first_dts ^^^ ++ + /* an arbitrarily chosen "sane" max packet size -- 50M */ + #define SANE_CHUNK_SIZE (50000000) + diff --git a/050-add-av_stream_get_first_dts-for-chromium.patch b/050-add-av_stream_get_first_dts-for-chromium.patch deleted file mode 100644 index fb5589800d3d..000000000000 --- a/050-add-av_stream_get_first_dts-for-chromium.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 95aab0fd83619408995720ce53d7a74790580220 Mon Sep 17 00:00:00 2001 -From: "liberato@chromium.org" <liberato@chromium.org> -Date: Wed, 7 Jul 2021 19:01:22 -0700 -Subject: [PATCH] Add av_stream_get_first_dts for Chromium - -[foutrelis: adjust for new FFStream struct replacing AVStreamInternal] ---- - libavformat/avformat.h | 4 ++++ - libavformat/utils.c | 7 +++++++ - 2 files changed, 11 insertions(+) - -diff --git a/libavformat/avformat.h b/libavformat/avformat.h -index cd7b0d941c..b4a6dce885 100644 ---- a/libavformat/avformat.h -+++ b/libavformat/avformat.h -@@ -1010,6 +1010,10 @@ struct AVCodecParserContext *av_stream_get_parser(const AVStream *s); - */ - int64_t av_stream_get_end_pts(const AVStream *st); - -+// Chromium: We use the internal field first_dts vvv -+int64_t av_stream_get_first_dts(const AVStream *st); -+// Chromium: We use the internal field first_dts ^^^ -+ - #define AV_PROGRAM_RUNNING 1 - - /** -diff --git a/libavformat/utils.c b/libavformat/utils.c -index de7580c32d..0ef0fe530e 100644 ---- a/libavformat/utils.c -+++ b/libavformat/utils.c -@@ -121,6 +121,13 @@ int64_t av_stream_get_end_pts(const AVStream *st) - return AV_NOPTS_VALUE; - } - -+// Chromium: We use the internal field first_dts vvv -+int64_t av_stream_get_first_dts(const AVStream *st) -+{ -+ return cffstream(st)->first_dts; -+} -+// Chromium: We use the internal field first_dts ^^^ -+ - struct AVCodecParserContext *av_stream_get_parser(const AVStream *st) - { - return st->internal->parser; diff --git a/060-ffmpeg-fix-segfault-with-avisynthplus.patch b/060-ffmpeg-fix-segfault-with-avisynthplus.patch new file mode 100644 index 000000000000..2404112a4236 --- /dev/null +++ b/060-ffmpeg-fix-segfault-with-avisynthplus.patch @@ -0,0 +1,11 @@ +--- a/libavformat/avisynth.c ++++ b/libavformat/avisynth.c +@@ -127,7 +127,7 @@ static av_cold void avisynth_atexit_handler(void); + + static av_cold int avisynth_load_library(void) + { +- avs_library.library = dlopen(AVISYNTH_LIB, RTLD_NOW | RTLD_LOCAL); ++ avs_library.library = dlopen(AVISYNTH_LIB, RTLD_NOW | RTLD_DEEPBIND); + if (!avs_library.library) + return AVERROR_UNKNOWN; + @@ -4,7 +4,7 @@ # Contributor: Bruno Filipe < gmail-com: bmilreu > pkgname=ffmpeg-amd-full -pkgver=5.0.1 +pkgver=5.1 pkgrel=1 pkgdesc='Complete solution to record, convert and stream audio and video (all possible features for AMD)' arch=('x86_64') @@ -13,63 +13,62 @@ license=('custom: nonfree and unredistributable') depends=( # official repositories: 'alsa-lib' 'avisynthplus' 'bzip2' 'frei0r-plugins' 'libgcrypt' 'gmp' 'gnutls' - 'ladspa' 'libass' 'aom' 'aribb24' 'libbluray' 'libbs2b' 'libcaca' 'celt' - 'libcdio-paranoia' 'chromaprint' 'codec2' 'dav1d' 'libdc1394' 'libavc1394' - 'libfdk-aac' 'fontconfig' 'freetype2' 'fribidi' 'glslang' 'spirv-tools' 'libgme' - 'gsm' 'libiec61883' 'libilbc' 'jack' 'kvazaar' 'libmodplug' 'lame' - 'opencore-amr' 'openjpeg2' 'libopenmpt' 'opus' 'libpulse' 'librabbitmq-c' 'rav1e' 'librsvg' - 'rubberband' 'rtmpdump' 'smbclient' 'snappy' 'libsoxr' 'speex' 'srt' 'libssh' - 'svt-hevc' 'svt-av1' 'svt-vp9' 'tesseract' 'libtheora' 'twolame' - 'v4l-utils' 'vid.stab' 'vmaf' 'libvorbis' 'libvpx' 'libwebp' 'x264' - 'x265' 'libxcb' 'xvidcore' 'libxml2' 'zimg' 'zeromq' 'zvbi' 'lv2' 'lilv' 'xz' + 'ladspa' 'lcms2' 'aom' 'aribb24' 'libass' 'libbluray' 'libbs2b' 'libcaca' + 'celt' 'libcdio-paranoia' 'codec2' 'dav1d' 'libdc1394' 'libavc1394' 'libfdk-aac' + 'fontconfig' 'freetype2' 'fribidi' 'glslang' 'spirv-tools' 'libgme' 'gsm' + 'libiec61883' 'libilbc' 'jack' 'libjxl-git' 'kvazaar' 'libmodplug' 'lame' + 'opencore-amr' 'openjpeg2' 'opus' 'libplacebo' 'libpulse' 'librabbitmq-c' + 'rav1e' 'librsvg' 'rubberband' 'rtmpdump' 'smbclient' 'snappy' 'libsoxr' 'speex' + 'srt' 'libssh' 'svt-av1' 'svt-hevc' 'svt-vp9' 'tesseract' 'libtheora' 'twolame' + 'v4l-utils' 'vid.stab' 'vmaf' 'libvorbis' 'libvpx' 'libwebp' 'x264' 'x265' + 'libxcb' 'xvidcore' 'libxml2' 'zimg' 'zeromq' 'zvbi' 'lv2' 'lilv' 'xz' 'libmysofa' 'openal' 'ocl-icd' 'libgl' 'sndio' 'sdl2' 'vapoursynth' - 'vulkan-icd-loader' 'libxv' 'libx11' 'libxext' 'zlib' + 'vulkan-icd-loader' 'libxv' 'libx11' 'libxext' 'zlib' 'libomxil-bellagio' 'libdrm' 'libva' 'libvdpau' # AUR: - 'davs2' 'flite1' 'libklvanc-git' 'openh264' - 'librist' 'shine' 'uavs3d-git' 'vo-amrwbenc' 'xavs' 'xavs2' - 'pocketsphinx' 'lensfun-git' + 'chromaprint-fftw' 'davs2' 'flite1' 'libklvanc-git' 'openh264' + 'libopenmpt' 'librist' 'shine' 'uavs3d-git' 'vo-amrwbenc' 'xavs' + 'xavs2' 'pocketsphinx' 'lensfun-git' ) makedepends=( # official repositories: - 'nasm' 'opencl-headers' 'vulkan-headers' 'clang' 'amf-headers' + 'nasm' 'opencl-headers' 'vulkan-headers' 'clang' + 'amf-headers' # AUR: 'decklink-sdk' ) provides=('libavcodec.so' 'libavdevice.so' 'libavfilter.so' 'libavformat.so' - 'libavutil.so' 'libpostproc.so' 'libswscale.so' - 'libswresample.so' 'ffmpeg' 'ffmpeg-full') + 'libavutil.so' 'libpostproc.so' 'libswscale.so' 'libswresample.so' + 'ffmpeg' 'ffmpeg-full') conflicts=('ffmpeg') -_svt_hevc_ver='6e677e0017cb27bfdd62effcfd2a0dc83b48bb16' -_svt_vp9_ver='41819e71950883655dcfa2a8b60cf0a75d50db74' +_svt_hevc_ver='b62f72e752243cee4104cfb41dc7ee409d3ac3e9' +_svt_vp9_ver='d9ef3cc13159143b9afc776c04f67cdfa6284046' source=("https://ffmpeg.org/releases/ffmpeg-${pkgver}.tar.xz"{,.asc} - '010-ffmpeg-vmaf2.x.patch' - #"020-ffmpeg-add-svt-hevc-g${_svt_hevc_ver:0:7}.patch"::"https://raw.githubusercontent.com/OpenVisualCloud/SVT-HEVC/${_svt_hevc_ver}/ffmpeg_plugin/master-0001-lavc-svt_hevc-add-libsvt-hevc-encoder-wrapper.patch" - #"030-ffmpeg-add-svt-hevc-docs-g${_svt_hevc_ver:0:7}.patch"::"https://raw.githubusercontent.com/OpenVisualCloud/SVT-HEVC/${_svt_hevc_ver}/ffmpeg_plugin/0002-doc-Add-libsvt_hevc-encoder-docs.patch" - #"040-ffmpeg-add-svt-vp9-g${_svt_vp9_ver:0:7}.patch"::"https://raw.githubusercontent.com/OpenVisualCloud/SVT-VP9/${_svt_vp9_ver}/ffmpeg_plugin/master-0001-Add-ability-for-ffmpeg-to-run-svt-vp9.patch" - "050-add-av_stream_get_first_dts-for-chromium.patch" + "010-ffmpeg-add-svt-hevc-g${_svt_hevc_ver:0:7}.patch"::"https://raw.githubusercontent.com/OpenVisualCloud/SVT-HEVC/${_svt_hevc_ver}/ffmpeg_plugin/master-0001-lavc-svt_hevc-add-libsvt-hevc-encoder-wrapper.patch" + #"020-ffmpeg-add-svt-hevc-docs-g${_svt_hevc_ver:0:7}.patch"::"https://raw.githubusercontent.com/OpenVisualCloud/SVT-HEVC/${_svt_hevc_ver}/ffmpeg_plugin/0002-doc-Add-libsvt_hevc-encoder-docs.patch" + "030-ffmpeg-add-svt-vp9-g${_svt_vp9_ver:0:7}.patch"::"https://raw.githubusercontent.com/OpenVisualCloud/SVT-VP9/${_svt_vp9_ver}/ffmpeg_plugin/master-0001-Add-ability-for-ffmpeg-to-run-svt-vp9.patch" + '040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch' + '060-ffmpeg-fix-segfault-with-avisynthplus.patch' 'LICENSE') -sha256sums=('ef2efae259ce80a240de48ec85ecb062cecca26e4352ffb3fda562c21a93007b' +sha256sums=('55eb6aab5ee235550fa54a33eaf8bf1b4ec66c01453182b12f6a993d75698b03' 'SKIP' - '42bd572442a4eba4e9559953c72f9e980b78286ab288ac01e659be39d8bc7298' - #'778030cdd6a097c013e562d3be091280ff92fbd625e5336cd075fbee93589ed0' - #'837cac5a64234f34d136d18c8f7dc14203cdea11406fdb310cef2f62504d9e0c' - #'1cdedb9e8c2912986d6acf20dd9d8ef0f1e21995d9b1898120dc55b714b4de0d' - '91973c465f01446a999f278f0c2a3763304994dba1ac35de0e4c72f12f39409e' + '4da3826aa370572273ef9fb4c0bf2c93a840595b07a671a0412ad0dc9ed8d689' + 'e310eedb3dc88c8ad6ffcd6cb6bde1f593ded330ea99b0356724c9d22bcfde4c' + '2df82046908015bf26bc1303275cf52ba01fa380029a54ea6415373e389e423c' + 'b1d68f626168f2409a4b0987acf5b208e7ced2ddab49b11990a10f458d377e9a' '04a7176400907fd7db0d69116b99de49e582a6e176b3bfb36a03e50a4cb26a36') validpgpkeys=('FCF986EA15E6E293A5644F10B4322F04D67658D8') prepare() { rm -f "ffmpeg-${pkgver}/libavcodec/"libsvt_{hevc,vp9}.c - #sed -i 's/general.texi/general_contents.texi/g' "030-ffmpeg-add-svt-hevc-docs-g${_svt_hevc_ver:0:7}.patch" - patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/010-ffmpeg-vmaf2.x.patch" - #patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/020-ffmpeg-add-svt-hevc-g${_svt_hevc_ver:0:7}.patch" - #patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/030-ffmpeg-add-svt-hevc-docs-g${_svt_hevc_ver:0:7}.patch" - #patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/040-ffmpeg-add-svt-vp9-g${_svt_vp9_ver:0:7}.patch" - # https://crbug.com/1251779 - patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/050-add-av_stream_get_first_dts-for-chromium.patch" + patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/010-ffmpeg-add-svt-hevc-g${_svt_hevc_ver:0:7}.patch" + #patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/020-ffmpeg-add-svt-hevc-docs-g${_svt_hevc_ver:0:7}.patch" + patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/030-ffmpeg-add-svt-vp9-g${_svt_vp9_ver:0:7}.patch" + patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/040-ffmpeg-add-av_stream_get_first_dts-for-chromium.patch" + patch -d "ffmpeg-${pkgver}" -Np1 -i "${srcdir}/060-ffmpeg-fix-segfault-with-avisynthplus.patch" } + build() { cd "ffmpeg-${pkgver}" @@ -98,6 +97,7 @@ build() { --enable-gnutls \ --enable-iconv \ --enable-ladspa \ + --enable-lcms2 \ --enable-libaom \ --enable-libaribb24 \ --enable-libass \ @@ -121,6 +121,7 @@ build() { --enable-libiec61883 \ --enable-libilbc \ --enable-libjack \ + --enable-libjxl \ --enable-libklvanc \ --enable-libkvazaar \ --enable-liblensfun \ @@ -134,6 +135,7 @@ build() { --enable-libopenmpt \ --disable-libopenvino \ --enable-libopus \ + --enable-libplacebo \ --enable-libpulse \ --enable-librabbitmq \ --enable-librav1e \ @@ -149,6 +151,8 @@ build() { --enable-libsrt \ --enable-libssh \ --enable-libsvtav1 \ + --enable-libsvthevc \ + --enable-libsvtvp9 \ --disable-libtensorflow \ --enable-libtesseract \ --enable-libtheora \ |