From patchwork Sat Dec 2 17:46:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew D'Addesio X-Patchwork-Id: 6510 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp2568384jah; Sat, 2 Dec 2017 09:47:50 -0800 (PST) X-Google-Smtp-Source: AGs4zMZKVaf7wswEcGxnQQKkYaxwcgy6U3xHWovLFF1r6d7+ynGLnU+Vs/YjAN3xhHxWhPG35oPB X-Received: by 10.223.176.27 with SMTP id f27mr8740292wra.105.1512236870766; Sat, 02 Dec 2017 09:47:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512236870; cv=none; d=google.com; s=arc-20160816; b=SoSrceUPlQRUs4k+V1l2u0932qOY3b7tgbI2Hm3FqrZ1h+OFckFq+3wd1CLx6IAfCN Z5hd61gO1s82Lzy4DfTDD5cI34iyI1Ivo5T6IVjllK7IgJuDHtgTha+YiwlGk+M87ZnQ qarU5/XU+qwTeb/ZLKSbP/zDTv9Texptgh0X9s/CahremChfuhHDJd1inqequSbdtFIq p/S0V2WYqWOyPSAqbjNnXUy0lu+N6PPe7ZXPnvo6lvzLg8KendxUfwJG7kXE/Rh/b/w6 7+uDqSU8WHxjp/UuUL3srzoZUxJ0BW7Xql0DAsmRGr6EU+ZSzS2QDOAE/Wh2qv/7ZHSM OY4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=b0LaQx6ynxtLZO1C9gbYFF/cVp3ntvayO8S2M2PDj1M=; b=WQS3wJJ/pJAnc9LeXzyOTxZ0V2jN7J9K3PzUjYqS0RWUMmBa9KoZyhpXW7ABM4yHE7 lN+Erc5pjkDYBvpYlCfcU0CxlXIPFXST+ASG7z0vYZVzKfpkHQHNZ3sxU+NatBsntcSM IirJa82FbOo8k4YMKwthS73qJt+BYEif8pIgNoqoxgdBUcarG+dsIzDOs9N8bjGk0bFe jLr/tYTr5npeLYoviSS6FMna8bRAO9c8H/PHDhTzJOphyOXQYgiPlXkRzZ9J02uYN5h6 YA16mq37u9PbNE7GXixOZViQAEHiBPksxvzj2NneteRGrJCRj4LC7GPSsiDEs7QkIK7I aL0w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=SME8V1zH; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 18si2452935wmi.228.2017.12.02.09.47.50; Sat, 02 Dec 2017 09:47:50 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=SME8V1zH; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 24C5B68A55E; Sat, 2 Dec 2017 19:47:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi0-f66.google.com (mail-oi0-f66.google.com [209.85.218.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F0DD568A3FC for ; Sat, 2 Dec 2017 19:47:38 +0200 (EET) Received: by mail-oi0-f66.google.com with SMTP id k2so9190672oib.11 for ; Sat, 02 Dec 2017 09:47:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=D6f65l6vKyWF4lWIi/L5ipiuZ4eCBIbel+q1QmFzL6s=; b=SME8V1zHeUKwGV2ckTZx6OPv6Wv9n/DmGBYP1GOFofk5cJ3rZiFc7ozu+G6FhuFdaZ tknetMn5J1WJ5n+Np4n7CaAMAoydNv1LJU0/jzBhTJT7TAY7Lra2cMuYBRuWaPxDc+37 rPvLTPnKReT5T0t942oiAF/7x2N3nFeTXaJ9zTFLqaL/8uaUlx1eGXel/uQhotj1d1pi DnGejCifWFKWobHCCdeCT17NbEV9whnoumBaqMXJLudJD0qNdO0U/VivptqQmjycJpur jTcmA9vrpcOkn4ksJDaG7C5CpZvTuaH1Wv7BpW5MmqeRP5CqzKzXkTtsbvnrvGnDS+Kj f7dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=D6f65l6vKyWF4lWIi/L5ipiuZ4eCBIbel+q1QmFzL6s=; b=iFLCXowKMg7/rf5+2lxp1CRhabRBIcFNvsikN8+NYr/cj69N7sZdQkkW1RnTzTMTay nGpu6Vky3yHBSBO+RaElDzWPFqDcV+ybFAETqus7tLfdFzo0DIkgFYtj9js9imZIJzji 7jQ0/vVvJ+qT4MF8rH4CjM4gRzCmL0S+9oqVUt3gSfGAeC+n+GRkSSwssr8rXzt84Df/ yJXyLazhELzR18dNCwvg6bUJSTcpNwahGhJiy3xmdPJnCuyRx2QrWKplTPyaQim+nvis jFKmqIgp9bdwMgxZtuMGcnf1KAw5ptwAne/ApUhab0pj4ECyVYI/fS6CcLX2+V463nCV OAIQ== X-Gm-Message-State: AJaThX6Rldbl/97NyTEV/HKgCNBipBsWvkb3lPjExkI79WRNKmRI9BHb sSiK+JNjoMKKnM15I9prPYaz3A== X-Received: by 10.202.236.135 with SMTP id k129mr10200756oih.57.1512236861523; Sat, 02 Dec 2017 09:47:41 -0800 (PST) Received: from localhost.localdomain ([2605:6000:1019:4a8:80a0:1945:efcc:4de5]) by smtp.gmail.com with ESMTPSA id n40sm4185398otb.54.2017.12.02.09.47.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 02 Dec 2017 09:47:41 -0800 (PST) From: Andrew D'Addesio To: ffmpeg-devel@ffmpeg.org Date: Sat, 2 Dec 2017 11:46:58 -0600 Message-Id: <20171202174659.1064-3-modchipv12@gmail.com> X-Mailer: git-send-email 2.15.1.windows.2 In-Reply-To: <20171202174659.1064-1-modchipv12@gmail.com> References: <20171202174659.1064-1-modchipv12@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/4] opus: Add Special Hybrid Folding (per RFC8251) X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andrew D'Addesio MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This decoder-side change, introduced in RFC 8251 (section 9), slightly improves the decoded quality of 16kbps speech in Hybrid Mode. Differences can be seen/heard in testvector05.bit, testvector06.bit, and testvector12.bit in the RFC 6716/8251 testvectors found here: https://people.xiph.org/~greg/opus_testvectors/ Signed-off-by: Andrew D'Addesio --- libavcodec/opus_celt.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/libavcodec/opus_celt.c b/libavcodec/opus_celt.c index ff56041..2bbb96b 100644 --- a/libavcodec/opus_celt.c +++ b/libavcodec/opus_celt.c @@ -712,10 +712,22 @@ static void celt_decode_bands(CeltFrame *f, OpusRangeCoder *rc) b = av_clip_uintp2(FFMIN(f->remaining2 + 1, f->pulses[i] + curr_balance), 14); } - if (ff_celt_freq_bands[i] - ff_celt_freq_range[i] >= ff_celt_freq_bands[f->start_band] && - (update_lowband || lowband_offset == 0)) + if ((ff_celt_freq_bands[i] - ff_celt_freq_range[i] >= ff_celt_freq_bands[f->start_band] || + i == f->start_band + 1) && (update_lowband || lowband_offset == 0)) lowband_offset = i; + if (i == f->start_band + 1) { + /* Special Hybrid Folding (RFC 8251 section 9). Copy the first band into + the second to ensure the second band never has to use the LCG. */ + int offset = 8 * ff_celt_freq_bands[i]; + int count = 8 * (ff_celt_freq_range[i] - ff_celt_freq_range[i-1]); + + memcpy(&norm[offset], &norm[offset - count], count * sizeof(float)); + + if (f->channels == 2) + memcpy(&norm2[offset], &norm2[offset - count], count * sizeof(float)); + } + /* Get a conservative estimate of the collapse_mask's for the bands we're going to be folding from. */ if (lowband_offset != 0 && (f->spread != CELT_SPREAD_AGGRESSIVE || @@ -728,7 +740,7 @@ static void celt_decode_bands(CeltFrame *f, OpusRangeCoder *rc) foldstart = lowband_offset; while (ff_celt_freq_bands[--foldstart] > effective_lowband); foldend = lowband_offset - 1; - while (ff_celt_freq_bands[++foldend] < effective_lowband + ff_celt_freq_range[i]); + while (++foldend < i && ff_celt_freq_bands[foldend] < effective_lowband + ff_celt_freq_range[i]); cm[0] = cm[1] = 0; for (j = foldstart; j < foldend; j++) {