From patchwork Fri Oct 26 19:37:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 10796 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 91CB044CCBB for ; Fri, 26 Oct 2018 22:43:59 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 075BA68A0C2; Fri, 26 Oct 2018 22:43:31 +0300 (EEST) 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 0E204689AAA for ; Fri, 26 Oct 2018 22:43:24 +0300 (EEST) Received: by mail-qt1-f193.google.com with SMTP id l41-v6so2579313qtl.8 for ; Fri, 26 Oct 2018 12:43:53 -0700 (PDT) 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=M9jJbBNXY4cexiF5trJd0yDxHI1zFgJBBsVkMNhaDHM=; b=OaUDQnur5VK6l3UOoFf0PPAXNLN2bfP05snCh3To7Cm7ioIEj3SkXfu8WoeN609d0A BX5YNDKKlPcEtMyQGcxhAkPUteJdnbuofCg+UgMxaAeva83rKYu/k9Xm9syxaVXDAcBt EUjUcAplZnghQ47TkCYQsWHPwLyNVBpW8SmLT2MIC8Qcd8SMeG6/dGSlQkVKpCtjNfRh FApYaUES1DWZoZ+NshaL9RbdHOHYRZqqsOC3Uzntqaam47Lild/En9xu2Epp3OI6xch0 iqFIQA4PpqByEe2uLpdQiXA2m2UMxfstZgvWhRzfvjIkOQqXjYyOT3tEvk9WNHB0xbuw dnYA== 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=M9jJbBNXY4cexiF5trJd0yDxHI1zFgJBBsVkMNhaDHM=; b=WkmlpsvxqXQi2HFwXEuMGuW9y/3NSTyuz8QIKODHwSyGsuBS5fzwRrpfkdLGm8wwv6 KAIdxW8S2on9MgPebJkFYwln7or+L6bj56ELCX9VeBZDsvmJdacLzAq7fqNImCsMLkUn qTghPi8LfZtm1BBePVA8qiEpb2ol0i0MdWSq9BmEG/4MVjuJpQgX3uxU6SrcTukX5kJR gzFraDLBLUuQMKQr3zOSxh2riLMbt26kEcqH3UVBe/jcUVteuF6ZONC3azkWqpbfXWiQ byUDclJEyjkmgaaDZAuXAgUBb5tpfwokKWevTw00+4E995u+PbDvmqAKPhaGVeBe7JEn r6ZA== X-Gm-Message-State: AGRZ1gLJKhkdVGBwnMM2IzZRm8gX2wqU3zgcNazKPCXx9qchT6NC7sZH oSb0K1gVMGW7Q4W4JZ2KbFptL93M X-Google-Smtp-Source: AJdET5eJuX3qJ9pnUkOkp7r8sZZlkBoq2J8mazVemJwSdHpfxtlJnp7H7w86AL3Z60a2uH493Nz5bA== X-Received: by 2002:ac8:5355:: with SMTP id d21-v6mr4600037qto.278.1540582650594; Fri, 26 Oct 2018 12:37:30 -0700 (PDT) Received: from localhost.localdomain ([179.38.174.95]) by smtp.gmail.com with ESMTPSA id b5-v6sm7804683qkf.4.2018.10.26.12.37.29 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 26 Oct 2018 12:37:30 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 26 Oct 2018 16:37:07 -0300 Message-Id: <20181026193708.8056-2-jamrial@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181026193708.8056-1-jamrial@gmail.com> References: <20181026193708.8056-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] 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 | 15 +++++++++- libavcodec/cbs_vp9_syntax_template.c | 42 ++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/libavcodec/cbs_vp9.h b/libavcodec/cbs_vp9.h index 5b99c90c2e..47c3052c7d 100644 --- a/libavcodec/cbs_vp9.h +++ b/libavcodec/cbs_vp9.h @@ -117,7 +117,7 @@ typedef struct VP9RawFrameHeader { uint8_t frame_context_idx; // Frame/render size. - uint8_t found_ref[VP9_REFS_PER_FRAME]; + uint8_t found_ref; uint16_t frame_width_minus_1; uint16_t frame_height_minus_1; uint8_t render_and_frame_size_different; @@ -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,12 @@ typedef struct CodedBitstreamVP9Context { uint16_t sb64_cols; uint16_t sb64_rows; + int bit_depth; + int frame_width; + int frame_height; + + 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..b6209d979b 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); @@ -81,8 +85,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,12 +114,24 @@ 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]) + f(1, found_ref); + if (current->found_ref) { + VP9ReferenceFrameState *ref = + &vp9->ref[current->ref_frame_idx[i]]; + + vp9->frame_width = ref->frame_width; + vp9->frame_height = ref->frame_height; + + 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; break; + } } if (i >= VP9_REFS_PER_FRAME) CHECK(FUNC(frame_size)(ctx, rw, current)); @@ -249,6 +268,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; @@ -339,6 +359,18 @@ 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 = current->subsampling_x, + .subsampling_y = current->subsampling_y, + .bit_depth = vp9->bit_depth, + }; + } + } + return 0; }