From 0aac9b76bc7770a90d1317f9979644aefb341ffa Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sat, 12 Apr 2014 04:23:20 +0200 Subject: [PATCH] avcodec/libx264: Implement reference frame count limiting based on level This makes libavcodec/libx264.c behave more similar to the x264 command line util Fixes Ticket3307 Implementation based on x264 Signed-off-by: Michael Niedermayer --- Changelog | 1 + libavcodec/libx264.c | 23 +++++++++++++++++++++++ libavcodec/version.h | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 8d61c9d38f..3559d1889a 100644 --- a/Changelog +++ b/Changelog @@ -22,6 +22,7 @@ version : - On2 AVC (Audio for Video) decoder - support for decoding through DXVA2 in ffmpeg - libbs2b-based stereo-to-binaural audio filter +- libx264 reference frames count limiting depending on level version 2.2: diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index d9130b21ad..474c247f45 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/eval.h" #include "libavutil/internal.h" #include "libavutil/opt.h" #include "libavutil/mem.h" @@ -426,6 +427,28 @@ static av_cold int X264_init(AVCodecContext *avctx) x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */ if (avctx->refs >= 0) x4->params.i_frame_reference = avctx->refs; + else if (x4->level) { + int i; + int mbn = FF_CEIL_RSHIFT(avctx->width, 4) * FF_CEIL_RSHIFT(avctx->height, 4); + int level_id = -1; + char *tail; + int scale = X264_BUILD < 129 ? 384 : 1; + + if (!strcmp(x4->level, "1b")) { + level_id = 9; + } else if (strlen(x4->level) <= 3){ + level_id = av_strtod(x4->level, &tail) * 10 + 0.5; + if (*tail) + level_id = -1; + } + if (level_id <= 0) + av_log(avctx, AV_LOG_WARNING, "Failed to parse level\n"); + + for (i = 0; iparams.i_frame_reference = av_clip(x264_levels[i].dpb / mbn / scale, 1, x4->params.i_frame_reference); + } + if (avctx->trellis >= 0) x4->params.analyse.i_trellis = avctx->trellis; if (avctx->me_range >= 0) diff --git a/libavcodec/version.h b/libavcodec/version.h index 150e932b41..dc9739e57e 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -30,7 +30,7 @@ #define LIBAVCODEC_VERSION_MAJOR 55 #define LIBAVCODEC_VERSION_MINOR 61 -#define LIBAVCODEC_VERSION_MICRO 100 +#define LIBAVCODEC_VERSION_MICRO 101 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \