From patchwork Tue Nov 10 10:48:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 23559 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 8465844A917 for ; Tue, 10 Nov 2020 13:09:23 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4C4A468BF92; Tue, 10 Nov 2020 12:50:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4856268BF4E for ; Tue, 10 Nov 2020 12:50:43 +0200 (EET) Received: by mail-wm1-f66.google.com with SMTP id p22so2524870wmg.3 for ; Tue, 10 Nov 2020 02:50:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=Xr50HeACmWq+BEtFFh9gcrop5+AXSwsTS6iOQsVosRI=; b=ocu8uB5k4LE1i8r9LhQp0X4IypP6RsJ98XiCVJkkgjonjLFBP/Ohls/1dcwtTP3WL6 WBNknOjIQiDzz5oQjLsgj+RkAu+Zwg6gtn/tzGsjtyNLR8OIPmKYeQsFG4snBzEnWxEl iX4rRfJumig02p+DXJ7FwdM96q/8+immy4OCPftlKqiv6PEHDDfnx36EjqwsP0lm283Y UCXpnrg8C4L26PpociioLvLjxPj2GGvf6mTAnmRqxGDoLWbsCHW+CY/GlQcYKDjMjxlu VGUYMky+Z3XOL9wZCDAIQLQjmSQaBxqCAv6ZK7DGDh3oEbJbjMgpVwNWcI7w2BRPWnf3 QpOg== 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:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=Xr50HeACmWq+BEtFFh9gcrop5+AXSwsTS6iOQsVosRI=; b=SLAFOsqGygvGhDi5lmzNWBij13iGjQEJM92FFi7ke5ZwRn8fVV9KIifEek61lVjAev ILIfBnnU6vLG8T56hFS48Cb3YjlT6nejNhUIyJNtlRiUKthU/8ldxCNKiOFL5tU2YDGQ TEm5aKZ4Bk/yqy9Gp2g7QQFEkaMs1R2rIL3sQZWFyBHBuS81w1b0LoGqMquMEMDU5ceq fZq9cnS7k9QxPiVouisGsSeWpAwc3fziQhn5w9reeK0hWB++TXay3j0hKfs/uawB9IcS 4FbQMk/5qJfG7OFqvml6xMu61vMldV5qcNd7xCgX50b2BIufR5mr1ICQrkX+g14WN48f ffJQ== X-Gm-Message-State: AOAM532l3T+QApvhk1FC//J8R0nQkALxtOmV/bqJMvxb9iNKjQIlGAhn Y3mMvU0YFHTl971BhNlK9Le/wKBUa7E= X-Google-Smtp-Source: ABdhPJzYBuU6dWsvdwrfNcGdDhm9y4EQV8QBYHYTGhJY2/rWJGNmu/ZbWPGlMDvth8el+jcidpr+0Q== X-Received: by 2002:a7b:c841:: with SMTP id c1mr4006798wml.31.1605005441949; Tue, 10 Nov 2020 02:50:41 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id l24sm2572543wmi.7.2020.11.10.02.50.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Nov 2020 02:50:41 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 10 Nov 2020 11:48:21 +0100 Message-Id: <20201110104851.321029-85-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201110104851.321029-1-andreas.rheinhardt@gmail.com> References: <20201110104851.321029-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 084/114] avcodec/vc1: Use symbols table to parse macroblock mode 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Expressions like array[get_vlc2()] can be optimized by using a symbols table if the array is always the same for a given VLC. This requirement is fulfilled for the VLCs used to parse the macroblock mode (MBMODE) element for frame P and B pictures. MBMODE consists of four pieces of information which can easily be encoded on one byte. Doing so not only avoids a dereference, but also some space as the table containing this information becomes redundant; furthermore, some of the VLCs used were initialized with code tables of type uint16_t which are now replaced by symbol tables of type uint8_t (thanks to ff_init_vlc_from_lengths()), thereby saving space. Signed-off-by: Andreas Rheinhardt --- libavcodec/vc1.c | 14 ++-- libavcodec/vc1_block.c | 41 +++++----- libavcodec/vc1data.c | 177 +++++++++++++++++++++++++++-------------- libavcodec/vc1data.h | 18 +++-- 4 files changed, 155 insertions(+), 95 deletions(-) diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 8c8d701ef8..9eb02f88b3 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -1439,15 +1439,17 @@ av_cold int ff_vc1_init_common(VC1Context *v) /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */ ff_vc1_intfr_4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 37]]; ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37]; - init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15, - ff_vc1_intfr_4mv_mbmode_bits[i], 1, 1, - ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); + ff_init_vlc_from_lengths(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15, + &ff_vc1_intfr_4mv_mbmode_tabs[i][0][1], 2, + &ff_vc1_intfr_4mv_mbmode_tabs[i][0][0], 2, 1, + 0, INIT_VLC_USE_NEW_STATIC); /* initialize NON-4MV MBMODE VLC tables for the same */ ff_vc1_intfr_non4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 38]]; ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38]; - init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9, - ff_vc1_intfr_non4mv_mbmode_bits[i], 1, 1, - ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); + ff_init_vlc_from_lengths(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9, + &ff_vc1_intfr_non4mv_mbmode_tabs[i][0][1], 2, + &ff_vc1_intfr_non4mv_mbmode_tabs[i][0][0], 2, 1, + 0, INIT_VLC_USE_NEW_STATIC); /* initialize interlaced MVDATA tables (1-Ref) */ ff_vc1_1ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 39]]; ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39]; diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index 6820ffb0d7..18637e75d8 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -1518,7 +1518,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) int dst_idx, off; int skipped, fourmv = 0, twomv = 0; int block_cbp = 0, pat, block_tt = 0; - int idx_mbmode = 0, mvbp; + int mvbp; int fieldtx; mquant = v->pq; /* Lossy initialization */ @@ -1528,11 +1528,11 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) else skipped = v->s.mbskip_table[mb_pos]; if (!skipped) { - if (v->fourmvswitch) - idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done - else - idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line - switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) { + int bits = v->fourmvswitch ? VC1_INTFR_4MV_MBMODE_VLC_BITS : + VC1_INTFR_NON4MV_MBMODE_VLC_BITS; + int mbmode = get_vlc2(gb, v->mbmode_vlc->table, bits, 2); + + switch (mbmode & 0x1F) { /* store the motion vector type in a flag (useful later) */ case MV_PMODE_INTFR_4MV: fourmv = 1; @@ -1562,7 +1562,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) v->blk_mv_type[s->block_index[3]] = 0; break; } - if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB + if ((mbmode & 0x1F) == MV_PMODE_INTFR_INTRA) { // intra MB for (i = 0; i < 4; i++) { s->current_picture.motion_val[1][s->block_index[i]][0] = 0; s->current_picture.motion_val[1][s->block_index[i]][1] = 0; @@ -1605,21 +1605,21 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) } } else { // inter MB - mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3]; + mb_has_coeffs = !!(mbmode & RESIDUAL); if (mb_has_coeffs) cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); - if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) { + if ((mbmode & 0x1F) == MV_PMODE_INTFR_2MV_FIELD) { v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1); } else { - if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV) - || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) { + if (((mbmode & 0x1F) == MV_PMODE_INTFR_4MV) || + ((mbmode & 0x1F) == MV_PMODE_INTFR_4MV_FIELD)) { v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1); } } s->mb_intra = v->is_intra[s->mb_x] = 0; for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0; - fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1]; + fieldtx = v->fieldtx_plane[mb_pos] = !!(mbmode & FIELDTX); /* for all motion vector read MVDATA and motion compensate each block */ dst_idx = 0; if (fourmv) { @@ -1650,7 +1650,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) ff_vc1_mc_4mv_luma(v, 3, 0, 0); ff_vc1_mc_4mv_chroma4(v, 0, 0, 0); } else { - mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2]; + mvbp = !!(mbmode & MVDIFF); dmv_x = dmv_y = 0; if (mvbp) { get_mvdata_interlaced(v, &dmv_x, &dmv_y, NULL); @@ -2175,7 +2175,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) int dst_idx, off; int skipped, direct, twomv = 0; int block_cbp = 0, pat, block_tt = 0; - int idx_mbmode = 0, mvbp; + int mbmode = MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, mvbp; int stride_y, fieldtx; int bmvtype = BMV_TYPE_BACKWARD; int dir, dir2; @@ -2188,8 +2188,9 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) skipped = v->s.mbskip_table[mb_pos]; if (!skipped) { - idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); - if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) { + mbmode = get_vlc2(gb, v->mbmode_vlc->table, + VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); + if ((mbmode & 0x1F) == MV_PMODE_INTFR_2MV_FIELD) { twomv = 1; v->blk_mv_type[s->block_index[0]] = 1; v->blk_mv_type[s->block_index[1]] = 1; @@ -2203,7 +2204,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) } } - if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB + if ((mbmode & 0x1F) == MV_PMODE_INTFR_INTRA) { // intra MB for (i = 0; i < 4; i++) { s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = 0; s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = 0; @@ -2309,7 +2310,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) } if (!skipped) { // inter MB - mb_has_coeffs = ff_vc1_mbmode_intfrp[0][idx_mbmode][3]; + mb_has_coeffs = !!(mbmode & RESIDUAL); if (mb_has_coeffs) cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2); if (!direct) { @@ -2322,7 +2323,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0; - fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[0][idx_mbmode][1]; + fieldtx = v->fieldtx_plane[mb_pos] = !!(mbmode & FIELDTX); /* for all motion vector read MVDATA and motion compensate each block */ dst_idx = 0; if (direct) { @@ -2404,7 +2405,7 @@ static int vc1_decode_b_mb_intfr(VC1Context *v) } else { dir = bmvtype == BMV_TYPE_BACKWARD; - mvbp = ff_vc1_mbmode_intfrp[0][idx_mbmode][2]; + mvbp = !!(mbmode & MVDIFF); dmv_x = dmv_y = 0; if (mvbp) get_mvdata_interlaced(v, &dmv_x, &dmv_y, NULL); diff --git a/libavcodec/vc1data.c b/libavcodec/vc1data.c index 701d285561..30d8585723 100644 --- a/libavcodec/vc1data.c +++ b/libavcodec/vc1data.c @@ -42,41 +42,6 @@ const uint8_t ff_vc1_mv_pmode_table2[2][4] = { { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN } }; -/* MBMODE table for interlaced frame P-picture */ -const uint8_t ff_vc1_mbmode_intfrp[2][15][4] = { - { /* 1: 4-MV, 0: non-4-MV */ - /* Type, FIELDTX, 1-MV Differential present, Residuals (CBP) present */ - /* Table 164 - Table 167 */ - { MV_PMODE_INTFR_1MV , 0, 1, 1 }, - { MV_PMODE_INTFR_1MV , 1, 1, 1 }, - { MV_PMODE_INTFR_1MV , 0, 1, 0 }, - { MV_PMODE_INTFR_1MV , 0, 0, 1 }, - { MV_PMODE_INTFR_1MV , 1, 0, 1 }, - { MV_PMODE_INTFR_2MV_FIELD, 0, 0, 1 }, - { MV_PMODE_INTFR_2MV_FIELD, 1, 0, 1 }, - { MV_PMODE_INTFR_2MV_FIELD, 1, 0, 0 }, - { MV_PMODE_INTFR_INTRA , 0, 0, 0 } - }, - { - /* Table 160 - Table 163 */ - { MV_PMODE_INTFR_1MV , 0, 1, 1 }, - { MV_PMODE_INTFR_1MV , 1, 1, 1 }, - { MV_PMODE_INTFR_1MV , 0, 1, 0 }, - { MV_PMODE_INTFR_1MV , 0, 0, 1 }, - { MV_PMODE_INTFR_1MV , 1, 0, 1 }, - { MV_PMODE_INTFR_2MV_FIELD, 0, 0, 1 }, - { MV_PMODE_INTFR_2MV_FIELD, 1, 0, 1 }, - { MV_PMODE_INTFR_2MV_FIELD, 1, 0, 0 }, - { MV_PMODE_INTFR_4MV , 0, 0, 1 }, - { MV_PMODE_INTFR_4MV , 1, 0, 1 }, - { MV_PMODE_INTFR_4MV , 0, 0, 0 }, - { MV_PMODE_INTFR_4MV_FIELD, 0, 0, 1 }, - { MV_PMODE_INTFR_4MV_FIELD, 1, 0, 1 }, - { MV_PMODE_INTFR_4MV_FIELD, 1, 0, 0 }, - { MV_PMODE_INTFR_INTRA , 0, 0, 0 } - } -}; - const int ff_vc1_fps_nr[7] = { 24, 25, 30, 50, 60, 48, 72 }, ff_vc1_fps_dr[2] = { 1000, 1001 }; const uint8_t ff_vc1_pquant_table[3][32] = { @@ -256,34 +221,124 @@ const uint8_t ff_vc1_2mv_block_pattern_bits[4][4] = { { 2, 2, 2, 2 }, { 1, 2, 3, 3 }, { 3, 2, 3, 1 }, { 1, 3, 3, 2 } }; -/* Interlaced frame picture 4MV MBMODE VLC tables (p. 246, p. 360) */ -const uint16_t ff_vc1_intfr_4mv_mbmode_codes[4][15] = { - { 22, 17, 0, 47, 32, 10, 1, 3, 67, 133, 132, 92, 19, 93, 18 }, - { 3, 45, 0, 7, 23, 6, 1, 2, 10, 39, 44, 8, 18, 77, 76 }, - { 15, 6, 28, 9, 41, 6, 2, 15, 14, 8, 40, 29, 0, 21, 11 }, - { 7, 198, 1, 2, 193, 13, 25, 0, 97, 1599, 98, 398, 798, 192, 1598 } -}; - -const uint8_t ff_vc1_intfr_4mv_mbmode_bits[4][15] = { - { 5, 5, 2, 6, 6, 4, 2, 2, 7, 8, 8, 7, 5, 7, 5 }, - { 3, 6, 3, 3, 5, 3, 3, 3, 4, 6, 6, 4, 5, 7, 7 }, - { 4, 3, 5, 5, 7, 4, 2, 5, 5, 5, 7, 5, 2, 6, 5 }, - { 4, 9, 1, 3, 9, 5, 6, 2, 8, 12, 8, 10, 11, 9, 12 } -}; - -/* Interlaced frame picture NON-4MV MBMODE VLC tables (p. 363) */ -const uint8_t ff_vc1_intfr_non4mv_mbmode_codes[4][9] = { - { 9, 22, 0, 17, 16, 10, 1, 3, 23 }, - { 7, 0, 5, 2, 1, 1, 6, 3, 4 }, - { 1, 0, 10, 23, 44, 8, 3, 9, 45 }, - { 7, 97, 1, 2, 49, 13, 25, 0, 96 } +/* Interlaced frame picture 4MV MBMODE VLC tables (tables 160-163) */ +const uint8_t ff_vc1_intfr_4mv_mbmode_tabs[4][15][2] = { + { + { MV_PMODE_INTFR_1MV | MVDIFF, 2 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX | RESIDUAL, 2 }, + { MV_PMODE_INTFR_1MV | FIELDTX | RESIDUAL, 6 }, + { MV_PMODE_INTFR_4MV, 8 }, + { MV_PMODE_INTFR_4MV | FIELDTX | RESIDUAL, 8 }, + { MV_PMODE_INTFR_4MV | RESIDUAL, 7 }, + { MV_PMODE_INTFR_1MV | FIELDTX | MVDIFF | RESIDUAL, 5 }, + { MV_PMODE_INTFR_INTRA, 5 }, + { MV_PMODE_INTFR_4MV_FIELD | FIELDTX | RESIDUAL, 5 }, + { MV_PMODE_INTFR_2MV_FIELD | RESIDUAL, 4 }, + { MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, 5 }, + { MV_PMODE_INTFR_4MV_FIELD | RESIDUAL, 7 }, + { MV_PMODE_INTFR_4MV_FIELD | FIELDTX, 7 }, + { MV_PMODE_INTFR_1MV | RESIDUAL, 6 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX, 2 }, + }, + { + { MV_PMODE_INTFR_1MV | MVDIFF, 3 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX | RESIDUAL, 3 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX, 3 }, + { MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, 3 }, + { MV_PMODE_INTFR_4MV_FIELD | RESIDUAL, 4 }, + { MV_PMODE_INTFR_4MV_FIELD | FIELDTX | RESIDUAL, 5 }, + { MV_PMODE_INTFR_INTRA, 7 }, + { MV_PMODE_INTFR_4MV_FIELD | FIELDTX, 7 }, + { MV_PMODE_INTFR_4MV | FIELDTX | RESIDUAL, 6 }, + { MV_PMODE_INTFR_4MV | RESIDUAL, 4 }, + { MV_PMODE_INTFR_4MV, 6 }, + { MV_PMODE_INTFR_1MV | FIELDTX | MVDIFF | RESIDUAL, 6 }, + { MV_PMODE_INTFR_1MV | FIELDTX | RESIDUAL, 5 }, + { MV_PMODE_INTFR_2MV_FIELD | RESIDUAL, 3 }, + { MV_PMODE_INTFR_1MV | RESIDUAL, 3 }, + }, + { + { MV_PMODE_INTFR_4MV_FIELD | FIELDTX | RESIDUAL, 2 }, + { MV_PMODE_INTFR_4MV | FIELDTX | RESIDUAL, 5 }, + { MV_PMODE_INTFR_1MV | RESIDUAL, 5 }, + { MV_PMODE_INTFR_4MV, 7 }, + { MV_PMODE_INTFR_1MV | FIELDTX | RESIDUAL, 7 }, + { MV_PMODE_INTFR_4MV_FIELD | FIELDTX, 6 }, + { MV_PMODE_INTFR_INTRA, 5 }, + { MV_PMODE_INTFR_2MV_FIELD | RESIDUAL, 4 }, + { MV_PMODE_INTFR_4MV | RESIDUAL, 5 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX, 5 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX | RESIDUAL, 2 }, + { MV_PMODE_INTFR_1MV | FIELDTX | MVDIFF | RESIDUAL, 3 }, + { MV_PMODE_INTFR_1MV | MVDIFF, 5 }, + { MV_PMODE_INTFR_4MV_FIELD | RESIDUAL, 5 }, + { MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, 4 }, + }, + { + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX, 2 }, + { MV_PMODE_INTFR_1MV | RESIDUAL, 3 }, + { MV_PMODE_INTFR_4MV_FIELD | FIELDTX, 9 }, + { MV_PMODE_INTFR_1MV | FIELDTX | RESIDUAL, 9 }, + { MV_PMODE_INTFR_4MV | RESIDUAL, 8 }, + { MV_PMODE_INTFR_4MV, 8 }, + { MV_PMODE_INTFR_1MV | FIELDTX | MVDIFF | RESIDUAL, 9 }, + { MV_PMODE_INTFR_4MV_FIELD | RESIDUAL, 10 }, + { MV_PMODE_INTFR_4MV_FIELD | FIELDTX | RESIDUAL, 11 }, + { MV_PMODE_INTFR_INTRA, 12 }, + { MV_PMODE_INTFR_4MV | FIELDTX | RESIDUAL, 12 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX | RESIDUAL, 6 }, + { MV_PMODE_INTFR_2MV_FIELD | RESIDUAL, 5 }, + { MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, 4 }, + { MV_PMODE_INTFR_1MV | MVDIFF, 1 }, + }, }; -const uint8_t ff_vc1_intfr_non4mv_mbmode_bits[4][9] = { - { 4, 5, 2, 5, 5, 4, 2, 2, 5 }, - { 3, 4, 6, 2, 3, 2, 3, 5, 6 }, - { 2, 2, 4, 5, 6, 4, 2, 4, 6 }, - { 4, 8, 1, 3, 7, 5, 6, 2, 8 } +/* Interlaced frame picture NON-4MV MBMODE VLC tables (tables 164-167) */ +const uint8_t ff_vc1_intfr_non4mv_mbmode_tabs[4][9][2] = { + { + { MV_PMODE_INTFR_1MV | MVDIFF, 2 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX | RESIDUAL, 2 }, + { MV_PMODE_INTFR_1MV | FIELDTX | RESIDUAL, 5 }, + { MV_PMODE_INTFR_1MV | RESIDUAL, 5 }, + { MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, 4 }, + { MV_PMODE_INTFR_2MV_FIELD | RESIDUAL, 4 }, + { MV_PMODE_INTFR_1MV | FIELDTX | MVDIFF | RESIDUAL, 5 }, + { MV_PMODE_INTFR_INTRA, 5 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX, 2 }, + }, + { + { MV_PMODE_INTFR_1MV | FIELDTX | MVDIFF | RESIDUAL, 4 }, + { MV_PMODE_INTFR_INTRA, 6 }, + { MV_PMODE_INTFR_1MV | MVDIFF, 6 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX, 5 }, + { MV_PMODE_INTFR_1MV | FIELDTX | RESIDUAL, 3 }, + { MV_PMODE_INTFR_2MV_FIELD | RESIDUAL, 2 }, + { MV_PMODE_INTFR_1MV | RESIDUAL, 2 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX | RESIDUAL, 3 }, + { MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, 3 }, + }, + { + { MV_PMODE_INTFR_1MV | FIELDTX | MVDIFF | RESIDUAL, 2 }, + { MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, 2 }, + { MV_PMODE_INTFR_2MV_FIELD | RESIDUAL, 4 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX, 4 }, + { MV_PMODE_INTFR_1MV | MVDIFF, 4 }, + { MV_PMODE_INTFR_1MV | FIELDTX | RESIDUAL, 6 }, + { MV_PMODE_INTFR_INTRA, 6 }, + { MV_PMODE_INTFR_1MV | RESIDUAL, 5 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX | RESIDUAL, 2 }, + }, + { + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX, 2 }, + { MV_PMODE_INTFR_1MV | RESIDUAL, 3 }, + { MV_PMODE_INTFR_INTRA, 8 }, + { MV_PMODE_INTFR_1MV | FIELDTX | MVDIFF | RESIDUAL, 8 }, + { MV_PMODE_INTFR_1MV | FIELDTX | RESIDUAL, 7 }, + { MV_PMODE_INTFR_2MV_FIELD | FIELDTX | RESIDUAL, 6 }, + { MV_PMODE_INTFR_2MV_FIELD | RESIDUAL, 5 }, + { MV_PMODE_INTFR_1MV | MVDIFF | RESIDUAL, 4 }, + { MV_PMODE_INTFR_1MV | MVDIFF, 1 }, + }, }; /* Interlaced field picture MBMODE VLC tables (p. 356 - 11.4.1, 11.4.2) */ diff --git a/libavcodec/vc1data.h b/libavcodec/vc1data.h index 5a071eb972..935ff4f44d 100644 --- a/libavcodec/vc1data.h +++ b/libavcodec/vc1data.h @@ -43,9 +43,6 @@ extern const uint8_t ff_vc1_mv_pmode_table2[2][4]; extern const int ff_vc1_fps_nr[7], ff_vc1_fps_dr[2]; extern const uint8_t ff_vc1_pquant_table[3][32]; -/* MBMODE table for interlaced frame P-picture */ -extern const uint8_t ff_vc1_mbmode_intfrp[2][15][4]; - /** @name VC-1 VLC tables and defines * @todo TODO move this into the context */ @@ -154,11 +151,16 @@ extern const uint8_t ff_vc1_subblkpat_tabs[3][15][2]; /* MV differential tables, p265 */ extern const uint8_t ff_vc1_mv_diff_tabs[4][73][2]; -/* Interlaced frame picture MBMODE VLC tables (p. 246, p. 360) */ -extern const uint16_t ff_vc1_intfr_4mv_mbmode_codes[4][15]; -extern const uint8_t ff_vc1_intfr_4mv_mbmode_bits[4][15]; -extern const uint8_t ff_vc1_intfr_non4mv_mbmode_codes[4][9]; -extern const uint8_t ff_vc1_intfr_non4mv_mbmode_bits[4][9]; +/* Interlaced frame picture MBMODE VLC tables (tables 160-167) + * The lowest five bits of the symbol contain the MBMODE, + * the next three bits the following properties: */ +enum MBModeProperties { + FIELDTX = 1 << 5, + MVDIFF = 1 << 6, + RESIDUAL = 1 << 7, +}; +extern const uint8_t ff_vc1_intfr_4mv_mbmode_tabs[4][15][2]; +extern const uint8_t ff_vc1_intfr_non4mv_mbmode_tabs[4][9][2]; /* Interlaced field picture MBMODE VLC tables (p. 356 - 11.4.1, 11.4.2) */ extern const uint8_t ff_vc1_if_mmv_mbmode_codes[8][8];