From patchwork Sun Aug 6 23:20:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 4643 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.46.211 with SMTP id u202csp2187773vsu; Sun, 6 Aug 2017 16:21:10 -0700 (PDT) X-Received: by 10.28.213.194 with SMTP id m185mr6254406wmg.109.1502061670152; Sun, 06 Aug 2017 16:21:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1502061670; cv=none; d=google.com; s=arc-20160816; b=aOwf26UcWmx8YUdca/gGGByoVpigVwsK9CQSPFqR1WJ98Njr2jc/qHF86aLiyvZMaO 5cg6SXydZk5VAImscwbnO8DtXBiyP1H/yToMT4iNL5wfSpfNabD33cI+r+0zowZeZ8S9 HJstcuZfmxpjCbcypT5sy1PsXzJsjPk2UgrQJbUHnMLwKfn32ELPt/zga3q6L3jD9M57 /9x66oVjYgANBWJNXOd0aiMmpBT/ctYB/6OybykDPdTYBIhwe+u/dcY0OlOTyVZyYAkx QmdhID39FBIDETKHJ084OIFG8sCBoiwTnuCGnI+/eAO+I92Hn1uTsn2LdRpHcH5KQD98 odvQ== 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:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:delivered-to :arc-authentication-results; bh=pUhAnxRAKLIYav5D8Tgc4lxE5O4wKa9tB2ySr9/Acw4=; b=DxhYqS7j687heBM2QQ6BNKW9qh9lEjj26i7rKStLFoDVCZ7bfNvYpDWSC6hkTdiN6Z P6fg2TqqsHBeSXNBkTKD3DBZPyTsdNWCmoFOjEZwKNNT5aSLsvejSSzAxIIwMRTWg8F1 WVPrteG1eFRdyoB9rSEQ0pPazqAY4+pXvvOZD/ukIiNegc6FuYUPBJSB0aFPx++ZgrDv QVoMJuo5W5A8H/T8pMrWEIznkyRkExXhtB8wL5MISA1CTJjFkxD2V19g5u87+zkoAjMI LY8O/J/FIX3cBC2riapV55bJol1sZjZM4lSHYspOXL8wqKAKsdChaMrcSZTpORIRDYvW PS3w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v16si7547559wra.229.2017.08.06.16.21.09; Sun, 06 Aug 2017 16:21:10 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 980F568055B; Mon, 7 Aug 2017 02:21:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from vie01a-dmta-pe05-1.mx.upcmail.net (vie01a-dmta-pe06-1.mx.upcmail.net [84.116.36.14]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3ACB1680467 for ; Mon, 7 Aug 2017 02:20:58 +0300 (EEST) Received: from [172.31.216.43] (helo=vie01a-pemc-psmtp-pe01) by vie01a-dmta-pe06.mx.upcmail.net with esmtp (Exim 4.88) (envelope-from ) id 1deUqw-0007sF-5X for ffmpeg-devel@ffmpeg.org; Mon, 07 Aug 2017 01:20:58 +0200 Received: from localhost ([213.47.41.20]) by vie01a-pemc-psmtp-pe01 with SMTP @ mailcloud.upcmail.net id tzLw1v0110S5wYM01zLxgr; Mon, 07 Aug 2017 01:20:58 +0200 X-SourceIP: 213.47.41.20 From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Mon, 7 Aug 2017 01:20:55 +0200 Message-Id: <20170806232056.601-1-michael@niedermayer.cc> X-Mailer: git-send-email 2.13.0 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/dvenc: Support adjusting the quantizer deadzone 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Michael Niedermayer --- libavcodec/dv.h | 3 +++ libavcodec/dvenc.c | 24 +++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/libavcodec/dv.h b/libavcodec/dv.h index 6350a16dff..0e97bb200e 100644 --- a/libavcodec/dv.h +++ b/libavcodec/dv.h @@ -38,6 +38,7 @@ typedef struct DVwork_chunk { } DVwork_chunk; typedef struct DVVideoContext { + AVClass *avclass; const AVDVProfile *sys; const AVFrame *frame; AVCodecContext *avctx; @@ -51,6 +52,8 @@ typedef struct DVVideoContext { me_cmp_func ildct_cmp; DVwork_chunk work_chunks[4 * 12 * 27]; uint32_t idct_factor[2 * 4 * 16 * 64]; + + int quant_deadzone; } DVVideoContext; enum dv_section_type { diff --git a/libavcodec/dvenc.c b/libavcodec/dvenc.c index e3de18a510..8474498ee6 100644 --- a/libavcodec/dvenc.c +++ b/libavcodec/dvenc.c @@ -17,6 +17,8 @@ * 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 + * + * quant_deadzone code and fixes sponsored by NOA GmbH */ /** @@ -28,6 +30,7 @@ #include "libavutil/attributes.h" #include "libavutil/internal.h" +#include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "avcodec.h" @@ -265,6 +268,8 @@ static av_always_inline int dv_init_enc_block(EncBlockInfo *bi, uint8_t *data, #endif int max = classes[0]; int prev = 0; + const unsigned deadzone = s->quant_deadzone; + const unsigned threshold = 2 * deadzone; av_assert2((((int) blk) & 15) == 0); @@ -297,13 +302,15 @@ static av_always_inline int dv_init_enc_block(EncBlockInfo *bi, uint8_t *data, for (i = mb_area_start[area]; i < mb_area_start[area + 1]; i++) { int level = blk[zigzag_scan[i]]; - if (level + 15 > 30U) { + if (level + deadzone > threshold) { bi->sign[i] = (level >> 31) & 1; /* Weight it and shift down into range, adding for rounding. * The extra division by a factor of 2^4 reverses the 8x * expansion of the DCT AND the 2x doubling of the weights. */ level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits + 3))) >> (dv_weight_bits + 4); + if (!level) + continue; bi->mb[i] = level; if (level > max) max = level; @@ -746,6 +753,20 @@ FF_ENABLE_DEPRECATION_WARNINGS return 0; } +#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM +#define OFFSET(x) offsetof(DVVideoContext, x) +static const AVOption dv_options[] = { + { "quant_deadzone", "Quantizer dead zone", OFFSET(quant_deadzone), AV_OPT_TYPE_INT, { .i64 = 15 }, 0, 1024, VE }, + { NULL }, +}; + +static const AVClass dvvideo_encode_class = { + .class_name = "dvvideo encoder", + .item_name = av_default_item_name, + .option = dv_options, + .version = LIBAVUTIL_VERSION_INT, +}; + AVCodec ff_dvvideo_encoder = { .name = "dvvideo", .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"), @@ -759,4 +780,5 @@ AVCodec ff_dvvideo_encoder = { AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, + .priv_class = &dvvideo_encode_class, };