From patchwork Wed Oct 23 19:24:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ramiro Polla X-Patchwork-Id: 15928 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 26E32448A8B for ; Wed, 23 Oct 2019 22:30:19 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0745668AD5E; Wed, 23 Oct 2019 22:30:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f66.google.com (mail-lf1-f66.google.com [209.85.167.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 609D768AD53 for ; Wed, 23 Oct 2019 22:30:12 +0300 (EEST) Received: by mail-lf1-f66.google.com with SMTP id u16so17078480lfq.3 for ; Wed, 23 Oct 2019 12:30:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=tqHcaQAuxL8f9Ron1ZhoaqiBGekV0gpogkWOqIP3s00=; b=j5AwyKgCYsPv/UAqOuSqwHzUap51L+ajF04t2H4ojZmHDUrpytNUrRuxQbPBBCTelb jEIHfWap1bJPMrndSnFrEXbIboBvTbu1SFYyl/tkGJUwvT2f3fkTRQLgOxaxY1VzRX1U hKZDoIs8de8fmj983UQMc6Sy6Gn4gSD3flnWO8p0MMI/KD2MbE18YKbh56zpKxMXGZv9 lwE7AnpdB7Wl5CoG0xVeONwd9WM4vjnlBKHgKrL/OAmNKsIvv2q1PmlatBT9oDB6ZpgU lOD5Rlg4eyVbC5klq587UnbTCGO6paLiZKaWXOolHsSBTS9Fw1BGxOd5sEnew2iqpF6C kSLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=tqHcaQAuxL8f9Ron1ZhoaqiBGekV0gpogkWOqIP3s00=; b=hAZGWnnLirCi96lfX6ZV8E3OwdQLtBXdUJ3wpTxHpAvnDXdbI6nnzoLGMRJ68EBjgy /L6aEdUliIyOMWzkoTZcFVjK0qDcy2qfYxhc0HOWd9lTqTHkaN9FCRDaNM15MG/y0TfF +dFkNju1BMMbDzC/iw3WQ0ozN4oa6CjvTnls9zAa5vbgJURpYHFFBriaO3lqBKnCCTZD KPmq9FR5nhm0FaLr+a3OE6ZWXCvU7au8wY3iL8wP8B2WO661j0eKuu8kjhU0May/A/Oo 3kQ1+mQjvXXrSUJB270dEdlq4EtIbUW2B+N0xxrQmq0+Yho3RtQJqve4GckHBGaY8Uji NP0g== X-Gm-Message-State: APjAAAWp6umNDIblOinNZe06wHkg/45iIsPcAqeo4T+v72Hm0mDNMtOs 5B8OwO0TftmEzp3y5GXRJNS8SJWterYsqKHxTtkEGUsy X-Google-Smtp-Source: APXvYqx3v+orMZHOCyHzMb3WvPXGXS9kM6NJZSL5WFM/0bKwQVL5uCrTgJn2OWAxWzJpFUo4m2okH/mt3VE72rQbkgM= X-Received: by 2002:ac2:483c:: with SMTP id 28mr18833919lft.174.1571858691327; Wed, 23 Oct 2019 12:24:51 -0700 (PDT) MIME-Version: 1.0 References: <20180509184425.18789-1-ramiro.polla@gmail.com> <20180510210159.GK20131@michaelspb> <20180610003258.GX4859@michaelspb> In-Reply-To: From: Ramiro Polla Date: Wed, 23 Oct 2019 21:24:39 +0200 Message-ID: To: FFmpeg development discussions and patches Subject: Re: [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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" On Sun, Jun 17, 2018 at 6:23 AM Ramiro Polla wrote: > On Sun, Jun 10, 2018 at 2:32 AM, Michael Niedermayer > wrote: > > On Sat, Jun 09, 2018 at 05:09:13PM +0200, Ramiro Polla wrote: > >> On Thu, May 10, 2018 at 11:01 PM, Michael Niedermayer > >> wrote: > >> > On Wed, May 09, 2018 at 08:44:25PM +0200, Ramiro Polla wrote: > >> >> 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. > >> > > >> > maybe a continuous variable like snows intra_penalty could achieve this > >> > too but give more flexibility in doing it also just partially if wanted > >> > >> I like this idea better. I wanted a simple way to be able to entirely > >> disable intra macroblocks, but "-intra_penalty max" could cause an > >> overflow, so I set the max value to INT_MAX/2. > >> > >> New patch attached. > > > > LGTM > > > > a fate test may also make sense > > I sent a new patch set that includes a fate test. The patchset with test that I had sent involved some changes to ffprobe/fate that weren't good. I gave up trying to add tests in a clean way. Here's just the previous LGTM'd patch, rebased against git master. Ramiro From e30abdeed04aa36e9f80ea54c891ee32b888d95c Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Wed, 23 Oct 2019 21:12:32 +0200 Subject: [PATCH] mpegvideo_enc: add intra_penalty option for p frames This option allows more control over the use of intra macroblocks in predictive frames. By using '-intra_penalty max', intra macroblocks are never used 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 | 10 +++++----- libavcodec/motion_est.h | 2 +- libavcodec/mpegvideo.h | 3 +++ libavcodec/mpegvideo_enc.c | 6 +++--- libavcodec/svq1enc.c | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index 759eea479d..02c75fd470 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->intra_penalty) 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){ @@ -1040,7 +1040,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s, intra_score= s->mecc.mb_cmp[0](s, c->scratchpad, pix, s->linesize, 16); } - intra_score += c->mb_penalty_factor*16; + intra_score += c->mb_penalty_factor*16 + s->intra_penalty; if(intra_score < dmin){ mb_type= CANDIDATE_MB_TYPE_INTRA; @@ -1648,7 +1648,7 @@ int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type) } } -void ff_fix_long_p_mvs(MpegEncContext * s) +void ff_fix_long_p_mvs(MpegEncContext * s, int type) { MotionEstContext * const c= &s->me; const int f_code= s->f_code; @@ -1682,8 +1682,8 @@ void ff_fix_long_p_mvs(MpegEncContext * s) if( mx >=range || mx <-range || my >=range || my <-range){ s->mb_type[i] &= ~CANDIDATE_MB_TYPE_INTER4V; - s->mb_type[i] |= CANDIDATE_MB_TYPE_INTRA; - s->current_picture.mb_type[i] = CANDIDATE_MB_TYPE_INTRA; + s->mb_type[i] |= type; + s->current_picture.mb_type[i] = type; } } } diff --git a/libavcodec/motion_est.h b/libavcodec/motion_est.h index 3b3a8d7341..817220f340 100644 --- a/libavcodec/motion_est.h +++ b/libavcodec/motion_est.h @@ -127,7 +127,7 @@ int ff_get_mb_score(struct MpegEncContext *s, int mx, int my, int src_index, int ff_get_best_fcode(struct MpegEncContext *s, int16_t (*mv_table)[2], int type); -void ff_fix_long_p_mvs(struct MpegEncContext *s); +void ff_fix_long_p_mvs(struct MpegEncContext *s, int type); void ff_fix_long_mvs(struct MpegEncContext *s, uint8_t *field_select_table, int field_select, int16_t (*mv_table)[2], int f_code, int type, int truncate); diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index e1ff5f97dc..29e692f245 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -580,6 +580,8 @@ typedef struct MpegEncContext { int scenechange_threshold; int noise_reduction; + + int intra_penalty; } MpegEncContext; /* mpegvideo_enc common options */ @@ -664,6 +666,7 @@ FF_MPV_OPT_CMP_FUNC, \ {"ps", "RTP payload size in bytes", FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ {"mepc", "Motion estimation bitrate penalty compensation (1.0 = 256)", FF_MPV_OFFSET(me_penalty_compensation), AV_OPT_TYPE_INT, {.i64 = 256 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ {"mepre", "pre motion estimation", FF_MPV_OFFSET(me_pre), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \ +{"intra_penalty", "Penalty for intra blocks in block decision", FF_MPV_OFFSET(intra_penalty), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX/2, FF_MPV_OPT_FLAGS }, \ {"a53cc", "Use A53 Closed Captions (if available)", FF_MPV_OFFSET(a53_cc), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FF_MPV_OPT_FLAGS }, \ extern const AVOption ff_mpv_generic_options[]; diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index f12e603215..96f5b4a666 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -3761,14 +3761,14 @@ static int encode_picture(MpegEncContext *s, int picture_number) s->f_code= FFMAX3(s->f_code, a, b); } - 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_p_mvs(s, s->intra_penalty ? CANDIDATE_MB_TYPE_INTER : CANDIDATE_MB_TYPE_INTRA); + ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, !!s->intra_penalty); 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, !!s->intra_penalty); } } } diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c index 80a8af1ef7..651013588f 100644 --- a/libavcodec/svq1enc.c +++ b/libavcodec/svq1enc.c @@ -345,7 +345,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, s->m.first_slice_line = 0; } - ff_fix_long_p_mvs(&s->m); + ff_fix_long_p_mvs(&s->m, CANDIDATE_MB_TYPE_INTRA); ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code, CANDIDATE_MB_TYPE_INTER, 0); } -- 2.11.0