From patchwork Sun Apr 19 00:13:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josh Brewster X-Patchwork-Id: 19077 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 13265449CBE for ; Sun, 19 Apr 2020 03:13:50 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E58B368B797; Sun, 19 Apr 2020 03:13:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail4.protonmail.ch (mail4.protonmail.ch [185.70.40.27]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E785068B62E for ; Sun, 19 Apr 2020 03:13:43 +0300 (EEST) Date: Sun, 19 Apr 2020 00:13:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail; t=1587255223; bh=nXWLyyOiHW1xK8Jt3Utp1AqznDm688Sg4FQobQm1dxo=; h=Date:To:From:Cc:Reply-To:Subject:From; b=sp3Fe07OldmtU0LVqSHUSGe/I8INzYdO9pN4rynom6TPE59MUIJebN7sNN5f5ju3K FjnltcQMX7oqhorESSqhPEtU9YNCnXsSAf231IcCbejEUckY5IwgLEytj2w+Tqdl/q 5J8QPOa4TKWaolslLZVLhIXlOSuU4enuVwBFtgN8= To: FFmpeg development discussions and patches From: Josh Brewster Message-ID: MIME-Version: 1.0 X-Spam-Status: No, score=-1.2 required=7.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM shortcircuit=no autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on mail.protonmail.ch Subject: [FFmpeg-devel] [PATCH v3] libavcodec/libx264: fix reference frame computation based on level X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: "linjie.fu@intel.com" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" > >I only made sure that the level was positive because its initial > > value was -1. > > > > > else if (x4->params.i_level_idc >= 0) { > > > Let me know if I need to reject 0 too. It seemed like premature optimization > > > as the level simply wouldn't be present in x264_levels. > > I'd say yes, level_idc = 0 is possible but invalid by PARSE_X264_OPT(), which seems > make no sense to calculate refs from x264_levels[] table. > > - Linjie Changed to > 0, thanks. From af09a7c3d33db90092be3dea57ba449884003246 Mon Sep 17 00:00:00 2001 From: Josh Brewster Date: Thu, 16 Apr 2020 22:50:29 +0200 Subject: [PATCH] libavcodec/libx264: fix reference frame computation based on level The current implementation allows passing levels to libavcodec as integers (such as "31" instead of "3.1"). However, in this case, the maximum reference frame value per level was ignored because libavcodec converted the string to 310 instead of 31. Since libx264 has correctly parsed the level to int (x4->params.i_level_idc), we should rely on this value instead of attempting to parse the level string on our own. Signed-off-by: Josh Brewster --- libavcodec/libx264.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index a08fe0ce76..c6cce9ff80 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -692,25 +692,13 @@ FF_ENABLE_DEPRECATION_WARNINGS 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) { + else if (x4->params.i_level_idc > 0) { int i; int mbn = AV_CEIL_RSHIFT(avctx->width, 4) * AV_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_level_idc) x4->params.i_frame_reference = av_clip(x264_levels[i].dpb / mbn / scale, 1, x4->params.i_frame_reference); } -- 2.26.0