From patchwork Wed Jun 20 11:11:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Borsboom X-Patchwork-Id: 9451 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:11c:0:0:0:0:0 with SMTP id c28-v6csp618821jad; Wed, 20 Jun 2018 04:11:20 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKLoN1NsuudROCZSc8Y5YLHsm+Sn+n8gmYZX/96udd4iac0Ub4qa0BYEJeXBYtVq4JHfmYP X-Received: by 2002:adf:8701:: with SMTP id a1-v6mr18484755wra.178.1529493080490; Wed, 20 Jun 2018 04:11:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529493080; cv=none; d=google.com; s=arc-20160816; b=sfetM9PKiO8cYs1inVThIcywz47ZtYLa56BX2f/KEeB4PekEfw6//QMJvlPJ9UPcxx VmePikzFneDcDM0uLKqXnqIC8TdkwAWumCppx4AiRP3nTlamBYt68iQeiUR/jLXFRxVe YNEQWWXImY3J01vQk7Dv6svKdUhdV8AAm1YCs3m+e2jpdlxI2tXtCe/7S53lu5WHjSJt 7oZ+EJRZT3HcNQlHsuddgKtEK1lCxab8fYqKK/DWGelYx8p1M7EdEBo2McraupuhM1gg Rui5CNfGK9Zmu3UatloN4ECiemdLYJdbXbi+SU8w1lJ716b4E2hN8tarnlUO6+rKGX9i yf0Q== 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:mime-version:user-agent:date :message-id:from:to:dkim-signature:delivered-to :arc-authentication-results; bh=+bE+RWT5VM69tSsjQvjYatK64Ei7yJCEIRGon1WHSgE=; b=lA6jT1ePh0KRSiKLpy4ASuq9JV5qZyzn5UijveQ0Gcfte3LWmNAN9gQYU1GelInvln 0zInnVGbUG6Q0Sxae7mpFliehEiZOC0x/lnBZAOxhhQf5gTsxjzMdx2qMr9w4qvb9mfz 5fyhKlT5LsW3AffgW3/o/RKeZ//tmKJMnggGxGRqYQTydZO5O6UcF6Zqiac3UXjQ4Xxv QcajvdbPyds8DuLy6qeCSzP+VzkWbfaP2YVzXdl05WmdzX75HpE0hqTmiQC9W0ACgzfq FI5FNmogI56cy3SyF9Kw9laUvpuKq+pFWkipiZIxvAxsUASb9IAZX1GER5N393mOBUfD LUow== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@carpalis.nl header.s=default header.b=I6qaVZnA; 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 202-v6si952052wml.114.2018.06.20.04.11.20; Wed, 20 Jun 2018 04:11:20 -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=I6qaVZnA; 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 D49E468A3FB; Wed, 20 Jun 2018 14:10:17 +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 BAA1E689C10 for ; Wed, 20 Jun 2018 14:10:11 +0300 (EEST) Received: from [10.1.50.50] ([87.215.30.74]) (authenticated bits=0) by kyoto.xs4all.nl (8.14.7/8.14.7) with ESMTP id w5KBB3Nc027028 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 20 Jun 2018 13:11:04 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=carpalis.nl; s=default; t=1529493064; bh=WdGfrnhAIFxWM/9COT96wWrsH6yCllEbebQLygfILK0=; h=To:From:Subject:Date; b=I6qaVZnAlkDyn8XRT9gC1sx1duj/42Bbm9De8cnhovA54qfCdDPBiZ1Tyjy0rNi9F St/rYwLxFV1SiEyjpZe5EiP8/VP/ONR4bICI4ylQuUYZovx0+jVgCqoNK/4yH4+GCC UpLs9zX9+OcWGDXkGQuVXcrviIwhkOW+5q0bERexTlxXWVE0iAn7YOWjvWiw2HT+LK nIl9V+gcGTCfdHYBuE+Ntc3SxsrAStWUbbqx+t7nQvJaU35vWeejjlZHvvCAu26AUZ i/Fex5h8xBN34/rVqx38TA3Jc5fo56QqF7QTGr+IdLszt+YbQEgQwPEJ7iPq45FcOZ gW9aQaeuNv1yw== To: ffmpeg-devel@ffmpeg.org From: Jerome Borsboom Message-ID: <1bead909-49e3-25fc-3c16-c8a079de79a8@carpalis.nl> Date: Wed, 20 Jun 2018 13:11:03 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 Content-Language: nl Subject: [FFmpeg-devel] [PATCH 2/3] avcodec/vc1: change the internal ordering of blocks within a macroblock 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 overlap filter needs to cover a full macroblock vertical edge when the FIELDTX value for two neighbouring macroblocks is not equal. By changing the internal ordering of the blocks from row major to column major, we do not need to reinterlace a FIELDTX coded macroblock before running the overlap filter. Signed-off-by: Jerome Borsboom --- libavcodec/vc1_block.c | 65 +++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index b58b71b3e0..a2321eddb9 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -45,6 +45,9 @@ static const uint8_t offset_table[2][9] = { { 0, 1, 3, 7, 15, 31, 63, 127, 255 }, }; +// mapping table for internal block representation +static const int block_map[6] = {0, 2, 1, 3, 4, 5}; + /***********************************************************************/ /** * @name VC-1 Bitplane decoding @@ -86,11 +89,11 @@ static void vc1_put_blocks_clamped(VC1Context *v, int put_signed) v->mb_type[0][s->block_index[i] - 2 * s->block_wrap[i] - 2]) { dest = s->dest[0] + ((i & 2) - 4) * 4 * s->linesize + ((i & 1) - 2) * 8; if (put_signed) - s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][i], + s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][block_map[i]], i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, i > 3 ? s->uvlinesize : s->linesize); else - s->idsp.put_pixels_clamped(v->block[v->topleft_blk_idx][i], + s->idsp.put_pixels_clamped(v->block[v->topleft_blk_idx][block_map[i]], i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, i > 3 ? s->uvlinesize : s->linesize); } @@ -102,11 +105,11 @@ static void vc1_put_blocks_clamped(VC1Context *v, int put_signed) v->mb_type[0][s->block_index[i] - 2 * s->block_wrap[i]]) { dest = s->dest[0] + ((i & 2) - 4) * 4 * s->linesize + (i & 1) * 8; if (put_signed) - s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][i], + s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][block_map[i]], i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, i > 3 ? s->uvlinesize : s->linesize); else - s->idsp.put_pixels_clamped(v->block[v->top_blk_idx][i], + s->idsp.put_pixels_clamped(v->block[v->top_blk_idx][block_map[i]], i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, i > 3 ? s->uvlinesize : s->linesize); } @@ -125,11 +128,11 @@ static void vc1_put_blocks_clamped(VC1Context *v, int put_signed) else dest = s->dest[0] + (i & 2) * 4 * s->linesize + ((i & 1) - 2) * 8; if (put_signed) - s->idsp.put_signed_pixels_clamped(v->block[v->left_blk_idx][i], + s->idsp.put_signed_pixels_clamped(v->block[v->left_blk_idx][block_map[i]], i > 3 ? s->dest[i - 3] - 8 : dest, i > 3 ? s->uvlinesize : s->linesize << fieldtx); else - s->idsp.put_pixels_clamped(v->block[v->left_blk_idx][i], + s->idsp.put_pixels_clamped(v->block[v->left_blk_idx][block_map[i]], i > 3 ? s->dest[i - 3] - 8 : dest, i > 3 ? s->uvlinesize : s->linesize << fieldtx); } @@ -145,11 +148,11 @@ static void vc1_put_blocks_clamped(VC1Context *v, int put_signed) else dest = s->dest[0] + (i & 2) * 4 * s->linesize + (i & 1) * 8; if (put_signed) - s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], + s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][block_map[i]], i > 3 ? s->dest[i - 3] : dest, i > 3 ? s->uvlinesize : s->linesize << fieldtx); else - s->idsp.put_pixels_clamped(v->block[v->cur_blk_idx][i], + s->idsp.put_pixels_clamped(v->block[v->cur_blk_idx][block_map[i]], i > 3 ? s->dest[i - 3] : dest, i > 3 ? s->uvlinesize : s->linesize << fieldtx); } @@ -1348,18 +1351,18 @@ static int vc1_decode_p_mb(VC1Context *v) if (i == 1 || i == 3 || s->mb_x) v->c_avail = v->mb_type[0][s->block_index[i] - 1]; - vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, val, mquant, + vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant, (i & 4) ? v->codingset2 : v->codingset); if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; - v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); + v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); if (v->rangeredfrm) for (j = 0; j < 64; j++) - v->block[v->cur_blk_idx][i][j] <<= 1; + v->block[v->cur_blk_idx][block_map[i]][j] <<= 1; block_cbp |= 0xF << (i << 2); block_intra |= 1 << i; } else if (val) { - pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb, first_block, + pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize, CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); block_cbp |= pat << (i << 2); @@ -1449,18 +1452,18 @@ static int vc1_decode_p_mb(VC1Context *v) if (i == 1 || i == 3 || s->mb_x) v->c_avail = v->mb_type[0][s->block_index[i] - 1]; - vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, is_coded[i], mquant, + vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, is_coded[i], mquant, (i & 4) ? v->codingset2 : v->codingset); if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; - v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); + v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); if (v->rangeredfrm) for (j = 0; j < 64; j++) - v->block[v->cur_blk_idx][i][j] <<= 1; + v->block[v->cur_blk_idx][block_map[i]][j] <<= 1; block_cbp |= 0xF << (i << 2); block_intra |= 1 << i; } else if (is_coded[i]) { - pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb, + pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize, CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), @@ -1591,11 +1594,11 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) if (i == 1 || i == 3 || s->mb_x) v->c_avail = v->mb_type[0][s->block_index[i] - 1]; - vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, val, mquant, + vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant, (i & 4) ? v->codingset2 : v->codingset); if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; - v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); + v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); if (i < 4) off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize; else @@ -1671,7 +1674,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) else off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize)); if (val) { - pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb, + pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : (s->linesize << fieldtx), CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt); @@ -1757,11 +1760,11 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) if (i == 1 || i == 3 || s->mb_x) v->c_avail = v->mb_type[0][s->block_index[i] - 1]; - vc1_decode_intra_block(v, v->block[v->cur_blk_idx][i], i, val, mquant, + vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant, (i & 4) ? v->codingset2 : v->codingset); if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; - v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); + v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]); off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); block_cbp |= 0xf << (i << 2); } @@ -1806,7 +1809,7 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) val = ((cbp >> (5 - i)) & 1); off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize; if (val) { - pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][i], i, mquant, ttmb, + pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize, CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), @@ -2541,9 +2544,8 @@ static void vc1_decode_i_blocks(VC1Context *v) s->mb_x = 0; init_block_index(v); for (; s->mb_x < v->end_mb_x; s->mb_x++) { - int16_t (*block)[64] = v->block[v->cur_blk_idx]; ff_update_block_index(s); - s->bdsp.clear_blocks(block[0]); + s->bdsp.clear_blocks(v->block[v->cur_blk_idx][0]); mb_pos = s->mb_x + s->mb_y * s->mb_width; s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA; s->current_picture.qscale_table[mb_pos] = v->pq; @@ -2568,11 +2570,11 @@ static void vc1_decode_i_blocks(VC1Context *v) } cbp |= val << (5 - k); - vc1_decode_i_block(v, block[k], k, val, (k < 4) ? v->codingset : v->codingset2); + vc1_decode_i_block(v, v->block[v->cur_blk_idx][block_map[k]], k, val, (k < 4) ? v->codingset : v->codingset2); if (CONFIG_GRAY && k > 3 && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; - v->vc1dsp.vc1_inv_trans_8x8(block[k]); + v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[k]]); } if (v->overlap && v->pq >= 9) { @@ -2580,13 +2582,13 @@ static void vc1_decode_i_blocks(VC1Context *v) if (v->rangeredfrm) for (k = 0; k < 6; k++) for (j = 0; j < 64; j++) - block[k][j] <<= 1; + v->block[v->cur_blk_idx][block_map[k]][j] <<= 1; vc1_put_blocks_clamped(v, 1); } else { if (v->rangeredfrm) for (k = 0; k < 6; k++) for (j = 0; j < 64; j++) - block[k][j] = (block[k][j] - 64) << 1; + v->block[v->cur_blk_idx][block_map[k]][j] = (v->block[v->cur_blk_idx][block_map[k]][j] - 64) << 1; vc1_put_blocks_clamped(v, 0); } @@ -2673,10 +2675,9 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) s->mb_x = 0; init_block_index(v); for (;s->mb_x < s->mb_width; s->mb_x++) { - int16_t (*block)[64] = v->block[v->cur_blk_idx]; mquant = v->pq; ff_update_block_index(s); - s->bdsp.clear_blocks(block[0]); + s->bdsp.clear_blocks(v->block[v->cur_blk_idx][0]); mb_pos = s->mb_x + s->mb_y * s->mb_stride; s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA; for (int i = 0; i < 4; i++) { @@ -2718,12 +2719,12 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) v->a_avail = !s->first_slice_line || (k == 2 || k == 3); v->c_avail = !!s->mb_x || (k == 1 || k == 3); - vc1_decode_i_block_adv(v, block[k], k, val, + vc1_decode_i_block_adv(v, v->block[v->cur_blk_idx][block_map[k]], k, val, (k < 4) ? v->codingset : v->codingset2, mquant); if (CONFIG_GRAY && k > 3 && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) continue; - v->vc1dsp.vc1_inv_trans_8x8(block[k]); + v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[k]]); } if (v->overlap && (v->pq >= 9 || v->condover != CONDOVER_NONE))