From patchwork Sat Jul 23 05:14:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36895 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp825757pzb; Fri, 22 Jul 2022 22:14:45 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uWRKcoTJ3IXNgWRnlneQlvwbLcfenqEGSIkMpJFK2MGqFe07chMA0y3/pMlzyhfYkQvdls X-Received: by 2002:a17:907:3f29:b0:72b:91df:2c4b with SMTP id hq41-20020a1709073f2900b0072b91df2c4bmr2393626ejc.206.1658553285054; Fri, 22 Jul 2022 22:14:45 -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 ay2-20020a056402202200b0043aa13e06d8si6700892edb.367.2022.07.22.22.14.42; Fri, 22 Jul 2022 22:14:45 -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=@outlook.com header.s=selector1 header.b=bjkiPrzi; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 83FB068B590; Sat, 23 Jul 2022 08:14:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2053.outbound.protection.outlook.com [40.92.91.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 19EB268B4F7 for ; Sat, 23 Jul 2022 08:14:32 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VhWp51f8Mv1e5iUw/RdTfljle7VlpDYbMxZ04GbySrupscoJGvDEfTF9vh3QufC7cfyFdQI+Bll06yFSTf/iSbIfC93n9BuZnawPDnGG1eJXhSlVCGybBD/uv5Dc6TkmTHrEOuxf6c4GECi94CskbdafVC7UYHaUZms2KNn5cqh2dB+0b/mBU+fAkFWFxMQJre6SPqyEKcWuX/YD1LqPMdqnvLUHOOkCanDnGc2Lczr+qw2dR58Vpo26PHvAr+GWsiIqMUGXzwSqlbd4RO+NxuV2DQ3468iiIlsETTA5kxMbpNTD6y8Ur/YY0vLEZc4SmSj5fGpG86OGuvBq9qwxBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=FEXPQnw/Oh5XgeuHxMWor9INdZAO63sd/DuSVoRfeOk=; b=QprA2PThE8haqhda91kErOfKu7ygKjb5XFUMKQ7iqxpbF3olEtgZUPg2oXZMOUMYZuKXFa15D+kh5awLC0dVR2iB0hTcIzqduZA7/W9l49NfpyICe6bdFOGp38P8mqAg/fWQP/Wei/PKmryhbZDG4btRSX0EX73pODj9ijbFAm+o4cuKT6D4wUMXioAZoGCZsyfVEgyTEYzNGlB1dOHhBjhWcJMK5UXcC6e1jJXJKN6/ZPS5V8dTyClI/XE6u85bazOjGCpIYi1y1+KSRrVJKRE8jiw5hUwLY09mNus75z+VNEW2xAD/VY7hbUTz3bJ6Rmb1cS9M4xvAcQmuWnW8Bg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FEXPQnw/Oh5XgeuHxMWor9INdZAO63sd/DuSVoRfeOk=; b=bjkiPrziWJ/IGvBfSTfZd5XPXgIWWjNfEAbRJWPcQqGoIM8amdG3cfjAgZ/zgURZIbabi+J1wKzALRv4BYbxe6wnSFJa0Umt9FrJZ8DqNR5DmrRql0fE461Qi96GJv2RHYKbM6EGi7UKJzm2eSRX9Gh38rW6Lb3MRW1DLMqvrxTnsu9kbyIgA/shcebNQyqB/ykz7vCPWoSPr8wIFsmxeCYTbtbqdDg+cJyKXUFlLps2NQYcyaHRMsRVZNixKN9Zls1095XXs2iTjEfsAnH6SfDy3Ygv7q1ltluBJQgUjXN/fxg0JZfP9wITpnAj1MoTk5+UQOovwNVuf/YtsYye1w== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by DB8PR01MB5449.eurprd01.prod.exchangelabs.com (2603:10a6:10:10b::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5438.15; Sat, 23 Jul 2022 05:14:30 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5458.020; Sat, 23 Jul 2022 05:14:30 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Jul 2022 07:14:16 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [DuKi4hHpII8ID8PiGz5eAZaw6DA5DIQ0] X-ClientProxiedBy: FR3P281CA0063.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4b::13) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220723051420.287716-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4c6c048c-571c-441a-4240-08da6c6a37d5 X-MS-Exchange-SLBlob-MailProps: ISIDp/2nRg1zbbtLliz97RSTgN8tc71BS0/jyU6CmuIJog6Em53akPhcNkBLzQxHSELrQDFX/xd8Zj+2qusB3IlkI40Th6V0P14iRK2IPttT60FSX0k2vAUmlRyjRMrBhsRU86DDwy86e+M2cesg/B0EsvIBfTZWKuh71XsekXjFiM8wEfY/iX70Gd9q9/ITY1IyN0tnD2+rf0DkiSt/jNgcBt+lLaBN0c7LXSjNWIReWd4GTjFSXjV9gYzr34LGvVf0+skarsnqkrTBdE2wlNw4fGuWqMyiRVu7CN7VtFaw8lzzEcrw2aQLQVlW6dKZBgRXaQIsSdKSd1YO3DMLwyoygq+/yVz+/C1hOjtT0ZaTwo4u85M7bAQ55KFPJHSlgGO8Phes5KAGPNyK8I8QhiUO9P5EXC7Xi+8XB7REw3PgPtMna97RcwZnbqpa6ive3X2qElxlmlNRJBw+KGVMH6Hxs05S59ee4drlYaNTN7+frfJPgsYkL3LxPFYZ/dT95USLmh5D+KGlu7W1Lr//kmWHB3b1FzC1rMHl8GC/2VCy82pPxYMmq3QJk4RitVorCOBP0Gw5i8+UnTrjN2VkuN3/4yRQJBm/6b52OtKihwUzpw55r6tcv5rc1g3n+eeY652J+Yhh3OKvk8yTaqfRgNhTLYQPSz7G7jU0Ia1PJTHB8tMzmiJLVmQyzAMUZ+PWVDl28I6wdb/vsJcatvaUpsFfewNYQD6nEbAYLS3UKBnWAvahSYCeF0fkdOOjNoDEIVUAbme1scUh4b8SckQvWkSfJbzOiA5KiQWDK99ydcYe48NZI0jGtddmYhqFkm4jCNqijE0j60XCG+DFzVo2hFEZQ+feq//Xj4EjxL6OXHyq5+qIedVYYERR98WCoHz3fi+sC5yteXg= X-MS-TrafficTypeDiagnostic: DB8PR01MB5449:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: OliHEa35Rt0fMn6ka5jC8Coc0EZlT5CHViBy7l4+Uq+Q+gyk9LDilMCHSbBBJpSvCFBwe6zWhqqgCa3/xbb5osgbePeP2OstwBxialcRkqv8a6i/EKTiYqG3ZaaXXPgcBvg+plpZeYoaIAeAuw5UhXrNgEfkiuj4fBmomP1sucux5Mpo4I9TOjXNlBNPV/Xo6aZ5UTkZL4UatNV3cIylpu0u8J4wPidMJraV4p9q2ypkgwIjfT8eSJBZPoVL/nhQ9EKk6/31W/toGLZM59DO1wDMSS2gNGgry3pYAEO7NZn4aWN3ZK8Pt9B/OUAaJvfUfBZACnF4hWvq4cWsrKB6hI8BjQOhguuO8IGabPoSE4bhKaqlyMLtroSB50NBXy4fsNUW3VA6cjjQWZYyNCM1PmIjpUElzjuaPASLmlVnqmmUQCbIoVfhV044fVwsiU/gpIHfJOS0vAsuYwD6li43MlFnG6rgNv4/OGXZdV4t6J+EHuGlPnFDL0sDuxfdoqPVlnP9Dd9ZXmNfnih4uYyGKD31FrJax51TO1whdORQv9FeTrOdEm+GCpGYDUPQ/52MBrQzvj51AGA57citqR8pBFIfWn2Lw8aLuWEvy+7EWbHbOA7j4OayCjIHbLLmWoIIpOBRqOrHUbOEENQ4GWHuEA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 1deonAruVrA04V3LdEKrUwdy/CzAFk751Y9uOXs6W0OYLrt+4kaqu1sbapmanHa+E0alI5uNbPbKq1+NaksN0WYIVjaLF5fWziWTIxPatdYbjcMcnkRMKeqp6gJHKwmYWZ87ip/xSw/xzMBb+4sKk42yIrD8TQCBcTYgYoZuzhYOnw5yGzBzLFXJz6wylu+avxu32qP1J2pv9f+9rFJDeWTxrFBf6sxbztXz5DsU/4+E263OTOh7JUPjWC5YIZDwOSLbENMxStTO0JqtqFJJCl9GgtwNj5LMUMhqdaDbmGf0arr020hYZGRQp134ECltO4KtxG4CtyOcGW4j4WD6c3crl6zZtIYWOIKp6NcA+F2ugqjeJXR82smx2e8doww0HduIS0wIdErSGDSiXUCSVA9lGjM2MH9+Qxh1vpzMPFSAhz9Zlxz8RuSaBrxPxqLEFjaNxlKJTXZe1q3hKK6Nk/8heUmgTfV0hRaneWeqDbemBRgV1tc/Vk07Dw5pOHGoDsmtDQ/HFK3ssWLJ33J34Icch2CSX0AkH2UTD0OJsyX4/RK9V/+0Ndu49jUqnxzUfDdve6g5B2Ye2Jy2+HGd0kJ/qntrtkL8zOVcvIAZGNTlVYbgP2IaiyGFpmcXxOcXHXQCLHiWGjQfHQADijrDBeUZYuTmo/OZVrer/rDXhAMkw4a48CgpNSfHc3hJLhO6WolguPtQH1k3hyOq4+tRtHY09jNKtqol5/KUH5w6la9a3an6QDNYKhoXt0/aQ2KMRAS7Lx0g430fcsg4aJOXGoVEDaR8pxJH1KP2O5b44GoFrSnR9g5dgnoT6NKou5t/P83aY9vIRfhFo+pWnPc9N2nqF7YwhuHRifOXEAtfSY7dDvYOZSPQsEuKuqCNJetI+WMUjgCUCSevLiyWdQg/lIeUWmgpgjMScuu222NsNPVZMRJJRkgzb/qcL9vBgF0SMnE7t027QzT2hXDKjrgF2GZsEIGmcDQpUbQLm8WyXAuHv9HKZBbBpUiLPU6golOR+Ab37iJS5AJw9q1FVkjXCsU2UEvlJppBkL9hDlGauohBSMXVrQ5sy1mp6skDKpWiqthaVD/AK7i1mPUdIferEIk+qMCypgv44olYlJFrR2iTGcdg8Q67lHmcyKqAbmx7sPQpaf5QAFhsxXkKxqC5KOL+s6ACMmjhRTq098Og5skUkrmb7EbL+VQJP5TMxfWNGZYTcfM+cxczMjMLehZHCM7kQKjQsI0Lu+A+9PihbZUjTgpx/OxEX0OaHiRnPWj9p/pwr9Ul8qbkbYugBTfcsM3MQ55vr9DwWHsW1WVW6Ks= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4c6c048c-571c-441a-4240-08da6c6a37d5 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2022 05:14:30.0401 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8PR01MB5449 Subject: [FFmpeg-devel] [PATCH 1/5] avcodec/hq_hqa: Remove transient GetByteContext from context X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: faooNl7qYxLN Signed-off-by: Andreas Rheinhardt --- libavcodec/hq_hqa.c | 48 +++++++++++++++++++++++---------------------- libavcodec/hq_hqa.h | 2 -- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/libavcodec/hq_hqa.c b/libavcodec/hq_hqa.c index 9a07d83114..a17fa18bf8 100644 --- a/libavcodec/hq_hqa.c +++ b/libavcodec/hq_hqa.c @@ -24,6 +24,7 @@ #include "libavutil/intreadwrite.h" #include "avcodec.h" +#include "bytestream.h" #include "canopus.h" #include "codec_internal.h" #include "get_bits.h" @@ -114,12 +115,12 @@ static int hq_decode_mb(HQContext *c, AVFrame *pic, return 0; } -static int hq_decode_frame(HQContext *ctx, AVFrame *pic, +static int hq_decode_frame(HQContext *ctx, AVFrame *pic, GetByteContext *gbc, int prof_num, size_t data_size) { const HQProfile *profile; GetBitContext gb; - const uint8_t *perm, *src = ctx->gbc.buffer; + const uint8_t *perm, *src = gbc->buffer; uint32_t slice_off[21]; int slice, start_off, next_off, i, ret; @@ -144,7 +145,7 @@ static int hq_decode_frame(HQContext *ctx, AVFrame *pic, /* Offsets are stored from CUV position, so adjust them accordingly. */ for (i = 0; i < profile->num_slices + 1; i++) - slice_off[i] = bytestream2_get_be24(&ctx->gbc) - 4; + slice_off[i] = bytestream2_get_be24(gbc) - 4; next_off = 0; for (slice = 0; slice < profile->num_slices; slice++) { @@ -240,20 +241,20 @@ static int hqa_decode_slice(HQContext *ctx, AVFrame *pic, GetBitContext *gb, return 0; } -static int hqa_decode_frame(HQContext *ctx, AVFrame *pic, size_t data_size) +static int hqa_decode_frame(HQContext *ctx, AVFrame *pic, GetByteContext *gbc, size_t data_size) { GetBitContext gb; const int num_slices = 8; uint32_t slice_off[9]; int i, slice, ret; int width, height, quant; - const uint8_t *src = ctx->gbc.buffer; + const uint8_t *src = gbc->buffer; - if (bytestream2_get_bytes_left(&ctx->gbc) < 8 + 4*(num_slices + 1)) + if (bytestream2_get_bytes_left(gbc) < 8 + 4*(num_slices + 1)) return AVERROR_INVALIDDATA; - width = bytestream2_get_be16(&ctx->gbc); - height = bytestream2_get_be16(&ctx->gbc); + width = bytestream2_get_be16(gbc); + height = bytestream2_get_be16(gbc); ret = ff_set_dimensions(ctx->avctx, width, height); if (ret < 0) @@ -266,8 +267,8 @@ static int hqa_decode_frame(HQContext *ctx, AVFrame *pic, size_t data_size) av_log(ctx->avctx, AV_LOG_VERBOSE, "HQA Profile\n"); - quant = bytestream2_get_byte(&ctx->gbc); - bytestream2_skip(&ctx->gbc, 3); + quant = bytestream2_get_byte(gbc); + bytestream2_skip(gbc, 3); if (quant >= NUM_HQ_QUANTS) { av_log(ctx->avctx, AV_LOG_ERROR, "Invalid quantization matrix %d.\n", quant); @@ -280,7 +281,7 @@ static int hqa_decode_frame(HQContext *ctx, AVFrame *pic, size_t data_size) /* Offsets are stored from HQA1 position, so adjust them accordingly. */ for (i = 0; i < num_slices + 1; i++) - slice_off[i] = bytestream2_get_be32(&ctx->gbc) - 4; + slice_off[i] = bytestream2_get_be32(gbc) - 4; for (slice = 0; slice < num_slices; slice++) { if (slice_off[slice] < (num_slices + 1) * 3 || @@ -305,32 +306,33 @@ static int hq_hqa_decode_frame(AVCodecContext *avctx, AVFrame *pic, int *got_frame, AVPacket *avpkt) { HQContext *ctx = avctx->priv_data; + GetByteContext gbc0, *const gbc = &gbc0; uint32_t info_tag; unsigned int data_size; int ret; unsigned tag; - bytestream2_init(&ctx->gbc, avpkt->data, avpkt->size); - if (bytestream2_get_bytes_left(&ctx->gbc) < 4 + 4) { + bytestream2_init(gbc, avpkt->data, avpkt->size); + if (bytestream2_get_bytes_left(gbc) < 4 + 4) { av_log(avctx, AV_LOG_ERROR, "Frame is too small (%d).\n", avpkt->size); return AVERROR_INVALIDDATA; } - info_tag = bytestream2_peek_le32(&ctx->gbc); + info_tag = bytestream2_peek_le32(gbc); if (info_tag == MKTAG('I', 'N', 'F', 'O')) { int info_size; - bytestream2_skip(&ctx->gbc, 4); - info_size = bytestream2_get_le32(&ctx->gbc); - if (info_size < 0 || bytestream2_get_bytes_left(&ctx->gbc) < info_size) { + bytestream2_skip(gbc, 4); + info_size = bytestream2_get_le32(gbc); + if (info_size < 0 || bytestream2_get_bytes_left(gbc) < info_size) { av_log(avctx, AV_LOG_ERROR, "Invalid INFO size (%d).\n", info_size); return AVERROR_INVALIDDATA; } - ff_canopus_parse_info_tag(avctx, ctx->gbc.buffer, info_size); + ff_canopus_parse_info_tag(avctx, gbc->buffer, info_size); - bytestream2_skip(&ctx->gbc, info_size); + bytestream2_skip(gbc, info_size); } - data_size = bytestream2_get_bytes_left(&ctx->gbc); + data_size = bytestream2_get_bytes_left(gbc); if (data_size < 4) { av_log(avctx, AV_LOG_ERROR, "Frame is too small (%d).\n", data_size); return AVERROR_INVALIDDATA; @@ -339,11 +341,11 @@ static int hq_hqa_decode_frame(AVCodecContext *avctx, AVFrame *pic, /* HQ defines dimensions and number of slices, and thus slice traversal * order. HQA has no size constraint and a fixed number of slices, so it * needs a separate scheme for it. */ - tag = bytestream2_get_le32(&ctx->gbc); + tag = bytestream2_get_le32(gbc); if ((tag & 0x00FFFFFF) == (MKTAG('U', 'V', 'C', ' ') & 0x00FFFFFF)) { - ret = hq_decode_frame(ctx, pic, tag >> 24, data_size); + ret = hq_decode_frame(ctx, pic, gbc, tag >> 24, data_size); } else if (tag == MKTAG('H', 'Q', 'A', '1')) { - ret = hqa_decode_frame(ctx, pic, data_size); + ret = hqa_decode_frame(ctx, pic, gbc, data_size); } else { av_log(avctx, AV_LOG_ERROR, "Not a HQ/HQA frame.\n"); return AVERROR_INVALIDDATA; diff --git a/libavcodec/hq_hqa.h b/libavcodec/hq_hqa.h index 08d79e7454..71aa36706c 100644 --- a/libavcodec/hq_hqa.h +++ b/libavcodec/hq_hqa.h @@ -26,7 +26,6 @@ #include "libavutil/mem_internal.h" #include "avcodec.h" -#include "bytestream.h" #include "hq_hqadsp.h" #include "vlc.h" @@ -37,7 +36,6 @@ typedef struct HQContext { AVCodecContext *avctx; HQDSPContext hqhqadsp; - GetByteContext gbc; VLC hq_ac_vlc; VLC hqa_cbp_vlc; From patchwork Sat Jul 23 05:16:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36896 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp826270pzb; Fri, 22 Jul 2022 22:16:29 -0700 (PDT) X-Google-Smtp-Source: AGRyM1stOqHbsPbJtkQAFtNZj9EDGN/aExK41jt76D5JQJnXEgfX+/Wi6td1aB1p7flP9cWxylBr X-Received: by 2002:a50:fd09:0:b0:43b:c338:528 with SMTP id i9-20020a50fd09000000b0043bc3380528mr2888867eds.353.1658553389018; Fri, 22 Jul 2022 22:16:29 -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 n8-20020a170906724800b0070d5a5343a3si7219333ejk.353.2022.07.22.22.16.28; Fri, 22 Jul 2022 22:16:29 -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=@outlook.com header.s=selector1 header.b=W71erSPQ; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B75D568064B; Sat, 23 Jul 2022 08:16:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073013.outbound.protection.outlook.com [40.92.73.13]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4150268B4C4 for ; Sat, 23 Jul 2022 08:16:20 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CU0eBTQpHTZyiI3sBIwiqB8D6hI8cpSljdixJ241ruVNlzhLPcxyaKq2+AmBLPPDv/ukmLaVG3yQInlTANDD4LexpSyQlyLNW54bMQVSSRhm4MsDiTf4JNcpK5fXQ7e6yIDP2gZ4Qxm5N7cfp/5EU8A47TgX8Ec7iXaWBDAhVzR74+JkPgpRzLN6v/aiXaIYgMNHvG4PF4W9euRxa85/jEGm/Ne6vXyD0BMfKdl/r0VfwFKAMZ/ToVS53aOdknleA1LDZZvyLwvqlNZujob1b/OjRGH5/hT4v1nId2YjW5n7zyJ1/ymwsebiDry9DqQR3bMXdbegj/aTwmeV5jhmCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=b/ksQdVWUqCbrh1ET9IHRS3YcdS8tiR/b64OwxxYFC4=; b=fWvBHi6MLtWy/zNMPYAGdp0NVf+5tMlk0b+xupy6KWRjUBuJvcVFrz2xXLxtUlFa8LNlx1agZAvPY18pafFlXji7McRKcwPNMP1cCGBcnbzZfAGTN3XF0ZSYzHKnQT66O0RkAgVgxvguINnZe8UXZUOLVdvQa/BIEwwQj7WPlcUj9+57Y3dTKLWi+Z+80vcZLzDT1bhalE7Snb2RHLRSyoAtJxuGJEoByvc6LW3aB2sIFeCIZ4T/jR532IUefx8u3D/Np6AlS5nRK4Y5+T+BQCwHYqoe/X+kDA8ASXVxY8wjQ/jy+P3hY6D6XP9qqgM5xcFIxNzkxdfvtDOJmRX3AA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=b/ksQdVWUqCbrh1ET9IHRS3YcdS8tiR/b64OwxxYFC4=; b=W71erSPQmi0x1Haq+V6hNAsv4Ozd0sqNdz356BCb2tNH08boxpd0i0nfqHPPnQHgsdghPk6LI030whVsq87Ej5mcYHhKODhDFocQbsgOBIbStiC9ZMlqEvSfF3aX7CyGIcimhi3KQthdgogIRzvZRk+e1dSZed/59Xz+Wzl3MUwTdLBaZYmMx5dPkow8E3Xj7nPhzQJoKHuf/rC6ZM+1OXxShAFMLwKCgArjZf8WN/hJ9sl1J9Otcs23LGjxSfRhAdZExBYw5NqwkI73SqRtZ/HaRmbqW0YsgoZ0EvSCBuAazMhJ+CxlV+srAcKY7CqQtNRI3gi9IuElOCWVKeUwBg== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by DU0PR01MB10211.eurprd01.prod.exchangelabs.com (2603:10a6:10:315::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.20; Sat, 23 Jul 2022 05:16:18 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5458.020; Sat, 23 Jul 2022 05:16:18 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Jul 2022 07:16:07 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [I9l9h+Q8Qm/7vdGPAFbTXI7PeEeZG6mn] X-ClientProxiedBy: FR3P281CA0037.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4a::21) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220723051610.287773-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 16b265d4-b80c-4a97-fee7-08da6c6a790e X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiToJ1zOhCTJMxCCEpyIerpRqiyRJAH1fOqpvx8js6B1CqTAt5tl4Yip+hpUzMVJtgQQNJy14nvkMukO6lylEFWKM8Rno/f2xUUSDTFX2UsstDrvaJ6sVmOnMeGfWbZ/aaTKou9hm2ozIM5VXZGa+YbZsTakEL9C9OmYBcO8m1hY68X4AU8jKetCTnovn+I3bf0QdjYO0M5zsSh/qib7mcKxleC8RXDQiceG1yASn7DBa1d9ja3Rw8HMf+YnGqQloCoH2gOowaFB95kfqSZLEJlZKRgZNQDjScr9OC/ReIs9x1fJx7qKSahMtjfPt+m27qoBuAFkQphqAy4ZvF6dt/9kMsLLmuOd7LnVkeQSdL+gIloKi27m8iMX6PIZLtbiigXCg+6JE9+4cPs1diegSLLWF5VjkOm2ON/NG8CsWp3TAZs/fTypIj1cde1lITvlMiSKgd/4Km/ufif1q1/Ycfs2bXtJL21T9lqPobLMiJpXf1XveXt+uN+vgFLxu0dx4p2YGkTni96jHKn5K3JlcZ63vlpopiAiqUpHkG4wAcI4KMIzU24MLu/b6Qi8FxsSnBP5ZRQrSTLMNfnBiQN0SB2rcqOav8ydLFu4gMV5Lhx9Cljo+9+Qf/6Xmsi4zjOUm6R0CHqeRZ+k+gtWWeQUt9Qer4qpUi2TM7BFN/i/gJqI02WlNeE3KcOyDjFTY+mGW/OHwityBoiFd2GDjtMYkxrzWmfHlI/gX5rsv+nS6+CLjLQEszHnBHWjQgyUnt2matk= X-MS-TrafficTypeDiagnostic: DU0PR01MB10211:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 2mnbFie7sMiXIBjChaHzrBEgRb2S2Da+ktuTatELsrSMfoss2n+UsrzVObb/X88kXctaBgD/CaEx0mK8lBqwwd269owcpoMsF6mq2Xer5hxnUy0TNdX66yyxmHx9cWpgI6PTbtyA1OgdLccp5md/CQjpKOfk3E1dSx54jyS+aBDbPhITSimnmCaNp3gqBU9lsjfmhxTSxL66WMxFKEXQWL5Ix+M/B6CX94SxwV6qCoC3HBM1Mzq1/7GuMhX4ksb/WU1+KY9FBrlkBZSY+v2zbDtcGl3IHcmDQIVE/HWYaQtYO2sMMtETyoTby1SC+Wi9rP4ZrP/k5d98kIFeKgExX65JFqjc3UMZOVUFAeCrTFm6fYZW5y4r9it8MqPJ+iiIb4kNWyVGlzonlxTP8bI2M1J2VraOWsPHiaCxW8s3zwv0PWU/XX08CUAHQ709ePzobVwOs5sFuUFLn7su4JJ3FLwLZ9P8SONGmaIYP3xErJ0jrtCmiRsoPUQQRL2l7kF4qLo41E+U9jCFFF3sYo6BXFr9okDARTIoOfXMytilXzwF5PyBCAc1pq/b2J6N1BMRZ6Hyf7Sp/Nek45x0CJP2J/4giyvn+PiO/Rou8gD4lpNVcp726dc8Hu3xz3MFQ7Wcfsx25KooJbZ/IPaluFfnKg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: EY6H+m+9lWTXfQo4OnrwuvUpY+XyGMhRHGjh4rUqEUsX5VlfH7ARw0Cgcw4NrXzuWDV7LHn+PltAkGPBcrAXRFSS1S3Fj3dRMflZJdBRSQDrkgPQCrsECk9PmOOtzud6RKzoib9lfLkU7VOgKox9qhkzT719qrH4Ygz3u6m8VFR8PrnzjLWSpOZog2mx4rBa9OBMRTM2NeviorrS+dvoLeebknrqGPgc1hp7jfZh/FNXA9cCciGyjsqneJQF4qDzl1//A1Xx4MsgkmVc4v7AIAjC7Iw/tlf5NQhUpRBFC27Ez2+C9JPWk2bZ3qXghKyb/7X3hxQKZMcmOEhrjLQfrcdVU+oWd8mQIYDrNBrCa2ubawfMM34V8YVBONZbrahirnetsLqJ0wLcwc0Y7Xp5Ks4mrlbtQPyum9ImGr4ncTx+NimPoptciz/egQ9JFgPmgtZ1xW83iHsjH0kSmBKAcjSn+McBir83MrR/YEGCOUJWtElzNOqzzN2PlJ4SxMPwc0j0sxSYWGi69QK1CIHRZZG9vDoXxtDQ3ZPVFNxeIpIaOVOQlTyMxesHKs2qrOfRulaOKpNq+eSNY6mJl+138ecKTsaOzzcx7uvRHm8R8knYG8vGfv+cUIfobnyULmYwZ30LOkfg8Mj0UYCVa2X0q6Afw1Vx5o7TFTqDI3A4ERzYfuIgbVJ2hfgRJpVfcKqey081oxsRMO4jIeRBZYyVVOsR8H06+rh5cOM9l1TWsxrjZLqsiAfcizIGdQ+CpPy6rhKjG2OBByHxpegS/D0Cs2M9FLE44x5vcGJRQ9xwf4cBhBZRkteuvAiXumBg3AIUgtBkU3Gqoek+f1JHL5IxWYk7HspBOsHVeUgoerHh8lEKADlqgEIWKn5oRA5Jn9GtMcDtD8JvtRHRCY+J1+S1xVdGDZwkB8TN+0A2n+tKbd7XgViREMBPsiR3Byi37HAsANAQ//QGgZhFOGRfRHRh3M1sMEKsvocnsmgZx4v7vdYWP3+vtAiQstUxxgjlXXMckuZP1AJR9ShMxZqko5hyZposB5onFDllUTN7UemrtNDukk0WRJ34AbP2su8xM7/gLoS7XAqTfzYEaLrFHjWmi7YfudoSqRJSPZSJljghHAk2VrHNKs5iGPfVmq9Jzx60gTdet5dh6mLrIgRiomhHf3M4W5dtvEZxDZs1RWUeco14FRDxiYYOX34rc8uPPXZ/gB0PTvyN8C4k0+E6vTQDJyYKGmm/eZPy2CzrHQZSOo2rpe+i7UlIZOkD1Kf11q6PQZWkr+qXJUGa6PDts1fAbE8neIezO8kJyHwEUNk7HJ4= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 16b265d4-b80c-4a97-fee7-08da6c6a790e X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2022 05:16:18.2049 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR01MB10211 Subject: [FFmpeg-devel] [PATCH 2/5] avcodec/vp56.h: Move VP8-only functions to vp8.c X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: GFEtBCjKB02+ Signed-off-by: Andreas Rheinhardt --- libavcodec/vp56.h | 36 +----------------------------------- libavcodec/vp8.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h index d2e6ad3ed0..08172e1987 100644 --- a/libavcodec/vp56.h +++ b/libavcodec/vp56.h @@ -339,7 +339,7 @@ static int vp56_rac_gets(VP56RangeCoder *c, int bits) return value; } -static int vp8_rac_get_uint(VP56RangeCoder *c, int bits) +static av_unused int vp8_rac_get_uint(VP56RangeCoder *c, int bits) { int value = 0; @@ -350,22 +350,6 @@ static int vp8_rac_get_uint(VP56RangeCoder *c, int bits) return value; } -// fixme: add 1 bit to all the calls to this? -static av_unused int vp8_rac_get_sint(VP56RangeCoder *c, int bits) -{ - int v; - - if (!vp8_rac_get(c)) - return 0; - - v = vp8_rac_get_uint(c, bits); - - if (vp8_rac_get(c)) - v = -v; - - return v; -} - // P(7) static av_unused int vp56_rac_gets_nn(VP56RangeCoder *c, int bits) { @@ -373,12 +357,6 @@ static av_unused int vp56_rac_gets_nn(VP56RangeCoder *c, int bits) return v + !v; } -static av_unused int vp8_rac_get_nn(VP56RangeCoder *c) -{ - int v = vp8_rac_get_uint(c, 7) << 1; - return v + !v; -} - static av_always_inline int vp56_rac_get_tree(VP56RangeCoder *c, const VP56Tree *tree, @@ -407,16 +385,4 @@ static av_always_inline int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t (*t return -i; } -// DCTextra -static av_always_inline int vp8_rac_get_coeff(VP56RangeCoder *c, const uint8_t *prob) -{ - int v = 0; - - do { - v = (v<<1) + vp56_rac_get_prob(c, *prob++); - } while (*prob); - - return v; -} - #endif /* AVCODEC_VP56_H */ diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 10de962118..9e7616990f 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -52,6 +52,40 @@ #define VPX(vp7, f) vp8_ ## f #endif +// fixme: add 1 bit to all the calls to this? +static int vp8_rac_get_sint(VP56RangeCoder *c, int bits) +{ + int v; + + if (!vp8_rac_get(c)) + return 0; + + v = vp8_rac_get_uint(c, bits); + + if (vp8_rac_get(c)) + v = -v; + + return v; +} + +static int vp8_rac_get_nn(VP56RangeCoder *c) +{ + int v = vp8_rac_get_uint(c, 7) << 1; + return v + !v; +} + +// DCTextra +static int vp8_rac_get_coeff(VP56RangeCoder *c, const uint8_t *prob) +{ + int v = 0; + + do { + v = (v<<1) + vp56_rac_get_prob(c, *prob++); + } while (*prob); + + return v; +} + static void free_buffers(VP8Context *s) { int i; From patchwork Sat Jul 23 05:16:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36897 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp826313pzb; Fri, 22 Jul 2022 22:16:38 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uDUadPP4Sqjo1uUEVubha6WoQYyjG65ODAkBGIztrEKupTavmdbExswjTIXQh77U+5yBLC X-Received: by 2002:a05:6402:448c:b0:435:9dcc:b8a5 with SMTP id er12-20020a056402448c00b004359dccb8a5mr2808757edb.287.1658553398233; Fri, 22 Jul 2022 22:16:38 -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 sh34-20020a1709076ea200b0072b4f140c57si8373530ejc.592.2022.07.22.22.16.37; Fri, 22 Jul 2022 22:16:38 -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=@outlook.com header.s=selector1 header.b=h1Zif8fy; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C782A68B701; Sat, 23 Jul 2022 08:16:32 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073013.outbound.protection.outlook.com [40.92.73.13]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7018668B4FD for ; Sat, 23 Jul 2022 08:16:25 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eEqNFAv00JycR6DqErtF8HHz8TdR/bbhhSr+8GgZm1h9KR3AQM0oksa2ri6vnKblcCTshOonTZAulJODnH8+7kSeV1F3+JAFjwqun0jzkrG/dVmXYo+7NE78wHH4/WtpEuH8NsahnkTFR38dVso5ujJwABt4ISF0+7H6oElSF3EFr3MQp516mluptFx1GZt2UW+A+baLSZPXHP+oLcUCDIvAHaVexh0YCHSNQfPjMm1NWdzQBo23yL47XMhhamfscvuCEr1g4N+FdIOp9R5pSaQXYH4Vz3O/UgfavhI6gZTEzXnUIoCi4Q/qd2aAHy0tDzlMDpgF8aPRuckxeuRSWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=X9nl9HzUNbjokxiVQZjtTuBXpNFNN6hFhDsjaLgtSpY=; b=npQQOCjUPrt2/4oHaU6ezjXx/z8Mqs1qqftX4yBHIm9aiu9cnsOQjGPh/fAPF66B9N7OaNzeYK9GWSGPcdRkAdM3DCgGTCzaKLYZJyQZRKcXyfWh4DXZqES9RTyqcHrCJlpvbKfX3sL7GsTKiWYDLnomI/CzeDsoSeZFFVDyDSawAIrzATAAI8hTnUm9XEpagGuPZNuYB756eV9hhaHaULXHXureT36sLgENiiUyABSQfiGOzygBiST9FXZ5ew7Q5BHj1kOTug9DT0LkPR7Hs152SK5JvlWISFll5Ml8eDpMH8TWcaXkzLEJ9L8SmB+NWR9VDTwRwTyiPpljriU+uA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=X9nl9HzUNbjokxiVQZjtTuBXpNFNN6hFhDsjaLgtSpY=; b=h1Zif8fyi9VmQRIu3nkmQ/y2SK9NtvqdYau6i/migHuCMBl1AqCFbohAJj/iDxvKzSZRZukt7iMtF+kndRcAOwvSztM6fSYEpmw3UHR4rAl4VSzemIAPywH1vnZO9cgXcgcowpBNxgTvDnShZHOJpep8nRIaEzln1HvnzdVtc1Vlgj1wrQuK6cP5xAUslkmzUC55yjWIgZQaAwK0Y1enXhASIwbi3mgIXVvmuiqpsckrlVNOxQTb3mysn57/xyVZ6JXUcjqHTKAMK+fe5GbeNXEbsSpS51RtjvOBrJ5gEkG7UNxxa/iLubw/cBO5zuY6N4TV9anVI5Frg/8B6SbR6Q== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by DU0PR01MB10211.eurprd01.prod.exchangelabs.com (2603:10a6:10:315::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.20; Sat, 23 Jul 2022 05:16:20 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5458.020; Sat, 23 Jul 2022 05:16:20 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Jul 2022 07:16:08 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [ACsohxubk2FAMOgT7hHWQzDjrSjo/nvB] X-ClientProxiedBy: FR3P281CA0037.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4a::21) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220723051610.287773-2-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2c9f30dd-7cf8-40db-c128-08da6c6a7a9a X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiToJ1zOhCTJMxCCEpyIerpRCJl8d7iJdyzN04I44cbOaCABzkU0ChG2dFYn3df8FBjnuoD2zVmK4HZlkGorf5ccn0/eyKpPEVqeQxk+CweE0hEGSi2G5W1EhEwYqqbpMfdQv+npeExHRudKYZITjPzJeQPxRnOXM4W1yUKFOP5+hTm43NjVccKlprFhnuYcCv/o6Ei920ud/VvL0Mn4oHbvh+Z2WqTgY0z8+eykDU8XbOoBW5Vfawk1hntZaFMrt5MQYtnOaXC7jl/HmIKJBlpwagFEtZIE2A60UIYdLLMTiuvn8/y1NDGAS6wPbMs9dR8p0l5MwCSRFn7394C1bM8jzK5ARfDxadHVAeeXwJKpLN3CRiW30dldg6aliu341yKB6C+0v+FZciJGIN3Oh3hW5FrOWjEoZpWvkvgPn+y5qdEfUrNHG5H8pl8TnLWedC+HgIVwn2kJMzyoUtjjTj89KmqSztTCE8ZrSmGYIOPr3kmuCQBbpOBQfkObxLJ/psL8U7tmIN8avjQRQK8632H5oUCotdmxxHTsvkyE2c5OJyRMOpChxKo5l0JChdsOQW8QYWpptuveMTwFaPuplV535Rd1+TB9XfxjSkSXXpufdj6HqQtfYHqmo8sD1cayrQeJB2jjJIha1tnft1ExPX9MN5s317cfjvR9eXKovoZCMGxjjGD4BRby1w2ttMDduj2rvfXq73Ip+IhLKcN5Bjc6UUj4YWk+pYsOmuJkV/jRtbEkZI5S7PQRFkRC76K5Jwo= X-MS-TrafficTypeDiagnostic: DU0PR01MB10211:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Ut1ncB9MYrH80X6Mz97uFjfPFY/uGWAC3Zc7co+SbvTe3OZSriP/jaK0WcJ1dP5DJXIH1smQ2L0zWTIdQQWs03THLN+krz1b3xHRbDO3xnQSKl41faUlYhTWg8sR7wpWgoO2/FPCrQudOTpDLgsyoFJevKcytqnnc2SLIfP62EFnX4Aiu9aBMms1zP+Eh6Vsux3d7rPpFwpmgWJHrLZ7jqXuJMUBQpfmzduDV82pa5Vv+1R1sWRAb3mBNTXcaFROGG7sIyKhIZc/xvzJrfa+ZcBcTUFbdc1Rhx8ojNAK3SHa2Ch3zaxpE9Hyxsw/AfUh0t4zVXnHw7hpMVe9eUFrSTJOZBHg/i7DhwHPH3F4f55PUPtMiPc5Q9cqF+TcHksAnMMSU4/se1zrnB921qP6N2JP6a8fzx0LB/ZsxaGViSM8jUwriCQnJDI1B5oZsQw6xC7KBtqujGZMzeykfLMGpO0y/bjCETh99rXO+qC+Aw37yuKMRa3hOw5rrgK88i3RF16KGp49a0ZO19X93EuApAL2pnDv6SGqstsF2TK6PNxj8nAaUkEUJ8QedTNASK49L6k1lmpEugKgZZL2FtUcYaqaSEkYtKMpXYD3jCZHDs7wYAybZiqAzVe9wqKL6TmI+IWa68+Txxg4wibe+GaRtg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: wo8AX6BwM7S29qN3iqWFIHJb7l/NLK6f37xhlgsAaSGcWP+iWkTMiRdOcvyheOe5haMGE7elwYhskUPT6ErmDg3aLkTwBP57tFURwRgLL/J6EIPbN//EIgUVigoMFi99kD2t8cTLdzwP7tfDOpKTyodzgorqFVO0wSCwToXyXZcWGbT8RbSUxtBnDvVZwHV5NdQ1HvNXJxkGLL46tS9LrkGQa+sZekqImneynkdrr/I3eaaW6etLDMOwSG+jJtdQNSy8Mhjgu7V2t1wzjV0FWM8tGWZVIk9qUTI2KseauoFjxq3lueaLioCLAhXc1v1UC9aJjfASunPd+2ZwI9AgUZYYpAi9rdzkd1RH+pIe40/YmNik0Tg/LEOq8+er06sbspS6P0ERy2KHpvY9bYPyUJvh6fvdhC6W9rvaqUvMT2tuyYJXBHkFuZk9dLLoafizCMB57wvVAIizeJfG+yxl1bj0qjYEwpqAp9gZkESjaSZ515soW6koj3ekCijIqw5bIGszZVUma1d3Wywp59/mJLhPpO5/j81jqTCpS+oVrTlLerFJL85EtzUWjC3OKIE/9lJuL9fRN195ewf6s3qH8hFLnL6+lZNOth+5syY1rS2/+YucB4yFncJ7bXtP+gCpHcNlsx8yEKTcfti4H74D/UOuYz3RXKC8STrTTTEdkEw506UAg0+yqNUwTlY93LxgFeWGF0HnzGHO7hbASMuYMaBl8knymTdxSUIe0HWJuf5M4AyXKXnXhvfsIUXX8AkRjY+NcRx1oeZW+L8aQwbDo5xUzEPbg3HNyIudNngLdHZCYn1vmpCjpMLLjAHOryAWBjUaUDbnHLX55raazSm2p3PmDWWOyFOlnJNnllyUxNSosd1oEmLBPmHvLbCaeuR2slsPUUhjcx7feyOapW4jk1078U1EdENX7DXJW9FHBcUIwYRKP7OLIEfTH3ZWOzDpS6M40f98PNr3PVyyTpO20eZBsITGjW5ka1d3iTl/YOdybeoBz5gryfr7bS2UUU02HWcXuGpiuukibxeMngt5jzUPufwnJgk0Y4hsQSWVUQERVwjThXwz5JlKj1D51xGyOAcU77Lt6gA+Uv72ybUnND8emQ8FnQpxDQ1UIVq5Nzl0/ZUWPMWS2wsjqCr6O4LQ150pPVlRZYwQwjQ9XdNtZrCkUTGa49wyJK/4l7D0+w9+bcdqU9X88uyx2Q7nZ3C56MDQ2P25r7FwzMGqtwkioJIhV4Lfh1S8brodS0qz/K5KAWi8FblH0DtjZUJfrWM0S2WG4/qTcxpFjHSM2Dsce6SeDVX0e6DY2Lu2m0QIXY0= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2c9f30dd-7cf8-40db-c128-08da6c6a7a9a X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2022 05:16:20.8922 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR01MB10211 Subject: [FFmpeg-devel] [PATCH 3/5] avcodec/vp56: Move VP8/9-only rac functions to a header of their own X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Nsdce2zPOGZg Also rename these functions from vp8_rac_* to vp89_rac_*. Signed-off-by: Andreas Rheinhardt --- libavcodec/vp56.h | 31 -------- libavcodec/vp8.c | 166 +++++++++++++++++++++--------------------- libavcodec/vp89_rac.h | 66 +++++++++++++++++ libavcodec/vp9.c | 49 +++++++------ libavcodec/vp9block.c | 84 ++++++++++----------- libavcodec/vp9mvs.c | 21 +++--- 6 files changed, 229 insertions(+), 188 deletions(-) create mode 100644 libavcodec/vp89_rac.h diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h index 08172e1987..174f126309 100644 --- a/libavcodec/vp56.h +++ b/libavcodec/vp56.h @@ -322,12 +322,6 @@ static av_always_inline int vp56_rac_get(VP56RangeCoder *c) return bit; } -// rounding is different than vp56_rac_get, is vp56_rac_get wrong? -static av_always_inline int vp8_rac_get(VP56RangeCoder *c) -{ - return vp56_rac_get_prob(c, 128); -} - static int vp56_rac_gets(VP56RangeCoder *c, int bits) { int value = 0; @@ -339,17 +333,6 @@ static int vp56_rac_gets(VP56RangeCoder *c, int bits) return value; } -static av_unused int vp8_rac_get_uint(VP56RangeCoder *c, int bits) -{ - int value = 0; - - while (bits--) { - value = (value << 1) | vp8_rac_get(c); - } - - return value; -} - // P(7) static av_unused int vp56_rac_gets_nn(VP56RangeCoder *c, int bits) { @@ -371,18 +354,4 @@ int vp56_rac_get_tree(VP56RangeCoder *c, return -tree->val; } -// how probabilities are associated with decisions is different I think -// well, the new scheme fits in the old but this way has one fewer branches per decision -static av_always_inline int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t (*tree)[2], - const uint8_t *probs) -{ - int i = 0; - - do { - i = tree[i][vp56_rac_get_prob(c, probs[i])]; - } while (i > 0); - - return -i; -} - #endif /* AVCODEC_VP56_H */ diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 9e7616990f..ade7769943 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -38,6 +38,7 @@ #include "thread.h" #include "threadframe.h" #include "vp8.h" +#include "vp89_rac.h" #include "vp8data.h" #if ARCH_ARM @@ -57,12 +58,12 @@ static int vp8_rac_get_sint(VP56RangeCoder *c, int bits) { int v; - if (!vp8_rac_get(c)) + if (!vp89_rac_get(c)) return 0; - v = vp8_rac_get_uint(c, bits); + v = vp89_rac_get_uint(c, bits); - if (vp8_rac_get(c)) + if (vp89_rac_get(c)) v = -v; return v; @@ -70,7 +71,7 @@ static int vp8_rac_get_sint(VP56RangeCoder *c, int bits) static int vp8_rac_get_nn(VP56RangeCoder *c) { - int v = vp8_rac_get_uint(c, 7) << 1; + int v = vp89_rac_get_uint(c, 7) << 1; return v + !v; } @@ -303,11 +304,11 @@ static void parse_segment_info(VP8Context *s) VP56RangeCoder *c = &s->c; int i; - s->segmentation.update_map = vp8_rac_get(c); - s->segmentation.update_feature_data = vp8_rac_get(c); + s->segmentation.update_map = vp89_rac_get(c); + s->segmentation.update_feature_data = vp89_rac_get(c); if (s->segmentation.update_feature_data) { - s->segmentation.absolute_vals = vp8_rac_get(c); + s->segmentation.absolute_vals = vp89_rac_get(c); for (i = 0; i < 4; i++) s->segmentation.base_quant[i] = vp8_rac_get_sint(c, 7); @@ -317,7 +318,7 @@ static void parse_segment_info(VP8Context *s) } if (s->segmentation.update_map) for (i = 0; i < 3; i++) - s->prob->segmentid[i] = vp8_rac_get(c) ? vp8_rac_get_uint(c, 8) : 255; + s->prob->segmentid[i] = vp89_rac_get(c) ? vp89_rac_get_uint(c, 8) : 255; } static void update_lf_deltas(VP8Context *s) @@ -326,19 +327,19 @@ static void update_lf_deltas(VP8Context *s) int i; for (i = 0; i < 4; i++) { - if (vp8_rac_get(c)) { - s->lf_delta.ref[i] = vp8_rac_get_uint(c, 6); + if (vp89_rac_get(c)) { + s->lf_delta.ref[i] = vp89_rac_get_uint(c, 6); - if (vp8_rac_get(c)) + if (vp89_rac_get(c)) s->lf_delta.ref[i] = -s->lf_delta.ref[i]; } } for (i = MODE_I4x4; i <= VP8_MVMODE_SPLIT; i++) { - if (vp8_rac_get(c)) { - s->lf_delta.mode[i] = vp8_rac_get_uint(c, 6); + if (vp89_rac_get(c)) { + s->lf_delta.mode[i] = vp89_rac_get_uint(c, 6); - if (vp8_rac_get(c)) + if (vp89_rac_get(c)) s->lf_delta.mode[i] = -s->lf_delta.mode[i]; } } @@ -350,7 +351,7 @@ static int setup_partitions(VP8Context *s, const uint8_t *buf, int buf_size) int i; int ret; - s->num_coeff_partitions = 1 << vp8_rac_get_uint(&s->c, 2); + s->num_coeff_partitions = 1 << vp89_rac_get_uint(&s->c, 2); buf += 3 * (s->num_coeff_partitions - 1); buf_size -= 3 * (s->num_coeff_partitions - 1); @@ -380,12 +381,12 @@ static void vp7_get_quants(VP8Context *s) { VP56RangeCoder *c = &s->c; - int yac_qi = vp8_rac_get_uint(c, 7); - int ydc_qi = vp8_rac_get(c) ? vp8_rac_get_uint(c, 7) : yac_qi; - int y2dc_qi = vp8_rac_get(c) ? vp8_rac_get_uint(c, 7) : yac_qi; - int y2ac_qi = vp8_rac_get(c) ? vp8_rac_get_uint(c, 7) : yac_qi; - int uvdc_qi = vp8_rac_get(c) ? vp8_rac_get_uint(c, 7) : yac_qi; - int uvac_qi = vp8_rac_get(c) ? vp8_rac_get_uint(c, 7) : yac_qi; + int yac_qi = vp89_rac_get_uint(c, 7); + int ydc_qi = vp89_rac_get(c) ? vp89_rac_get_uint(c, 7) : yac_qi; + int y2dc_qi = vp89_rac_get(c) ? vp89_rac_get_uint(c, 7) : yac_qi; + int y2ac_qi = vp89_rac_get(c) ? vp89_rac_get_uint(c, 7) : yac_qi; + int uvdc_qi = vp89_rac_get(c) ? vp89_rac_get_uint(c, 7) : yac_qi; + int uvac_qi = vp89_rac_get(c) ? vp89_rac_get_uint(c, 7) : yac_qi; s->qmat[0].luma_qmul[0] = vp7_ydc_qlookup[ydc_qi]; s->qmat[0].luma_qmul[1] = vp7_yac_qlookup[yac_qi]; @@ -400,7 +401,7 @@ static void vp8_get_quants(VP8Context *s) VP56RangeCoder *c = &s->c; int i, base_qi; - s->quant.yac_qi = vp8_rac_get_uint(c, 7); + s->quant.yac_qi = vp89_rac_get_uint(c, 7); s->quant.ydc_delta = vp8_rac_get_sint(c, 4); s->quant.y2dc_delta = vp8_rac_get_sint(c, 4); s->quant.y2ac_delta = vp8_rac_get_sint(c, 4); @@ -448,7 +449,7 @@ static VP56Frame ref_to_update(VP8Context *s, int update, VP56Frame ref) if (update) return VP56_FRAME_CURRENT; - switch (vp8_rac_get_uint(c, 2)) { + switch (vp89_rac_get_uint(c, 2)) { case 1: return VP56_FRAME_PREVIOUS; case 2: @@ -476,7 +477,7 @@ static void vp78_update_probability_tables(VP8Context *s) for (k = 0; k < 3; k++) for (l = 0; l < NUM_DCT_TOKENS-1; l++) if (vp56_rac_get_prob_branchy(c, vp8_token_update_probs[i][j][k][l])) { - int prob = vp8_rac_get_uint(c, 8); + int prob = vp89_rac_get_uint(c, 8); for (m = 0; vp8_coeff_band_indexes[j][m] >= 0; m++) s->prob->token[i][vp8_coeff_band_indexes[j][m]][k][l] = prob; } @@ -491,12 +492,12 @@ static void vp78_update_pred16x16_pred8x8_mvc_probabilities(VP8Context *s, VP56RangeCoder *c = &s->c; int i, j; - if (vp8_rac_get(c)) + if (vp89_rac_get(c)) for (i = 0; i < 4; i++) - s->prob->pred16x16[i] = vp8_rac_get_uint(c, 8); - if (vp8_rac_get(c)) + s->prob->pred16x16[i] = vp89_rac_get_uint(c, 8); + if (vp89_rac_get(c)) for (i = 0; i < 3; i++) - s->prob->pred8x8c[i] = vp8_rac_get_uint(c, 8); + s->prob->pred8x8c[i] = vp89_rac_get_uint(c, 8); // 17.2 MV probability update for (i = 0; i < 2; i++) @@ -509,8 +510,8 @@ static void update_refs(VP8Context *s) { VP56RangeCoder *c = &s->c; - int update_golden = vp8_rac_get(c); - int update_altref = vp8_rac_get(c); + int update_golden = vp89_rac_get(c); + int update_altref = vp89_rac_get(c); s->update_golden = ref_to_update(s, update_golden, VP56_FRAME_GOLDEN); s->update_altref = ref_to_update(s, update_altref, VP56_FRAME_GOLDEN2); @@ -621,10 +622,10 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si /* A. Dimension information (keyframes only) */ if (s->keyframe) { - width = vp8_rac_get_uint(c, 12); - height = vp8_rac_get_uint(c, 12); - hscale = vp8_rac_get_uint(c, 2); - vscale = vp8_rac_get_uint(c, 2); + width = vp89_rac_get_uint(c, 12); + height = vp89_rac_get_uint(c, 12); + hscale = vp89_rac_get_uint(c, 2); + vscale = vp89_rac_get_uint(c, 2); if (hscale || vscale) avpriv_request_sample(s->avctx, "Upscaling"); @@ -647,18 +648,18 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si /* B. Decoding information for all four macroblock-level features */ for (i = 0; i < 4; i++) { - s->feature_enabled[i] = vp8_rac_get(c); + s->feature_enabled[i] = vp89_rac_get(c); if (s->feature_enabled[i]) { - s->feature_present_prob[i] = vp8_rac_get_uint(c, 8); + s->feature_present_prob[i] = vp89_rac_get_uint(c, 8); for (j = 0; j < 3; j++) s->feature_index_prob[i][j] = - vp8_rac_get(c) ? vp8_rac_get_uint(c, 8) : 255; + vp89_rac_get(c) ? vp89_rac_get_uint(c, 8) : 255; if (vp7_feature_value_size[s->profile][i]) for (j = 0; j < 4; j++) s->feature_value[i][j] = - vp8_rac_get(c) ? vp8_rac_get_uint(c, vp7_feature_value_size[s->profile][i]) : 0; + vp89_rac_get(c) ? vp89_rac_get_uint(c, vp7_feature_value_size[s->profile][i]) : 0; } } @@ -683,7 +684,7 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si /* D. Golden frame update flag (a Flag) for interframes only */ if (!s->keyframe) { - s->update_golden = vp8_rac_get(c) ? VP56_FRAME_CURRENT : VP56_FRAME_NONE; + s->update_golden = vp89_rac_get(c) ? VP56_FRAME_CURRENT : VP56_FRAME_NONE; s->sign_bias[VP56_FRAME_GOLDEN] = 0; } @@ -692,36 +693,36 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si s->fade_present = 1; if (s->profile > 0) { - s->update_probabilities = vp8_rac_get(c); + s->update_probabilities = vp89_rac_get(c); if (!s->update_probabilities) s->prob[1] = s->prob[0]; if (!s->keyframe) - s->fade_present = vp8_rac_get(c); + s->fade_present = vp89_rac_get(c); } if (vpX_rac_is_end(c)) return AVERROR_INVALIDDATA; /* E. Fading information for previous frame */ - if (s->fade_present && vp8_rac_get(c)) { - alpha = (int8_t) vp8_rac_get_uint(c, 8); - beta = (int8_t) vp8_rac_get_uint(c, 8); + if (s->fade_present && vp89_rac_get(c)) { + alpha = (int8_t) vp89_rac_get_uint(c, 8); + beta = (int8_t) vp89_rac_get_uint(c, 8); } /* F. Loop filter type */ if (!s->profile) - s->filter.simple = vp8_rac_get(c); + s->filter.simple = vp89_rac_get(c); /* G. DCT coefficient ordering specification */ - if (vp8_rac_get(c)) + if (vp89_rac_get(c)) for (i = 1; i < 16; i++) - s->prob[0].scan[i] = ff_zigzag_scan[vp8_rac_get_uint(c, 4)]; + s->prob[0].scan[i] = ff_zigzag_scan[vp89_rac_get_uint(c, 4)]; /* H. Loop filter levels */ if (s->profile > 0) - s->filter.simple = vp8_rac_get(c); - s->filter.level = vp8_rac_get_uint(c, 6); - s->filter.sharpness = vp8_rac_get_uint(c, 3); + s->filter.simple = vp89_rac_get(c); + s->filter.level = vp89_rac_get_uint(c, 6); + s->filter.sharpness = vp89_rac_get_uint(c, 3); /* I. DCT coefficient probability update; 13.3 Token Probability Updates */ vp78_update_probability_tables(s); @@ -730,8 +731,8 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si /* J. The remaining frame header data occurs ONLY FOR INTERFRAMES */ if (!s->keyframe) { - s->prob->intra = vp8_rac_get_uint(c, 8); - s->prob->last = vp8_rac_get_uint(c, 8); + s->prob->intra = vp89_rac_get_uint(c, 8); + s->prob->last = vp89_rac_get_uint(c, 8); vp78_update_pred16x16_pred8x8_mvc_probabilities(s, VP7_MVC_SIZE); } @@ -815,23 +816,23 @@ static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si buf_size -= header_size; if (s->keyframe) { - s->colorspace = vp8_rac_get(c); + s->colorspace = vp89_rac_get(c); if (s->colorspace) av_log(s->avctx, AV_LOG_WARNING, "Unspecified colorspace\n"); - s->fullrange = vp8_rac_get(c); + s->fullrange = vp89_rac_get(c); } - if ((s->segmentation.enabled = vp8_rac_get(c))) + if ((s->segmentation.enabled = vp89_rac_get(c))) parse_segment_info(s); else s->segmentation.update_map = 0; // FIXME: move this to some init function? - s->filter.simple = vp8_rac_get(c); - s->filter.level = vp8_rac_get_uint(c, 6); - s->filter.sharpness = vp8_rac_get_uint(c, 3); + s->filter.simple = vp89_rac_get(c); + s->filter.level = vp89_rac_get_uint(c, 6); + s->filter.sharpness = vp89_rac_get_uint(c, 3); - if ((s->lf_delta.enabled = vp8_rac_get(c))) { - s->lf_delta.update = vp8_rac_get(c); + if ((s->lf_delta.enabled = vp89_rac_get(c))) { + s->lf_delta.update = vp89_rac_get(c); if (s->lf_delta.update) update_lf_deltas(s); } @@ -851,26 +852,26 @@ static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si if (!s->keyframe) { update_refs(s); - s->sign_bias[VP56_FRAME_GOLDEN] = vp8_rac_get(c); - s->sign_bias[VP56_FRAME_GOLDEN2 /* altref */] = vp8_rac_get(c); + s->sign_bias[VP56_FRAME_GOLDEN] = vp89_rac_get(c); + s->sign_bias[VP56_FRAME_GOLDEN2 /* altref */] = vp89_rac_get(c); } // if we aren't saving this frame's probabilities for future frames, // make a copy of the current probabilities - if (!(s->update_probabilities = vp8_rac_get(c))) + if (!(s->update_probabilities = vp89_rac_get(c))) s->prob[1] = s->prob[0]; - s->update_last = s->keyframe || vp8_rac_get(c); + s->update_last = s->keyframe || vp89_rac_get(c); vp78_update_probability_tables(s); - if ((s->mbskip_enabled = vp8_rac_get(c))) - s->prob->mbskip = vp8_rac_get_uint(c, 8); + if ((s->mbskip_enabled = vp89_rac_get(c))) + s->prob->mbskip = vp89_rac_get_uint(c, 8); if (!s->keyframe) { - s->prob->intra = vp8_rac_get_uint(c, 8); - s->prob->last = vp8_rac_get_uint(c, 8); - s->prob->golden = vp8_rac_get_uint(c, 8); + s->prob->intra = vp89_rac_get_uint(c, 8); + s->prob->last = vp89_rac_get_uint(c, 8); + s->prob->golden = vp89_rac_get_uint(c, 8); vp78_update_pred16x16_pred8x8_mvc_probabilities(s, VP8_MVC_SIZE); } @@ -1265,7 +1266,7 @@ void decode_intra4x4_modes(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, for (x = 0; x < 4; x++) { const uint8_t *ctx; ctx = vp8_pred4x4_prob_intra[top[x]][left[y]]; - *intra4x4 = vp8_rac_get_tree(c, vp8_pred4x4_tree, ctx); + *intra4x4 = vp89_rac_get_tree(c, vp8_pred4x4_tree, ctx); left[y] = top[x] = *intra4x4; intra4x4++; } @@ -1273,8 +1274,8 @@ void decode_intra4x4_modes(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, } else { int i; for (i = 0; i < 16; i++) - intra4x4[i] = vp8_rac_get_tree(c, vp8_pred4x4_tree, - vp8_pred4x4_prob_inter); + intra4x4[i] = vp89_rac_get_tree(c, vp8_pred4x4_tree, + vp8_pred4x4_prob_inter); } } @@ -1294,8 +1295,8 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, for (i = 0; i < 4; i++) { if (s->feature_enabled[i]) { if (vp56_rac_get_prob_branchy(c, s->feature_present_prob[i])) { - int index = vp8_rac_get_tree(c, vp7_feature_index_tree, - s->feature_index_prob[i]); + int index = vp89_rac_get_tree(c, vp7_feature_index_tree, + s->feature_index_prob[i]); av_log(s->avctx, AV_LOG_WARNING, "Feature %s present in macroblock (value 0x%x)\n", vp7_feature_name[i], s->feature_value[i][index]); @@ -1312,8 +1313,8 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, mb->skip = s->mbskip_enabled ? vp56_rac_get_prob(c, s->prob->mbskip) : 0; if (s->keyframe) { - mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_intra, - vp8_pred16x16_prob_intra); + mb->mode = vp89_rac_get_tree(c, vp8_pred16x16_tree_intra, + vp8_pred16x16_prob_intra); if (mb->mode == MODE_I4x4) { decode_intra4x4_modes(s, c, mb, mb_x, 1, layout); @@ -1327,8 +1328,8 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, AV_WN32A(s->intra4x4_pred_mode_left, modes); } - mb->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, - vp8_pred8x8c_prob_intra); + mb->chroma_pred_mode = vp89_rac_get_tree(c, vp8_pred8x8c_tree, + vp8_pred8x8c_prob_intra); mb->ref_frame = VP56_FRAME_CURRENT; } else if (vp56_rac_get_prob_branchy(c, s->prob->intra)) { // inter MB, 16.2 @@ -1347,13 +1348,14 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, vp8_decode_mvs(s, mv_bounds, mb, mb_x, mb_y, layout); } else { // intra MB, 16.1 - mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_inter, s->prob->pred16x16); + mb->mode = vp89_rac_get_tree(c, vp8_pred16x16_tree_inter, + s->prob->pred16x16); if (mb->mode == MODE_I4x4) decode_intra4x4_modes(s, c, mb, mb_x, 0, layout); - mb->chroma_pred_mode = vp8_rac_get_tree(c, vp8_pred8x8c_tree, - s->prob->pred8x8c); + mb->chroma_pred_mode = vp89_rac_get_tree(c, vp8_pred8x8c_tree, + s->prob->pred8x8c); mb->ref_frame = VP56_FRAME_CURRENT; mb->partitioning = VP8_SPLITMVMODE_NONE; AV_ZERO32(&mb->bmv[0]); @@ -1423,7 +1425,7 @@ skip_eob: } token_prob = probs[i + 1][2]; } - block[scan[i]] = (vp8_rac_get(&c) ? -coeff : coeff) * qmul[!!i]; + block[scan[i]] = (vp89_rac_get(&c) ? -coeff : coeff) * qmul[!!i]; } while (++i < 16); *r = c; diff --git a/libavcodec/vp89_rac.h b/libavcodec/vp89_rac.h new file mode 100644 index 0000000000..382c8ee64d --- /dev/null +++ b/libavcodec/vp89_rac.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2006 Aurelien Jacobs + * + * 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 + */ + +/** + * @file + * Range decoder functions common to VP8 and VP9 + */ + +#ifndef AVCODEC_VP89_RAC_H +#define AVCODEC_VP89_RAC_H + +#include + +#include "libavutil/attributes.h" + +#include "vp56.h" + +// rounding is different than vp56_rac_get, is vp56_rac_get wrong? +static av_always_inline int vp89_rac_get(VP56RangeCoder *c) +{ + return vp56_rac_get_prob(c, 128); +} + +static av_unused int vp89_rac_get_uint(VP56RangeCoder *c, int bits) +{ + int value = 0; + + while (bits--) { + value = (value << 1) | vp89_rac_get(c); + } + + return value; +} + +// how probabilities are associated with decisions is different I think +// well, the new scheme fits in the old but this way has one fewer branches per decision +static av_always_inline int vp89_rac_get_tree(VP56RangeCoder *c, const int8_t (*tree)[2], + const uint8_t *probs) +{ + int i = 0; + + do { + i = tree[i][vp56_rac_get_prob(c, probs[i])]; + } while (i > 0); + + return -i; +} + +#endif /* AVCODEC_VP89_RAC_H */ diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 12ec87992c..57ad8623a8 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -35,6 +35,7 @@ #include "videodsp.h" #include "vp56.h" +#include "vp89_rac.h" #include "vp9.h" #include "vp9data.h" #include "vp9dec.h" @@ -419,16 +420,16 @@ static int update_prob(VP56RangeCoder *c, int p) * updates vs. the 'fine, exact' updates further down the range, which * adds one extra dimension to this differential update model. */ - if (!vp8_rac_get(c)) { - d = vp8_rac_get_uint(c, 4) + 0; - } else if (!vp8_rac_get(c)) { - d = vp8_rac_get_uint(c, 4) + 16; - } else if (!vp8_rac_get(c)) { - d = vp8_rac_get_uint(c, 5) + 32; + if (!vp89_rac_get(c)) { + d = vp89_rac_get_uint(c, 4) + 0; + } else if (!vp89_rac_get(c)) { + d = vp89_rac_get_uint(c, 4) + 16; + } else if (!vp89_rac_get(c)) { + d = vp89_rac_get_uint(c, 5) + 32; } else { - d = vp8_rac_get_uint(c, 7); + d = vp89_rac_get_uint(c, 7); if (d >= 65) - d = (d << 1) - 65 + vp8_rac_get(c); + d = (d << 1) - 65 + vp89_rac_get(c); d += 64; av_assert2(d < FF_ARRAY_ELEMS(inv_map_table)); } @@ -905,9 +906,9 @@ static int decode_frame_header(AVCodecContext *avctx, if (s->s.h.lossless) { s->s.h.txfmmode = TX_4X4; } else { - s->s.h.txfmmode = vp8_rac_get_uint(&s->c, 2); + s->s.h.txfmmode = vp89_rac_get_uint(&s->c, 2); if (s->s.h.txfmmode == 3) - s->s.h.txfmmode += vp8_rac_get(&s->c); + s->s.h.txfmmode += vp89_rac_get(&s->c); if (s->s.h.txfmmode == TX_SWITCHABLE) { for (i = 0; i < 2; i++) @@ -929,7 +930,7 @@ static int decode_frame_header(AVCodecContext *avctx, // coef updates for (i = 0; i < 4; i++) { uint8_t (*ref)[2][6][6][3] = s->prob_ctx[c].coef[i]; - if (vp8_rac_get(&s->c)) { + if (vp89_rac_get(&s->c)) { for (j = 0; j < 2; j++) for (k = 0; k < 2; k++) for (l = 0; l < 6; l++) @@ -986,9 +987,9 @@ static int decode_frame_header(AVCodecContext *avctx, s->prob.p.intra[i] = update_prob(&s->c, s->prob.p.intra[i]); if (s->s.h.allowcompinter) { - s->s.h.comppredmode = vp8_rac_get(&s->c); + s->s.h.comppredmode = vp89_rac_get(&s->c); if (s->s.h.comppredmode) - s->s.h.comppredmode += vp8_rac_get(&s->c); + s->s.h.comppredmode += vp89_rac_get(&s->c); if (s->s.h.comppredmode == PRED_SWITCHABLE) for (i = 0; i < 5; i++) if (vp56_rac_get_prob_branchy(&s->c, 252)) @@ -1033,26 +1034,26 @@ static int decode_frame_header(AVCodecContext *avctx, // mv fields don't use the update_prob subexp model for some reason for (i = 0; i < 3; i++) if (vp56_rac_get_prob_branchy(&s->c, 252)) - s->prob.p.mv_joint[i] = (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + s->prob.p.mv_joint[i] = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; for (i = 0; i < 2; i++) { if (vp56_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].sign = - (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + (vp89_rac_get_uint(&s->c, 7) << 1) | 1; for (j = 0; j < 10; j++) if (vp56_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].classes[j] = - (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + (vp89_rac_get_uint(&s->c, 7) << 1) | 1; if (vp56_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].class0 = - (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + (vp89_rac_get_uint(&s->c, 7) << 1) | 1; for (j = 0; j < 10; j++) if (vp56_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].bits[j] = - (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + (vp89_rac_get_uint(&s->c, 7) << 1) | 1; } for (i = 0; i < 2; i++) { @@ -1060,23 +1061,23 @@ static int decode_frame_header(AVCodecContext *avctx, for (k = 0; k < 3; k++) if (vp56_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].class0_fp[j][k] = - (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + (vp89_rac_get_uint(&s->c, 7) << 1) | 1; for (j = 0; j < 3; j++) if (vp56_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].fp[j] = - (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + (vp89_rac_get_uint(&s->c, 7) << 1) | 1; } if (s->s.h.highprecisionmvs) { for (i = 0; i < 2; i++) { if (vp56_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].class0_hp = - (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + (vp89_rac_get_uint(&s->c, 7) << 1) | 1; if (vp56_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].hp = - (vp8_rac_get_uint(&s->c, 7) << 1) | 1; + (vp89_rac_get_uint(&s->c, 7) << 1) | 1; } } } @@ -1099,11 +1100,11 @@ static void decode_sb(VP9TileData *td, int row, int col, VP9Filter *lflvl, int bytesperpixel = s->bytesperpixel; if (bl == BL_8X8) { - bp = vp8_rac_get_tree(td->c, ff_vp9_partition_tree, p); + bp = vp89_rac_get_tree(td->c, ff_vp9_partition_tree, p); ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp); } else if (col + hbs < s->cols) { // FIXME why not <=? if (row + hbs < s->rows) { // FIXME why not <=? - bp = vp8_rac_get_tree(td->c, ff_vp9_partition_tree, p); + bp = vp89_rac_get_tree(td->c, ff_vp9_partition_tree, p); switch (bp) { case PARTITION_NONE: ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp); diff --git a/libavcodec/vp9block.c b/libavcodec/vp9block.c index 5fdda63545..f5088e3b59 100644 --- a/libavcodec/vp9block.c +++ b/libavcodec/vp9block.c @@ -25,6 +25,7 @@ #include "threadframe.h" #include "vp56.h" +#include "vp89_rac.h" #include "vp9.h" #include "vp9data.h" #include "vp9dec.h" @@ -100,7 +101,8 @@ static void decode_mode(VP9TileData *td) b->seg_id = 0; } else if (s->s.h.keyframe || s->s.h.intraonly) { b->seg_id = !s->s.h.segmentation.update_map ? 0 : - vp8_rac_get_tree(td->c, ff_vp9_segmentation_tree, s->s.h.segmentation.prob); + vp89_rac_get_tree(td->c, ff_vp9_segmentation_tree, + s->s.h.segmentation.prob); } else if (!s->s.h.segmentation.update_map || (s->s.h.segmentation.temporal && vp56_rac_get_prob_branchy(td->c, @@ -126,8 +128,8 @@ static void decode_mode(VP9TileData *td) memset(&s->above_segpred_ctx[col], 1, w4); memset(&td->left_segpred_ctx[row7], 1, h4); } else { - b->seg_id = vp8_rac_get_tree(td->c, ff_vp9_segmentation_tree, - s->s.h.segmentation.prob); + b->seg_id = vp89_rac_get_tree(td->c, ff_vp9_segmentation_tree, + s->s.h.segmentation.prob); memset(&s->above_segpred_ctx[col], 0, w4); memset(&td->left_segpred_ctx[row7], 0, h4); @@ -221,11 +223,11 @@ static void decode_mode(VP9TileData *td) // necessary, they're just there to make the code slightly // simpler for now b->mode[0] = - a[0] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - ff_vp9_default_kf_ymode_probs[a[0]][l[0]]); + a[0] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + ff_vp9_default_kf_ymode_probs[a[0]][l[0]]); if (b->bs != BS_8x4) { - b->mode[1] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - ff_vp9_default_kf_ymode_probs[a[1]][b->mode[0]]); + b->mode[1] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + ff_vp9_default_kf_ymode_probs[a[1]][b->mode[0]]); l[0] = a[1] = b->mode[1]; } else { @@ -235,11 +237,11 @@ static void decode_mode(VP9TileData *td) } if (b->bs != BS_4x8) { b->mode[2] = - a[0] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - ff_vp9_default_kf_ymode_probs[a[0]][l[1]]); + a[0] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + ff_vp9_default_kf_ymode_probs[a[0]][l[1]]); if (b->bs != BS_8x4) { - b->mode[3] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - ff_vp9_default_kf_ymode_probs[a[1]][b->mode[2]]); + b->mode[3] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + ff_vp9_default_kf_ymode_probs[a[1]][b->mode[2]]); l[1] = a[1] = b->mode[3]; } else { @@ -254,8 +256,8 @@ static void decode_mode(VP9TileData *td) b->mode[3] = b->mode[1]; } } else { - b->mode[0] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - ff_vp9_default_kf_ymode_probs[*a][*l]); + b->mode[0] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + ff_vp9_default_kf_ymode_probs[*a][*l]); b->mode[3] = b->mode[2] = b->mode[1] = b->mode[0]; @@ -263,28 +265,28 @@ static void decode_mode(VP9TileData *td) memset(a, b->mode[0], ff_vp9_bwh_tab[0][b->bs][0]); memset(l, b->mode[0], ff_vp9_bwh_tab[0][b->bs][1]); } - b->uvmode = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - ff_vp9_default_kf_uvmode_probs[b->mode[3]]); + b->uvmode = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + ff_vp9_default_kf_uvmode_probs[b->mode[3]]); } else if (b->intra) { b->comp = 0; if (b->bs > BS_8x8) { - b->mode[0] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - s->prob.p.y_mode[0]); + b->mode[0] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + s->prob.p.y_mode[0]); td->counts.y_mode[0][b->mode[0]]++; if (b->bs != BS_8x4) { - b->mode[1] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - s->prob.p.y_mode[0]); + b->mode[1] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + s->prob.p.y_mode[0]); td->counts.y_mode[0][b->mode[1]]++; } else { b->mode[1] = b->mode[0]; } if (b->bs != BS_4x8) { - b->mode[2] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - s->prob.p.y_mode[0]); + b->mode[2] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + s->prob.p.y_mode[0]); td->counts.y_mode[0][b->mode[2]]++; if (b->bs != BS_8x4) { - b->mode[3] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - s->prob.p.y_mode[0]); + b->mode[3] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + s->prob.p.y_mode[0]); td->counts.y_mode[0][b->mode[3]]++; } else { b->mode[3] = b->mode[2]; @@ -299,15 +301,15 @@ static void decode_mode(VP9TileData *td) }; int sz = size_group[b->bs]; - b->mode[0] = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - s->prob.p.y_mode[sz]); + b->mode[0] = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + s->prob.p.y_mode[sz]); b->mode[1] = b->mode[2] = b->mode[3] = b->mode[0]; td->counts.y_mode[sz][b->mode[3]]++; } - b->uvmode = vp8_rac_get_tree(td->c, ff_vp9_intramode_tree, - s->prob.p.uv_mode[b->mode[3]]); + b->uvmode = vp89_rac_get_tree(td->c, ff_vp9_intramode_tree, + s->prob.p.uv_mode[b->mode[3]]); td->counts.uv_mode[b->mode[3]][b->uvmode]++; } else { static const uint8_t inter_mode_ctx_lut[14][14] = { @@ -587,8 +589,8 @@ static void decode_mode(VP9TileData *td) int c = inter_mode_ctx_lut[s->above_mode_ctx[col + off[b->bs]]] [td->left_mode_ctx[row7 + off[b->bs]]]; - b->mode[0] = vp8_rac_get_tree(td->c, ff_vp9_inter_mode_tree, - s->prob.p.mv_mode[c]); + b->mode[0] = vp89_rac_get_tree(td->c, ff_vp9_inter_mode_tree, + s->prob.p.mv_mode[c]); b->mode[1] = b->mode[2] = b->mode[3] = b->mode[0]; @@ -612,8 +614,8 @@ static void decode_mode(VP9TileData *td) c = 3; } - filter_id = vp8_rac_get_tree(td->c, ff_vp9_filter_tree, - s->prob.p.filter[c]); + filter_id = vp89_rac_get_tree(td->c, ff_vp9_filter_tree, + s->prob.p.filter[c]); td->counts.filter[c][filter_id]++; b->filter = ff_vp9_filter_lut[filter_id]; } else { @@ -623,14 +625,14 @@ static void decode_mode(VP9TileData *td) if (b->bs > BS_8x8) { int c = inter_mode_ctx_lut[s->above_mode_ctx[col]][td->left_mode_ctx[row7]]; - b->mode[0] = vp8_rac_get_tree(td->c, ff_vp9_inter_mode_tree, - s->prob.p.mv_mode[c]); + b->mode[0] = vp89_rac_get_tree(td->c, ff_vp9_inter_mode_tree, + s->prob.p.mv_mode[c]); td->counts.mv_mode[c][b->mode[0] - 10]++; ff_vp9_fill_mv(td, b->mv[0], b->mode[0], 0); if (b->bs != BS_8x4) { - b->mode[1] = vp8_rac_get_tree(td->c, ff_vp9_inter_mode_tree, - s->prob.p.mv_mode[c]); + b->mode[1] = vp89_rac_get_tree(td->c, ff_vp9_inter_mode_tree, + s->prob.p.mv_mode[c]); td->counts.mv_mode[c][b->mode[1] - 10]++; ff_vp9_fill_mv(td, b->mv[1], b->mode[1], 1); } else { @@ -640,14 +642,14 @@ static void decode_mode(VP9TileData *td) } if (b->bs != BS_4x8) { - b->mode[2] = vp8_rac_get_tree(td->c, ff_vp9_inter_mode_tree, - s->prob.p.mv_mode[c]); + b->mode[2] = vp89_rac_get_tree(td->c, ff_vp9_inter_mode_tree, + s->prob.p.mv_mode[c]); td->counts.mv_mode[c][b->mode[2] - 10]++; ff_vp9_fill_mv(td, b->mv[2], b->mode[2], 2); if (b->bs != BS_8x4) { - b->mode[3] = vp8_rac_get_tree(td->c, ff_vp9_inter_mode_tree, - s->prob.p.mv_mode[c]); + b->mode[3] = vp89_rac_get_tree(td->c, ff_vp9_inter_mode_tree, + s->prob.p.mv_mode[c]); td->counts.mv_mode[c][b->mode[3] - 10]++; ff_vp9_fill_mv(td, b->mv[3], b->mode[3], 3); } else { @@ -909,9 +911,9 @@ skip_eob: if (!--band_left) band_left = band_counts[++band]; if (is_tx32x32) - STORE_COEF(coef, rc, (int)((vp8_rac_get(c) ? -val : val) * (unsigned)qmul[!!i]) / 2); + STORE_COEF(coef, rc, (int)((vp89_rac_get(c) ? -val : val) * (unsigned)qmul[!!i]) / 2); else - STORE_COEF(coef, rc, (vp8_rac_get(c) ? -val : val) * (unsigned)qmul[!!i]); + STORE_COEF(coef, rc, (vp89_rac_get(c) ? -val : val) * (unsigned)qmul[!!i]); nnz = (1 + cache[nb[i][0]] + cache[nb[i][1]]) >> 1; tp = p[band][nnz]; } while (++i < n_coeffs); diff --git a/libavcodec/vp9mvs.c b/libavcodec/vp9mvs.c index ddce9b6c84..cee91dc34d 100644 --- a/libavcodec/vp9mvs.c +++ b/libavcodec/vp9mvs.c @@ -23,6 +23,7 @@ #include "threadframe.h" #include "vp56.h" +#include "vp89_rac.h" #include "vp9.h" #include "vp9data.h" #include "vp9dec.h" @@ -237,8 +238,8 @@ static av_always_inline int read_mv_component(VP9TileData *td, int idx, int hp) { VP9Context *s = td->s; int bit, sign = vp56_rac_get_prob(td->c, s->prob.p.mv_comp[idx].sign); - int n, c = vp8_rac_get_tree(td->c, ff_vp9_mv_class_tree, - s->prob.p.mv_comp[idx].classes); + int n, c = vp89_rac_get_tree(td->c, ff_vp9_mv_class_tree, + s->prob.p.mv_comp[idx].classes); td->counts.mv_comp[idx].sign[sign]++; td->counts.mv_comp[idx].classes[c]++; @@ -251,8 +252,8 @@ static av_always_inline int read_mv_component(VP9TileData *td, int idx, int hp) td->counts.mv_comp[idx].bits[m][bit]++; } n <<= 3; - bit = vp8_rac_get_tree(td->c, ff_vp9_mv_fp_tree, - s->prob.p.mv_comp[idx].fp); + bit = vp89_rac_get_tree(td->c, ff_vp9_mv_fp_tree, + s->prob.p.mv_comp[idx].fp); n |= bit << 1; td->counts.mv_comp[idx].fp[bit]++; if (hp) { @@ -269,8 +270,8 @@ static av_always_inline int read_mv_component(VP9TileData *td, int idx, int hp) } else { n = vp56_rac_get_prob(td->c, s->prob.p.mv_comp[idx].class0); td->counts.mv_comp[idx].class0[n]++; - bit = vp8_rac_get_tree(td->c, ff_vp9_mv_fp_tree, - s->prob.p.mv_comp[idx].class0_fp[n]); + bit = vp89_rac_get_tree(td->c, ff_vp9_mv_fp_tree, + s->prob.p.mv_comp[idx].class0_fp[n]); td->counts.mv_comp[idx].class0_fp[n][bit]++; n = (n << 3) | (bit << 1); if (hp) { @@ -319,8 +320,8 @@ void ff_vp9_fill_mv(VP9TileData *td, VP56mv *mv, int mode, int sb) } } if (mode == NEWMV) { - enum MVJoint j = vp8_rac_get_tree(td->c, ff_vp9_mv_joint_tree, - s->prob.p.mv_joint); + enum MVJoint j = vp89_rac_get_tree(td->c, ff_vp9_mv_joint_tree, + s->prob.p.mv_joint); td->counts.mv_joint[j]++; if (j >= MV_JOINT_V) @@ -350,8 +351,8 @@ void ff_vp9_fill_mv(VP9TileData *td, VP56mv *mv, int mode, int sb) } } if (mode == NEWMV) { - enum MVJoint j = vp8_rac_get_tree(td->c, ff_vp9_mv_joint_tree, - s->prob.p.mv_joint); + enum MVJoint j = vp89_rac_get_tree(td->c, ff_vp9_mv_joint_tree, + s->prob.p.mv_joint); td->counts.mv_joint[j]++; if (j >= MV_JOINT_V) From patchwork Sat Jul 23 05:16:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36898 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp826371pzb; Fri, 22 Jul 2022 22:16:49 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vMvE3xt0abr9N4YF7D9+1sV1Qk2hRDVZMoFI1fe1FHqNFytHRZJFKabNm98xjqlsphfNn4 X-Received: by 2002:aa7:df83:0:b0:43a:4b96:f126 with SMTP id b3-20020aa7df83000000b0043a4b96f126mr2801781edy.309.1658553408994; Fri, 22 Jul 2022 22:16:48 -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 su7-20020a17090703c700b007156fc5217bsi1427196ejb.899.2022.07.22.22.16.48; Fri, 22 Jul 2022 22:16:48 -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=@outlook.com header.s=selector1 header.b=sbF91rAV; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E4F2F68B4FD; Sat, 23 Jul 2022 08:16:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073013.outbound.protection.outlook.com [40.92.73.13]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AAB7768B4FD for ; Sat, 23 Jul 2022 08:16:30 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LtRCqJ5eGhYTDGU/GiMV+H8Okbsu6WHAIjk064L0ybvTQ+iXraKzWN012MH7C+ik14oZ8rBWhrtVK4VQG7PJPaa2wRSkIJ9FmJz/jQinX6K9vuTZaFKLfHiBa8WHLPI7SE3HCZcTBRhFdmCaZCdzpHIJXzn+5eSO02HNNQk5fm1Srq6yFEhPRmjTjBYXX/oZXqVLLvloMAocrv8mQaPt+/3G+9WfX3H4TRhgyUaBD+vPbyk1KWKmyehDFJ1UXxx9Sn79T1tVbmqgqHwVCoc/jsZnjtF4/SkpgnHErs8bHim7Ysu2U9UvLUyvUUV3SunUp0fNw6z1It6BgR2y5mdQeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=W1t7l3idM8rmUjl2risoI+hyiS9fQ0eYmesUxj7akVU=; b=Fyi07J3xXChqClwQjoNIdOAWY0z3iw0j8y4k2lngZhF/4IiD9vcNFc8WjFZkAO8+vaDKPXqiF390Wpgm7lVOCklhLNKan9uSorO98h9xsJj0hXQs5MJeu7Dlr9b3EoS/H656dPLkelVHQJgLRxJDl7Tm1E3iVseQvJIcsM6o4u3e/u3Ib/Njbsv+vJSkhDSVKpPtPyiaU3p9sZxtoklMCpKRdNmeqUFlPYf9NOWwlqztDjLaEFJ1REx4KvtMZFsoOiH7CI3uEN7avJUjx7NKaeKFF8z9pDy+3FEct1gwruB1HgSzAKXWX50V3F0yTVlSIDVf6Di8p1mUEa3AOJCh3A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=W1t7l3idM8rmUjl2risoI+hyiS9fQ0eYmesUxj7akVU=; b=sbF91rAV9YU/OJdiAHqLobd1wi2UsfGHvanixMdrJ9mQtXgNVTTFhSTqwSbVaGNkIlJ2mxNECy2YZb/+MyqVpz4CafHfUkMAjKfOcMbUW/4LSBnW3mEhTp51kjMveLhtCMCQX2RlUQhrQNTxBIMCqUw+FqEENmTMSAWkbtIbNs3MJMW1EQRefVI/8HsI88RcFBFAMyLP6G6VTnzC1jiy5nraUuuG5iULURI0P7OaaflqUpcMepYcAHSEk0n2gZysw5MjkXWvmVhRY6XSW+I6yRefA4ZuaFTo9X/VuvY53cgrr+MSPXNOCRn+y7rWOXJwQWZmGjVKKB712/uZX2VXyQ== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by DU0PR01MB10211.eurprd01.prod.exchangelabs.com (2603:10a6:10:315::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.20; Sat, 23 Jul 2022 05:16:26 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5458.020; Sat, 23 Jul 2022 05:16:26 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Jul 2022 07:16:09 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [Iv/qOydg18u1S0cToc17GjZX55fcxrCA] X-ClientProxiedBy: FR3P281CA0037.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4a::21) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220723051610.287773-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 72492227-2130-4b96-c6e7-08da6c6a7dda X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiToJ1zOhCTJMxCCEpyIerpRy9IGvfQkHTzeDpDRDq+f2E1dy5YT0+axDqruuD/YMWUsl98YjBXekymhV3UJv8SF6txT6wkpOt7NRymUXglt3jmvQu0EC5SkS1NXULLCZC50UT3ql/ClIwwqPqq7cO9idupLDpzZNHjmbRONWed3lQJaBreoqOdRl4O6JWNJAbo3LdUe94HBKAKz7a4Gf9hGJ0DZYCRK/87m08zks5nWiCG0Xm2HBcABrJDYELsGFDjU5Z+qSx7jhbRZ1htwNz3tvEkvvffMkSkGfgPWvZ5QTJ3pTwRhsRJwLgg2a+p0f5EFuhq4NdOtUW9sjw0Gcp5cJwnGYfrSLDu+9uFo58CpePT1ox86GpMHkVoaoIKtx1n58yXtiYHRt1FKk32No8vbNCC/Pi0P60McR6xv4d+r3eg4Tq+4Frq0XTArifvUop9cMllHjlsch2r4WoRxDe+HO+2xI6mAATyQAWU+paqPR5AQZUQ2Q2vG2Ff0SSzs4j1CR+6KUpQ7yDN+Q3/hR6lnOKvfypzqZe/fexBI0I9MnRsLtooAeLa86QJepB4yCtQRNvEIHjibOVkpImKuAMHKYNRW4N6OR8fgUuMCGVMwyqRVuO6utTgJgVbHi1acuf3S70EzEeB3wQ3rOI9OaOa6gcbloPa0EaQnkwFu9hEod6crEh6agVOl5FcnzF7BgiNk/yBFXDxbGWDS7daKQ8dKJ9MkXfdI72rpTfCoiEwqFI3Yw6wuCZLNDHLkmNUkztY= X-MS-TrafficTypeDiagnostic: DU0PR01MB10211:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: V46XPsUebpetwo1uQMwAS/0TqeeHv/Sc6hEugSMKoKKOI9OBEda7Hv5z+mBYHTqHdnf8fIwuS8csv/gBo3QXXTA4vh4sEui4JfloRAbe0lOXTQ8fqQRDNPwVfSm4NMF8iVxNWZ50fXzZQ8aAmXAgByvJ5npnTPWpmEhbCbDPzPWATwKZDhZrxy+bb8KIMSKd/u+3MHRoEkWWMIxIJQtte81i+EcstiC3Ii+7MJ9A0X785hUYNyBWpxkge6qAULqjXPxlG+/zhwqk5eBPI42bLFB69wdcHGuT9ZeuFfiWfSZpj9rLFittrHlyAtNShQVFA2YlbHNH9/vZ1QGPMgCz4CbIF4eL7J29PzHxGhQHRGFGCdH3tJMuxgpjk8Lpojk1RBBp3130Hpm6OuUhIpNevd8rz0+Oyu7hL7zsGtNG8P9sDrTQmhbxjtdoqtC+yMasPvj5FPIEtLrJBcj2MH7Udq2B5EOkMo6Dkojpv85Lpuqnxbu5hCjdI2qZvD4pqjLQ3WgmEPu0bwBn7ZRg/p/UL2Pa+v8FeA02M+lVD6ZFSHGhB8UWj8imn6JR4/TBnF93ctpBCp1b4GvV3A4l1FvCMwSbjoX4k1Jl6Z5kIruGm+Uu1WEhRXes58WTgm8AV+jLCTjq3xsbgxYayc7zoz+M+A== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: pg854Gbb6clnkh81T5wNGDrEyvDGSPhibkcTn2J0vgzBxlbbwz1F1zPpdU6kedVoBMkpRdVwA3XV7nlCHLWB94qzpZuGqjwVfaLQeDjkGr+rGk4lzzpi3UpfNrG5tvBotLjnwO3ltgJx3RAfuEmODz2SfJ9bR3fzDELUNH8onkdY8Aa2qZHfKQ0BJMRZvok+yMqeDhHXwq2N+hTb72qTqroI+fO5bzknaVBM8MS8KDAmqVmE4z22m0zlmZ/OWxbK33tctE628O1sJ5VQHG+W4fuSWCue1CN3vKcEq60gkvjR/nR4fl75qFzpSxFIrCjEjukElmDMonhYsMSXnT2qJhwcDFQaqkwcweDNxPhS/ozZFrQ2qEXm2AUpjrXFD+JVDfbqn7JCGwwXCtVhw5fJBuHvXWigicWKAuX9CLvy+QDf/FS2E62SWv/wfeCCPxH3DpaST9wdKM7kzUxjXZXbsuU+2o/PFWdq2G7Rv5zXZJJ2iEWkHY+HGXOyzfTtObBpewfQNuGFODCN5/FCqNnPGXto/rtvz3SwhXBNlcOWfRklAn6AUlOEfN8FybM8sL7II5Euox6ziCHZnVbV6lU2uumdtJcibCPQzmb9ud4vhRqM8y4kdlcjxzhmKvG3BKwUBLuXrC0EHxI6CWT9aq9O3f44q+VMWgF1v3Gvw+TiQ/WFiNiOSq0bbHvTn8CT+YBbOjBVrC1W7MaYMBsn32uHxeCDAAju0mEHL7flr33IsqWpLDTa/3jWliQA5ZrogX8MW2sLMxDpW0VBvf7hggi1btQ0FOHOVEdMxmkP9VvBQvZcmlg1wC1j+ICNq/sgGArJqCbaIp+r394GDGuqjfaZXdBoKaxd0XCqcHChlnoHm0ai9HMQXK3PZInvQs8hNLSafOzzfDXSDFEYWBqFBisp5ZpQ90d5490GIiHetXFDbNBlklmHT2DPFJTre7NfjKhCTkOyteUFqUdoS9uX3Ri7AFfrHPOI03gzgYu9k22yp+hpDEmut4N5cx/p6cqvR08XF5rgYPus12e9weg3lKsADRQu1q3TOOmUmZMRbw6veEj+5wuO3p+uwYi32vHl8CbuuFtk4Lzb2W8gERlqmCM+us7kebuPXY4QWRWV3BSechFsnjX/1+FlkAnDCnSDFzYTW2YYCjgKilvXK6F03moZCgz14TUSe4A3nHS8xQ9J+tM+FvYtzHPrMP2nB5V6RBC/1JjfAzekHoz94r5jEPBqbDtqpWk9jhS8mWxOhf7AwRoHokpzVq4EkAVU62eEv/y38EATBklE3Em9bD+rf5+qBXKrerUiJATITi8SdRSOSeo= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 72492227-2130-4b96-c6e7-08da6c6a7dda X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2022 05:16:26.3762 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR01MB10211 Subject: [FFmpeg-devel] [PATCH 4/5] avcodec/vp56: Move VP5-9 range coder functions to a header of their own X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: KDljRCk+98nl Also use a vpx prefix for them. Signed-off-by: Andreas Rheinhardt --- libavcodec/Makefile | 12 +- libavcodec/arm/vp8.h | 4 +- libavcodec/arm/vp8_armv6.S | 2 +- libavcodec/arm/{vp56_arith.h => vpx_arith.h} | 18 +- libavcodec/vp5.c | 63 +++---- libavcodec/vp56.c | 15 +- libavcodec/vp56.h | 118 +------------ libavcodec/vp6.c | 77 ++++----- libavcodec/vp8.c | 171 ++++++++++--------- libavcodec/vp8.h | 5 +- libavcodec/vp89_rac.h | 14 +- libavcodec/vp9.c | 73 ++++---- libavcodec/vp9block.c | 117 ++++++------- libavcodec/vp9dec.h | 7 +- libavcodec/vp9mvs.c | 12 +- libavcodec/{vp56rac.c => vpx_rac.c} | 6 +- libavcodec/vpx_rac.h | 135 +++++++++++++++ libavcodec/x86/{vp56_arith.h => vpx_arith.h} | 14 +- 18 files changed, 454 insertions(+), 409 deletions(-) rename libavcodec/arm/{vp56_arith.h => vpx_arith.h} (88%) rename libavcodec/{vp56rac.c => vpx_rac.c} (92%) create mode 100644 libavcodec/vpx_rac.h rename libavcodec/x86/{vp56_arith.h => vpx_arith.h} (83%) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index ef2318438b..a4fab108d6 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -737,11 +737,11 @@ OBJS-$(CONFIG_VORBIS_DECODER) += vorbisdec.o vorbisdsp.o vorbis.o \ OBJS-$(CONFIG_VORBIS_ENCODER) += vorbisenc.o vorbis.o \ vorbis_data.o OBJS-$(CONFIG_VP3_DECODER) += vp3.o -OBJS-$(CONFIG_VP5_DECODER) += vp5.o vp56.o vp56data.o vp56rac.o +OBJS-$(CONFIG_VP5_DECODER) += vp5.o vp56.o vp56data.o vpx_rac.o OBJS-$(CONFIG_VP6_DECODER) += vp6.o vp56.o vp56data.o \ - vp6dsp.o vp56rac.o -OBJS-$(CONFIG_VP7_DECODER) += vp8.o vp56rac.o -OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp56rac.o + vp6dsp.o vpx_rac.o +OBJS-$(CONFIG_VP7_DECODER) += vp8.o vpx_rac.o +OBJS-$(CONFIG_VP8_DECODER) += vp8.o vpx_rac.o OBJS-$(CONFIG_VP8_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_VP8_MEDIACODEC_DECODER) += mediacodecdec.o OBJS-$(CONFIG_VP8_QSV_DECODER) += qsvdec.o @@ -750,7 +750,7 @@ OBJS-$(CONFIG_VP8_VAAPI_ENCODER) += vaapi_encode_vp8.o OBJS-$(CONFIG_VP8_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_VP8_V4L2M2M_ENCODER) += v4l2_m2m_enc.o OBJS-$(CONFIG_VP9_DECODER) += vp9.o vp9data.o vp9dsp.o vp9lpf.o vp9recon.o \ - vp9block.o vp9prob.o vp9mvs.o vp56rac.o \ + vp9block.o vp9prob.o vp9mvs.o vpx_rac.o \ vp9dsp_8bpp.o vp9dsp_10bpp.o vp9dsp_12bpp.o OBJS-$(CONFIG_VP9_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_VP9_MEDIACODEC_DECODER) += mediacodecdec.o @@ -1234,7 +1234,7 @@ SKIPHEADERS += %_tablegen.h \ aaccoder_trellis.h \ aacenc_quantization.h \ aacenc_quantization_misc.h \ - $(ARCH)/vp56_arith.h \ + $(ARCH)/vpx_arith.h \ SKIPHEADERS-$(CONFIG_AMF) += amfenc.h SKIPHEADERS-$(CONFIG_D3D11VA) += d3d11va.h dxva2_internal.h diff --git a/libavcodec/arm/vp8.h b/libavcodec/arm/vp8.h index 965342d93b..7c59a7d63d 100644 --- a/libavcodec/arm/vp8.h +++ b/libavcodec/arm/vp8.h @@ -22,12 +22,12 @@ #include #include "config.h" -#include "libavcodec/vp56.h" +#include "libavcodec/vpx_rac.h" #include "libavcodec/vp8.h" #if HAVE_ARMV6_EXTERNAL #define vp8_decode_block_coeffs_internal ff_decode_block_coeffs_armv6 -int ff_decode_block_coeffs_armv6(VP56RangeCoder *rc, int16_t block[16], +int ff_decode_block_coeffs_armv6(VPXRangeCoder *rc, int16_t block[16], uint8_t probs[8][3][NUM_DCT_TOKENS-1], int i, uint8_t *token_prob, int16_t qmul[2]); #endif diff --git a/libavcodec/arm/vp8_armv6.S b/libavcodec/arm/vp8_armv6.S index e7d25a45c1..7ecf2641fb 100644 --- a/libavcodec/arm/vp8_armv6.S +++ b/libavcodec/arm/vp8_armv6.S @@ -65,7 +65,7 @@ T orrcs \cw, \cw, \t1 function ff_decode_block_coeffs_armv6, export=1 push {r0,r1,r4-r11,lr} - movrelx lr, X(ff_vp56_norm_shift) + movrelx lr, X(ff_vpx_norm_shift) ldrd r4, r5, [sp, #44] @ token_prob, qmul cmp r3, #0 ldr r11, [r5] diff --git a/libavcodec/arm/vp56_arith.h b/libavcodec/arm/vpx_arith.h similarity index 88% rename from libavcodec/arm/vp56_arith.h rename to libavcodec/arm/vpx_arith.h index feb1247916..1ead2284c3 100644 --- a/libavcodec/arm/vp56_arith.h +++ b/libavcodec/arm/vpx_arith.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVCODEC_ARM_VP56_ARITH_H -#define AVCODEC_ARM_VP56_ARITH_H +#ifndef AVCODEC_ARM_VPX_ARITH_H +#define AVCODEC_ARM_VPX_ARITH_H #if CONFIG_THUMB # define A(x) @@ -39,10 +39,10 @@ #if HAVE_ARMV6_INLINE -#define vp56_rac_get_prob vp56_rac_get_prob_armv6 -static inline int vp56_rac_get_prob_armv6(VP56RangeCoder *c, int pr) +#define vpx_rac_get_prob vp56_rac_get_prob_armv6 +static inline int vp56_rac_get_prob_armv6(VPXRangeCoder *c, int pr) { - unsigned shift = ff_vp56_norm_shift[c->high]; + unsigned shift = ff_vpx_norm_shift[c->high]; unsigned code_word = c->code_word << shift; unsigned high = c->high << shift; unsigned bit; @@ -76,10 +76,10 @@ static inline int vp56_rac_get_prob_armv6(VP56RangeCoder *c, int pr) return bit; } -#define vp56_rac_get_prob_branchy vp56_rac_get_prob_branchy_armv6 -static inline int vp56_rac_get_prob_branchy_armv6(VP56RangeCoder *c, int pr) +#define vpx_rac_get_prob_branchy vp56_rac_get_prob_branchy_armv6 +static inline int vp56_rac_get_prob_branchy_armv6(VPXRangeCoder *c, int pr) { - unsigned shift = ff_vp56_norm_shift[c->high]; + unsigned shift = ff_vpx_norm_shift[c->high]; unsigned code_word = c->code_word << shift; unsigned high = c->high << shift; unsigned low; @@ -118,4 +118,4 @@ static inline int vp56_rac_get_prob_branchy_armv6(VP56RangeCoder *c, int pr) #endif -#endif /* AVCODEC_ARM_VP56_ARITH_H */ +#endif /* AVCODEC_ARM_VPX_ARITH_H */ diff --git a/libavcodec/vp5.c b/libavcodec/vp5.c index de8846a867..8ba4de71e5 100644 --- a/libavcodec/vp5.c +++ b/libavcodec/vp5.c @@ -33,19 +33,20 @@ #include "vp56.h" #include "vp56data.h" #include "vp5data.h" +#include "vpx_rac.h" static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int rows, cols; int ret; - ret = ff_vp56_init_range_decoder(&s->c, buf, buf_size); + ret = ff_vpx_init_range_decoder(&s->c, buf, buf_size); if (ret < 0) return ret; - s->frames[VP56_FRAME_CURRENT]->key_frame = !vp56_rac_get(c); - vp56_rac_get(c); + s->frames[VP56_FRAME_CURRENT]->key_frame = !vpx_rac_get(c); + vpx_rac_get(c); ff_vp56_init_dequant(s, vp56_rac_gets(c, 6)); if (s->frames[VP56_FRAME_CURRENT]->key_frame) { @@ -55,7 +56,7 @@ static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) if(vp56_rac_gets(c, 5) > 5) return AVERROR_INVALIDDATA; vp56_rac_gets(c, 2); - if (vp56_rac_get(c)) { + if (vpx_rac_get(c)) { avpriv_report_missing_feature(s->avctx, "Interlacing"); return AVERROR_PATCHWELCOME; } @@ -87,16 +88,16 @@ static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) static void vp5_parse_vector_adjustment(VP56Context *s, VP56mv *vect) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; VP56Model *model = s->modelp; int comp, di; for (comp=0; comp<2; comp++) { int delta = 0; - if (vp56_rac_get_prob_branchy(c, model->vector_dct[comp])) { - int sign = vp56_rac_get_prob(c, model->vector_sig[comp]); - di = vp56_rac_get_prob(c, model->vector_pdi[comp][0]); - di |= vp56_rac_get_prob(c, model->vector_pdi[comp][1]) << 1; + if (vpx_rac_get_prob_branchy(c, model->vector_dct[comp])) { + int sign = vpx_rac_get_prob(c, model->vector_sig[comp]); + di = vpx_rac_get_prob(c, model->vector_pdi[comp][0]); + di |= vpx_rac_get_prob(c, model->vector_pdi[comp][1]) << 1; delta = vp56_rac_get_tree(c, ff_vp56_pva_tree, model->vector_pdv[comp]); delta = di | (delta << 2); @@ -111,30 +112,30 @@ static void vp5_parse_vector_adjustment(VP56Context *s, VP56mv *vect) static void vp5_parse_vector_models(VP56Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; VP56Model *model = s->modelp; int comp, node; for (comp=0; comp<2; comp++) { - if (vp56_rac_get_prob_branchy(c, vp5_vmc_pct[comp][0])) + if (vpx_rac_get_prob_branchy(c, vp5_vmc_pct[comp][0])) model->vector_dct[comp] = vp56_rac_gets_nn(c, 7); - if (vp56_rac_get_prob_branchy(c, vp5_vmc_pct[comp][1])) + if (vpx_rac_get_prob_branchy(c, vp5_vmc_pct[comp][1])) model->vector_sig[comp] = vp56_rac_gets_nn(c, 7); - if (vp56_rac_get_prob_branchy(c, vp5_vmc_pct[comp][2])) + if (vpx_rac_get_prob_branchy(c, vp5_vmc_pct[comp][2])) model->vector_pdi[comp][0] = vp56_rac_gets_nn(c, 7); - if (vp56_rac_get_prob_branchy(c, vp5_vmc_pct[comp][3])) + if (vpx_rac_get_prob_branchy(c, vp5_vmc_pct[comp][3])) model->vector_pdi[comp][1] = vp56_rac_gets_nn(c, 7); } for (comp=0; comp<2; comp++) for (node=0; node<7; node++) - if (vp56_rac_get_prob_branchy(c, vp5_vmc_pct[comp][4 + node])) + if (vpx_rac_get_prob_branchy(c, vp5_vmc_pct[comp][4 + node])) model->vector_pdv[comp][node] = vp56_rac_gets_nn(c, 7); } static int vp5_parse_coeff_models(VP56Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; VP56Model *model = s->modelp; uint8_t def_prob[11]; int node, cg, ctx; @@ -145,7 +146,7 @@ static int vp5_parse_coeff_models(VP56Context *s) for (pt=0; pt<2; pt++) for (node=0; node<11; node++) - if (vp56_rac_get_prob_branchy(c, vp5_dccv_pct[pt][node])) { + if (vpx_rac_get_prob_branchy(c, vp5_dccv_pct[pt][node])) { def_prob[node] = vp56_rac_gets_nn(c, 7); model->coeff_dccv[pt][node] = def_prob[node]; } else if (s->frames[VP56_FRAME_CURRENT]->key_frame) { @@ -156,7 +157,7 @@ static int vp5_parse_coeff_models(VP56Context *s) for (pt=0; pt<2; pt++) for (cg=0; cg<6; cg++) for (node=0; node<11; node++) - if (vp56_rac_get_prob_branchy(c, vp5_ract_pct[ct][pt][cg][node])) { + if (vpx_rac_get_prob_branchy(c, vp5_ract_pct[ct][pt][cg][node])) { def_prob[node] = vp56_rac_gets_nn(c, 7); model->coeff_ract[pt][ct][cg][node] = def_prob[node]; } else if (s->frames[VP56_FRAME_CURRENT]->key_frame) { @@ -181,7 +182,7 @@ static int vp5_parse_coeff_models(VP56Context *s) static int vp5_parse_coeff(VP56Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; VP56Model *model = s->modelp; uint8_t *permute = s->idct_scantable; uint8_t *model1, *model2; @@ -189,7 +190,7 @@ static int vp5_parse_coeff(VP56Context *s) int b, i, cg, idx, ctx, ctx_last; int pt = 0; /* plane type (0 for Y, 1 for U or V) */ - if (vpX_rac_is_end(c)) { + if (vpx_rac_is_end(c)) { av_log(s->avctx, AV_LOG_ERROR, "End of AC stream reached in vp5_parse_coeff\n"); return AVERROR_INVALIDDATA; } @@ -206,30 +207,30 @@ static int vp5_parse_coeff(VP56Context *s) coeff_idx = 0; for (;;) { - if (vp56_rac_get_prob_branchy(c, model2[0])) { - if (vp56_rac_get_prob_branchy(c, model2[2])) { - if (vp56_rac_get_prob_branchy(c, model2[3])) { + if (vpx_rac_get_prob_branchy(c, model2[0])) { + if (vpx_rac_get_prob_branchy(c, model2[2])) { + if (vpx_rac_get_prob_branchy(c, model2[3])) { s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 4; idx = vp56_rac_get_tree(c, ff_vp56_pc_tree, model1); - sign = vp56_rac_get(c); + sign = vpx_rac_get(c); coeff = ff_vp56_coeff_bias[idx+5]; for (i=ff_vp56_coeff_bit_length[idx]; i>=0; i--) - coeff += vp56_rac_get_prob(c, ff_vp56_coeff_parse_table[idx][i]) << i; + coeff += vpx_rac_get_prob(c, ff_vp56_coeff_parse_table[idx][i]) << i; } else { - if (vp56_rac_get_prob_branchy(c, model2[4])) { - coeff = 3 + vp56_rac_get_prob(c, model1[5]); + if (vpx_rac_get_prob_branchy(c, model2[4])) { + coeff = 3 + vpx_rac_get_prob(c, model1[5]); s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 3; } else { coeff = 2; s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 2; } - sign = vp56_rac_get(c); + sign = vpx_rac_get(c); } ct = 2; } else { ct = 1; s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 1; - sign = vp56_rac_get(c); + sign = vpx_rac_get(c); coeff = 1; } coeff = (coeff ^ -sign) + sign; @@ -237,7 +238,7 @@ static int vp5_parse_coeff(VP56Context *s) coeff *= s->dequant_ac; s->block_coeff[b][permute[coeff_idx]] = coeff; } else { - if (ct && !vp56_rac_get_prob_branchy(c, model2[1])) + if (ct && !vpx_rac_get_prob_branchy(c, model2[1])) break; ct = 0; s->coeff_ctx[ff_vp56_b6to4[b]][coeff_idx] = 0; diff --git a/libavcodec/vp56.c b/libavcodec/vp56.c index a2efca1c9c..3863af15e5 100644 --- a/libavcodec/vp56.c +++ b/libavcodec/vp56.c @@ -29,6 +29,7 @@ #include "h264chroma.h" #include "vp56.h" #include "vp56data.h" +#include "vpx_rac.h" void ff_vp56_init_dequant(VP56Context *s, int quantizer) @@ -80,22 +81,22 @@ static int vp56_get_vectors_predictors(VP56Context *s, int row, int col, static void vp56_parse_mb_type_models(VP56Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; VP56Model *model = s->modelp; int i, ctx, type; for (ctx=0; ctx<3; ctx++) { - if (vp56_rac_get_prob_branchy(c, 174)) { + if (vpx_rac_get_prob_branchy(c, 174)) { int idx = vp56_rac_gets(c, 4); memcpy(model->mb_types_stats[ctx], ff_vp56_pre_def_mb_type_stats[idx][ctx], sizeof(model->mb_types_stats[ctx])); } - if (vp56_rac_get_prob_branchy(c, 254)) { + if (vpx_rac_get_prob_branchy(c, 254)) { for (type=0; type<10; type++) { for(i=0; i<2; i++) { - if (vp56_rac_get_prob_branchy(c, 205)) { - int delta, sign = vp56_rac_get(c); + if (vpx_rac_get_prob_branchy(c, 205)) { + int delta, sign = vpx_rac_get(c); delta = vp56_rac_get_tree(c, ff_vp56_pmbtm_tree, ff_vp56_mb_type_model_model); @@ -153,9 +154,9 @@ static VP56mb vp56_parse_mb_type(VP56Context *s, VP56mb prev_type, int ctx) { uint8_t *mb_type_model = s->modelp->mb_type[ctx][prev_type]; - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; - if (vp56_rac_get_prob_branchy(c, mb_type_model[0])) + if (vpx_rac_get_prob_branchy(c, mb_type_model[0])) return prev_type; else return vp56_rac_get_tree(c, ff_vp56_pmbt_tree, mb_type_model); diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h index 174f126309..b1b14b63f8 100644 --- a/libavcodec/vp56.h +++ b/libavcodec/vp56.h @@ -31,11 +31,11 @@ #include "avcodec.h" #include "get_bits.h" #include "hpeldsp.h" -#include "bytestream.h" #include "h264chroma.h" #include "videodsp.h" #include "vp3dsp.h" #include "vp56dsp.h" +#include "vpx_rac.h" typedef struct vp56_context VP56Context; @@ -84,16 +84,6 @@ typedef int (*VP56ParseCoeffModels)(VP56Context *s); typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf, int buf_size); -typedef struct VP56RangeCoder { - int high; - int bits; /* stored negated (i.e. negative "bits" is a positive number of - bits left) in order to eliminate a negate in cache refilling */ - const uint8_t *buffer; - const uint8_t *end; - unsigned int code_word; - int end_reached; -} VP56RangeCoder; - typedef struct VP56RefDc { uint8_t not_null_dc; VP56Frame ref_frame; @@ -134,9 +124,9 @@ struct vp56_context { AVFrame *frames[4]; uint8_t *edge_emu_buffer_alloc; uint8_t *edge_emu_buffer; - VP56RangeCoder c; - VP56RangeCoder cc; - VP56RangeCoder *ccp; + VPXRangeCoder c; + VPXRangeCoder cc; + VPXRangeCoder *ccp; int sub_version; /* frame info */ @@ -232,121 +222,31 @@ int ff_vp56_decode_frame(AVCodecContext *avctx, AVFrame *frame, * vp56 specific range coder implementation */ -extern const uint8_t ff_vp56_norm_shift[256]; -int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size); - -/** - * vp5689 returns 1 if the end of the stream has been reached, 0 otherwise. - */ -static av_always_inline int vpX_rac_is_end(VP56RangeCoder *c) -{ - if (c->end <= c->buffer && c->bits >= 0) - c->end_reached ++; - return c->end_reached > 10; -} - -static av_always_inline unsigned int vp56_rac_renorm(VP56RangeCoder *c) -{ - int shift = ff_vp56_norm_shift[c->high]; - int bits = c->bits; - unsigned int code_word = c->code_word; - - c->high <<= shift; - code_word <<= shift; - bits += shift; - if(bits >= 0 && c->buffer < c->end) { - code_word |= bytestream_get_be16(&c->buffer) << bits; - bits -= 16; - } - c->bits = bits; - return code_word; -} - -#if ARCH_ARM -#include "arm/vp56_arith.h" -#elif ARCH_X86 -#include "x86/vp56_arith.h" -#endif - -#ifndef vp56_rac_get_prob -#define vp56_rac_get_prob vp56_rac_get_prob -static av_always_inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob) -{ - unsigned int code_word = vp56_rac_renorm(c); - unsigned int low = 1 + (((c->high - 1) * prob) >> 8); - unsigned int low_shift = low << 16; - int bit = code_word >= low_shift; - - c->high = bit ? c->high - low : low; - c->code_word = bit ? code_word - low_shift : code_word; - - return bit; -} -#endif - -#ifndef vp56_rac_get_prob_branchy -// branchy variant, to be used where there's a branch based on the bit decoded -static av_always_inline int vp56_rac_get_prob_branchy(VP56RangeCoder *c, int prob) -{ - unsigned long code_word = vp56_rac_renorm(c); - unsigned low = 1 + (((c->high - 1) * prob) >> 8); - unsigned low_shift = low << 16; - - if (code_word >= low_shift) { - c->high -= low; - c->code_word = code_word - low_shift; - return 1; - } - - c->high = low; - c->code_word = code_word; - return 0; -} -#endif - -static av_always_inline int vp56_rac_get(VP56RangeCoder *c) -{ - unsigned int code_word = vp56_rac_renorm(c); - /* equiprobable */ - int low = (c->high + 1) >> 1; - unsigned int low_shift = low << 16; - int bit = code_word >= low_shift; - if (bit) { - c->high -= low; - code_word -= low_shift; - } else { - c->high = low; - } - - c->code_word = code_word; - return bit; -} - -static int vp56_rac_gets(VP56RangeCoder *c, int bits) +static int vp56_rac_gets(VPXRangeCoder *c, int bits) { int value = 0; while (bits--) { - value = (value << 1) | vp56_rac_get(c); + value = (value << 1) | vpx_rac_get(c); } return value; } // P(7) -static av_unused int vp56_rac_gets_nn(VP56RangeCoder *c, int bits) +static av_unused int vp56_rac_gets_nn(VPXRangeCoder *c, int bits) { int v = vp56_rac_gets(c, 7) << 1; return v + !v; } static av_always_inline -int vp56_rac_get_tree(VP56RangeCoder *c, +int vp56_rac_get_tree(VPXRangeCoder *c, const VP56Tree *tree, const uint8_t *probs) { while (tree->val > 0) { - if (vp56_rac_get_prob_branchy(c, probs[tree->prob_idx])) + if (vpx_rac_get_prob_branchy(c, probs[tree->prob_idx])) tree += tree->val; else tree++; diff --git a/libavcodec/vp6.c b/libavcodec/vp6.c index 37938038c4..ad81060886 100644 --- a/libavcodec/vp6.c +++ b/libavcodec/vp6.c @@ -38,6 +38,7 @@ #include "vp56.h" #include "vp56data.h" #include "vp6data.h" +#include "vpx_rac.h" #define VP6_MAX_HUFF_SIZE 12 @@ -46,7 +47,7 @@ static int vp6_parse_coeff_huffman(VP56Context *s); static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int parse_filter_info = 0; int coeff_offset = 0; int vrt_shift = 0; @@ -107,7 +108,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) res = VP56_SIZE_CHANGE; } - ret = ff_vp56_init_range_decoder(c, buf+6, buf_size-6); + ret = ff_vpx_init_range_decoder(c, buf+6, buf_size-6); if (ret < 0) goto fail; vp56_rac_gets(c, 2); @@ -126,26 +127,26 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) buf += 2; buf_size -= 2; } - ret = ff_vp56_init_range_decoder(c, buf+1, buf_size-1); + ret = ff_vpx_init_range_decoder(c, buf+1, buf_size-1); if (ret < 0) return ret; - s->golden_frame = vp56_rac_get(c); + s->golden_frame = vpx_rac_get(c); if (s->filter_header) { - s->deblock_filtering = vp56_rac_get(c); + s->deblock_filtering = vpx_rac_get(c); if (s->deblock_filtering) - vp56_rac_get(c); + vpx_rac_get(c); if (s->sub_version > 7) - parse_filter_info = vp56_rac_get(c); + parse_filter_info = vpx_rac_get(c); } } if (parse_filter_info) { - if (vp56_rac_get(c)) { + if (vpx_rac_get(c)) { s->filter_mode = 2; s->sample_variance_threshold = vp56_rac_gets(c, 5) << vrt_shift; s->max_vector_length = 2 << vp56_rac_gets(c, 3); - } else if (vp56_rac_get(c)) { + } else if (vpx_rac_get(c)) { s->filter_mode = 1; } else { s->filter_mode = 0; @@ -156,7 +157,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) s->filter_selection = 16; } - s->use_huffman = vp56_rac_get(c); + s->use_huffman = vpx_rac_get(c); s->parse_coeff = vp6_parse_coeff; if (coeff_offset) { @@ -172,7 +173,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) if (ret < 0) return ret; } else { - ret = ff_vp56_init_range_decoder(&s->cc, buf, buf_size); + ret = ff_vpx_init_range_decoder(&s->cc, buf, buf_size); if (ret < 0) goto fail; s->ccp = &s->cc; @@ -231,25 +232,25 @@ static void vp6_default_models_init(VP56Context *s) static void vp6_parse_vector_models(VP56Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; VP56Model *model = s->modelp; int comp, node; for (comp=0; comp<2; comp++) { - if (vp56_rac_get_prob_branchy(c, vp6_sig_dct_pct[comp][0])) + if (vpx_rac_get_prob_branchy(c, vp6_sig_dct_pct[comp][0])) model->vector_dct[comp] = vp56_rac_gets_nn(c, 7); - if (vp56_rac_get_prob_branchy(c, vp6_sig_dct_pct[comp][1])) + if (vpx_rac_get_prob_branchy(c, vp6_sig_dct_pct[comp][1])) model->vector_sig[comp] = vp56_rac_gets_nn(c, 7); } for (comp=0; comp<2; comp++) for (node=0; node<7; node++) - if (vp56_rac_get_prob_branchy(c, vp6_pdv_pct[comp][node])) + if (vpx_rac_get_prob_branchy(c, vp6_pdv_pct[comp][node])) model->vector_pdv[comp][node] = vp56_rac_gets_nn(c, 7); for (comp=0; comp<2; comp++) for (node=0; node<8; node++) - if (vp56_rac_get_prob_branchy(c, vp6_fdv_pct[comp][node])) + if (vpx_rac_get_prob_branchy(c, vp6_fdv_pct[comp][node])) model->vector_fdv[comp][node] = vp56_rac_gets_nn(c, 7); } @@ -284,7 +285,7 @@ static int vp6_build_huff_tree(VP56Context *s, uint8_t coeff_model[], static int vp6_parse_coeff_models(VP56Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; VP56Model *model = s->modelp; int def_prob[11]; int node, cg, ctx, pos; @@ -295,30 +296,30 @@ static int vp6_parse_coeff_models(VP56Context *s) for (pt=0; pt<2; pt++) for (node=0; node<11; node++) - if (vp56_rac_get_prob_branchy(c, vp6_dccv_pct[pt][node])) { + if (vpx_rac_get_prob_branchy(c, vp6_dccv_pct[pt][node])) { def_prob[node] = vp56_rac_gets_nn(c, 7); model->coeff_dccv[pt][node] = def_prob[node]; } else if (s->frames[VP56_FRAME_CURRENT]->key_frame) { model->coeff_dccv[pt][node] = def_prob[node]; } - if (vp56_rac_get(c)) { + if (vpx_rac_get(c)) { for (pos=1; pos<64; pos++) - if (vp56_rac_get_prob_branchy(c, vp6_coeff_reorder_pct[pos])) + if (vpx_rac_get_prob_branchy(c, vp6_coeff_reorder_pct[pos])) model->coeff_reorder[pos] = vp56_rac_gets(c, 4); vp6_coeff_order_table_init(s); } for (cg=0; cg<2; cg++) for (node=0; node<14; node++) - if (vp56_rac_get_prob_branchy(c, vp6_runv_pct[cg][node])) + if (vpx_rac_get_prob_branchy(c, vp6_runv_pct[cg][node])) model->coeff_runv[cg][node] = vp56_rac_gets_nn(c, 7); for (ct=0; ct<3; ct++) for (pt=0; pt<2; pt++) for (cg=0; cg<6; cg++) for (node=0; node<11; node++) - if (vp56_rac_get_prob_branchy(c, vp6_ract_pct[ct][pt][cg][node])) { + if (vpx_rac_get_prob_branchy(c, vp6_ract_pct[ct][pt][cg][node])) { def_prob[node] = vp56_rac_gets_nn(c, 7); model->coeff_ract[pt][ct][cg][node] = def_prob[node]; } else if (s->frames[VP56_FRAME_CURRENT]->key_frame) { @@ -353,7 +354,7 @@ static int vp6_parse_coeff_models(VP56Context *s) static void vp6_parse_vector_adjustment(VP56Context *s, VP56mv *vect) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; VP56Model *model = s->modelp; int comp; @@ -364,14 +365,14 @@ static void vp6_parse_vector_adjustment(VP56Context *s, VP56mv *vect) for (comp=0; comp<2; comp++) { int i, delta = 0; - if (vp56_rac_get_prob_branchy(c, model->vector_dct[comp])) { + if (vpx_rac_get_prob_branchy(c, model->vector_dct[comp])) { static const uint8_t prob_order[] = {0, 1, 2, 7, 6, 5, 4}; for (i=0; ivector_fdv[comp][j])<vector_fdv[comp][j])<vector_fdv[comp][3])<<3; + delta |= vpx_rac_get_prob(c, model->vector_fdv[comp][3])<<3; else delta |= 8; } else { @@ -379,7 +380,7 @@ static void vp6_parse_vector_adjustment(VP56Context *s, VP56mv *vect) model->vector_pdv[comp]); } - if (delta && vp56_rac_get_prob_branchy(c, model->vector_sig[comp])) + if (delta && vpx_rac_get_prob_branchy(c, model->vector_sig[comp])) delta = -delta; if (!comp) @@ -468,7 +469,7 @@ static int vp6_parse_coeff_huffman(VP56Context *s) static int vp6_parse_coeff(VP56Context *s) { - VP56RangeCoder *c = s->ccp; + VPXRangeCoder *c = s->ccp; VP56Model *model = s->modelp; uint8_t *permute = s->idct_scantable; uint8_t *model1, *model2, *model3; @@ -476,7 +477,7 @@ static int vp6_parse_coeff(VP56Context *s) int b, i, cg, idx, ctx; int pt = 0; /* plane type (0 for Y, 1 for U or V) */ - if (vpX_rac_is_end(c)) { + if (vpx_rac_is_end(c)) { av_log(s->avctx, AV_LOG_ERROR, "End of AC stream reached in vp6_parse_coeff\n"); return AVERROR_INVALIDDATA; } @@ -494,17 +495,17 @@ static int vp6_parse_coeff(VP56Context *s) coeff_idx = 0; for (;;) { - if ((coeff_idx>1 && ct==0) || vp56_rac_get_prob_branchy(c, model2[0])) { + if ((coeff_idx>1 && ct==0) || vpx_rac_get_prob_branchy(c, model2[0])) { /* parse a coeff */ - if (vp56_rac_get_prob_branchy(c, model2[2])) { - if (vp56_rac_get_prob_branchy(c, model2[3])) { + if (vpx_rac_get_prob_branchy(c, model2[2])) { + if (vpx_rac_get_prob_branchy(c, model2[3])) { idx = vp56_rac_get_tree(c, ff_vp56_pc_tree, model1); coeff = ff_vp56_coeff_bias[idx+5]; for (i=ff_vp56_coeff_bit_length[idx]; i>=0; i--) - coeff += vp56_rac_get_prob(c, ff_vp56_coeff_parse_table[idx][i]) << i; + coeff += vpx_rac_get_prob(c, ff_vp56_coeff_parse_table[idx][i]) << i; } else { - if (vp56_rac_get_prob_branchy(c, model2[4])) - coeff = 3 + vp56_rac_get_prob(c, model1[5]); + if (vpx_rac_get_prob_branchy(c, model2[4])) + coeff = 3 + vpx_rac_get_prob(c, model1[5]); else coeff = 2; } @@ -513,7 +514,7 @@ static int vp6_parse_coeff(VP56Context *s) ct = 1; coeff = 1; } - sign = vp56_rac_get(c); + sign = vpx_rac_get(c); coeff = (coeff ^ -sign) + sign; if (coeff_idx) coeff *= s->dequant_ac; @@ -524,14 +525,14 @@ static int vp6_parse_coeff(VP56Context *s) /* parse a run */ ct = 0; if (coeff_idx > 0) { - if (!vp56_rac_get_prob_branchy(c, model2[1])) + if (!vpx_rac_get_prob_branchy(c, model2[1])) break; model3 = model->coeff_runv[coeff_idx >= 6]; run = vp56_rac_get_tree(c, vp6_pcr_tree, model3); if (!run) for (run=9, i=0; i<6; i++) - run += vp56_rac_get_prob(c, model3[i+8]) << i; + run += vpx_rac_get_prob(c, model3[i+8]) << i; } } coeff_idx += run; diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index ade7769943..de1fdac82e 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -40,6 +40,7 @@ #include "vp8.h" #include "vp89_rac.h" #include "vp8data.h" +#include "vpx_rac.h" #if ARCH_ARM # include "arm/vp8.h" @@ -54,7 +55,7 @@ #endif // fixme: add 1 bit to all the calls to this? -static int vp8_rac_get_sint(VP56RangeCoder *c, int bits) +static int vp8_rac_get_sint(VPXRangeCoder *c, int bits) { int v; @@ -69,19 +70,19 @@ static int vp8_rac_get_sint(VP56RangeCoder *c, int bits) return v; } -static int vp8_rac_get_nn(VP56RangeCoder *c) +static int vp8_rac_get_nn(VPXRangeCoder *c) { int v = vp89_rac_get_uint(c, 7) << 1; return v + !v; } // DCTextra -static int vp8_rac_get_coeff(VP56RangeCoder *c, const uint8_t *prob) +static int vp8_rac_get_coeff(VPXRangeCoder *c, const uint8_t *prob) { int v = 0; do { - v = (v<<1) + vp56_rac_get_prob(c, *prob++); + v = (v<<1) + vpx_rac_get_prob(c, *prob++); } while (*prob); return v; @@ -301,7 +302,7 @@ static int vp8_update_dimensions(VP8Context *s, int width, int height) static void parse_segment_info(VP8Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int i; s->segmentation.update_map = vp89_rac_get(c); @@ -323,7 +324,7 @@ static void parse_segment_info(VP8Context *s) static void update_lf_deltas(VP8Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int i; for (i = 0; i < 4; i++) { @@ -364,7 +365,7 @@ static int setup_partitions(VP8Context *s, const uint8_t *buf, int buf_size) return -1; s->coeff_partition_size[i] = size; - ret = ff_vp56_init_range_decoder(&s->coeff_partition[i], buf, size); + ret = ff_vpx_init_range_decoder(&s->coeff_partition[i], buf, size); if (ret < 0) return ret; buf += size; @@ -372,14 +373,14 @@ static int setup_partitions(VP8Context *s, const uint8_t *buf, int buf_size) } s->coeff_partition_size[i] = buf_size; - ff_vp56_init_range_decoder(&s->coeff_partition[i], buf, buf_size); + ff_vpx_init_range_decoder(&s->coeff_partition[i], buf, buf_size); return 0; } static void vp7_get_quants(VP8Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int yac_qi = vp89_rac_get_uint(c, 7); int ydc_qi = vp89_rac_get(c) ? vp89_rac_get_uint(c, 7) : yac_qi; @@ -398,7 +399,7 @@ static void vp7_get_quants(VP8Context *s) static void vp8_get_quants(VP8Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int i, base_qi; s->quant.yac_qi = vp89_rac_get_uint(c, 7); @@ -444,7 +445,7 @@ static void vp8_get_quants(VP8Context *s) */ static VP56Frame ref_to_update(VP8Context *s, int update, VP56Frame ref) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; if (update) return VP56_FRAME_CURRENT; @@ -469,14 +470,14 @@ static void vp78_reset_probability_tables(VP8Context *s) static void vp78_update_probability_tables(VP8Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int i, j, k, l, m; for (i = 0; i < 4; i++) for (j = 0; j < 8; j++) for (k = 0; k < 3; k++) for (l = 0; l < NUM_DCT_TOKENS-1; l++) - if (vp56_rac_get_prob_branchy(c, vp8_token_update_probs[i][j][k][l])) { + if (vpx_rac_get_prob_branchy(c, vp8_token_update_probs[i][j][k][l])) { int prob = vp89_rac_get_uint(c, 8); for (m = 0; vp8_coeff_band_indexes[j][m] >= 0; m++) s->prob->token[i][vp8_coeff_band_indexes[j][m]][k][l] = prob; @@ -489,7 +490,7 @@ static void vp78_update_probability_tables(VP8Context *s) static void vp78_update_pred16x16_pred8x8_mvc_probabilities(VP8Context *s, int mvc_size) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int i, j; if (vp89_rac_get(c)) @@ -502,13 +503,13 @@ static void vp78_update_pred16x16_pred8x8_mvc_probabilities(VP8Context *s, // 17.2 MV probability update for (i = 0; i < 2; i++) for (j = 0; j < mvc_size; j++) - if (vp56_rac_get_prob_branchy(c, vp8_mv_update_prob[i][j])) + if (vpx_rac_get_prob_branchy(c, vp8_mv_update_prob[i][j])) s->prob->mvc[i][j] = vp8_rac_get_nn(c); } static void update_refs(VP8Context *s) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int update_golden = vp89_rac_get(c); int update_altref = vp89_rac_get(c); @@ -583,7 +584,7 @@ static int vp7_fade_frame(VP8Context *s, int alpha, int beta) static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_size) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int part1_size, hscale, vscale, i, j, ret; int width = s->avctx->width; int height = s->avctx->height; @@ -614,7 +615,7 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si memcpy(s->put_pixels_tab, s->vp8dsp.put_vp8_epel_pixels_tab, sizeof(s->put_pixels_tab)); - ret = ff_vp56_init_range_decoder(c, buf, part1_size); + ret = ff_vpx_init_range_decoder(c, buf, part1_size); if (ret < 0) return ret; buf += part1_size; @@ -668,7 +669,7 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si s->lf_delta.enabled = 0; s->num_coeff_partitions = 1; - ret = ff_vp56_init_range_decoder(&s->coeff_partition[0], buf, buf_size); + ret = ff_vpx_init_range_decoder(&s->coeff_partition[0], buf, buf_size); if (ret < 0) return ret; @@ -701,7 +702,7 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si s->fade_present = vp89_rac_get(c); } - if (vpX_rac_is_end(c)) + if (vpx_rac_is_end(c)) return AVERROR_INVALIDDATA; /* E. Fading information for previous frame */ if (s->fade_present && vp89_rac_get(c)) { @@ -736,7 +737,7 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si vp78_update_pred16x16_pred8x8_mvc_probabilities(s, VP7_MVC_SIZE); } - if (vpX_rac_is_end(c)) + if (vpx_rac_is_end(c)) return AVERROR_INVALIDDATA; if ((ret = vp7_fade_frame(s, alpha, beta)) < 0) @@ -747,7 +748,7 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_size) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int header_size, hscale, vscale, ret; int width = s->avctx->width; int height = s->avctx->height; @@ -809,7 +810,7 @@ static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si memset(&s->lf_delta, 0, sizeof(s->lf_delta)); } - ret = ff_vp56_init_range_decoder(c, buf, header_size); + ret = ff_vpx_init_range_decoder(c, buf, header_size); if (ret < 0) return ret; buf += header_size; @@ -876,7 +877,7 @@ static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si } // Record the entropy coder state here so that hwaccels can use it. - s->c.code_word = vp56_rac_renorm(&s->c); + s->c.code_word = vpx_rac_renorm(&s->c); s->coder_state_at_header_end.input = s->c.buffer - (-s->c.bits / 8); s->coder_state_at_header_end.range = s->c.high; s->coder_state_at_header_end.value = s->c.code_word >> 16; @@ -897,40 +898,40 @@ void clamp_mv(VP8mvbounds *s, VP56mv *dst, const VP56mv *src) /** * Motion vector coding, 17.1. */ -static av_always_inline int read_mv_component(VP56RangeCoder *c, const uint8_t *p, int vp7) +static av_always_inline int read_mv_component(VPXRangeCoder *c, const uint8_t *p, int vp7) { int bit, x = 0; - if (vp56_rac_get_prob_branchy(c, p[0])) { + if (vpx_rac_get_prob_branchy(c, p[0])) { int i; for (i = 0; i < 3; i++) - x += vp56_rac_get_prob(c, p[9 + i]) << i; + x += vpx_rac_get_prob(c, p[9 + i]) << i; for (i = (vp7 ? 7 : 9); i > 3; i--) - x += vp56_rac_get_prob(c, p[9 + i]) << i; - if (!(x & (vp7 ? 0xF0 : 0xFFF0)) || vp56_rac_get_prob(c, p[12])) + x += vpx_rac_get_prob(c, p[9 + i]) << i; + if (!(x & (vp7 ? 0xF0 : 0xFFF0)) || vpx_rac_get_prob(c, p[12])) x += 8; } else { // small_mvtree const uint8_t *ps = p + 2; - bit = vp56_rac_get_prob(c, *ps); + bit = vpx_rac_get_prob(c, *ps); ps += 1 + 3 * bit; x += 4 * bit; - bit = vp56_rac_get_prob(c, *ps); + bit = vpx_rac_get_prob(c, *ps); ps += 1 + bit; x += 2 * bit; - x += vp56_rac_get_prob(c, *ps); + x += vpx_rac_get_prob(c, *ps); } - return (x && vp56_rac_get_prob(c, p[1])) ? -x : x; + return (x && vpx_rac_get_prob(c, p[1])) ? -x : x; } -static int vp7_read_mv_component(VP56RangeCoder *c, const uint8_t *p) +static int vp7_read_mv_component(VPXRangeCoder *c, const uint8_t *p) { return read_mv_component(c, p, 1); } -static int vp8_read_mv_component(VP56RangeCoder *c, const uint8_t *p) +static int vp8_read_mv_component(VPXRangeCoder *c, const uint8_t *p) { return read_mv_component(c, p, 0); } @@ -953,7 +954,7 @@ const uint8_t *get_submv_prob(uint32_t left, uint32_t top, int is_vp7) * @returns the number of motion vectors parsed (2, 4 or 16) */ static av_always_inline -int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, +int decode_splitmvs(VP8Context *s, VPXRangeCoder *c, VP8Macroblock *mb, int layout, int is_vp7) { int part_idx; @@ -973,9 +974,9 @@ int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, mbsplits_top = vp8_mbsplits[top_mb->partitioning]; top_mv = top_mb->bmv; - if (vp56_rac_get_prob_branchy(c, vp8_mbsplit_prob[0])) { - if (vp56_rac_get_prob_branchy(c, vp8_mbsplit_prob[1])) - part_idx = VP8_SPLITMVMODE_16x8 + vp56_rac_get_prob(c, vp8_mbsplit_prob[2]); + if (vpx_rac_get_prob_branchy(c, vp8_mbsplit_prob[0])) { + if (vpx_rac_get_prob_branchy(c, vp8_mbsplit_prob[1])) + part_idx = VP8_SPLITMVMODE_16x8 + vpx_rac_get_prob(c, vp8_mbsplit_prob[2]); else part_idx = VP8_SPLITMVMODE_8x8; } else { @@ -1003,9 +1004,9 @@ int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, submv_prob = get_submv_prob(left, above, is_vp7); - if (vp56_rac_get_prob_branchy(c, submv_prob[0])) { - if (vp56_rac_get_prob_branchy(c, submv_prob[1])) { - if (vp56_rac_get_prob_branchy(c, submv_prob[2])) { + if (vpx_rac_get_prob_branchy(c, submv_prob[0])) { + if (vpx_rac_get_prob_branchy(c, submv_prob[1])) { + if (vpx_rac_get_prob_branchy(c, submv_prob[2])) { mb->bmv[n].y = mb->mv.y + read_mv_component(c, s->prob->mvc[0], is_vp7); mb->bmv[n].x = mb->mv.x + @@ -1063,7 +1064,7 @@ void vp7_decode_mvs(VP8Context *s, VP8Macroblock *mb, int idx = CNT_ZERO; VP56mv near_mv[3]; uint8_t cnt[3] = { 0 }; - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; int i; AV_ZERO32(&near_mv[0]); @@ -1109,19 +1110,19 @@ void vp7_decode_mvs(VP8Context *s, VP8Macroblock *mb, mb->partitioning = VP8_SPLITMVMODE_NONE; - if (vp56_rac_get_prob_branchy(c, vp7_mode_contexts[cnt[CNT_ZERO]][0])) { + if (vpx_rac_get_prob_branchy(c, vp7_mode_contexts[cnt[CNT_ZERO]][0])) { mb->mode = VP8_MVMODE_MV; - if (vp56_rac_get_prob_branchy(c, vp7_mode_contexts[cnt[CNT_NEAREST]][1])) { + if (vpx_rac_get_prob_branchy(c, vp7_mode_contexts[cnt[CNT_NEAREST]][1])) { - if (vp56_rac_get_prob_branchy(c, vp7_mode_contexts[cnt[CNT_NEAR]][2])) { + if (vpx_rac_get_prob_branchy(c, vp7_mode_contexts[cnt[CNT_NEAR]][2])) { if (cnt[CNT_NEAREST] > cnt[CNT_NEAR]) AV_WN32A(&mb->mv, cnt[CNT_ZERO] > cnt[CNT_NEAREST] ? 0 : AV_RN32A(&near_mv[CNT_NEAREST])); else AV_WN32A(&mb->mv, cnt[CNT_ZERO] > cnt[CNT_NEAR] ? 0 : AV_RN32A(&near_mv[CNT_NEAR])); - if (vp56_rac_get_prob_branchy(c, vp7_mode_contexts[cnt[CNT_NEAR]][3])) { + if (vpx_rac_get_prob_branchy(c, vp7_mode_contexts[cnt[CNT_NEAR]][3])) { mb->mode = VP8_MVMODE_SPLIT; mb->mv = mb->bmv[decode_splitmvs(s, c, mb, layout, IS_VP7) - 1]; } else { @@ -1158,7 +1159,7 @@ void vp8_decode_mvs(VP8Context *s, VP8mvbounds *mv_bounds, VP8Macroblock *mb, int8_t *sign_bias = s->sign_bias; VP56mv near_mv[4]; uint8_t cnt[4] = { 0 }; - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; if (!layout) { // layout is inlined (s->mb_layout is not) mb_edge[0] = mb + 2; @@ -1199,7 +1200,7 @@ void vp8_decode_mvs(VP8Context *s, VP8mvbounds *mv_bounds, VP8Macroblock *mb, MV_EDGE_CHECK(2) mb->partitioning = VP8_SPLITMVMODE_NONE; - if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_ZERO]][0])) { + if (vpx_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_ZERO]][0])) { mb->mode = VP8_MVMODE_MV; /* If we have three distinct MVs, merge first and last if they're the same */ @@ -1213,15 +1214,15 @@ void vp8_decode_mvs(VP8Context *s, VP8mvbounds *mv_bounds, VP8Macroblock *mb, FFSWAP( VP56mv, near_mv[CNT_NEAREST], near_mv[CNT_NEAR]); } - if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_NEAREST]][1])) { - if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_NEAR]][2])) { + if (vpx_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_NEAREST]][1])) { + if (vpx_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_NEAR]][2])) { /* Choose the best mv out of 0,0 and the nearest mv */ clamp_mv(mv_bounds, &mb->mv, &near_mv[CNT_ZERO + (cnt[CNT_NEAREST] >= cnt[CNT_ZERO])]); cnt[CNT_SPLITMV] = ((mb_edge[VP8_EDGE_LEFT]->mode == VP8_MVMODE_SPLIT) + (mb_edge[VP8_EDGE_TOP]->mode == VP8_MVMODE_SPLIT)) * 2 + (mb_edge[VP8_EDGE_TOPLEFT]->mode == VP8_MVMODE_SPLIT); - if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_SPLITMV]][3])) { + if (vpx_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_SPLITMV]][3])) { mb->mode = VP8_MVMODE_SPLIT; mb->mv = mb->bmv[decode_splitmvs(s, c, mb, layout, IS_VP8) - 1]; } else { @@ -1245,7 +1246,7 @@ void vp8_decode_mvs(VP8Context *s, VP8mvbounds *mv_bounds, VP8Macroblock *mb, } static av_always_inline -void decode_intra4x4_modes(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb, +void decode_intra4x4_modes(VP8Context *s, VPXRangeCoder *c, VP8Macroblock *mb, int mb_x, int keyframe, int layout) { uint8_t *intra4x4 = mb->intra4x4_pred_mode_mb; @@ -1284,7 +1285,7 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, VP8Macroblock *mb, int mb_x, int mb_y, uint8_t *segment, uint8_t *ref, int layout, int is_vp7) { - VP56RangeCoder *c = &s->c; + VPXRangeCoder *c = &s->c; static const char * const vp7_feature_name[] = { "q-index", "lf-delta", "partial-golden-update", @@ -1294,7 +1295,7 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, *segment = 0; for (i = 0; i < 4; i++) { if (s->feature_enabled[i]) { - if (vp56_rac_get_prob_branchy(c, s->feature_present_prob[i])) { + if (vpx_rac_get_prob_branchy(c, s->feature_present_prob[i])) { int index = vp89_rac_get_tree(c, vp7_feature_index_tree, s->feature_index_prob[i]); av_log(s->avctx, AV_LOG_WARNING, @@ -1304,13 +1305,13 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, } } } else if (s->segmentation.update_map) { - int bit = vp56_rac_get_prob(c, s->prob->segmentid[0]); - *segment = vp56_rac_get_prob(c, s->prob->segmentid[1+bit]) + 2*bit; + int bit = vpx_rac_get_prob(c, s->prob->segmentid[0]); + *segment = vpx_rac_get_prob(c, s->prob->segmentid[1+bit]) + 2*bit; } else if (s->segmentation.enabled) *segment = ref ? *ref : *segment; mb->segment = *segment; - mb->skip = s->mbskip_enabled ? vp56_rac_get_prob(c, s->prob->mbskip) : 0; + mb->skip = s->mbskip_enabled ? vpx_rac_get_prob(c, s->prob->mbskip) : 0; if (s->keyframe) { mb->mode = vp89_rac_get_tree(c, vp8_pred16x16_tree_intra, @@ -1331,11 +1332,11 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, mb->chroma_pred_mode = vp89_rac_get_tree(c, vp8_pred8x8c_tree, vp8_pred8x8c_prob_intra); mb->ref_frame = VP56_FRAME_CURRENT; - } else if (vp56_rac_get_prob_branchy(c, s->prob->intra)) { + } else if (vpx_rac_get_prob_branchy(c, s->prob->intra)) { // inter MB, 16.2 - if (vp56_rac_get_prob_branchy(c, s->prob->last)) + if (vpx_rac_get_prob_branchy(c, s->prob->last)) mb->ref_frame = - (!is_vp7 && vp56_rac_get_prob(c, s->prob->golden)) ? VP56_FRAME_GOLDEN2 /* altref */ + (!is_vp7 && vpx_rac_get_prob(c, s->prob->golden)) ? VP56_FRAME_GOLDEN2 /* altref */ : VP56_FRAME_GOLDEN; else mb->ref_frame = VP56_FRAME_PREVIOUS; @@ -1373,21 +1374,21 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, * otherwise, the index of the last coeff decoded plus one */ static av_always_inline -int decode_block_coeffs_internal(VP56RangeCoder *r, int16_t block[16], +int decode_block_coeffs_internal(VPXRangeCoder *r, int16_t block[16], uint8_t probs[16][3][NUM_DCT_TOKENS - 1], int i, uint8_t *token_prob, int16_t qmul[2], const uint8_t scan[16], int vp7) { - VP56RangeCoder c = *r; + VPXRangeCoder c = *r; goto skip_eob; do { int coeff; restart: - if (!vp56_rac_get_prob_branchy(&c, token_prob[0])) // DCT_EOB + if (!vpx_rac_get_prob_branchy(&c, token_prob[0])) // DCT_EOB break; skip_eob: - if (!vp56_rac_get_prob_branchy(&c, token_prob[1])) { // DCT_0 + if (!vpx_rac_get_prob_branchy(&c, token_prob[1])) { // DCT_0 if (++i == 16) break; // invalid input; blocks should end with EOB token_prob = probs[i][0]; @@ -1396,28 +1397,28 @@ skip_eob: goto skip_eob; } - if (!vp56_rac_get_prob_branchy(&c, token_prob[2])) { // DCT_1 + if (!vpx_rac_get_prob_branchy(&c, token_prob[2])) { // DCT_1 coeff = 1; token_prob = probs[i + 1][1]; } else { - if (!vp56_rac_get_prob_branchy(&c, token_prob[3])) { // DCT 2,3,4 - coeff = vp56_rac_get_prob_branchy(&c, token_prob[4]); + if (!vpx_rac_get_prob_branchy(&c, token_prob[3])) { // DCT 2,3,4 + coeff = vpx_rac_get_prob_branchy(&c, token_prob[4]); if (coeff) - coeff += vp56_rac_get_prob(&c, token_prob[5]); + coeff += vpx_rac_get_prob(&c, token_prob[5]); coeff += 2; } else { // DCT_CAT* - if (!vp56_rac_get_prob_branchy(&c, token_prob[6])) { - if (!vp56_rac_get_prob_branchy(&c, token_prob[7])) { // DCT_CAT1 - coeff = 5 + vp56_rac_get_prob(&c, vp8_dct_cat1_prob[0]); + if (!vpx_rac_get_prob_branchy(&c, token_prob[6])) { + if (!vpx_rac_get_prob_branchy(&c, token_prob[7])) { // DCT_CAT1 + coeff = 5 + vpx_rac_get_prob(&c, vp8_dct_cat1_prob[0]); } else { // DCT_CAT2 coeff = 7; - coeff += vp56_rac_get_prob(&c, vp8_dct_cat2_prob[0]) << 1; - coeff += vp56_rac_get_prob(&c, vp8_dct_cat2_prob[1]); + coeff += vpx_rac_get_prob(&c, vp8_dct_cat2_prob[0]) << 1; + coeff += vpx_rac_get_prob(&c, vp8_dct_cat2_prob[1]); } } else { // DCT_CAT3 and up - int a = vp56_rac_get_prob(&c, token_prob[8]); - int b = vp56_rac_get_prob(&c, token_prob[9 + a]); + int a = vpx_rac_get_prob(&c, token_prob[8]); + int b = vpx_rac_get_prob(&c, token_prob[9 + a]); int cat = (a << 1) + b; coeff = 3 + (8 << cat); coeff += vp8_rac_get_coeff(&c, ff_vp8_dct_cat_prob[cat]); @@ -1455,7 +1456,7 @@ int inter_predict_dc(int16_t block[16], int16_t pred[2]) return ret; } -static int vp7_decode_block_coeffs_internal(VP56RangeCoder *r, +static int vp7_decode_block_coeffs_internal(VPXRangeCoder *r, int16_t block[16], uint8_t probs[16][3][NUM_DCT_TOKENS - 1], int i, uint8_t *token_prob, @@ -1467,7 +1468,7 @@ static int vp7_decode_block_coeffs_internal(VP56RangeCoder *r, } #ifndef vp8_decode_block_coeffs_internal -static int vp8_decode_block_coeffs_internal(VP56RangeCoder *r, +static int vp8_decode_block_coeffs_internal(VPXRangeCoder *r, int16_t block[16], uint8_t probs[16][3][NUM_DCT_TOKENS - 1], int i, uint8_t *token_prob, @@ -1492,13 +1493,13 @@ static int vp8_decode_block_coeffs_internal(VP56RangeCoder *r, * otherwise, the index of the last coeff decoded plus one */ static av_always_inline -int decode_block_coeffs(VP56RangeCoder *c, int16_t block[16], +int decode_block_coeffs(VPXRangeCoder *c, int16_t block[16], uint8_t probs[16][3][NUM_DCT_TOKENS - 1], int i, int zero_nhood, int16_t qmul[2], const uint8_t scan[16], int vp7) { uint8_t *token_prob = probs[i][zero_nhood]; - if (!vp56_rac_get_prob_branchy(c, token_prob[0])) // DCT_EOB + if (!vpx_rac_get_prob_branchy(c, token_prob[0])) // DCT_EOB return 0; return vp7 ? vp7_decode_block_coeffs_internal(c, block, probs, i, token_prob, qmul, scan) @@ -1507,7 +1508,7 @@ int decode_block_coeffs(VP56RangeCoder *c, int16_t block[16], } static av_always_inline -void decode_mb_coeffs(VP8Context *s, VP8ThreadData *td, VP56RangeCoder *c, +void decode_mb_coeffs(VP8Context *s, VP8ThreadData *td, VPXRangeCoder *c, VP8Macroblock *mb, uint8_t t_nnz[9], uint8_t l_nnz[9], int is_vp7) { @@ -2334,7 +2335,7 @@ int vp78_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *curframe, s->mv_bounds.mv_max.x = ((s->mb_width - 1) << 6) + MARGIN; for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) { - if (vpX_rac_is_end(&s->c)) { + if (vpx_rac_is_end(&s->c)) { return AVERROR_INVALIDDATA; } if (mb_y == 0) @@ -2411,7 +2412,7 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void int mb_x, mb_xy = mb_y * s->mb_width; int num_jobs = s->num_jobs; VP8Frame *curframe = s->curframe, *prev_frame = s->prev_frame; - VP56RangeCoder *c = &s->coeff_partition[mb_y & (s->num_coeff_partitions - 1)]; + VPXRangeCoder *c = &s->coeff_partition[mb_y & (s->num_coeff_partitions - 1)]; VP8Macroblock *mb; uint8_t *dst[3] = { curframe->tf.f->data[0] + 16 * mb_y * s->linesize, @@ -2419,7 +2420,7 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void curframe->tf.f->data[2] + 8 * mb_y * s->uvlinesize }; - if (vpX_rac_is_end(c)) + if (vpx_rac_is_end(c)) return AVERROR_INVALIDDATA; if (mb_y == 0) @@ -2450,7 +2451,7 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void td->mv_bounds.mv_max.x = ((s->mb_width - 1) << 6) + MARGIN; for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) { - if (vpX_rac_is_end(c)) + if (vpx_rac_is_end(c)) return AVERROR_INVALIDDATA; // Wait for previous thread to read mb_x+2, and reach mb_y-1. if (prev_td != td) { diff --git a/libavcodec/vp8.h b/libavcodec/vp8.h index 8fe45573ed..9695111806 100644 --- a/libavcodec/vp8.h +++ b/libavcodec/vp8.h @@ -36,6 +36,7 @@ #include "threadframe.h" #include "vp56.h" #include "vp8dsp.h" +#include "vpx_rac.h" #define VP8_MAX_QUANT 127 @@ -245,7 +246,7 @@ typedef struct VP8Context { uint8_t (*top_border)[16 + 8 + 8]; uint8_t (*top_nnz)[9]; - VP56RangeCoder c; ///< header context, includes mb modes and motion vectors + VPXRangeCoder c; ///< header context, includes mb modes and motion vectors /* This contains the entropy coder state at the end of the header * block, in the form specified by the standard. For use by @@ -297,7 +298,7 @@ typedef struct VP8Context { * There can be 1, 2, 4, or 8 of these after the header context. */ int num_coeff_partitions; - VP56RangeCoder coeff_partition[8]; + VPXRangeCoder coeff_partition[8]; int coeff_partition_size[8]; VideoDSPContext vdsp; VP8DSPContext vp8dsp; diff --git a/libavcodec/vp89_rac.h b/libavcodec/vp89_rac.h index 382c8ee64d..bc0924c387 100644 --- a/libavcodec/vp89_rac.h +++ b/libavcodec/vp89_rac.h @@ -30,15 +30,15 @@ #include "libavutil/attributes.h" -#include "vp56.h" +#include "vpx_rac.h" -// rounding is different than vp56_rac_get, is vp56_rac_get wrong? -static av_always_inline int vp89_rac_get(VP56RangeCoder *c) +// rounding is different than vpx_rac_get, is vpx_rac_get wrong? +static av_always_inline int vp89_rac_get(VPXRangeCoder *c) { - return vp56_rac_get_prob(c, 128); + return vpx_rac_get_prob(c, 128); } -static av_unused int vp89_rac_get_uint(VP56RangeCoder *c, int bits) +static av_unused int vp89_rac_get_uint(VPXRangeCoder *c, int bits) { int value = 0; @@ -51,13 +51,13 @@ static av_unused int vp89_rac_get_uint(VP56RangeCoder *c, int bits) // how probabilities are associated with decisions is different I think // well, the new scheme fits in the old but this way has one fewer branches per decision -static av_always_inline int vp89_rac_get_tree(VP56RangeCoder *c, const int8_t (*tree)[2], +static av_always_inline int vp89_rac_get_tree(VPXRangeCoder *c, const int8_t (*tree)[2], const uint8_t *probs) { int i = 0; do { - i = tree[i][vp56_rac_get_prob(c, probs[i])]; + i = tree[i][vpx_rac_get_prob(c, probs[i])]; } while (i > 0); return -i; diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 57ad8623a8..1eeb460fc0 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -39,6 +39,7 @@ #include "vp9.h" #include "vp9data.h" #include "vp9dec.h" +#include "vpx_rac.h" #include "libavutil/avassert.h" #include "libavutil/pixdesc.h" #include "libavutil/video_enc_params.h" @@ -380,7 +381,7 @@ static av_always_inline int inv_recenter_nonneg(int v, int m) } // differential forward probability updates -static int update_prob(VP56RangeCoder *c, int p) +static int update_prob(VPXRangeCoder *c, int p) { static const uint8_t inv_map_table[255] = { 7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176, @@ -785,7 +786,7 @@ static int decode_frame_header(AVCodecContext *avctx, s->s.h.tiling.tile_rows = 1 << s->s.h.tiling.log2_tile_rows; if (s->s.h.tiling.tile_cols != (1 << s->s.h.tiling.log2_tile_cols)) { int n_range_coders; - VP56RangeCoder *rc; + VPXRangeCoder *rc; if (s->td) { for (i = 0; i < s->active_tile_cols; i++) @@ -803,10 +804,10 @@ static int decode_frame_header(AVCodecContext *avctx, n_range_coders = s->s.h.tiling.tile_cols; } s->td = av_calloc(s->active_tile_cols, sizeof(VP9TileData) + - n_range_coders * sizeof(VP56RangeCoder)); + n_range_coders * sizeof(VPXRangeCoder)); if (!s->td) return AVERROR(ENOMEM); - rc = (VP56RangeCoder *) &s->td[s->active_tile_cols]; + rc = (VPXRangeCoder *) &s->td[s->active_tile_cols]; for (i = 0; i < s->active_tile_cols; i++) { s->td[i].s = s; s->td[i].c_b = rc; @@ -878,11 +879,11 @@ static int decode_frame_header(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "Invalid compressed header size\n"); return AVERROR_INVALIDDATA; } - ret = ff_vp56_init_range_decoder(&s->c, data2, size2); + ret = ff_vpx_init_range_decoder(&s->c, data2, size2); if (ret < 0) return ret; - if (vp56_rac_get_prob_branchy(&s->c, 128)) { // marker bit + if (vpx_rac_get_prob_branchy(&s->c, 128)) { // marker bit av_log(avctx, AV_LOG_ERROR, "Marker bit was set\n"); return AVERROR_INVALIDDATA; } @@ -912,16 +913,16 @@ static int decode_frame_header(AVCodecContext *avctx, if (s->s.h.txfmmode == TX_SWITCHABLE) { for (i = 0; i < 2; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.tx8p[i] = update_prob(&s->c, s->prob.p.tx8p[i]); for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.tx16p[i][j] = update_prob(&s->c, s->prob.p.tx16p[i][j]); for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.tx32p[i][j] = update_prob(&s->c, s->prob.p.tx32p[i][j]); } @@ -940,7 +941,7 @@ static int decode_frame_header(AVCodecContext *avctx, if (m >= 3 && l == 0) // dc only has 3 pt break; for (n = 0; n < 3; n++) { - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) p[n] = update_prob(&s->c, r[n]); else p[n] = r[n]; @@ -966,24 +967,24 @@ static int decode_frame_header(AVCodecContext *avctx, // mode updates for (i = 0; i < 3; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.skip[i] = update_prob(&s->c, s->prob.p.skip[i]); if (!s->s.h.keyframe && !s->s.h.intraonly) { for (i = 0; i < 7; i++) for (j = 0; j < 3; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_mode[i][j] = update_prob(&s->c, s->prob.p.mv_mode[i][j]); if (s->s.h.filtermode == FILTER_SWITCHABLE) for (i = 0; i < 4; i++) for (j = 0; j < 2; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.filter[i][j] = update_prob(&s->c, s->prob.p.filter[i][j]); for (i = 0; i < 4; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.intra[i] = update_prob(&s->c, s->prob.p.intra[i]); if (s->s.h.allowcompinter) { @@ -992,7 +993,7 @@ static int decode_frame_header(AVCodecContext *avctx, s->s.h.comppredmode += vp89_rac_get(&s->c); if (s->s.h.comppredmode == PRED_SWITCHABLE) for (i = 0; i < 5; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.comp[i] = update_prob(&s->c, s->prob.p.comp[i]); } else { @@ -1001,10 +1002,10 @@ static int decode_frame_header(AVCodecContext *avctx, if (s->s.h.comppredmode != PRED_COMPREF) { for (i = 0; i < 5; i++) { - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.single_ref[i][0] = update_prob(&s->c, s->prob.p.single_ref[i][0]); - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.single_ref[i][1] = update_prob(&s->c, s->prob.p.single_ref[i][1]); } @@ -1012,46 +1013,46 @@ static int decode_frame_header(AVCodecContext *avctx, if (s->s.h.comppredmode != PRED_SINGLEREF) { for (i = 0; i < 5; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.comp_ref[i] = update_prob(&s->c, s->prob.p.comp_ref[i]); } for (i = 0; i < 4; i++) for (j = 0; j < 9; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.y_mode[i][j] = update_prob(&s->c, s->prob.p.y_mode[i][j]); for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) for (k = 0; k < 3; k++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.partition[3 - i][j][k] = update_prob(&s->c, s->prob.p.partition[3 - i][j][k]); // mv fields don't use the update_prob subexp model for some reason for (i = 0; i < 3; i++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_joint[i] = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; for (i = 0; i < 2; i++) { - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].sign = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; for (j = 0; j < 10; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].classes[j] = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].class0 = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; for (j = 0; j < 10; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].bits[j] = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; } @@ -1059,23 +1060,23 @@ static int decode_frame_header(AVCodecContext *avctx, for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) for (k = 0; k < 3; k++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].class0_fp[j][k] = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; for (j = 0; j < 3; j++) - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].fp[j] = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; } if (s->s.h.highprecisionmvs) { for (i = 0; i < 2; i++) { - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].class0_hp = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; - if (vp56_rac_get_prob_branchy(&s->c, 252)) + if (vpx_rac_get_prob_branchy(&s->c, 252)) s->prob.p.mv_comp[i].hp = (vp89_rac_get_uint(&s->c, 7) << 1) | 1; } @@ -1136,7 +1137,7 @@ static void decode_sb(VP9TileData *td, int row, int col, VP9Filter *lflvl, default: av_assert0(0); } - } else if (vp56_rac_get_prob_branchy(td->c, p[1])) { + } else if (vpx_rac_get_prob_branchy(td->c, p[1])) { bp = PARTITION_SPLIT; decode_sb(td, row, col, lflvl, yoff, uvoff, bl + 1); decode_sb(td, row, col + hbs, lflvl, @@ -1147,7 +1148,7 @@ static void decode_sb(VP9TileData *td, int row, int col, VP9Filter *lflvl, ff_vp9_decode_block(td, row, col, lflvl, yoff, uvoff, bl, bp); } } else if (row + hbs < s->rows) { // FIXME why not <=? - if (vp56_rac_get_prob_branchy(td->c, p[2])) { + if (vpx_rac_get_prob_branchy(td->c, p[2])) { bp = PARTITION_SPLIT; decode_sb(td, row, col, lflvl, yoff, uvoff, bl + 1); yoff += hbs * 8 * y_stride; @@ -1292,10 +1293,10 @@ static int decode_tiles(AVCodecContext *avctx, ff_thread_report_progress(&s->s.frames[CUR_FRAME].tf, INT_MAX, 0); return AVERROR_INVALIDDATA; } - ret = ff_vp56_init_range_decoder(&td->c_b[tile_col], data, tile_size); + ret = ff_vpx_init_range_decoder(&td->c_b[tile_col], data, tile_size); if (ret < 0) return ret; - if (vp56_rac_get_prob_branchy(&td->c_b[tile_col], 128)) { // marker bit + if (vpx_rac_get_prob_branchy(&td->c_b[tile_col], 128)) { // marker bit ff_thread_report_progress(&s->s.frames[CUR_FRAME].tf, INT_MAX, 0); return AVERROR_INVALIDDATA; } @@ -1341,7 +1342,7 @@ static int decode_tiles(AVCodecContext *avctx, decode_sb_mem(td, row, col, lflvl_ptr, yoff2, uvoff2, BL_64X64); } else { - if (vpX_rac_is_end(td->c)) { + if (vpx_rac_is_end(td->c)) { return AVERROR_INVALIDDATA; } decode_sb(td, row, col, lflvl_ptr, @@ -1715,10 +1716,10 @@ static int vp9_decode_frame(AVCodecContext *avctx, AVFrame *frame, } if (tile_size > size) return AVERROR_INVALIDDATA; - ret = ff_vp56_init_range_decoder(&s->td[tile_col].c_b[tile_row], data, tile_size); + ret = ff_vpx_init_range_decoder(&s->td[tile_col].c_b[tile_row], data, tile_size); if (ret < 0) return ret; - if (vp56_rac_get_prob_branchy(&s->td[tile_col].c_b[tile_row], 128)) // marker bit + if (vpx_rac_get_prob_branchy(&s->td[tile_col].c_b[tile_row], 128)) // marker bit return AVERROR_INVALIDDATA; data += tile_size; size -= tile_size; diff --git a/libavcodec/vp9block.c b/libavcodec/vp9block.c index f5088e3b59..baa343fddc 100644 --- a/libavcodec/vp9block.c +++ b/libavcodec/vp9block.c @@ -29,6 +29,7 @@ #include "vp9.h" #include "vp9data.h" #include "vp9dec.h" +#include "vpx_rac.h" static av_always_inline void setctx_2d(uint8_t *ptr, int w, int h, ptrdiff_t stride, int v) @@ -105,7 +106,7 @@ static void decode_mode(VP9TileData *td) s->s.h.segmentation.prob); } else if (!s->s.h.segmentation.update_map || (s->s.h.segmentation.temporal && - vp56_rac_get_prob_branchy(td->c, + vpx_rac_get_prob_branchy(td->c, s->s.h.segmentation.pred_prob[s->above_segpred_ctx[col] + td->left_segpred_ctx[row7]]))) { if (!s->s.h.errorres && s->s.frames[REF_FRAME_SEGMAP].segmentation_map) { @@ -144,7 +145,7 @@ static void decode_mode(VP9TileData *td) s->s.h.segmentation.feat[b->seg_id].skip_enabled; if (!b->skip) { int c = td->left_skip_ctx[row7] + s->above_skip_ctx[col]; - b->skip = vp56_rac_get_prob(td->c, s->prob.p.skip[c]); + b->skip = vpx_rac_get_prob(td->c, s->prob.p.skip[c]); td->counts.skip[c][b->skip]++; } @@ -162,7 +163,7 @@ static void decode_mode(VP9TileData *td) c = have_a ? 2 * s->above_intra_ctx[col] : have_l ? 2 * td->left_intra_ctx[row7] : 0; } - bit = vp56_rac_get_prob(td->c, s->prob.p.intra[c]); + bit = vpx_rac_get_prob(td->c, s->prob.p.intra[c]); td->counts.intra[c][bit]++; b->intra = !bit; } @@ -187,22 +188,22 @@ static void decode_mode(VP9TileData *td) } switch (max_tx) { case TX_32X32: - b->tx = vp56_rac_get_prob(td->c, s->prob.p.tx32p[c][0]); + b->tx = vpx_rac_get_prob(td->c, s->prob.p.tx32p[c][0]); if (b->tx) { - b->tx += vp56_rac_get_prob(td->c, s->prob.p.tx32p[c][1]); + b->tx += vpx_rac_get_prob(td->c, s->prob.p.tx32p[c][1]); if (b->tx == 2) - b->tx += vp56_rac_get_prob(td->c, s->prob.p.tx32p[c][2]); + b->tx += vpx_rac_get_prob(td->c, s->prob.p.tx32p[c][2]); } td->counts.tx32p[c][b->tx]++; break; case TX_16X16: - b->tx = vp56_rac_get_prob(td->c, s->prob.p.tx16p[c][0]); + b->tx = vpx_rac_get_prob(td->c, s->prob.p.tx16p[c][0]); if (b->tx) - b->tx += vp56_rac_get_prob(td->c, s->prob.p.tx16p[c][1]); + b->tx += vpx_rac_get_prob(td->c, s->prob.p.tx16p[c][1]); td->counts.tx16p[c][b->tx]++; break; case TX_8X8: - b->tx = vp56_rac_get_prob(td->c, s->prob.p.tx8p[c]); + b->tx = vpx_rac_get_prob(td->c, s->prob.p.tx8p[c]); td->counts.tx8p[c][b->tx]++; break; case TX_4X4: @@ -367,7 +368,7 @@ static void decode_mode(VP9TileData *td) } else { c = 1; } - b->comp = vp56_rac_get_prob(td->c, s->prob.p.comp[c]); + b->comp = vpx_rac_get_prob(td->c, s->prob.p.comp[c]); td->counts.comp[c][b->comp]++; } @@ -439,7 +440,7 @@ static void decode_mode(VP9TileData *td) } else { c = 2; } - bit = vp56_rac_get_prob(td->c, s->prob.p.comp_ref[c]); + bit = vpx_rac_get_prob(td->c, s->prob.p.comp_ref[c]); b->ref[var_idx] = s->s.h.varcompref[bit]; td->counts.comp_ref[c][bit]++; } else /* single reference */ { @@ -479,7 +480,7 @@ static void decode_mode(VP9TileData *td) } else { c = 2; } - bit = vp56_rac_get_prob(td->c, s->prob.p.single_ref[c][0]); + bit = vpx_rac_get_prob(td->c, s->prob.p.single_ref[c][0]); td->counts.single_ref[c][0][bit]++; if (!bit) { b->ref[0] = 0; @@ -566,7 +567,7 @@ static void decode_mode(VP9TileData *td) } else { c = 2; } - bit = vp56_rac_get_prob(td->c, s->prob.p.single_ref[c][1]); + bit = vpx_rac_get_prob(td->c, s->prob.p.single_ref[c][1]); td->counts.single_ref[c][1][bit]++; b->ref[0] = 1 + bit; } @@ -802,7 +803,7 @@ static void decode_mode(VP9TileData *td) // FIXME merge cnt/eob arguments? static av_always_inline int -decode_coeffs_b_generic(VP56RangeCoder *c, int16_t *coef, int n_coeffs, +decode_coeffs_b_generic(VPXRangeCoder *c, int16_t *coef, int n_coeffs, int is_tx32x32, int is8bitsperpixel, int bpp, unsigned (*cnt)[6][3], unsigned (*eob)[6][2], uint8_t (*p)[6][11], int nnz, const int16_t *scan, const int16_t (*nb)[2], @@ -815,13 +816,13 @@ decode_coeffs_b_generic(VP56RangeCoder *c, int16_t *coef, int n_coeffs, do { int val, rc; - val = vp56_rac_get_prob_branchy(c, tp[0]); // eob + val = vpx_rac_get_prob_branchy(c, tp[0]); // eob eob[band][nnz][val]++; if (!val) break; skip_eob: - if (!vp56_rac_get_prob_branchy(c, tp[1])) { // zero + if (!vpx_rac_get_prob_branchy(c, tp[1])) { // zero cnt[band][nnz][0]++; if (!--band_left) band_left = band_counts[++band]; @@ -834,70 +835,70 @@ skip_eob: } rc = scan[i]; - if (!vp56_rac_get_prob_branchy(c, tp[2])) { // one + if (!vpx_rac_get_prob_branchy(c, tp[2])) { // one cnt[band][nnz][1]++; val = 1; cache[rc] = 1; } else { cnt[band][nnz][2]++; - if (!vp56_rac_get_prob_branchy(c, tp[3])) { // 2, 3, 4 - if (!vp56_rac_get_prob_branchy(c, tp[4])) { + if (!vpx_rac_get_prob_branchy(c, tp[3])) { // 2, 3, 4 + if (!vpx_rac_get_prob_branchy(c, tp[4])) { cache[rc] = val = 2; } else { - val = 3 + vp56_rac_get_prob(c, tp[5]); + val = 3 + vpx_rac_get_prob(c, tp[5]); cache[rc] = 3; } - } else if (!vp56_rac_get_prob_branchy(c, tp[6])) { // cat1/2 + } else if (!vpx_rac_get_prob_branchy(c, tp[6])) { // cat1/2 cache[rc] = 4; - if (!vp56_rac_get_prob_branchy(c, tp[7])) { - val = vp56_rac_get_prob(c, 159) + 5; + if (!vpx_rac_get_prob_branchy(c, tp[7])) { + val = vpx_rac_get_prob(c, 159) + 5; } else { - val = (vp56_rac_get_prob(c, 165) << 1) + 7; - val += vp56_rac_get_prob(c, 145); + val = (vpx_rac_get_prob(c, 165) << 1) + 7; + val += vpx_rac_get_prob(c, 145); } } else { // cat 3-6 cache[rc] = 5; - if (!vp56_rac_get_prob_branchy(c, tp[8])) { - if (!vp56_rac_get_prob_branchy(c, tp[9])) { - val = 11 + (vp56_rac_get_prob(c, 173) << 2); - val += (vp56_rac_get_prob(c, 148) << 1); - val += vp56_rac_get_prob(c, 140); + if (!vpx_rac_get_prob_branchy(c, tp[8])) { + if (!vpx_rac_get_prob_branchy(c, tp[9])) { + val = 11 + (vpx_rac_get_prob(c, 173) << 2); + val += (vpx_rac_get_prob(c, 148) << 1); + val += vpx_rac_get_prob(c, 140); } else { - val = 19 + (vp56_rac_get_prob(c, 176) << 3); - val += (vp56_rac_get_prob(c, 155) << 2); - val += (vp56_rac_get_prob(c, 140) << 1); - val += vp56_rac_get_prob(c, 135); + val = 19 + (vpx_rac_get_prob(c, 176) << 3); + val += (vpx_rac_get_prob(c, 155) << 2); + val += (vpx_rac_get_prob(c, 140) << 1); + val += vpx_rac_get_prob(c, 135); } - } else if (!vp56_rac_get_prob_branchy(c, tp[10])) { - val = (vp56_rac_get_prob(c, 180) << 4) + 35; - val += (vp56_rac_get_prob(c, 157) << 3); - val += (vp56_rac_get_prob(c, 141) << 2); - val += (vp56_rac_get_prob(c, 134) << 1); - val += vp56_rac_get_prob(c, 130); + } else if (!vpx_rac_get_prob_branchy(c, tp[10])) { + val = (vpx_rac_get_prob(c, 180) << 4) + 35; + val += (vpx_rac_get_prob(c, 157) << 3); + val += (vpx_rac_get_prob(c, 141) << 2); + val += (vpx_rac_get_prob(c, 134) << 1); + val += vpx_rac_get_prob(c, 130); } else { val = 67; if (!is8bitsperpixel) { if (bpp == 12) { - val += vp56_rac_get_prob(c, 255) << 17; - val += vp56_rac_get_prob(c, 255) << 16; + val += vpx_rac_get_prob(c, 255) << 17; + val += vpx_rac_get_prob(c, 255) << 16; } - val += (vp56_rac_get_prob(c, 255) << 15); - val += (vp56_rac_get_prob(c, 255) << 14); + val += (vpx_rac_get_prob(c, 255) << 15); + val += (vpx_rac_get_prob(c, 255) << 14); } - val += (vp56_rac_get_prob(c, 254) << 13); - val += (vp56_rac_get_prob(c, 254) << 12); - val += (vp56_rac_get_prob(c, 254) << 11); - val += (vp56_rac_get_prob(c, 252) << 10); - val += (vp56_rac_get_prob(c, 249) << 9); - val += (vp56_rac_get_prob(c, 243) << 8); - val += (vp56_rac_get_prob(c, 230) << 7); - val += (vp56_rac_get_prob(c, 196) << 6); - val += (vp56_rac_get_prob(c, 177) << 5); - val += (vp56_rac_get_prob(c, 153) << 4); - val += (vp56_rac_get_prob(c, 140) << 3); - val += (vp56_rac_get_prob(c, 133) << 2); - val += (vp56_rac_get_prob(c, 130) << 1); - val += vp56_rac_get_prob(c, 129); + val += (vpx_rac_get_prob(c, 254) << 13); + val += (vpx_rac_get_prob(c, 254) << 12); + val += (vpx_rac_get_prob(c, 254) << 11); + val += (vpx_rac_get_prob(c, 252) << 10); + val += (vpx_rac_get_prob(c, 249) << 9); + val += (vpx_rac_get_prob(c, 243) << 8); + val += (vpx_rac_get_prob(c, 230) << 7); + val += (vpx_rac_get_prob(c, 196) << 6); + val += (vpx_rac_get_prob(c, 177) << 5); + val += (vpx_rac_get_prob(c, 153) << 4); + val += (vpx_rac_get_prob(c, 140) << 3); + val += (vpx_rac_get_prob(c, 133) << 2); + val += (vpx_rac_get_prob(c, 130) << 1); + val += vpx_rac_get_prob(c, 129); } } } diff --git a/libavcodec/vp9dec.h b/libavcodec/vp9dec.h index 9cbd5839a8..56676a7c03 100644 --- a/libavcodec/vp9dec.h +++ b/libavcodec/vp9dec.h @@ -36,6 +36,7 @@ #include "vp9.h" #include "vp9dsp.h" #include "vp9shared.h" +#include "vpx_rac.h" #define REF_INVALID_SCALE 0xFFFF @@ -98,7 +99,7 @@ typedef struct VP9Context { VP9DSPContext dsp; VideoDSPContext vdsp; GetBitContext gb; - VP56RangeCoder c; + VPXRangeCoder c; int pass, active_tile_cols; #if HAVE_THREADS @@ -166,8 +167,8 @@ struct VP9TileData { //VP9Context should be const, but because of the threading API(generates //a lot of warnings) it's not. VP9Context *s; - VP56RangeCoder *c_b; - VP56RangeCoder *c; + VPXRangeCoder *c_b; + VPXRangeCoder *c; int row, row7, col, col7; uint8_t *dst[3]; ptrdiff_t y_stride, uv_stride; diff --git a/libavcodec/vp9mvs.c b/libavcodec/vp9mvs.c index cee91dc34d..c604ec7cb6 100644 --- a/libavcodec/vp9mvs.c +++ b/libavcodec/vp9mvs.c @@ -24,9 +24,9 @@ #include "threadframe.h" #include "vp56.h" #include "vp89_rac.h" -#include "vp9.h" #include "vp9data.h" #include "vp9dec.h" +#include "vpx_rac.h" static av_always_inline void clamp_mv(VP56mv *dst, const VP56mv *src, VP9TileData *td) @@ -237,7 +237,7 @@ static void find_ref_mvs(VP9TileData *td, static av_always_inline int read_mv_component(VP9TileData *td, int idx, int hp) { VP9Context *s = td->s; - int bit, sign = vp56_rac_get_prob(td->c, s->prob.p.mv_comp[idx].sign); + int bit, sign = vpx_rac_get_prob(td->c, s->prob.p.mv_comp[idx].sign); int n, c = vp89_rac_get_tree(td->c, ff_vp9_mv_class_tree, s->prob.p.mv_comp[idx].classes); @@ -247,7 +247,7 @@ static av_always_inline int read_mv_component(VP9TileData *td, int idx, int hp) int m; for (n = 0, m = 0; m < c; m++) { - bit = vp56_rac_get_prob(td->c, s->prob.p.mv_comp[idx].bits[m]); + bit = vpx_rac_get_prob(td->c, s->prob.p.mv_comp[idx].bits[m]); n |= bit << m; td->counts.mv_comp[idx].bits[m][bit]++; } @@ -257,7 +257,7 @@ static av_always_inline int read_mv_component(VP9TileData *td, int idx, int hp) n |= bit << 1; td->counts.mv_comp[idx].fp[bit]++; if (hp) { - bit = vp56_rac_get_prob(td->c, s->prob.p.mv_comp[idx].hp); + bit = vpx_rac_get_prob(td->c, s->prob.p.mv_comp[idx].hp); td->counts.mv_comp[idx].hp[bit]++; n |= bit; } else { @@ -268,14 +268,14 @@ static av_always_inline int read_mv_component(VP9TileData *td, int idx, int hp) } n += 8 << c; } else { - n = vp56_rac_get_prob(td->c, s->prob.p.mv_comp[idx].class0); + n = vpx_rac_get_prob(td->c, s->prob.p.mv_comp[idx].class0); td->counts.mv_comp[idx].class0[n]++; bit = vp89_rac_get_tree(td->c, ff_vp9_mv_fp_tree, s->prob.p.mv_comp[idx].class0_fp[n]); td->counts.mv_comp[idx].class0_fp[n][bit]++; n = (n << 3) | (bit << 1); if (hp) { - bit = vp56_rac_get_prob(td->c, s->prob.p.mv_comp[idx].class0_hp); + bit = vpx_rac_get_prob(td->c, s->prob.p.mv_comp[idx].class0_hp); td->counts.mv_comp[idx].class0_hp[bit]++; n |= bit; } else { diff --git a/libavcodec/vp56rac.c b/libavcodec/vpx_rac.c similarity index 92% rename from libavcodec/vp56rac.c rename to libavcodec/vpx_rac.c index 19e7dcf2bb..cf02e9a19c 100644 --- a/libavcodec/vp56rac.c +++ b/libavcodec/vpx_rac.c @@ -22,9 +22,9 @@ #include #include "libavutil/error.h" #include "bytestream.h" -#include "vp56.h" +#include "vpx_rac.h" -const uint8_t ff_vp56_norm_shift[256]= { +const uint8_t ff_vpx_norm_shift[256]= { 8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, @@ -39,7 +39,7 @@ const uint8_t ff_vp56_norm_shift[256]= { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; -int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size) +int ff_vpx_init_range_decoder(VPXRangeCoder *c, const uint8_t *buf, int buf_size) { c->high = 255; c->bits = -16; diff --git a/libavcodec/vpx_rac.h b/libavcodec/vpx_rac.h new file mode 100644 index 0000000000..b158cc0754 --- /dev/null +++ b/libavcodec/vpx_rac.h @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2006 Aurelien Jacobs + * + * 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 + */ + +/** + * @file + * Common VP5-VP9 range decoder stuff + */ + +#ifndef AVCODEC_VPX_RAC_H +#define AVCODEC_VPX_RAC_H + +#include + +#include "config.h" +#include "libavutil/attributes.h" +#include "bytestream.h" + +typedef struct VPXRangeCoder { + int high; + int bits; /* stored negated (i.e. negative "bits" is a positive number of + bits left) in order to eliminate a negate in cache refilling */ + const uint8_t *buffer; + const uint8_t *end; + unsigned int code_word; + int end_reached; +} VPXRangeCoder; + +extern const uint8_t ff_vpx_norm_shift[256]; +int ff_vpx_init_range_decoder(VPXRangeCoder *c, const uint8_t *buf, int buf_size); + +/** + * returns 1 if the end of the stream has been reached, 0 otherwise. + */ +static av_always_inline int vpx_rac_is_end(VPXRangeCoder *c) +{ + if (c->end <= c->buffer && c->bits >= 0) + c->end_reached ++; + return c->end_reached > 10; +} + +static av_always_inline unsigned int vpx_rac_renorm(VPXRangeCoder *c) +{ + int shift = ff_vpx_norm_shift[c->high]; + int bits = c->bits; + unsigned int code_word = c->code_word; + + c->high <<= shift; + code_word <<= shift; + bits += shift; + if(bits >= 0 && c->buffer < c->end) { + code_word |= bytestream_get_be16(&c->buffer) << bits; + bits -= 16; + } + c->bits = bits; + return code_word; +} + +#if ARCH_ARM +#include "arm/vpx_arith.h" +#elif ARCH_X86 +#include "x86/vpx_arith.h" +#endif + +#ifndef vpx_rac_get_prob +#define vpx_rac_get_prob vpx_rac_get_prob +static av_always_inline int vpx_rac_get_prob(VPXRangeCoder *c, uint8_t prob) +{ + unsigned int code_word = vpx_rac_renorm(c); + unsigned int low = 1 + (((c->high - 1) * prob) >> 8); + unsigned int low_shift = low << 16; + int bit = code_word >= low_shift; + + c->high = bit ? c->high - low : low; + c->code_word = bit ? code_word - low_shift : code_word; + + return bit; +} +#endif + +#ifndef vpx_rac_get_prob_branchy +// branchy variant, to be used where there's a branch based on the bit decoded +static av_always_inline int vpx_rac_get_prob_branchy(VPXRangeCoder *c, int prob) +{ + unsigned long code_word = vpx_rac_renorm(c); + unsigned low = 1 + (((c->high - 1) * prob) >> 8); + unsigned low_shift = low << 16; + + if (code_word >= low_shift) { + c->high -= low; + c->code_word = code_word - low_shift; + return 1; + } + + c->high = low; + c->code_word = code_word; + return 0; +} +#endif + +static av_always_inline int vpx_rac_get(VPXRangeCoder *c) +{ + unsigned int code_word = vpx_rac_renorm(c); + /* equiprobable */ + int low = (c->high + 1) >> 1; + unsigned int low_shift = low << 16; + int bit = code_word >= low_shift; + if (bit) { + c->high -= low; + code_word -= low_shift; + } else { + c->high = low; + } + + c->code_word = code_word; + return bit; +} + +#endif /* AVCODEC_VPX_RAC_H */ diff --git a/libavcodec/x86/vp56_arith.h b/libavcodec/x86/vpx_arith.h similarity index 83% rename from libavcodec/x86/vp56_arith.h rename to libavcodec/x86/vpx_arith.h index 9f7639980c..d9e4c0dec4 100644 --- a/libavcodec/x86/vp56_arith.h +++ b/libavcodec/x86/vpx_arith.h @@ -21,16 +21,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVCODEC_X86_VP56_ARITH_H -#define AVCODEC_X86_VP56_ARITH_H +#ifndef AVCODEC_X86_VPX_ARITH_H +#define AVCODEC_X86_VPX_ARITH_H + +#include "libavutil/x86/asm.h" #if HAVE_INLINE_ASM && HAVE_FAST_CMOV && HAVE_6REGS #include "libavutil/attributes.h" -#define vp56_rac_get_prob vp56_rac_get_prob -static av_always_inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob) +#define vpx_rac_get_prob vpx_rac_get_prob +static av_always_inline int vpx_rac_get_prob(VPXRangeCoder *c, uint8_t prob) { - unsigned int code_word = vp56_rac_renorm(c); + unsigned int code_word = vpx_rac_renorm(c); unsigned int low = 1 + (((c->high - 1) * prob) >> 8); unsigned int low_shift = low << 16; int bit = 0; @@ -50,4 +52,4 @@ static av_always_inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob) } #endif -#endif /* AVCODEC_X86_VP56_ARITH_H */ +#endif /* AVCODEC_X86_VPX_ARITH_H */ From patchwork Sat Jul 23 05:16:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36899 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp826434pzb; Fri, 22 Jul 2022 22:17:00 -0700 (PDT) X-Google-Smtp-Source: AGRyM1v/xd5OmmeY6su4E2UJFvyavfVg1Lj3MoLXOSdDoMHkycp2dURN9vMQ6Hj4czuB0oGmwViq X-Received: by 2002:a17:906:8a69:b0:72b:40d3:7b6c with SMTP id hy9-20020a1709068a6900b0072b40d37b6cmr2370940ejc.624.1658553420158; Fri, 22 Jul 2022 22:17:00 -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 hs5-20020a1709073e8500b0072b52d5f9e4si6288641ejc.988.2022.07.22.22.16.59; Fri, 22 Jul 2022 22:17:00 -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=@outlook.com header.s=selector1 header.b=Vykqae6P; arc=fail (body hash mismatch); 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=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 01B4368B7B8; Sat, 23 Jul 2022 08:16:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073013.outbound.protection.outlook.com [40.92.73.13]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EF97468B6FA for ; Sat, 23 Jul 2022 08:16:35 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=D03mXQCUJkochEFEhyT98l8pOEl5qV3EBD/ZMdF0Hl4bGFt1C6q/mv9ZSXaB3Xm3KurLLtOPgIXw+FmXgI/mBpelCgqrI583Mtx87NynZcP2PVDeAkaigeg3YZ63mqsB3AgpVfhg7YG04IEvS94hiyNR9YXt0rAV1O/ruIpuh5N40aemI8h0ksnIr3+9agc9I7XYG29heSpP3Vz8M+m3JyTLroo28oCI/wh+Eve9S8jQPHIQgh0FEVQ5qhQB174AeSS5co0SdFtrn1715eL8lazuohQvNAtNadmv8WbUi+PT68e9YJQrPjy5ZaI0ISCuNLLUuaaaRmSOWvT5w/W39w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=CwlvxhK46URGgofK8g9uaqxeR4E+XkB04FK60UeQdLA=; b=Cg+gtYpzS4q9g9we4h3YWjHY3Ai4A3MAOHQrkKTIM269QNGS3xftyp94pQQ/GG9ddwhDKRKe7gA4kreMtjUeQzGW6y6MuKgt+dMrkMbeKaiHjvnMrM66BDudiY4bxeKk9/uTyciGLOBVUuwFp6Krms1HAYdAsxUmMujOgTGwOlxlSAd+GqZ6gpQI0r/rceGQIp/O+GYEN1+VOpVI3hAby8xke7T+yadw/iAt+cw6/rGxEhMCIfRjz6YPGeLACuy0inX/zTZShWQxw7zzFE5G8A1WTKi6K/IYm4jGBefQMkd6n7/emulhCYaj8IogQK4MZnMsQOr7FMl9V3Gp42iRUw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CwlvxhK46URGgofK8g9uaqxeR4E+XkB04FK60UeQdLA=; b=Vykqae6PGauc+bG68anydj8VEk7tkZiSdzt58C7zszUBOBg6lWetSExNdA0eckAYeYJUq74+Za/p6CLH8zMFjTVOMfwJUD/ZQFhkfDB6jlWD34vsahaBtW7fC8yTzMDVB7feS/5/OV0shJPJ4uq65Osc0t7BsdaqZGFS+arpyVyrFK0f/ZuHp2k0rDQekhrBjR8mNu3zsfKgMzeDqCFhlUp+wrc8pcRH+hFBEhvDwjBrtKpuG2SLUM2Kjs8wZgKmOp4GdvTtTJT0rTYh5ICZEYZ4gVx33jdxZYxIsMVKgCI6eVdn05nc8CNLlkoNgIRi+iZUqi3/J/zH6yUXq7RXiA== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by DU0PR01MB10211.eurprd01.prod.exchangelabs.com (2603:10a6:10:315::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.20; Sat, 23 Jul 2022 05:16:28 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5458.020; Sat, 23 Jul 2022 05:16:28 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Jul 2022 07:16:10 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [yWd4mkw2hCbjNEC67E+GeqyuqbUGtheR] X-ClientProxiedBy: FR3P281CA0037.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:4a::21) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220723051610.287773-4-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d22c780e-2091-4219-40d3-08da6c6a7edc X-MS-Exchange-SLBlob-MailProps: ISIDp/2nRg1zbbtLliz97RSTgN8tc71BbFDCdn9mOZzSj+xBPpuXvprDdqv2FqMsyc7O3zsqDWg3gP64PQHbZtVoNKxYdf3cWYnvz3R/r5TELqgxLhVmho0ptDPBUdUPFOUkIUdJTXYF/XYAbqTNwW3MM78ZOHY71A2NicDYHtedy/hxA5aUyiPEx4rffTPDehmdI+wX6mZbimn7us8yFZIJSWBsNCAFPn3ZVjzvhkq3yp+Op7Kt5zBMoTlWk9EG9w6joJY9j1Zx2aH30Z1zx/o21XHUu5fsvMkJ0Do0qDNT2NpkThCbhoz7Vw/xa6WTmuwRiSOm87mkP+YFDmuJ4yP9onBVIZiarTYcdlTk8K+o52hy5qJXGnw96dvK/1nbKbatLUm+2cZgz7wXVfrK/aAAgekB1nD6FEw29znwg4CecBDfzV3XlJWCN9avFFkhGuuAxDrDJzIAsuJz3gxusu9s06RhM8bfqLCYd9/xtkH0xtTI0l5WZ1e76iRhjZVzscUCbMxjcaKYxwGX83bezNvpolQ2GWnTVcZqj2BE9DfkH/Y7OCcKfTExuLheBqKpttdlvbIa7IJkV+In86jp62gGQ2vTEu0rgJQKITcAd8n/KAP0abZa1v2Of6gL++GMJY/uPRS5AQAUH6jgHTrGCU18P4VGKLKKXITVtU+IMMtyl73/whjv5HsCccsL84KD6uLvkubzVjM9/OYxcLPzrFaI1RTHNTDlpyUERuu55TqbqnGoTUPHP2/wQXbumGLtZ9StYmggvaNtYmUUThoZWXgiYs/nq59pA9VvTQdbPLZVBLETaqCPYfDg6k/0Ja5Gc6M+9vez6TBwLqr0WmPAb33sJRKYl4R+TPzLM0eTYr4zSIRtdAhjGLEO5W7ol7g6dFZ+tzrtseQ= X-MS-TrafficTypeDiagnostic: DU0PR01MB10211:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: LPR57garUJG5NIu9dWifCkQy6qG36DTDuHEeNrWBZnIcIvmRcoa9jKHer7MqY3jUN0aCdffSOIp5xwJbvTO1Rnh41N78BCNCTh2CZoD9/JFX3DdXnwHE0IFzfUI2USDWVyhENFd9peF9FzM/e1ABibfEyNT8YzCYcCiSGVbDfFcGtehLqIO6HuZvYSS+tpFm2bVMgP0deMAA0buOtOO+OZBbQ3IP83CxNxMKfb5lXgj1sk2vBWNwqoW0OP2YWf3u1hdSF/T7U8ntQxp1XpyxJS/WBo+dxF5jgoO2xo++tAIG7DcNNSxiULjgctzyI0Q0dyqymOYWhYJjxalPyjqD0qVuDQFqZcT4etih7+cN40wEDLIqxeeqaU+SG1+0Fici5d5HQqqyyVtXbKVEoMAV56VpThKWB9O1MuL+3t1tL446btcetfrV4ivyh9vWXJxzwSbKorWMUUFd+vu4AHufxwPo3kqOT1nh7ihtPtrlMSrW0n/G8Ej6c3XB1oNEy8ZfmreJHGtcMXo4G/PH+mGQ6/pSjDLlY/LVQIwI4//bDvZyFzFWZymXkvkmm+h2FZgwRjj9a5Ycn7nGVyO0GDLc+ZJz72W2NV7ZDtWLv/MeYwyP/akdDQTEQEAqdo6+AxUE X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: RnMjxR8y/WuqMn6GuOGruYUjJeYEStqZ7B+7PrWVoWr3Rn7TO4wNxWufBqcPVAhwIVfaiX+dUQT7EU3r7dlFTt6W0zRQJ7xQzy7KubQhncBfIm8af+IhmcipRKAr7LziC8PYw+U1vM3qSaA49d7EXLLFUP8D4w5/UBS4GnPKLD9FH6xXacRHrqL9dXwv42EgHY65GreMXF1/D0En+qcTxmSJG0GhtiJboUyaRl6vvVmpqJQOtOLlDeOzyIg8OTBPE2FMXaVV/Gvp2Ilj5AKy16xiDmiALB3umjgmvVbACd62EGO25Yi4B5j5Dd6VUQo0dTP3QHbG+/d4skiZUBC8EwLUe/LhnOFU2tCCIA4GAQ0zwDyKnZ41JJGSAVmkv3N2dXrDMb777woN3Gcaio+QFLeYsjtwCehBgEsVrpS/AdH6TuIaBSbeZDUkiYWqQnVNix/WzITEISR96z/oHTokMuyznKY/pcD3s42TMd6hE1BRmhI2X9/FENTvvgD6oP/1cuTrwqC6ozdGZcxpvCID0/rvU6fLmZP12wVXLVaG/6xgtXzjctRps08WHRuFqlidHy5jnz/GNhndiDbzytzqhTwyVPsouWXFxSQHyfYbx1zo7IjCiyxpnRoah1js9ujDB3Ak+gFlQPChFNdWMacMPXPgcFwEyE432up35M2tAy6d3rzKa6X/6UVhfdF8vffDVWJCVX9iuZyeGSB84mY3Nj1+JWqugkugQnuTi9oEahv9c68LUBFVKW9wmiPAkoWPAsmgfCagvKauxJvgA+wAlKMZxVEinaUvsW6aE4efu4No15nuOEZR+CE8blBY/R/rK1r+OGFaEOoULPAjy4T0nfV8v1F0nCCMhaisv7Seo8s3EWJwxf56TkTCfqTelpWyEAV8v4mACpgcYDODDQ90QNP7oWyP6TIikOQDrzLCJJa1v7TuV+OGFIR9zqYcOlpVdho3YG9slBW8nrApkHXm4FMZBBJwbLCZXzrs4CGe6rwfhxGb6Ma1harYBzV2sQ5fdUEymRUaefsC6AbOoeyCUwS0BqRRkZx0f7J5HonfHgh9pgphjMCbiELPtV+W7cNWkCRMA0tQ7zUhN1P3XBElu2+wf6iH0Iic5EjfsR5WecUFpwzuxdOwg2LKV2Md9p5oBhDOnEFr4ADHTO3Z6VP1TQBdHtKUYkGGrdhVRJUzHL/88E02QSslTIHhyu5yDzAbdETIilO5tG4n9+Lx09mPATX2Q0pJxYMZFYZ89e8hITCvXAb+l+gizgYoHOBQwjQmF+WV5lvN+qEPbxca4US8xT//63CjPCRZyLflnAudJNc= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d22c780e-2091-4219-40d3-08da6c6a7edc X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jul 2022 05:16:28.2199 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR01MB10211 Subject: [FFmpeg-devel] [PATCH 5/5] avcodec/vp8, vp9: Avoid using VP56mv and VP56Frame in VP8/9 X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: M8OXT+LOCkAI Instead replace VP56mv by new and identical structures VP8mv and VP9mv. Also replace VP56Frame by VP8FrameType in vp8.h and use that in VP8 code. Also remove VP56_FRAME_GOLDEN2, as this has only been used by VP8. This allows to remove all inclusions of vp56.h from everything that is not VP5/6. This also removes implicit inclusions of hpeldsp.h, h264chroma.h, vp3dsp.h and vp56dsp.h from all VP8/9 files. Signed-off-by: Andreas Rheinhardt --- libavcodec/nvdec_vp8.c | 8 +- libavcodec/vaapi_vp8.c | 18 ++--- libavcodec/vp56.h | 1 - libavcodec/vp8.c | 138 +++++++++++++++++------------------ libavcodec/vp8.h | 35 ++++++--- libavcodec/vp9.c | 3 +- libavcodec/vp9_mc_template.c | 6 +- libavcodec/vp9block.c | 1 - libavcodec/vp9dec.h | 10 ++- libavcodec/vp9mvs.c | 11 ++- libavcodec/vp9prob.c | 2 - libavcodec/vp9recon.c | 12 +-- libavcodec/vp9shared.h | 10 ++- 13 files changed, 135 insertions(+), 120 deletions(-) diff --git a/libavcodec/nvdec_vp8.c b/libavcodec/nvdec_vp8.c index 9c4608d8cf..1fbd56a289 100644 --- a/libavcodec/nvdec_vp8.c +++ b/libavcodec/nvdec_vp8.c @@ -39,7 +39,7 @@ static int nvdec_vp8_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u CUVIDPICPARAMS *pp = &ctx->pic_params; FrameDecodeData *fdd; NVDECFrame *cf; - AVFrame *cur_frame = h->framep[VP56_FRAME_CURRENT]->tf.f; + AVFrame *cur_frame = h->framep[VP8_FRAME_CURRENT]->tf.f; int ret; @@ -61,9 +61,9 @@ static int nvdec_vp8_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u .first_partition_size = h->header_partition_size, - .LastRefIdx = safe_get_ref_idx(h->framep[VP56_FRAME_PREVIOUS]), - .GoldenRefIdx = safe_get_ref_idx(h->framep[VP56_FRAME_GOLDEN]), - .AltRefIdx = safe_get_ref_idx(h->framep[VP56_FRAME_GOLDEN2]), + .LastRefIdx = safe_get_ref_idx(h->framep[VP8_FRAME_PREVIOUS]), + .GoldenRefIdx = safe_get_ref_idx(h->framep[VP8_FRAME_GOLDEN]), + .AltRefIdx = safe_get_ref_idx(h->framep[VP8_FRAME_GOLDEN2]), /* * Explicit braces for anonymous inners and unnamed fields * to work around limitations in ancient versions of gcc. diff --git a/libavcodec/vaapi_vp8.c b/libavcodec/vaapi_vp8.c index 06c23e760b..cd1594e0fb 100644 --- a/libavcodec/vaapi_vp8.c +++ b/libavcodec/vaapi_vp8.c @@ -36,21 +36,21 @@ static int vaapi_vp8_start_frame(AVCodecContext *avctx, av_unused uint32_t size) { const VP8Context *s = avctx->priv_data; - VAAPIDecodePicture *pic = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private; + VAAPIDecodePicture *pic = s->framep[VP8_FRAME_CURRENT]->hwaccel_picture_private; VAPictureParameterBufferVP8 pp; VAProbabilityDataBufferVP8 prob; VAIQMatrixBufferVP8 quant; int err, i, j, k; - pic->output_surface = vaapi_vp8_surface_id(s->framep[VP56_FRAME_CURRENT]); + pic->output_surface = vaapi_vp8_surface_id(s->framep[VP8_FRAME_CURRENT]); pp = (VAPictureParameterBufferVP8) { .frame_width = avctx->width, .frame_height = avctx->height, - .last_ref_frame = vaapi_vp8_surface_id(s->framep[VP56_FRAME_PREVIOUS]), - .golden_ref_frame = vaapi_vp8_surface_id(s->framep[VP56_FRAME_GOLDEN]), - .alt_ref_frame = vaapi_vp8_surface_id(s->framep[VP56_FRAME_GOLDEN2]), + .last_ref_frame = vaapi_vp8_surface_id(s->framep[VP8_FRAME_PREVIOUS]), + .golden_ref_frame = vaapi_vp8_surface_id(s->framep[VP8_FRAME_GOLDEN]), + .alt_ref_frame = vaapi_vp8_surface_id(s->framep[VP8_FRAME_GOLDEN2]), .out_of_loop_frame = VA_INVALID_SURFACE, .pic_fields.bits = { @@ -67,8 +67,8 @@ static int vaapi_vp8_start_frame(AVCodecContext *avctx, .loop_filter_adj_enable = s->lf_delta.enabled, .mode_ref_lf_delta_update = s->lf_delta.update, - .sign_bias_golden = s->sign_bias[VP56_FRAME_GOLDEN], - .sign_bias_alternate = s->sign_bias[VP56_FRAME_GOLDEN2], + .sign_bias_golden = s->sign_bias[VP8_FRAME_GOLDEN], + .sign_bias_alternate = s->sign_bias[VP8_FRAME_GOLDEN2], .mb_no_coeff_skip = s->mbskip_enabled, .loop_filter_disable = s->filter.level == 0, @@ -177,7 +177,7 @@ fail: static int vaapi_vp8_end_frame(AVCodecContext *avctx) { const VP8Context *s = avctx->priv_data; - VAAPIDecodePicture *pic = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private; + VAAPIDecodePicture *pic = s->framep[VP8_FRAME_CURRENT]->hwaccel_picture_private; return ff_vaapi_decode_issue(avctx, pic); } @@ -187,7 +187,7 @@ static int vaapi_vp8_decode_slice(AVCodecContext *avctx, uint32_t size) { const VP8Context *s = avctx->priv_data; - VAAPIDecodePicture *pic = s->framep[VP56_FRAME_CURRENT]->hwaccel_picture_private; + VAAPIDecodePicture *pic = s->framep[VP8_FRAME_CURRENT]->hwaccel_picture_private; VASliceParameterBufferVP8 sp; int err, i; diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h index b1b14b63f8..9dc0b9c7ad 100644 --- a/libavcodec/vp56.h +++ b/libavcodec/vp56.h @@ -44,7 +44,6 @@ typedef enum { VP56_FRAME_CURRENT = 0, VP56_FRAME_PREVIOUS = 1, VP56_FRAME_GOLDEN = 2, - VP56_FRAME_GOLDEN2 = 3, } VP56Frame; typedef enum { diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index de1fdac82e..781b0967f6 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -191,10 +191,10 @@ static VP8Frame *vp8_find_free_buffer(VP8Context *s) // find a free buffer for (i = 0; i < 5; i++) - if (&s->frames[i] != s->framep[VP56_FRAME_CURRENT] && - &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] && - &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] && - &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) { + if (&s->frames[i] != s->framep[VP8_FRAME_CURRENT] && + &s->frames[i] != s->framep[VP8_FRAME_PREVIOUS] && + &s->frames[i] != s->framep[VP8_FRAME_GOLDEN] && + &s->frames[i] != s->framep[VP8_FRAME_GOLDEN2]) { frame = &s->frames[i]; break; } @@ -435,28 +435,28 @@ static void vp8_get_quants(VP8Context *s) * The spec isn't clear here, so I'm going by my understanding of what libvpx does * * Intra frames update all 3 references - * Inter frames update VP56_FRAME_PREVIOUS if the update_last flag is set + * Inter frames update VP8_FRAME_PREVIOUS if the update_last flag is set * If the update (golden|altref) flag is set, it's updated with the current frame - * if update_last is set, and VP56_FRAME_PREVIOUS otherwise. + * if update_last is set, and VP8_FRAME_PREVIOUS otherwise. * If the flag is not set, the number read means: * 0: no update - * 1: VP56_FRAME_PREVIOUS + * 1: VP8_FRAME_PREVIOUS * 2: update golden with altref, or update altref with golden */ -static VP56Frame ref_to_update(VP8Context *s, int update, VP56Frame ref) +static VP8FrameType ref_to_update(VP8Context *s, int update, VP8FrameType ref) { VPXRangeCoder *c = &s->c; if (update) - return VP56_FRAME_CURRENT; + return VP8_FRAME_CURRENT; switch (vp89_rac_get_uint(c, 2)) { case 1: - return VP56_FRAME_PREVIOUS; + return VP8_FRAME_PREVIOUS; case 2: - return (ref == VP56_FRAME_GOLDEN) ? VP56_FRAME_GOLDEN2 : VP56_FRAME_GOLDEN; + return (ref == VP8_FRAME_GOLDEN) ? VP8_FRAME_GOLDEN2 : VP8_FRAME_GOLDEN; } - return VP56_FRAME_NONE; + return VP8_FRAME_NONE; } static void vp78_reset_probability_tables(VP8Context *s) @@ -514,8 +514,8 @@ static void update_refs(VP8Context *s) int update_golden = vp89_rac_get(c); int update_altref = vp89_rac_get(c); - s->update_golden = ref_to_update(s, update_golden, VP56_FRAME_GOLDEN); - s->update_altref = ref_to_update(s, update_altref, VP56_FRAME_GOLDEN2); + s->update_golden = ref_to_update(s, update_golden, VP8_FRAME_GOLDEN); + s->update_altref = ref_to_update(s, update_altref, VP8_FRAME_GOLDEN2); } static void copy_chroma(AVFrame *dst, AVFrame *src, int width, int height) @@ -554,22 +554,22 @@ static int vp7_fade_frame(VP8Context *s, int alpha, int beta) int height = s->mb_height * 16; AVFrame *src, *dst; - if (!s->framep[VP56_FRAME_PREVIOUS] || - !s->framep[VP56_FRAME_GOLDEN]) { + if (!s->framep[VP8_FRAME_PREVIOUS] || + !s->framep[VP8_FRAME_GOLDEN]) { av_log(s->avctx, AV_LOG_WARNING, "Discarding interframe without a prior keyframe!\n"); return AVERROR_INVALIDDATA; } dst = - src = s->framep[VP56_FRAME_PREVIOUS]->tf.f; + src = s->framep[VP8_FRAME_PREVIOUS]->tf.f; /* preserve the golden frame, write a new previous frame */ - if (s->framep[VP56_FRAME_GOLDEN] == s->framep[VP56_FRAME_PREVIOUS]) { - s->framep[VP56_FRAME_PREVIOUS] = vp8_find_free_buffer(s); - if ((ret = vp8_alloc_frame(s, s->framep[VP56_FRAME_PREVIOUS], 1)) < 0) + if (s->framep[VP8_FRAME_GOLDEN] == s->framep[VP8_FRAME_PREVIOUS]) { + s->framep[VP8_FRAME_PREVIOUS] = vp8_find_free_buffer(s); + if ((ret = vp8_alloc_frame(s, s->framep[VP8_FRAME_PREVIOUS], 1)) < 0) return ret; - dst = s->framep[VP56_FRAME_PREVIOUS]->tf.f; + dst = s->framep[VP8_FRAME_PREVIOUS]->tf.f; copy_chroma(dst, src, width, height); } @@ -630,7 +630,7 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si if (hscale || vscale) avpriv_request_sample(s->avctx, "Upscaling"); - s->update_golden = s->update_altref = VP56_FRAME_CURRENT; + s->update_golden = s->update_altref = VP8_FRAME_CURRENT; vp78_reset_probability_tables(s); memcpy(s->prob->pred16x16, vp8_pred16x16_prob_inter, sizeof(s->prob->pred16x16)); @@ -685,8 +685,8 @@ static int vp7_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si /* D. Golden frame update flag (a Flag) for interframes only */ if (!s->keyframe) { - s->update_golden = vp89_rac_get(c) ? VP56_FRAME_CURRENT : VP56_FRAME_NONE; - s->sign_bias[VP56_FRAME_GOLDEN] = 0; + s->update_golden = vp89_rac_get(c) ? VP8_FRAME_CURRENT : VP8_FRAME_NONE; + s->sign_bias[VP8_FRAME_GOLDEN] = 0; } s->update_last = 1; @@ -798,7 +798,7 @@ static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si if (hscale || vscale) avpriv_request_sample(s->avctx, "Upscaling"); - s->update_golden = s->update_altref = VP56_FRAME_CURRENT; + s->update_golden = s->update_altref = VP8_FRAME_CURRENT; vp78_reset_probability_tables(s); memcpy(s->prob->pred16x16, vp8_pred16x16_prob_inter, sizeof(s->prob->pred16x16)); @@ -853,8 +853,8 @@ static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si if (!s->keyframe) { update_refs(s); - s->sign_bias[VP56_FRAME_GOLDEN] = vp89_rac_get(c); - s->sign_bias[VP56_FRAME_GOLDEN2 /* altref */] = vp89_rac_get(c); + s->sign_bias[VP8_FRAME_GOLDEN] = vp89_rac_get(c); + s->sign_bias[VP8_FRAME_GOLDEN2 /* altref */] = vp89_rac_get(c); } // if we aren't saving this frame's probabilities for future frames, @@ -887,7 +887,7 @@ static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si } static av_always_inline -void clamp_mv(VP8mvbounds *s, VP56mv *dst, const VP56mv *src) +void clamp_mv(VP8mvbounds *s, VP8mv *dst, const VP8mv *src) { dst->x = av_clip(src->x, av_clip(s->mv_min.x, INT16_MIN, INT16_MAX), av_clip(s->mv_max.x, INT16_MIN, INT16_MAX)); @@ -963,9 +963,9 @@ int decode_splitmvs(VP8Context *s, VPXRangeCoder *c, VP8Macroblock *mb, VP8Macroblock *left_mb = &mb[-1]; const uint8_t *mbsplits_left = vp8_mbsplits[left_mb->partitioning]; const uint8_t *mbsplits_top, *mbsplits_cur, *firstidx; - VP56mv *top_mv; - VP56mv *left_mv = left_mb->bmv; - VP56mv *cur_mv = mb->bmv; + VP8mv *top_mv; + VP8mv *left_mv = left_mb->bmv; + VP8mv *cur_mv = mb->bmv; if (!layout) // layout is inlined, s->mb_layout is not top_mb = &mb[2]; @@ -1049,7 +1049,7 @@ static int vp7_calculate_mb_offset(int mb_x, int mb_y, int mb_width, return 1; } -static const VP56mv *get_bmv_ptr(const VP8Macroblock *mb, int subblock) +static const VP8mv *get_bmv_ptr(const VP8Macroblock *mb, int subblock) { return &mb->bmv[mb->mode == VP8_MVMODE_SPLIT ? vp8_mbsplits[mb->partitioning][subblock] : 0]; } @@ -1062,7 +1062,7 @@ void vp7_decode_mvs(VP8Context *s, VP8Macroblock *mb, enum { CNT_ZERO, CNT_NEAREST, CNT_NEAR }; enum { VP8_EDGE_TOP, VP8_EDGE_LEFT, VP8_EDGE_TOPLEFT }; int idx = CNT_ZERO; - VP56mv near_mv[3]; + VP8mv near_mv[3]; uint8_t cnt[3] = { 0 }; VPXRangeCoder *c = &s->c; int i; @@ -1157,7 +1157,7 @@ void vp8_decode_mvs(VP8Context *s, VP8mvbounds *mv_bounds, VP8Macroblock *mb, int idx = CNT_ZERO; int cur_sign_bias = s->sign_bias[mb->ref_frame]; int8_t *sign_bias = s->sign_bias; - VP56mv near_mv[4]; + VP8mv near_mv[4]; uint8_t cnt[4] = { 0 }; VPXRangeCoder *c = &s->c; @@ -1178,7 +1178,7 @@ void vp8_decode_mvs(VP8Context *s, VP8mvbounds *mv_bounds, VP8Macroblock *mb, { \ VP8Macroblock *edge = mb_edge[n]; \ int edge_ref = edge->ref_frame; \ - if (edge_ref != VP56_FRAME_CURRENT) { \ + if (edge_ref != VP8_FRAME_CURRENT) { \ uint32_t mv = AV_RN32A(&edge->mv); \ if (mv) { \ if (cur_sign_bias != sign_bias[edge_ref]) { \ @@ -1211,7 +1211,7 @@ void vp8_decode_mvs(VP8Context *s, VP8mvbounds *mv_bounds, VP8Macroblock *mb, /* Swap near and nearest if necessary */ if (cnt[CNT_NEAR] > cnt[CNT_NEAREST]) { FFSWAP(uint8_t, cnt[CNT_NEAREST], cnt[CNT_NEAR]); - FFSWAP( VP56mv, near_mv[CNT_NEAREST], near_mv[CNT_NEAR]); + FFSWAP(VP8mv, near_mv[CNT_NEAREST], near_mv[CNT_NEAR]); } if (vpx_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[CNT_NEAREST]][1])) { @@ -1331,15 +1331,15 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, mb->chroma_pred_mode = vp89_rac_get_tree(c, vp8_pred8x8c_tree, vp8_pred8x8c_prob_intra); - mb->ref_frame = VP56_FRAME_CURRENT; + mb->ref_frame = VP8_FRAME_CURRENT; } else if (vpx_rac_get_prob_branchy(c, s->prob->intra)) { // inter MB, 16.2 if (vpx_rac_get_prob_branchy(c, s->prob->last)) mb->ref_frame = - (!is_vp7 && vpx_rac_get_prob(c, s->prob->golden)) ? VP56_FRAME_GOLDEN2 /* altref */ - : VP56_FRAME_GOLDEN; + (!is_vp7 && vpx_rac_get_prob(c, s->prob->golden)) ? VP8_FRAME_GOLDEN2 /* altref */ + : VP8_FRAME_GOLDEN; else - mb->ref_frame = VP56_FRAME_PREVIOUS; + mb->ref_frame = VP8_FRAME_PREVIOUS; s->ref_count[mb->ref_frame - 1]++; // motion vectors, 16.3 @@ -1357,7 +1357,7 @@ void decode_mb_mode(VP8Context *s, VP8mvbounds *mv_bounds, mb->chroma_pred_mode = vp89_rac_get_tree(c, vp8_pred8x8c_tree, s->prob->pred8x8c); - mb->ref_frame = VP56_FRAME_CURRENT; + mb->ref_frame = VP8_FRAME_CURRENT; mb->partitioning = VP8_SPLITMVMODE_NONE; AV_ZERO32(&mb->bmv[0]); } @@ -1848,7 +1848,7 @@ static const uint8_t subpel_idx[3][8] = { */ static av_always_inline void vp8_mc_luma(VP8Context *s, VP8ThreadData *td, uint8_t *dst, - ThreadFrame *ref, const VP56mv *mv, + ThreadFrame *ref, const VP8mv *mv, int x_off, int y_off, int block_w, int block_h, int width, int height, ptrdiff_t linesize, vp8_mc_func mc_func[3][3]) @@ -1906,7 +1906,7 @@ void vp8_mc_luma(VP8Context *s, VP8ThreadData *td, uint8_t *dst, */ static av_always_inline void vp8_mc_chroma(VP8Context *s, VP8ThreadData *td, uint8_t *dst1, - uint8_t *dst2, ThreadFrame *ref, const VP56mv *mv, + uint8_t *dst2, ThreadFrame *ref, const VP8mv *mv, int x_off, int y_off, int block_w, int block_h, int width, int height, ptrdiff_t linesize, vp8_mc_func mc_func[3][3]) @@ -1958,9 +1958,9 @@ static av_always_inline void vp8_mc_part(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3], ThreadFrame *ref_frame, int x_off, int y_off, int bx_off, int by_off, int block_w, int block_h, - int width, int height, VP56mv *mv) + int width, int height, VP8mv *mv) { - VP56mv uvmv = *mv; + VP8mv uvmv = *mv; /* Y */ vp8_mc_luma(s, td, dst[0] + by_off * s->linesize + bx_off, @@ -2022,7 +2022,7 @@ void inter_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3], int x_off = mb_x << 4, y_off = mb_y << 4; int width = 16 * s->mb_width, height = 16 * s->mb_height; ThreadFrame *ref = &s->framep[mb->ref_frame]->tf; - VP56mv *bmv = mb->bmv; + VP8mv *bmv = mb->bmv; switch (mb->partitioning) { case VP8_SPLITMVMODE_NONE: @@ -2031,7 +2031,7 @@ void inter_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3], break; case VP8_SPLITMVMODE_4x4: { int x, y; - VP56mv uvmv; + VP8mv uvmv; /* Y */ for (y = 0; y < 4; y++) { @@ -2476,7 +2476,7 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void prev_frame && prev_frame->seg_map ? prev_frame->seg_map->data + mb_xy : NULL, 0, is_vp7); - prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_PREVIOUS); + prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP8_FRAME_PREVIOUS); if (!mb->skip) decode_mb_coeffs(s, td, c, mb, s->top_nnz[mb_x], td->left_nnz, is_vp7); @@ -2486,7 +2486,7 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void else inter_predict(s, td, dst, mb, mb_x, mb_y); - prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_GOLDEN); + prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP8_FRAME_GOLDEN); if (!mb->skip) { idct_mb(s, td, dst, mb); @@ -2514,7 +2514,7 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void dst[1], dst[2], s->linesize, s->uvlinesize, 0); } - prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP56_FRAME_GOLDEN2); + prefetch_motion(s, mb, mb_x, mb_y, mb_xy, VP8_FRAME_GOLDEN2); dst[0] += 16; dst[1] += 8; @@ -2689,10 +2689,10 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, avctx->pix_fmt = s->pix_fmt; } - prev_frame = s->framep[VP56_FRAME_CURRENT]; + prev_frame = s->framep[VP8_FRAME_CURRENT]; - referenced = s->update_last || s->update_golden == VP56_FRAME_CURRENT || - s->update_altref == VP56_FRAME_CURRENT; + referenced = s->update_last || s->update_golden == VP8_FRAME_CURRENT || + s->update_altref == VP8_FRAME_CURRENT; skip_thresh = !referenced ? AVDISCARD_NONREF : !s->keyframe ? AVDISCARD_NONKEY @@ -2709,12 +2709,12 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, for (i = 0; i < 5; i++) if (s->frames[i].tf.f->buf[0] && &s->frames[i] != prev_frame && - &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] && - &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] && - &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) + &s->frames[i] != s->framep[VP8_FRAME_PREVIOUS] && + &s->frames[i] != s->framep[VP8_FRAME_GOLDEN] && + &s->frames[i] != s->framep[VP8_FRAME_GOLDEN2]) vp8_release_frame(s, &s->frames[i]); - curframe = s->framep[VP56_FRAME_CURRENT] = vp8_find_free_buffer(s); + curframe = s->framep[VP8_FRAME_CURRENT] = vp8_find_free_buffer(s); if (!s->colorspace) avctx->colorspace = AVCOL_SPC_BT470BG; @@ -2727,9 +2727,9 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, * likely that the values we have on a random interframe are complete * junk if we didn't start decode on a keyframe. So just don't display * anything rather than junk. */ - if (!s->keyframe && (!s->framep[VP56_FRAME_PREVIOUS] || - !s->framep[VP56_FRAME_GOLDEN] || - !s->framep[VP56_FRAME_GOLDEN2])) { + if (!s->keyframe && (!s->framep[VP8_FRAME_PREVIOUS] || + !s->framep[VP8_FRAME_GOLDEN] || + !s->framep[VP8_FRAME_GOLDEN2])) { av_log(avctx, AV_LOG_WARNING, "Discarding interframe without a prior keyframe!\n"); ret = AVERROR_INVALIDDATA; @@ -2743,22 +2743,22 @@ int vp78_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, goto err; // check if golden and altref are swapped - if (s->update_altref != VP56_FRAME_NONE) - s->next_framep[VP56_FRAME_GOLDEN2] = s->framep[s->update_altref]; + if (s->update_altref != VP8_FRAME_NONE) + s->next_framep[VP8_FRAME_GOLDEN2] = s->framep[s->update_altref]; else - s->next_framep[VP56_FRAME_GOLDEN2] = s->framep[VP56_FRAME_GOLDEN2]; + s->next_framep[VP8_FRAME_GOLDEN2] = s->framep[VP8_FRAME_GOLDEN2]; - if (s->update_golden != VP56_FRAME_NONE) - s->next_framep[VP56_FRAME_GOLDEN] = s->framep[s->update_golden]; + if (s->update_golden != VP8_FRAME_NONE) + s->next_framep[VP8_FRAME_GOLDEN] = s->framep[s->update_golden]; else - s->next_framep[VP56_FRAME_GOLDEN] = s->framep[VP56_FRAME_GOLDEN]; + s->next_framep[VP8_FRAME_GOLDEN] = s->framep[VP8_FRAME_GOLDEN]; if (s->update_last) - s->next_framep[VP56_FRAME_PREVIOUS] = curframe; + s->next_framep[VP8_FRAME_PREVIOUS] = curframe; else - s->next_framep[VP56_FRAME_PREVIOUS] = s->framep[VP56_FRAME_PREVIOUS]; + s->next_framep[VP8_FRAME_PREVIOUS] = s->framep[VP8_FRAME_PREVIOUS]; - s->next_framep[VP56_FRAME_CURRENT] = curframe; + s->next_framep[VP8_FRAME_CURRENT] = curframe; if (ffcodec(avctx->codec)->update_thread_context) ff_thread_finish_setup(avctx); diff --git a/libavcodec/vp8.h b/libavcodec/vp8.h index 9695111806..1d3c3d2138 100644 --- a/libavcodec/vp8.h +++ b/libavcodec/vp8.h @@ -34,12 +34,20 @@ #include "h264pred.h" #include "threadframe.h" -#include "vp56.h" +#include "videodsp.h" #include "vp8dsp.h" #include "vpx_rac.h" #define VP8_MAX_QUANT 127 +typedef enum { + VP8_FRAME_NONE =-1, + VP8_FRAME_CURRENT = 0, + VP8_FRAME_PREVIOUS = 1, + VP8_FRAME_GOLDEN = 2, + VP8_FRAME_GOLDEN2 = 3, +} VP8FrameType; + enum dct_token { DCT_0, DCT_1, @@ -74,6 +82,11 @@ enum inter_splitmvmode { VP8_SPLITMVMODE_NONE, ///< (only used in prediction) no split MVs }; +typedef struct VP8mv { + DECLARE_ALIGNED(4, int16_t, x); + int16_t y; +} VP8mv; + typedef struct VP8FilterStrength { uint8_t filter_level; uint8_t inner_limit; @@ -91,8 +104,8 @@ typedef struct VP8Macroblock { uint8_t segment; uint8_t intra4x4_pred_mode_mb[16]; DECLARE_ALIGNED(4, uint8_t, intra4x4_pred_mode_top)[4]; - VP56mv mv; - VP56mv bmv[16]; + VP8mv mv; + VP8mv bmv[16]; } VP8Macroblock; typedef struct VP8intmv { @@ -235,10 +248,10 @@ typedef struct VP8Context { /** * filter strength adjustment for macroblocks that reference: - * [0] - intra / VP56_FRAME_CURRENT - * [1] - VP56_FRAME_PREVIOUS - * [2] - VP56_FRAME_GOLDEN - * [3] - altref / VP56_FRAME_GOLDEN2 + * [0] - intra / VP8_FRAME_CURRENT + * [1] - VP8_FRAME_PREVIOUS + * [2] - VP8_FRAME_GOLDEN + * [3] - altref / VP8_FRAME_GOLDEN2 */ int8_t ref[4]; } lf_delta; @@ -283,8 +296,8 @@ typedef struct VP8Context { VP8Macroblock *macroblocks_base; int invisible; - int update_last; ///< update VP56_FRAME_PREVIOUS with the current one - int update_golden; ///< VP56_FRAME_NONE if not updated, or which frame to copy if so + int update_last; ///< update VP8_FRAME_PREVIOUS with the current one + int update_golden; ///< VP8_FRAME_NONE if not updated, or which frame to copy if so int update_altref; /** @@ -329,8 +342,8 @@ typedef struct VP8Context { /** * Interframe DC prediction (VP7) - * [0] VP56_FRAME_PREVIOUS - * [1] VP56_FRAME_GOLDEN + * [0] VP8_FRAME_PREVIOUS + * [1] VP8_FRAME_GOLDEN */ uint16_t inter_dc_pred[2][2]; diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 1eeb460fc0..bd2951c92e 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -34,7 +34,6 @@ #include "pthread_internal.h" #include "videodsp.h" -#include "vp56.h" #include "vp89_rac.h" #include "vp9.h" #include "vp9data.h" @@ -276,7 +275,7 @@ static int update_size(AVCodecContext *avctx, int w, int h) assign(s->intra_pred_data[2], uint8_t *, 64 * bytesperpixel); assign(s->above_y_nnz_ctx, uint8_t *, 16); assign(s->above_mode_ctx, uint8_t *, 16); - assign(s->above_mv_ctx, VP56mv(*)[2], 16); + assign(s->above_mv_ctx, VP9mv(*)[2], 16); assign(s->above_uv_nnz_ctx[0], uint8_t *, 16); assign(s->above_uv_nnz_ctx[1], uint8_t *, 16); assign(s->above_partition_ctx, uint8_t *, 8); diff --git a/libavcodec/vp9_mc_template.c b/libavcodec/vp9_mc_template.c index 31e692f362..6ea3cc3225 100644 --- a/libavcodec/vp9_mc_template.c +++ b/libavcodec/vp9_mc_template.c @@ -22,9 +22,9 @@ */ #define ROUNDED_DIV_MVx2(a, b) \ - (VP56mv) { .x = ROUNDED_DIV(a.x + b.x, 2), .y = ROUNDED_DIV(a.y + b.y, 2) } + (VP9mv) { .x = ROUNDED_DIV(a.x + b.x, 2), .y = ROUNDED_DIV(a.y + b.y, 2) } #define ROUNDED_DIV_MVx4(a, b, c, d) \ - (VP56mv) { .x = ROUNDED_DIV(a.x + b.x + c.x + d.x, 4), \ + (VP9mv) { .x = ROUNDED_DIV(a.x + b.x + c.x + d.x, 4), \ .y = ROUNDED_DIV(a.y + b.y + c.y + d.y, 4) } static void FN(inter_pred)(VP9TileData *td) @@ -51,7 +51,7 @@ static void FN(inter_pred)(VP9TileData *td) // y inter pred if (b->bs > BS_8x8) { - VP56mv uvmv; + VP9mv uvmv; #if SCALED == 0 if (b->bs == BS_8x4) { diff --git a/libavcodec/vp9block.c b/libavcodec/vp9block.c index baa343fddc..c6103ee6f0 100644 --- a/libavcodec/vp9block.c +++ b/libavcodec/vp9block.c @@ -24,7 +24,6 @@ #include "libavutil/avassert.h" #include "threadframe.h" -#include "vp56.h" #include "vp89_rac.h" #include "vp9.h" #include "vp9data.h" diff --git a/libavcodec/vp9dec.h b/libavcodec/vp9dec.h index 56676a7c03..4bfd50d27b 100644 --- a/libavcodec/vp9dec.h +++ b/libavcodec/vp9dec.h @@ -33,6 +33,8 @@ #include "libavutil/thread.h" #include "libavutil/internal.h" +#include "get_bits.h" +#include "videodsp.h" #include "vp9.h" #include "vp9dsp.h" #include "vp9shared.h" @@ -83,7 +85,7 @@ typedef struct VP9Filter { typedef struct VP9Block { uint8_t seg_id, intra, comp, ref[2], mode[4], uvmode, skip; enum FilterMode filter; - VP56mv mv[4 /* b_idx */][2 /* ref */]; + VP9mv mv[4 /* b_idx */][2 /* ref */]; enum BlockSize bs; enum TxfmMode tx, uvtx; enum BlockLevel bl; @@ -147,7 +149,7 @@ typedef struct VP9Context { uint8_t *above_comp_ctx; // 1bit uint8_t *above_ref_ctx; // 2bit uint8_t *above_filter_ctx; - VP56mv (*above_mv_ctx)[2]; + VP9mv (*above_mv_ctx)[2]; // whole-frame cache uint8_t *intra_pred_data[3]; @@ -210,7 +212,7 @@ struct VP9TileData { // contextual (left) cache DECLARE_ALIGNED(16, uint8_t, left_y_nnz_ctx)[16]; DECLARE_ALIGNED(16, uint8_t, left_mode_ctx)[16]; - DECLARE_ALIGNED(16, VP56mv, left_mv_ctx)[16][2]; + DECLARE_ALIGNED(16, VP9mv, left_mv_ctx)[16][2]; DECLARE_ALIGNED(16, uint8_t, left_uv_nnz_ctx)[2][16]; DECLARE_ALIGNED(8, uint8_t, left_partition_ctx)[8]; DECLARE_ALIGNED(8, uint8_t, left_skip_ctx)[8]; @@ -238,7 +240,7 @@ struct VP9TileData { unsigned int nb_block_structure; }; -void ff_vp9_fill_mv(VP9TileData *td, VP56mv *mv, int mode, int sb); +void ff_vp9_fill_mv(VP9TileData *td, VP9mv *mv, int mode, int sb); void ff_vp9_adapt_probs(VP9Context *s); diff --git a/libavcodec/vp9mvs.c b/libavcodec/vp9mvs.c index c604ec7cb6..8b682166e4 100644 --- a/libavcodec/vp9mvs.c +++ b/libavcodec/vp9mvs.c @@ -22,13 +22,12 @@ */ #include "threadframe.h" -#include "vp56.h" #include "vp89_rac.h" #include "vp9data.h" #include "vp9dec.h" #include "vpx_rac.h" -static av_always_inline void clamp_mv(VP56mv *dst, const VP56mv *src, +static av_always_inline void clamp_mv(VP9mv *dst, const VP9mv *src, VP9TileData *td) { dst->x = av_clip(src->x, td->min_mv.x, td->max_mv.x); @@ -36,7 +35,7 @@ static av_always_inline void clamp_mv(VP56mv *dst, const VP56mv *src, } static void find_ref_mvs(VP9TileData *td, - VP56mv *pmv, int ref, int z, int idx, int sb) + VP9mv *pmv, int ref, int z, int idx, int sb) { static const int8_t mv_ref_blk_off[N_BS_SIZES][8][2] = { [BS_64x64] = { { 3, -1 }, { -1, 3 }, { 4, -1 }, { -1, 4 }, @@ -100,7 +99,7 @@ static void find_ref_mvs(VP9TileData *td, #define RETURN_MV(mv) \ do { \ if (sb > 0) { \ - VP56mv tmp; \ + VP9mv tmp; \ uint32_t m; \ av_assert2(idx == 1); \ av_assert2(mem != INVALID_MV); \ @@ -186,7 +185,7 @@ static void find_ref_mvs(VP9TileData *td, #define RETURN_SCALE_MV(mv, scale) \ do { \ if (scale) { \ - VP56mv mv_temp = { -mv.x, -mv.y }; \ + VP9mv mv_temp = { -mv.x, -mv.y }; \ RETURN_MV(mv_temp); \ } else { \ RETURN_MV(mv); \ @@ -289,7 +288,7 @@ static av_always_inline int read_mv_component(VP9TileData *td, int idx, int hp) return sign ? -(n + 1) : (n + 1); } -void ff_vp9_fill_mv(VP9TileData *td, VP56mv *mv, int mode, int sb) +void ff_vp9_fill_mv(VP9TileData *td, VP9mv *mv, int mode, int sb) { VP9Context *s = td->s; VP9Block *b = td->b; diff --git a/libavcodec/vp9prob.c b/libavcodec/vp9prob.c index fb295b482d..69a5180770 100644 --- a/libavcodec/vp9prob.c +++ b/libavcodec/vp9prob.c @@ -21,9 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "vp56.h" #include "vp9.h" -#include "vp9data.h" #include "vp9dec.h" static av_always_inline void adapt_prob(uint8_t *p, unsigned ct0, unsigned ct1, diff --git a/libavcodec/vp9recon.c b/libavcodec/vp9recon.c index bfafde8c9c..e758dca55b 100644 --- a/libavcodec/vp9recon.c +++ b/libavcodec/vp9recon.c @@ -299,7 +299,7 @@ static av_always_inline void mc_luma_unscaled(VP9TileData *td, vp9_mc_func (*mc) uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *ref, ptrdiff_t ref_stride, ThreadFrame *ref_frame, - ptrdiff_t y, ptrdiff_t x, const VP56mv *mv, + ptrdiff_t y, ptrdiff_t x, const VP9mv *mv, int bw, int bh, int w, int h, int bytesperpixel) { VP9Context *s = td->s; @@ -337,7 +337,7 @@ static av_always_inline void mc_chroma_unscaled(VP9TileData *td, vp9_mc_func (*m const uint8_t *ref_u, ptrdiff_t src_stride_u, const uint8_t *ref_v, ptrdiff_t src_stride_v, ThreadFrame *ref_frame, - ptrdiff_t y, ptrdiff_t x, const VP56mv *mv, + ptrdiff_t y, ptrdiff_t x, const VP9mv *mv, int bw, int bh, int w, int h, int bytesperpixel) { VP9Context *s = td->s; @@ -408,7 +408,7 @@ static av_always_inline void mc_luma_scaled(VP9TileData *td, vp9_scaled_mc_func uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *ref, ptrdiff_t ref_stride, ThreadFrame *ref_frame, - ptrdiff_t y, ptrdiff_t x, const VP56mv *in_mv, + ptrdiff_t y, ptrdiff_t x, const VP9mv *in_mv, int px, int py, int pw, int ph, int bw, int bh, int w, int h, int bytesperpixel, const uint16_t *scale, const uint8_t *step) @@ -423,7 +423,7 @@ static av_always_inline void mc_luma_scaled(VP9TileData *td, vp9_scaled_mc_func int mx, my; int refbw_m1, refbh_m1; int th; - VP56mv mv; + VP9mv mv; mv.x = av_clip(in_mv->x, -(x + pw - px + 4) * 8, (s->cols * 8 - x + px + 3) * 8); mv.y = av_clip(in_mv->y, -(y + ph - py + 4) * 8, (s->rows * 8 - y + py + 3) * 8); @@ -468,7 +468,7 @@ static av_always_inline void mc_chroma_scaled(VP9TileData *td, vp9_scaled_mc_fun const uint8_t *ref_u, ptrdiff_t src_stride_u, const uint8_t *ref_v, ptrdiff_t src_stride_v, ThreadFrame *ref_frame, - ptrdiff_t y, ptrdiff_t x, const VP56mv *in_mv, + ptrdiff_t y, ptrdiff_t x, const VP9mv *in_mv, int px, int py, int pw, int ph, int bw, int bh, int w, int h, int bytesperpixel, const uint16_t *scale, const uint8_t *step) @@ -483,7 +483,7 @@ static av_always_inline void mc_chroma_scaled(VP9TileData *td, vp9_scaled_mc_fun int mx, my; int refbw_m1, refbh_m1; int th; - VP56mv mv; + VP9mv mv; if (s->ss_h) { // BUG https://code.google.com/p/webm/issues/detail?id=820 diff --git a/libavcodec/vp9shared.h b/libavcodec/vp9shared.h index ebaa11d2c1..543a496df8 100644 --- a/libavcodec/vp9shared.h +++ b/libavcodec/vp9shared.h @@ -27,9 +27,10 @@ #include #include +#include "libavutil/mem_internal.h" + #include "vp9.h" #include "threadframe.h" -#include "vp56.h" enum BlockPartition { PARTITION_NONE, // [ ] <-. @@ -51,8 +52,13 @@ enum CompPredMode { PRED_SWITCHABLE, }; +typedef struct VP9mv { + DECLARE_ALIGNED(4, int16_t, x); + int16_t y; +} VP9mv; + typedef struct VP9mvrefPair { - VP56mv mv[2]; + VP9mv mv[2]; int8_t ref[2]; } VP9mvrefPair;