Opened 3 years ago

Closed 2 years ago

#79 closed defect (invalid)

Mismatch between spec. and BMS/VTM 2.0 for MPM derivation

Reported by: merkle Owned by:
Priority: minor Milestone:
Component: BMS Version: BMS-2.0.1
Keywords: Cc: ksuehring, bbross, XiangLi, fbossen, jvet@…

Description

In section 8.2.2 equations (8-5) and (8-6) differ from the implementation in BMS/VTM 2.0:

Equation (8-5) uses +61 and %64 while VTM 2.0 uses +62 and %65
Equation (8-6) usues %64 while VTM 2.0 uses %65

Change history (4)

comment:1 Changed 3 years ago by bbross

  • Component changed from spec to BMS
  • Version changed from VVC D2 v4 to BMS-2.0.1

Comment by Shan from email discussion:

In last (July) meeting we decided to adopt HEVC style 3MPM intra mode coding with 67 total intra modes (65 directional + DC + Planar).

In HEVC (33 directional modes + DC + Planar) we have:

– Otherwise, candModeList[ x ] with x = 0..2 is derived as follows:

candModeList[ 0 ] = candIntraPredModeA
candModeList[ 1 ] = 2 + ( ( candIntraPredModeA + 29 ) % 32 )
candModeList[ 2 ] = 2 + ( ( candIntraPredModeA − 2 + 1 ) % 32 )

For example, if candModeList[ 0 ] = 2, then candModeList[ 1 ] = 33 (opposite direction of 2 minus 1) and candModeList[ 2 ] = 3 (i.e. 2 plus 1)

In the VVC (65 directional modes + DC + Planar) draft text, we have:

– Otherwise, candModeList[ x ] with x = 0..2 is derived as follows:

candModeList[ 0 ] = candIntraPredModeA
candModeList[ 1 ] = 2 + ( ( candIntraPredModeA + 61 ) % 64 )
candModeList[ 2 ] = 2 + ( ( candIntraPredModeA − 1 ) % 64 )

For example, if candModeList[ 0 ] = 2, then candModeList[ 1 ] = 65 (opposite direction of 2 minus 1) and candModeList[ 2 ] = 3 (i.e. 2 plus 1)
This is aligned with HEVC style 3MPM intra mode coding.

If using VTM2.0 approach, i.e. +62 and %65, then if candModeList[ 0 ] = 2, candModeList[ 1 ] would be equal to 66, which is the opposite direction of 2. This is slightly different to HEVC solution. Hence, I think the text is correct.

Best regards,
Shan

comment:2 Changed 3 years ago by andrew.dorrell

I believe the BMS code is correct by virtue of the following (from PU::getIntraMPMs):

mpm[0] = leftIntraDir;
mpm[1] = ((leftIntraDir + offset) % mod) + 2;
mpm[2] = ((leftIntraDir - 1) % mod) + 2;

This code is intended to generate the MPM list as the angular mode and its immediate neighbours. By my calculations it does this if the BMS values are used (offset=62, mod=65)… and to demonstrate that:

[dorrell@lavi]~/tmp% cat > modtest.cpp
#include <stdio.h>

int main(int argc, char *argv[])
{

int values[] = {65, 66, 2, 3};

for(int i=0; i<4; i++)
{

const int offset = 62;
const int mod = 65;
int n = values[i];
printf("%d, %d, %d\n", n, ((n + offset) % mod) + 2, ((n - 1) % mod) + 2);

}
return(0);

}

[dorrell@lavi]~/tmp% make modtest
g++ modtest.cpp -o modtest
[dorrell@lavi]~/tmp% ./modtest
65, 64, 66
66, 65, 2
2, 66, 3
3, 2, 4

comment:3 Changed 3 years ago by xinzhao

This has been clarified by the editor one month before, and I believe the current BMS-2.1 SW and Spec text are already aligned.

Previous clarification email sent by editor is quoted below:

_

Comment by Shan from email discussion:

In last (July) meeting we decided to adopt HEVC style 3MPM intra mode
coding with 67 total intra modes (65 directional + DC + Planar).

In HEVC (33 directional modes + DC + Planar) we have:

– Otherwise, candModeList[ x ] with x = 0..2 is derived as follows:

candModeList[ 0 ] = candIntraPredModeA
candModeList[ 1 ] = 2 + ( ( candIntraPredModeA + 29 ) % 32 )
candModeList[ 2 ] = 2 + ( ( candIntraPredModeA − 2 + 1 ) % 32 )

For example, if candModeList[ 0 ] = 2, then candModeList[ 1 ] = 33
(opposite direction of 2 minus 1) and candModeList[ 2 ] = 3 (i.e. 2 plus
1)

In the VVC (65 directional modes + DC + Planar) draft text, we have:

– Otherwise, candModeList[ x ] with x = 0..2 is derived as follows:

candModeList[ 0 ] = candIntraPredModeA
candModeList[ 1 ] = 2 + ( ( candIntraPredModeA + 61 ) % 64 )
candModeList[ 2 ] = 2 + ( ( candIntraPredModeA − 1 ) % 64 )

For example, if candModeList[ 0 ] = 2, then candModeList[ 1 ] = 65
(opposite direction of 2 minus 1) and candModeList[ 2 ] = 3 (i.e. 2 plus
1)
This is aligned with HEVC style 3MPM intra mode coding.

If using VTM2.0 approach, i.e. +62 and %65, then if candModeList[ 0 ] = 2,
candModeList[ 1 ] would be equal to 66, which is the opposite direction of

  1. This is slightly different to HEVC solution. Hence, I think the text is correct.

Best regards,
Shan

comment:4 Changed 2 years ago by ksuehring

  • Resolution set to invalid
  • Status changed from new to closed

There seems to be consent that there is no open issue. We also got 6MPM in VTM 3 now, so that we don't need any more action here.

Note: See TracTickets for help on using tickets.