From patchwork Wed May 9 18:44:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ramiro Polla X-Patchwork-Id: 8894 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp185663jad; Wed, 9 May 2018 11:51:30 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrlD9uPDQ2vpcvOiYRl6pPHka6vznLcJ2mmt0vOt62JwH4IvNaChQf8vqFDVI0IQFk3rS58 X-Received: by 2002:a1c:57c6:: with SMTP id l189-v6mr6661498wmb.161.1525891890704; Wed, 09 May 2018 11:51:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525891890; cv=none; d=google.com; s=arc-20160816; b=u/jhvBo7LiR90QJnVVS7zl7GziJixGjHX/fin2zys0nnvPOoYS4vAlSPLgghb3cMQ1 NhnaVHm6BxwAPoc8QOe8JV7d1lAFL7/8+VYhrG7Y7D5ClnvolxIIgR168Z8PP4L9iq8q T/mfqHnIMeIZ2hxvzWtM8knSxoe9ETxvokUDCqUi+6Zs8JRSR+fGLXiPtaqoJKJufL0o 3ga/5Eb65Vblx7FeTcb84TDNnCyFkF2GJhZoizbjhM/ITin73Hq+Rku/SjHqzUiEAiK9 IZgQMqZ6HtMOEEjbaw1wtW27cCzbV/4ZRZhL+Drgv+IwNjVizuj0x4LBFWTBxPK9Ksp1 WNig== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=8jLISeLk8nE1Ado+eaUcD0at7XC3X9MpbWAvEp1RE7I=; b=cRJqkMbtkN+9smujO4tu6VpYCX/YTaDOWcektu/IGtNYBI/zNqpCcM6ySj4z7sqQXq hVZmrkC6yuvkPG/SWwyQqJcIXykNzmTXOKWdDppJkS7s37ouqkTdrrjP/+bb7VUn2Ney RltQnNvJu3jQs7TOYK6IyV91bQUVeWhTqTYJfbt55m2B0e2Egl7vy7QiJccTygMrb/EO G7FstPUIn7KGHiMX/uqnez8Di3tH0SoNl/DSbydu7PHFLRiaD2ajXXkynKEoyt7mrl7y WNliMSKOawC4t6/u/obrRxmLWwQIRuSNx7D9aNz4VbS+UR70YctIvJCmUHbP0/C9Qfi8 35Wg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=hejSVzG3; 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=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 c7-v6si20569219wrh.267.2018.05.09.11.51.30; Wed, 09 May 2018 11:51:30 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=hejSVzG3; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6AA5268A639; Wed, 9 May 2018 21:50:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E39AC68A262 for ; Wed, 9 May 2018 21:50:46 +0300 (EEST) Received: by mail-wm0-f65.google.com with SMTP id a137-v6so24518782wme.1 for ; Wed, 09 May 2018 11:51:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=A8nDkbtOjbeNabFnbAvic5OFDnnRkJHtUjNMevIoQHI=; b=hejSVzG33RME5FEdzo37tm0NWr71i64YlIm1w5USRgS8sLcTA84SSmbXJO0xkVQBiF wMOVg+ImGNFyfDM7ikXfKRl3GYbji6lAY3Ru7q2sFqExYGzxo7+V2VvmfjEqII7+uW4N kC2jQrHXs5rxu0SMXcQkZu3TTnPeiodh/gHumj9wb81RKnlGCq24ULKXiHNbzkBo0XRR Y61XX+3s8eaPRW/l5OCthXQY24qcVp0f8qBKX7F/qlHcqat9vqaDbOercMPelYReNpW3 bj0zmFZ+HNvYiir/Y1S3fyqFt6QSg/DkQ46qbl+B9dubwS45P+N0fckqnS+fa8I2hb3z mUyg== 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; bh=A8nDkbtOjbeNabFnbAvic5OFDnnRkJHtUjNMevIoQHI=; b=OO5e0JW4IlJHRqi0oBtAf8VEcTzI34VrdjG/5hE1BtBNh4WQwK4iKbcht8SLmb4hLi w5QyHOEgTgO6NT8Y7Kz1RWn9EsDXgHFulA5ZZ7kncnfcuKQNoiBiuPk/xHBOgQRj4vlU D8tmj5IxMC1ImqHLhwvUSCCMfaJ8o2zxNR8ij2OoZyHq71QG7rTXQXgy4F0AHYwOKK9a Uko6xDKI907f6HpUq2NQgfqBfLohwyPMHnedLmkT1OOULPnBlOMfCY+J4O5UIUvgPFuu OKpkdzvJJK6C6LlKr1OzWhV3dNS+WgsFEDhkW/m0+lHSpvYiL4sxbJdUVg2Mg6IeMqI+ ecDA== X-Gm-Message-State: ALQs6tBG9bMgS0IONoW8S2045L9TEsbC4S3mh8qyWAeJM7W2NZaHdRYU 5ISugRIiNxFe80d/5ya+U39C1Q== X-Received: by 2002:a50:8142:: with SMTP id 60-v6mr61085939edc.181.1525891475742; Wed, 09 May 2018 11:44:35 -0700 (PDT) Received: from localhost.localdomain (62-197-64-159.teledisnet.be. [62.197.64.159]) by smtp.gmail.com with ESMTPSA id o16-v6sm15584334edr.75.2018.05.09.11.44.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 09 May 2018 11:44:34 -0700 (PDT) From: Ramiro Polla To: ffmpeg-devel@ffmpeg.org Date: Wed, 9 May 2018 20:44:25 +0200 Message-Id: <20180509184425.18789-1-ramiro.polla@gmail.com> X-Mailer: git-send-email 2.11.0 Subject: [FFmpeg-devel] [PATCH] mpegvideo_enc: add option to disable intra mbs in p frames X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Ramiro Polla MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This option prevents the mpv encoders from using intra macroblocks in predictive frames. It is useful for glitch artists to generate input material. This option allows them to split and merge two video files while maintaining fluid motion from the second video without having intra macroblocks restoring chunks of the first video. --- libavcodec/motion_est.c | 4 ++-- libavcodec/mpegvideo.h | 2 ++ libavcodec/mpegvideo_enc.c | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index 8b5ce2117a..827e2282f7 100644 --- a/libavcodec/motion_est.c +++ b/libavcodec/motion_est.c @@ -971,7 +971,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20; c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score); - if (vard*2 + 200*256 > varc) + if (vard*2 + 200*256 > varc && !(s->mpv_flags & FF_MPV_FLAG_NOPIMB)) mb_type|= CANDIDATE_MB_TYPE_INTRA; if (varc*2 + 200*256 > vard || s->qscale > 24){ // if (varc*2 + 200*256 + 50*(s->lambda2>>FF_LAMBDA_SHIFT) > vard){ @@ -1042,7 +1042,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, } intra_score += c->mb_penalty_factor*16; - if(intra_score < dmin){ + if(intra_score < dmin && !(s->mpv_flags & FF_MPV_FLAG_NOPIMB)){ mb_type= CANDIDATE_MB_TYPE_INTRA; s->current_picture.mb_type[mb_y*s->mb_stride + mb_x] = CANDIDATE_MB_TYPE_INTRA; //FIXME cleanup }else diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index e16deb64e7..b7ac2c7b48 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -586,6 +586,7 @@ typedef struct MpegEncContext { #define FF_MPV_FLAG_CBP_RD 0x0008 #define FF_MPV_FLAG_NAQ 0x0010 #define FF_MPV_FLAG_MV0 0x0020 +#define FF_MPV_FLAG_NOPIMB 0x0040 #define FF_MPV_OPT_CMP_FUNC \ { "sad", "Sum of absolute differences, fast", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SAD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \ @@ -617,6 +618,7 @@ FF_MPV_OPT_CMP_FUNC, \ { "cbp_rd", "use rate distortion optimization for CBP", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_CBP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\ { "naq", "normalize adaptive quantization", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_NAQ }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\ { "mv0", "always try a mb with mv=<0,0>", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_MV0 }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\ +{ "nopimb", "do not use intra mbs for predictive frames", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_NOPIMB }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\ { "luma_elim_threshold", "single coefficient elimination threshold for luminance (negative values also consider dc coefficient)",\ FF_MPV_OFFSET(luma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\ { "chroma_elim_threshold", "single coefficient elimination threshold for chrominance (negative values also consider dc coefficient)",\ diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 9fdab31a25..e41a8f40cf 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -3752,6 +3752,7 @@ static int encode_picture(MpegEncContext *s, int picture_number) if(!s->umvplus){ if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) { + int truncate = s->mpv_flags & FF_MPV_FLAG_NOPIMB; s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER); if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) { @@ -3762,13 +3763,13 @@ static int encode_picture(MpegEncContext *s, int picture_number) } ff_fix_long_p_mvs(s); - ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0); + ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, truncate); if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) { int j; for(i=0; i<2; i++){ for(j=0; j<2; j++) ff_fix_long_mvs(s, s->p_field_select_table[i], j, - s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0); + s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, truncate); } } }