From patchwork Tue Oct 30 19:21:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 10855 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 B602344C0F7 for ; Tue, 30 Oct 2018 21:23:18 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 20F8F68A534; Tue, 30 Oct 2018 21:22:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f193.google.com (mail-qt1-f193.google.com [209.85.160.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B086668A533 for ; Tue, 30 Oct 2018 21:22:43 +0200 (EET) Received: by mail-qt1-f193.google.com with SMTP id d14-v6so14932224qto.4 for ; Tue, 30 Oct 2018 12:23:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=71H9p1cliOflGG5sIi0kmxB7rvhKc+K6jj8816O7Z0g=; b=jUYVfL6u79eof/QitngIGGlW2E8oc+Ha97ag2s4c+q2SD07U1p35PholUirGAXeeZy UEzblhS217E2SoJhjnu6kPFsog9jLwU5Wdt61jam7S8/fnbdSP7h8DxPraVRDBxoJkxb a8h2201SjSxVo3+UJCIgDVCAVuTdHumc2BP/5fXgEInDxH3HcWZt7fLr4wFS66FMLdiX 3C3rw37lIJvbh8EPigrjXXiZ0UVm5m8NzPLYX3Z+2hjHDpX7C1wAoaVEdPUyBHOH2QOu ZPvzWN90fueK4J9u7HXCoiuVjipYdWYcZYSI90BCJ2lDC9kxZtDG8z16qgh2IOiQpSvg b4NQ== 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:mime-version :content-transfer-encoding; bh=71H9p1cliOflGG5sIi0kmxB7rvhKc+K6jj8816O7Z0g=; b=nfU2YQ8D2EO1GECCuIiCUu74z7URo+cvhc+IDLiWNVvccxhjrF9Vz1CL5e8rbWsSGX KH64X8k+WrKaA1MK5BLz5sO3oqnxMlu3s8CIQbn+rfjMjtvNR2YnGIRY9fv2PaN4KDs9 CGkkpueIV1Vv4LIAzTY151EHUSrC39uXMG861RG4tI4wRca9Li13SERHKPTh4Pf3l0K1 zk8IvVxEb4+JdjKx07JZM5jJPXBSe642Z/Cc8De0Bij15A2rX9T4IXK/JsY/P8oqgsoC 6uwVNaRCaTClo4ax/nd3q+PKeOpXmT+Khn95HT0JH1ecmuxX+1bWe96MSkNKIxGJAY5/ bMdg== X-Gm-Message-State: AGRZ1gIF1UEmVTWQAilcMHabIhpafUckKAas/mnl/cXd3Gb1zRMRWswx LHkD+1mJkX0mRtLGqbgZIl7Qthn0 X-Google-Smtp-Source: AJdET5dm9xgZ2oi3TrkX2BDLJ5qXveY/kyVa1o1PTEtMDf86HXt3zsEACH4mOKML2DPQVaEzGJuNvg== X-Received: by 2002:ac8:3a24:: with SMTP id w33-v6mr27299qte.142.1540927393790; Tue, 30 Oct 2018 12:23:13 -0700 (PDT) Received: from localhost.localdomain ([179.38.180.156]) by smtp.gmail.com with ESMTPSA id q36-v6sm14095822qte.94.2018.10.30.12.23.11 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Oct 2018 12:23:12 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 30 Oct 2018 16:21:49 -0300 Message-Id: <20181030192151.6560-1-jamrial@gmail.com> X-Mailer: git-send-email 2.19.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] avcodec/cbs_vp9: keep track of reference frames 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" Signed-off-by: James Almer --- libavcodec/cbs_vp9.h | 16 ++++++++ libavcodec/cbs_vp9_syntax_template.c | 60 ++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/libavcodec/cbs_vp9.h b/libavcodec/cbs_vp9.h index 5b99c90c2e..12689e51cc 100644 --- a/libavcodec/cbs_vp9.h +++ b/libavcodec/cbs_vp9.h @@ -183,6 +183,13 @@ typedef struct VP9RawSuperframe { VP9RawSuperframeIndex index; } VP9RawSuperframe; +typedef struct VP9ReferenceFrameState { + int frame_width; // RefFrameWidth + int frame_height; // RefFrameHeight + int subsampling_x; // RefSubsamplingX + int subsampling_y; // RefSubsamplingY + int bit_depth; // RefBitDepth +} VP9ReferenceFrameState; typedef struct CodedBitstreamVP9Context { // Frame dimensions in 8x8 mode info blocks. @@ -192,6 +199,15 @@ typedef struct CodedBitstreamVP9Context { uint16_t sb64_cols; uint16_t sb64_rows; + int frame_width; + int frame_height; + + uint8_t subsampling_x; + uint8_t subsampling_y; + int bit_depth; + + VP9ReferenceFrameState ref[VP9_NUM_REF_FRAMES]; + // Write buffer. uint8_t *write_buffer; size_t write_buffer_size; diff --git a/libavcodec/cbs_vp9_syntax_template.c b/libavcodec/cbs_vp9_syntax_template.c index b4a7f65e85..7b90775ed6 100644 --- a/libavcodec/cbs_vp9_syntax_template.c +++ b/libavcodec/cbs_vp9_syntax_template.c @@ -43,10 +43,14 @@ static int FUNC(frame_sync_code)(CodedBitstreamContext *ctx, RWContext *rw, static int FUNC(color_config)(CodedBitstreamContext *ctx, RWContext *rw, VP9RawFrameHeader *current, int profile) { + CodedBitstreamVP9Context *vp9 = ctx->priv_data; int err; - if (profile >= 2) + if (profile >= 2) { f(1, ten_or_twelve_bit); + vp9->bit_depth = current->ten_or_twelve_bit ? 12 : 10; + } else + vp9->bit_depth = 8; f(3, color_space); @@ -69,6 +73,9 @@ static int FUNC(color_config)(CodedBitstreamContext *ctx, RWContext *rw, } } + vp9->subsampling_x = current->subsampling_x; + vp9->subsampling_y = current->subsampling_y; + return 0; } @@ -81,8 +88,11 @@ static int FUNC(frame_size)(CodedBitstreamContext *ctx, RWContext *rw, f(16, frame_width_minus_1); f(16, frame_height_minus_1); - vp9->mi_cols = (current->frame_width_minus_1 + 8) >> 3; - vp9->mi_rows = (current->frame_height_minus_1 + 8) >> 3; + vp9->frame_width = current->frame_width_minus_1 + 1; + vp9->frame_height = current->frame_height_minus_1 + 1; + + vp9->mi_cols = (vp9->frame_width + 7) >> 3; + vp9->mi_rows = (vp9->frame_height + 7) >> 3; vp9->sb64_cols = (vp9->mi_cols + 7) >> 3; vp9->sb64_rows = (vp9->mi_rows + 7) >> 3; @@ -107,15 +117,33 @@ static int FUNC(render_size)(CodedBitstreamContext *ctx, RWContext *rw, static int FUNC(frame_size_with_refs)(CodedBitstreamContext *ctx, RWContext *rw, VP9RawFrameHeader *current) { + CodedBitstreamVP9Context *vp9 = ctx->priv_data; int err, i; for (i = 0; i < VP9_REFS_PER_FRAME; i++) { fs(1, found_ref[i], 1, i); - if (current->found_ref[i]) + if (current->found_ref[i]) { + VP9ReferenceFrameState *ref = + &vp9->ref[current->ref_frame_idx[i]]; + + vp9->frame_width = ref->frame_width; + vp9->frame_height = ref->frame_height; + + vp9->subsampling_x = ref->subsampling_x; + vp9->subsampling_y = ref->subsampling_y; + vp9->bit_depth = ref->bit_depth; + break; + } } if (i >= VP9_REFS_PER_FRAME) CHECK(FUNC(frame_size)(ctx, rw, current)); + else { + vp9->mi_cols = (vp9->frame_width + 7) >> 3; + vp9->mi_rows = (vp9->frame_height + 7) >> 3; + vp9->sb64_cols = (vp9->mi_cols + 7) >> 3; + vp9->sb64_rows = (vp9->mi_rows + 7) >> 3; + } CHECK(FUNC(render_size)(ctx, rw, current)); return 0; @@ -249,6 +277,7 @@ static int FUNC(tile_info)(CodedBitstreamContext *ctx, RWContext *rw, static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw, VP9RawFrameHeader *current) { + CodedBitstreamVP9Context *vp9 = ctx->priv_data; int profile, i; int err; @@ -301,6 +330,10 @@ static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw, infer(color_space, 1); infer(subsampling_x, 1); infer(subsampling_y, 1); + vp9->bit_depth = 8; + + vp9->subsampling_x = current->subsampling_x; + vp9->subsampling_y = current->subsampling_y; } f(8, refresh_frame_flags); @@ -339,6 +372,25 @@ static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw, f(16, header_size_in_bytes); + for (i = 0; i < VP9_NUM_REF_FRAMES; i++) { + if (current->refresh_frame_flags & (1 << i)) { + vp9->ref[i] = (VP9ReferenceFrameState) { + .frame_width = vp9->frame_width, + .frame_height = vp9->frame_height, + .subsampling_x = vp9->subsampling_x, + .subsampling_y = vp9->subsampling_y, + .bit_depth = vp9->bit_depth, + }; + } + } + + av_log(ctx->log_ctx, AV_LOG_DEBUG, "Frame: size %dx%d " + "subsample %dx%d bit_depth %d tiles %dx%d.\n", + vp9->frame_width, vp9->frame_height, + vp9->subsampling_x, vp9->subsampling_y, + vp9->bit_depth, 1 << current->tile_cols_log2, + 1 << current->tile_rows_log2); + return 0; }