From patchwork Wed May 30 11:53:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Borsboom X-Patchwork-Id: 9160 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:11c:0:0:0:0:0 with SMTP id c28-v6csp4236848jad; Wed, 30 May 2018 04:53:59 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLI9HiqiVVf//fMi9US6x1RswWOVUO5cEvWROmKW4voLdtSfz5zAy+UwKByamBcCkSJXkKH X-Received: by 2002:a1c:8312:: with SMTP id f18-v6mr1322779wmd.127.1527681239568; Wed, 30 May 2018 04:53:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527681239; cv=none; d=google.com; s=arc-20160816; b=a27gUmJuZLMeiJty9aIF5+1FI3XeR/YmVVzGsjkr7UgLA6KPerIlV47xKNF3Y7LV56 I7JcRukXANjSmCKpiAJ90ajhlxdxLvTS/Z5rsVS8qk2XYBEBTMm/fjNGiidtJC/JWoMA X26lx6mWlRY+xgk1bhy1h642jirl6tNrWIxDmv8T78FPdM6uY69QUgDKPQQmVe6oqsNr uhYnDEi5MkIC/1hGCEViW25MFgjjQzCsERLqQCU6Epvj/q+P7bBPl6euq05CsYsdaqph DciAwy1hqFX1LsbgakU37d1cK9+Xht38ahFbqLoBNfXGlOwKpF9hY/8tHyxEC3/CXUrK VJoQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:content-language:in-reply-to:mime-version :user-agent:date:message-id:from:references:to:dkim-signature :delivered-to:arc-authentication-results; bh=kEPwiAzUH4uRHbVmqpTMP90avT61s6XYS1bfU1QpnR8=; b=0/FK6t0/qIh5Z/iV1oPkqjrrMxNxoangG38d+TrTH6BIFj5B28OLjAweYq/rKq1QvM KVXz9HBDACG5WLLGxU75YaZLXDqNs4cKVwLlL8IVtRd4+26IbtaVEwnULsTymlSQCSYo SsVoq5QawN+NhC9wvhTrfSZWdw+b5XESULHE9cnhzLkegg6ndXkQlES8QLa+TM3rNUZm c5vtY/wWaHUAHlozTJ5xkq46fSi66e6LkUI1rkTuSetmpJDml8Jj4CRwSG35uerwVQAk rWrB5JCeYh4gebyBCRgkt5nGHaIFvA79Ifzm9vCa0oWiDRAwRzt/FkDm6JI3WsgVSVxW k+ug== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@carpalis.nl header.s=default header.b=lc+KkQ1U; 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 s6-v6si10155833wrp.129.2018.05.30.04.53.58; Wed, 30 May 2018 04:53:59 -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=@carpalis.nl header.s=default header.b=lc+KkQ1U; 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 706E868A3B3; Wed, 30 May 2018 14:53:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from kyoto.xs4all.nl (kyoto.xs4all.nl [83.161.153.34]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3708968A389 for ; Wed, 30 May 2018 14:53:06 +0300 (EEST) Received: from [10.1.48.103] ([87.215.30.74]) (authenticated bits=0) by kyoto.xs4all.nl (8.14.7/8.14.7) with ESMTP id w4UBrmAj007048 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 30 May 2018 13:53:49 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=carpalis.nl; s=default; t=1527681229; bh=SQ88pIB7QmnK8n6hxsWEKnHuDbiTfGOnoQVlOel8lW4=; h=To:References:Subject:From:Date:In-Reply-To; b=lc+KkQ1UNBJ6jtoSQ5qvXtppDxWuEJ7dkNS+8dXdU1GSg1u+ckOruYJ7VtstO6iSK EaRVQ1iXKFg0Mzkl4SVsIXUMrJmb4yD3viT7Im6r/tHBkrtWvMudezSfbGgyVtbiAo omTwmZb4kG6/6FB7JV67kReDQl6B7prpLGD4lOMYeOuwaAZcIUmG3vNAWRcE69odUX XqefFSfmMnbv+x/8CBMEoCxE+dQJV6AlsazIUvfku/VvaBsdJ7rjvv51fAheIUQDxF ty2K1dFzX7yPelgG6bX3tXgG26CWB+Lfo2+lGmiziAScXrtZF1xSVbEGul4v4nOVZY 7yahqIAfAC1KQ== To: ffmpeg-devel@ffmpeg.org References: <212f8acc-1340-db58-2ac7-716a9e1ca25f@carpalis.nl> From: Jerome Borsboom Message-ID: <79832fd5-4b54-ed48-d76b-349df2e1a526@carpalis.nl> Date: Wed, 30 May 2018 13:53:48 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: <212f8acc-1340-db58-2ac7-716a9e1ca25f@carpalis.nl> Content-Language: nl Subject: Re: [FFmpeg-devel] [PATCH v2] avcodec/vc1: fix overlap smoothing filter for 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" The v_overlap_filter needs to run on the colocated block of the previous macroblock. For the luma plane, the colocated block is located two blocks on the left instead of one. In addition, the overlap filter needs to run on the non-edge blocks of the first macroblock row and column. Signed-off-by: Jerome Borsboom --- This is an improved patch that should also fix the remaining frames in SSL0013.rcv. libavcodec/vc1_loopfilter.c | 60 ++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/libavcodec/vc1_loopfilter.c b/libavcodec/vc1_loopfilter.c index 4c0de7c025..aceb1f77ff 100644 --- a/libavcodec/vc1_loopfilter.c +++ b/libavcodec/vc1_loopfilter.c @@ -64,27 +64,23 @@ void ff_vc1_loop_filter_iblk(VC1Context *v, int pq) static av_always_inline void vc1_h_overlap_filter(VC1Context *v, int16_t (*left_block)[64], int16_t (*right_block)[64], int block_num) { - if (left_block != right_block || (block_num & 5) == 1) { - if (block_num > 3) - v->vc1dsp.vc1_h_s_overlap(left_block[block_num], right_block[block_num]); - else if (block_num & 1) - v->vc1dsp.vc1_h_s_overlap(right_block[block_num - 1], right_block[block_num]); - else - v->vc1dsp.vc1_h_s_overlap(left_block[block_num + 1], right_block[block_num]); - } + if (block_num > 3) + v->vc1dsp.vc1_h_s_overlap(left_block[block_num], right_block[block_num]); + else if (block_num & 1) + v->vc1dsp.vc1_h_s_overlap(right_block[block_num - 1], right_block[block_num]); + else + v->vc1dsp.vc1_h_s_overlap(left_block[block_num + 1], right_block[block_num]); } static av_always_inline void vc1_v_overlap_filter(VC1Context *v, int16_t (*top_block)[64], int16_t (*bottom_block)[64], int block_num) { - if (top_block != bottom_block || block_num & 2) { - if (block_num > 3) - v->vc1dsp.vc1_v_s_overlap(top_block[block_num], bottom_block[block_num]); - else if (block_num & 2) - v->vc1dsp.vc1_v_s_overlap(bottom_block[block_num - 2], bottom_block[block_num]); - else - v->vc1dsp.vc1_v_s_overlap(top_block[block_num + 2], bottom_block[block_num]); - } + if (block_num > 3) + v->vc1dsp.vc1_v_s_overlap(top_block[block_num], bottom_block[block_num]); + else if (block_num & 2) + v->vc1dsp.vc1_v_s_overlap(bottom_block[block_num - 2], bottom_block[block_num]); + else + v->vc1dsp.vc1_v_s_overlap(top_block[block_num + 2], bottom_block[block_num]); } void ff_vc1_i_overlap_filter(VC1Context *v) @@ -108,21 +104,28 @@ void ff_vc1_i_overlap_filter(VC1Context *v) * borders. Therefore, the H overlap trails by one MB col and the * V overlap trails by one MB row. This is reflected in the time at which * we run the put_pixels loop, i.e. delayed by one row and one column. */ - for (i = 0; i < block_count; i++) + for (i = 0; i < block_count; i++) { + if (s->mb_x == 0 && (i & 5) != 1) + continue; + if (v->pq >= 9 || v->condover == CONDOVER_ALL || - (v->over_flags_plane[mb_pos] && ((i & 5) == 1 || (s->mb_x && v->over_flags_plane[mb_pos - 1])))) + (v->over_flags_plane[mb_pos] && ((i & 5) == 1 || v->over_flags_plane[mb_pos - 1]))) vc1_h_overlap_filter(v, s->mb_x ? left_blk : cur_blk, cur_blk, i); + } if (v->fcm != ILACE_FRAME) for (i = 0; i < block_count; i++) { + if (s->first_slice_line && !(i & 2)) + continue; + if (s->mb_x && (v->pq >= 9 || v->condover == CONDOVER_ALL || (v->over_flags_plane[mb_pos - 1] && - ((i & 2) || (!s->first_slice_line && v->over_flags_plane[mb_pos - 1 - s->mb_stride]))))) + ((i & 2) || v->over_flags_plane[mb_pos - 1 - s->mb_stride])))) vc1_v_overlap_filter(v, s->first_slice_line ? left_blk : topleft_blk, left_blk, i); if (s->mb_x == s->mb_width - 1) if (v->pq >= 9 || v->condover == CONDOVER_ALL || (v->over_flags_plane[mb_pos] && - ((i & 2) || (!s->first_slice_line && v->over_flags_plane[mb_pos - s->mb_stride])))) + ((i & 2) || v->over_flags_plane[mb_pos - s->mb_stride]))) vc1_v_overlap_filter(v, s->first_slice_line ? cur_blk : top_blk, cur_blk, i); } } @@ -139,18 +142,25 @@ void ff_vc1_p_overlap_filter(VC1Context *v) left_blk = v->block[v->left_blk_idx]; cur_blk = v->block[v->cur_blk_idx]; - for (i = 0; i < block_count; i++) - if (v->mb_type[0][s->block_index[i]] && (s->mb_x == 0 || v->mb_type[0][s->block_index[i] - 1])) + for (i = 0; i < block_count; i++) { + if (s->mb_x == 0 && (i & 5) != 1) + continue; + + if (v->mb_type[0][s->block_index[i]] && v->mb_type[0][s->block_index[i] - 1]) vc1_h_overlap_filter(v, s->mb_x ? left_blk : cur_blk, cur_blk, i); + } if (v->fcm != ILACE_FRAME) for (i = 0; i < block_count; i++) { - if (s->mb_x && v->mb_type[0][s->block_index[i] - 1] && - (s->first_slice_line || v->mb_type[0][s->block_index[i] - s->block_wrap[i] - 1])) + if (s->first_slice_line && !(i & 2)) + continue; + + if (s->mb_x && v->mb_type[0][s->block_index[i] - 2 + (i > 3)] && + v->mb_type[0][s->block_index[i] - s->block_wrap[i] - 2 + (i > 3)]) vc1_v_overlap_filter(v, s->first_slice_line ? left_blk : topleft_blk, left_blk, i); if (s->mb_x == s->mb_width - 1) if (v->mb_type[0][s->block_index[i]] && - (s->first_slice_line || v->mb_type[0][s->block_index[i] - s->block_wrap[i]])) + v->mb_type[0][s->block_index[i] - s->block_wrap[i]]) vc1_v_overlap_filter(v, s->first_slice_line ? cur_blk : top_blk, cur_blk, i); } }