From patchwork Mon Mar 27 21:35:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Ronald S. Bultje" X-Patchwork-Id: 3138 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.44.195 with SMTP id s186csp351026vss; Mon, 27 Mar 2017 14:36:20 -0700 (PDT) X-Received: by 10.28.130.81 with SMTP id e78mr11754080wmd.47.1490650580610; Mon, 27 Mar 2017 14:36:20 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o36si2168469wrb.225.2017.03.27.14.36.20; Mon, 27 Mar 2017 14:36:20 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4F2EC6883EB; Tue, 28 Mar 2017 00:35:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EBAB06891E7 for ; Tue, 28 Mar 2017 00:35:23 +0300 (EEST) Received: by mail-qt0-f194.google.com with SMTP id r45so9575241qte.0 for ; Mon, 27 Mar 2017 14:35:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=M7AXs7VjlBbHxCG/6TKzLgpYSCENxfsz7BgIrMjwLWI=; b=DNAJuH5COV1vhpKzs517KA20arUpZO58zn3j7pfzafio3GaYBssRFzi6aGk/VHw1cm ahIYqlmRJUpG9DPBCLIsx8R5WfKGK+MfFOEDS0Y1oKa3HWZ+z6rDsyn/4ptakv8GHQ4e OuKBs4rpViz+HnfQ9swu3Mv0W3Klhi17/zfH8pcvLp5FNuwaYBe+wTmDbI1wtYt1dohC Jw1+JRrR6pUiu3iE62haDw6+NvYH4IHFvySVmQg/0x6LEBlHKwAZ4x6TddsaTcIyv7wM A59JzcJgBBu0R9OADILB8PEQ3fAcUCq2Fz4wrqiyUQgZIfeESGy6/tk8kWLQK+i4kOsX PTVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=M7AXs7VjlBbHxCG/6TKzLgpYSCENxfsz7BgIrMjwLWI=; b=o4mesn9Ryq3PTiwKwK1vsYQaFkp1+qjOOG3EzOg0H4mIITikXPzUnsfKSj1QgUULA5 TdMvhwTDAWnuYL5bhwt5pueyiNTlpUgj4x/F/40Z5GWjkDkN4q8qpm3lzR/25iboZk3m XX4y6DZ7ZTwYoSAAkmW2NUcQE5y35a0afP9ztNuOpXjtsQ0ddhQC/amkHeNDjy+h27W+ ajRzl1VGhRJhVuGa09phxqwmhlZ0r5HVXYjy9ZrMHCUiPy8eBiy5+UZ9qaKVB4kOaTTE ABTWomhLobXSFkfxGHa3vSm6pn5uiJGHhzHOozsIG5AD94RaA5BMSW9zZ9lT1iufnihz bXIg== X-Gm-Message-State: AFeK/H3v6busp5KXcg4iI++c5DLMu7M2JxaAjFRWdh71rCdF8hr8QG4RTaNZgIvuJrhDcQ== X-Received: by 10.237.37.71 with SMTP id w7mr22208115qtc.34.1490650544650; Mon, 27 Mar 2017 14:35:44 -0700 (PDT) Received: from localhost.localdomain ([65.206.95.146]) by smtp.gmail.com with ESMTPSA id w55sm1251412qtw.9.2017.03.27.14.35.43 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 27 Mar 2017 14:35:44 -0700 (PDT) From: "Ronald S. Bultje" To: ffmpeg-devel@ffmpeg.org Date: Mon, 27 Mar 2017 17:35:35 -0400 Message-Id: <1490650535-81794-4-git-send-email-rsbultje@gmail.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1490650535-81794-1-git-send-email-rsbultje@gmail.com> References: <1490650535-81794-1-git-send-email-rsbultje@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/4] vp9: split out generic decoding skeleton interface API from VP9 types. 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: "Ronald S. Bultje" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This allows vp9dsp.h to only include the VP9 types header, and not the decoder skeleton interface which is for hardware decoders (dxva2/vaapi). --- libavcodec/dxva2_vp9.c | 2 +- libavcodec/vaapi_vp9.c | 2 +- libavcodec/vp9.h | 145 +----------------------------------------- libavcodec/vp9dec.h | 1 + libavcodec/vp9dsp.h | 4 +- libavcodec/vp9shared.h | 169 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 176 insertions(+), 147 deletions(-) create mode 100644 libavcodec/vp9shared.h diff --git a/libavcodec/dxva2_vp9.c b/libavcodec/dxva2_vp9.c index d53b327..fd7bd98 100644 --- a/libavcodec/dxva2_vp9.c +++ b/libavcodec/dxva2_vp9.c @@ -23,7 +23,7 @@ #include "libavutil/avassert.h" #include "libavutil/pixdesc.h" -#include "vp9.h" +#include "vp9shared.h" // The headers above may include w32threads.h, which uses the original // _WIN32_WINNT define, while dxva2_internal.h redefines it to target a diff --git a/libavcodec/vaapi_vp9.c b/libavcodec/vaapi_vp9.c index 7374465..d8ece75 100644 --- a/libavcodec/vaapi_vp9.c +++ b/libavcodec/vaapi_vp9.c @@ -24,7 +24,7 @@ #include "hwaccel.h" #include "vaapi_decode.h" -#include "vp9.h" +#include "vp9shared.h" static VASurfaceID vaapi_vp9_surface_id(const VP9Frame *vf) { diff --git a/libavcodec/vp9.h b/libavcodec/vp9.h index 6d2abaf..c8d07ad 100644 --- a/libavcodec/vp9.h +++ b/libavcodec/vp9.h @@ -24,13 +24,6 @@ #ifndef AVCODEC_VP9_H #define AVCODEC_VP9_H -#include -#include - -#include "avcodec.h" -#include "thread.h" -#include "vp56.h" - enum TxfmMode { TX_4X4, TX_8X8, @@ -73,142 +66,8 @@ enum FilterMode { FILTER_8TAP_REGULAR, FILTER_8TAP_SHARP, FILTER_BILINEAR, - FILTER_SWITCHABLE, -}; - -enum BlockPartition { - PARTITION_NONE, // [ ] <-. - PARTITION_H, // [-] | - PARTITION_V, // [|] | - PARTITION_SPLIT, // [+] --' -}; - -enum InterPredMode { - NEARESTMV = 10, - NEARMV = 11, - ZEROMV = 12, - NEWMV = 13, -}; - -enum CompPredMode { - PRED_SINGLEREF, - PRED_COMPREF, - PRED_SWITCHABLE, + N_FILTERS, + FILTER_SWITCHABLE = N_FILTERS, }; -typedef struct VP9mvrefPair { - VP56mv mv[2]; - int8_t ref[2]; -} VP9mvrefPair; - -typedef struct VP9Frame { - ThreadFrame tf; - AVBufferRef *extradata; - uint8_t *segmentation_map; - VP9mvrefPair *mv; - int uses_2pass; - - AVBufferRef *hwaccel_priv_buf; - void *hwaccel_picture_private; -} VP9Frame; - -enum BlockLevel { - BL_64X64, - BL_32X32, - BL_16X16, - BL_8X8, -}; - -enum BlockSize { - BS_64x64, - BS_64x32, - BS_32x64, - BS_32x32, - BS_32x16, - BS_16x32, - BS_16x16, - BS_16x8, - BS_8x16, - BS_8x8, - BS_8x4, - BS_4x8, - BS_4x4, - N_BS_SIZES, -}; - -typedef struct VP9BitstreamHeader { - // bitstream header - uint8_t profile; - uint8_t bpp; - uint8_t keyframe; - uint8_t invisible; - uint8_t errorres; - uint8_t intraonly; - uint8_t resetctx; - uint8_t refreshrefmask; - uint8_t highprecisionmvs; - enum FilterMode filtermode; - uint8_t allowcompinter; - uint8_t refreshctx; - uint8_t parallelmode; - uint8_t framectxid; - uint8_t use_last_frame_mvs; - uint8_t refidx[3]; - uint8_t signbias[3]; - uint8_t fixcompref; - uint8_t varcompref[2]; - struct { - uint8_t level; - int8_t sharpness; - } filter; - struct { - uint8_t enabled; - uint8_t updated; - int8_t mode[2]; - int8_t ref[4]; - } lf_delta; - uint8_t yac_qi; - int8_t ydc_qdelta, uvdc_qdelta, uvac_qdelta; - uint8_t lossless; -#define MAX_SEGMENT 8 - struct { - uint8_t enabled; - uint8_t temporal; - uint8_t absolute_vals; - uint8_t update_map; - uint8_t prob[7]; - uint8_t pred_prob[3]; - struct { - uint8_t q_enabled; - uint8_t lf_enabled; - uint8_t ref_enabled; - uint8_t skip_enabled; - uint8_t ref_val; - int16_t q_val; - int8_t lf_val; - int16_t qmul[2][2]; - uint8_t lflvl[4][2]; - } feat[MAX_SEGMENT]; - } segmentation; - enum TxfmMode txfmmode; - enum CompPredMode comppredmode; - struct { - unsigned log2_tile_cols, log2_tile_rows; - unsigned tile_cols, tile_rows; - } tiling; - - int uncompressed_header_size; - int compressed_header_size; -} VP9BitstreamHeader; - -typedef struct VP9SharedContext { - VP9BitstreamHeader h; - - ThreadFrame refs[8]; -#define CUR_FRAME 0 -#define REF_FRAME_MVPAIR 1 -#define REF_FRAME_SEGMAP 2 - VP9Frame frames[3]; -} VP9SharedContext; - #endif /* AVCODEC_VP9_H */ diff --git a/libavcodec/vp9dec.h b/libavcodec/vp9dec.h index f05e478..4002b3a 100644 --- a/libavcodec/vp9dec.h +++ b/libavcodec/vp9dec.h @@ -32,6 +32,7 @@ #include "vp9.h" #include "vp9dsp.h" +#include "vp9shared.h" enum MVJoint { MV_JOINT_ZERO, diff --git a/libavcodec/vp9dsp.h b/libavcodec/vp9dsp.h index d2c48b4..e225631 100644 --- a/libavcodec/vp9dsp.h +++ b/libavcodec/vp9dsp.h @@ -111,13 +111,13 @@ typedef struct VP9DSPContext { * * dst/stride are aligned by hsize */ - vp9_mc_func mc[5][4][2][2][2]; + vp9_mc_func mc[5][N_FILTERS][2][2][2]; /* * for scalable MC, first 3 dimensions identical to above, the other two * don't exist since it changes per stepsize. */ - vp9_scaled_mc_func smc[5][4][2]; + vp9_scaled_mc_func smc[5][N_FILTERS][2]; } VP9DSPContext; extern const int16_t ff_vp9_subpel_filters[3][16][8]; diff --git a/libavcodec/vp9shared.h b/libavcodec/vp9shared.h new file mode 100644 index 0000000..54726df --- /dev/null +++ b/libavcodec/vp9shared.h @@ -0,0 +1,169 @@ +/* + * VP9 compatible video decoder + * + * Copyright (C) 2013 Ronald S. Bultje + * Copyright (C) 2013 Clément Bœsch + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_VP9SHARED_H +#define AVCODEC_VP9SHARED_H + +#include +#include + +#include "vp9.h" +#include "thread.h" +#include "vp56.h" + +enum BlockPartition { + PARTITION_NONE, // [ ] <-. + PARTITION_H, // [-] | + PARTITION_V, // [|] | + PARTITION_SPLIT, // [+] --' +}; + +enum InterPredMode { + NEARESTMV = 10, + NEARMV = 11, + ZEROMV = 12, + NEWMV = 13, +}; + +enum CompPredMode { + PRED_SINGLEREF, + PRED_COMPREF, + PRED_SWITCHABLE, +}; + +typedef struct VP9mvrefPair { + VP56mv mv[2]; + int8_t ref[2]; +} VP9mvrefPair; + +typedef struct VP9Frame { + ThreadFrame tf; + AVBufferRef *extradata; + uint8_t *segmentation_map; + VP9mvrefPair *mv; + int uses_2pass; + + AVBufferRef *hwaccel_priv_buf; + void *hwaccel_picture_private; +} VP9Frame; + +enum BlockLevel { + BL_64X64, + BL_32X32, + BL_16X16, + BL_8X8, +}; + +enum BlockSize { + BS_64x64, + BS_64x32, + BS_32x64, + BS_32x32, + BS_32x16, + BS_16x32, + BS_16x16, + BS_16x8, + BS_8x16, + BS_8x8, + BS_8x4, + BS_4x8, + BS_4x4, + N_BS_SIZES, +}; + +typedef struct VP9BitstreamHeader { + // bitstream header + uint8_t profile; + uint8_t bpp; + uint8_t keyframe; + uint8_t invisible; + uint8_t errorres; + uint8_t intraonly; + uint8_t resetctx; + uint8_t refreshrefmask; + uint8_t highprecisionmvs; + enum FilterMode filtermode; + uint8_t allowcompinter; + uint8_t refreshctx; + uint8_t parallelmode; + uint8_t framectxid; + uint8_t use_last_frame_mvs; + uint8_t refidx[3]; + uint8_t signbias[3]; + uint8_t fixcompref; + uint8_t varcompref[2]; + struct { + uint8_t level; + int8_t sharpness; + } filter; + struct { + uint8_t enabled; + uint8_t updated; + int8_t mode[2]; + int8_t ref[4]; + } lf_delta; + uint8_t yac_qi; + int8_t ydc_qdelta, uvdc_qdelta, uvac_qdelta; + uint8_t lossless; +#define MAX_SEGMENT 8 + struct { + uint8_t enabled; + uint8_t temporal; + uint8_t absolute_vals; + uint8_t update_map; + uint8_t prob[7]; + uint8_t pred_prob[3]; + struct { + uint8_t q_enabled; + uint8_t lf_enabled; + uint8_t ref_enabled; + uint8_t skip_enabled; + uint8_t ref_val; + int16_t q_val; + int8_t lf_val; + int16_t qmul[2][2]; + uint8_t lflvl[4][2]; + } feat[MAX_SEGMENT]; + } segmentation; + enum TxfmMode txfmmode; + enum CompPredMode comppredmode; + struct { + unsigned log2_tile_cols, log2_tile_rows; + unsigned tile_cols, tile_rows; + } tiling; + + int uncompressed_header_size; + int compressed_header_size; +} VP9BitstreamHeader; + +typedef struct VP9SharedContext { + VP9BitstreamHeader h; + + ThreadFrame refs[8]; +#define CUR_FRAME 0 +#define REF_FRAME_MVPAIR 1 +#define REF_FRAME_SEGMAP 2 + VP9Frame frames[3]; +} VP9SharedContext; + +#endif /* AVCODEC_VP9SHARED_H */