From patchwork Mon Feb 10 18:30:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wonkap Jang X-Patchwork-Id: 17749 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 046BB44A0EC for ; Mon, 10 Feb 2020 20:30:20 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C7CDD68AFF5; Mon, 10 Feb 2020 20:30:19 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CFBBF68A862 for ; Mon, 10 Feb 2020 20:30:13 +0200 (EET) Received: by mail-pg1-f202.google.com with SMTP id t17so2518576pgb.20 for ; Mon, 10 Feb 2020 10:30:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to; bh=RporMgPx680u4wGMKECpdOzQLPrVlV6S1eQyvCdAZYc=; b=X4vksSrb6u4WByBY/610dbbIy6bT/xzyKbzLewi4w1QJyn6QNSvAJ/9CFDkyimeJDH YEg0BjHbESd1YXXcQQy9Iy652ZPZNIeW1hJUWUPigRAHPZjBXPNy2I803ODJN5rUOBKw 4AaS/h+7K4ktFKfy2CR0jKb9gSSqj3ZFwyLWNrkwZ+kjG08z8KvJU9ETIkAwa5cK0KtA Jbv7PP6MtvJWbFohkGrMPHpOUMrLebJOqAaPnxM+GgklyB6CinPadH6wQ8Qh3xjhLyAk dMpgW6ZeJuQQ2kJ8AjTgPthZK0iuxXoC1lNRi6wsQyHt8PPQYWWcTmvYIRgniJ3e9Ymj 05fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to; bh=RporMgPx680u4wGMKECpdOzQLPrVlV6S1eQyvCdAZYc=; b=jDXcfYzYMbjhfb++3qFbiQJFpkZRK+ry6At31KuCvSjpPUJ8ng6L38Pds8BL+JdIp0 udwtqxRRTQwNILrVEza1BlF0rOoAfDivdgULJNrQVYFiiTDkg98BcI2ivk2YeGAsCFjX akaXC7qOF52dV8Z6pEYI8ymIfwLFxFQjEtsgfkka/Ur4K++wGM3V40BmSLRgqdHEIBJn 64+E+ZaSjvxab/XQUXwK+DBleJBTCoRU1AIB4xq0wo3QJaQjdzVdMojqrhHFZyN/94dF 1CsNGbDaUqlCFa1LAGkWhX7LMDFAVPeOvjGVN5xRZTldvwecEVegQt0qyrsWJuGsUEym +n9g== X-Gm-Message-State: APjAAAXSKbZEaq/eCPOC07x5+PhShyDMj8tzRVZ7GTwsAxNdJ9BXsC4E EV7gbJaa28kv3v/crjjbk6nwM8GvV9cc+Boye5evcHdryWmQ0O9TKdKvTcip4be9X5yEgFmoENR XsghS4F4dqHIkhCeLx6l/xgQfZ4MKVaZxOa2B1Thk7ang+j1gY+9gQRXW4PBoC6k= X-Google-Smtp-Source: APXvYqzex3Qowhj9JT/gMklboBm+X+VzJOoMtKufXln5sCiWaiV/voHHN94KS2d8qK70z6OFaarB42xrKUw= X-Received: by 2002:a65:6147:: with SMTP id o7mr3157696pgv.442.1581359411989; Mon, 10 Feb 2020 10:30:11 -0800 (PST) Date: Mon, 10 Feb 2020 10:30:09 -0800 In-Reply-To: Message-Id: <20200210183009.22206-1-wonkap@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.25.0.341.g760bfbb309-goog From: Wonkap Jang To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH v7] avcodec/libvpxenc: add a way to explicitly set temporal layer id 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" In order for rate control to correctly allocate bitrate to each temporal layer, correct temporal layer id has to be set to each frame. This commit provides the ability to set correct temporal layer id for each frame. --- doc/encoders.texi | 9 ++++++++- libavcodec/libvpxenc.c | 13 ++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/doc/encoders.texi b/doc/encoders.texi index 7bae39435e..56fe208fef 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -1918,7 +1918,14 @@ Currently supports the following options. @table @option @item 0 No temporal layering flags are provided internally, -relies on flags being passed in using metadata in AVFrame. +relies on flags being passed in using @code{metadata} field in @code{AVFrame} with following keys. +@table @option +@item vp8-flags +Sets the flags passed into the encoder to indicate the referencing scheme for the current frame. +Refer to function @code{vpx_codec_encode} in @code{vpx/vpx_encoder.h} for more details. +@item temporal_id +Explicitly sets the temporal id of the current frame to encode. +@end table @item 2 Two temporal layers. 0-1... @item 3 diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index d522c43928..60a858853d 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -1519,11 +1519,22 @@ static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt, #endif if (frame->pict_type == AV_PICTURE_TYPE_I) flags |= VPX_EFLAG_FORCE_KF; - if (CONFIG_LIBVPX_VP8_ENCODER && avctx->codec_id == AV_CODEC_ID_VP8 && frame->metadata) { + if (frame->metadata) { AVDictionaryEntry* en = av_dict_get(frame->metadata, "vp8-flags", NULL, 0); if (en) { flags |= strtoul(en->value, NULL, 10); } + + memset(&layer_id, 0, sizeof(layer_id)); + + en = av_dict_get(frame->metadata, "temporal_id", NULL, 0); + if (en) { + layer_id.temporal_layer_id = strtoul(en->value, NULL, 10); +#ifdef VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT + layer_id.temporal_layer_id_per_spatial[0] = layer_id.temporal_layer_id; +#endif + layer_id_valid = 1; + } } if (sd) {