From patchwork Wed Nov 25 20:54:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 24035 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 C18B944B7D0 for ; Wed, 25 Nov 2020 23:01:32 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9804968BAE4; Wed, 25 Nov 2020 23:01:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f194.google.com (mail-qk1-f194.google.com [209.85.222.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BD0C268BA00 for ; Wed, 25 Nov 2020 23:01:25 +0200 (EET) Received: by mail-qk1-f194.google.com with SMTP id i199so6075421qke.5 for ; Wed, 25 Nov 2020 13:01:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=vr1XIqNgmIlNo/XYpcK02mT7kGocbts79AtBoMYCsX8=; b=rtl9L4sE3iHuu+boDtZb7DxB1bIpihFNIiNjdQ7Kyy+wAxGgRXfOpMUHAygPt+A1BY NHEINRvV6l5KIlN6s50CuIXRkrmUTw2MzyXOs5fmd7uDbyHc944R0d7+iSOGqGgt/vjN GZii1x75xOO4ZORKf/1BqriptdhG4QdeaBAThNRIdC7uBlDGGh1cDP7zHDn0ZFHfutUs TddGzIgseDmKtGiJSDYDxF0z00Opuj+McWbscWQItPXQjgA1NJDMi4UPeVZWZSvL/FEz lrkEA0KNjZGozoBaQ9bcXrCkP7sN1flMyBrJEuM3Iy1qBz/2m+lj6W30NH3aCXgdWHmu ewJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vr1XIqNgmIlNo/XYpcK02mT7kGocbts79AtBoMYCsX8=; b=sQArnNj4oO41f2TLDDeoW3eOzRpSmPlv7RwoPUQ18T3jqbqPEjmwSmm3byMgj2Dkc+ tfL+3g7TgBLpmTKjXASg7mB/R3lqV2erjiZJ2xodWgFRKe4gTvH3yWFhCJEzoD9RnSUg a8fI1sVUgTov0Zg7EhHTBvq1IkG0N0TstOIPjigNmbW4EteNuegbrFDpNuFKRLXenVlf wlOgH+sJXRmnPqG39nT6rtDmDYUAxUTrLngQa7lnpJcAFvehFh1xT9p/3X/F48adu3yA HFQsHcD7OGJQl1wOoJJ3Ickj7ejhRzuvdGQ9MH7zB762D41XDCSsty91otnebTxs48be TsTQ== X-Gm-Message-State: AOAM531h/fgt9mkE4a+hCjrXlAkmqqEIrcui6P9GRkIzTYTSRsLUP2is Qkz6nCOqR2Q3kFg6tYh5kdd6c6b//68= X-Google-Smtp-Source: ABdhPJwWFQo7DMioSGtmZd9uC1i7Bzbsypdq2OmQiFGVPIA85og/LLeHdiMTs//qSQ1Ym0epS8VzEg== X-Received: by 2002:a05:622a:9:: with SMTP id x9mr780099qtw.324.1606337764959; Wed, 25 Nov 2020 12:56:04 -0800 (PST) Received: from localhost.localdomain ([181.23.86.176]) by smtp.gmail.com with ESMTPSA id v15sm436274qti.92.2020.11.25.12.56.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Nov 2020 12:56:04 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 25 Nov 2020 17:54:43 -0300 Message-Id: <20201125205445.10859-3-jamrial@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201125205445.10859-1-jamrial@gmail.com> References: <20201125205445.10859-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/5] avcodec/av1dec: infer and store film grain param values in AV1Frame 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" They are not always coded in the bistream for each frame. In some cases, the values need to be taken from a reference frame. See section 6.8.20 from the AV1 spec. Signed-off-by: James Almer --- libavcodec/av1dec.c | 25 +++++++++++++++++++++++++ libavcodec/av1dec.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index ce051d4e6d..1589b8f0c0 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -247,6 +247,26 @@ static void coded_lossless_param(AV1DecContext *s) } } +static void load_grain_params(AV1DecContext *s) +{ + const AV1RawFrameHeader *header = s->raw_frame_header; + const AV1RawFilmGrainParams *film_grain = &header->film_grain, *src; + AV1RawFilmGrainParams *dst = &s->cur_frame.film_grain; + + if (!film_grain->apply_grain) + return; + + if (film_grain->update_grain) { + memcpy(dst, film_grain, sizeof(*dst)); + return; + } + + src = &s->ref[film_grain->film_grain_params_ref_idx].film_grain; + + memcpy(dst, src, sizeof(*dst)); + dst->grain_seed = film_grain->grain_seed; +} + static int init_tile_data(AV1DecContext *s) { @@ -447,6 +467,7 @@ static void av1_frame_unref(AVCodecContext *avctx, AV1Frame *f) f->spatial_id = f->temporal_id = 0; memset(f->skip_mode_frame_idx, 0, 2 * sizeof(uint8_t)); + memset(&f->film_grain, 0, sizeof(f->film_grain)); f->coded_lossless = 0; } @@ -482,6 +503,9 @@ static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s memcpy(dst->skip_mode_frame_idx, src->skip_mode_frame_idx, 2 * sizeof(uint8_t)); + memcpy(&dst->film_grain, + &src->film_grain, + sizeof(dst->film_grain)); dst->coded_lossless = src->coded_lossless; return 0; @@ -762,6 +786,7 @@ static int get_current_frame(AVCodecContext *avctx) global_motion_params(s); skip_mode_params(s); coded_lossless_param(s); + load_grain_params(s); return ret; } diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h index 4b218f64bb..7e3b0c7291 100644 --- a/libavcodec/av1dec.h +++ b/libavcodec/av1dec.h @@ -47,6 +47,8 @@ typedef struct AV1Frame { uint8_t skip_mode_frame_idx[2]; + AV1RawFilmGrainParams film_grain; + uint8_t coded_lossless; } AV1Frame;