Opened 5 years ago

Closed 4 years ago

#1012 closed defect (fixed)

Mismatch on the selected neighbouring sample list in CCLM

Reported by: wangyang.cs Owned by:
Priority: minor Milestone:
Component: spec Version: VVC D8 vB
Keywords: Cc: ksuehring, bbross, XiangLi, fbossen, jvet@…, jvet@…

Description

There is a mismatch on the selected neighbouring sample list in CCLM between the current VVC text and VTM-8.0.
In JVET-Q2001-vE, the left neighbouring samples are put into the selected neighbouring sample list before the above neighbouring samples. However, the above neighbouring samples are first put into the list in VTM-8.0. And the corresponding chroma samples are put to the list according to the selected luma samples. Therefore, a mismatch could happen between text and software when some selected luma samples may have the same value but their corresponding chroma samples may have different values.

Suggest changes in JVET-Q2001-vE as follows:

8.4.5.2.13 Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode
The prediction samples predSamples[ x ][ y ] with x = 0..nTbW − 1, y = 0..nTbH − 1 are derived as follows:
...

4. When numSampL is greater than 0, the selected neighbouring left chroma samples pSelC[ idx ] are set equal to p[ −1 ][ pickPosL[ idx ] ] with idx = 0..cntL − 1, and the selected down-sampled neighbouring left luma samples pSelDsY[ idx ] with idx = 0..cntL − 1 are derived as follows:

– The variable y is set equal to pickPosL[ idx ].
– If both SubWidthC and SubHeightC are equal to 1, the following applies:

pSelDsY[ idx ] = pY[ − 1][ y ] (372)

– Otherwise the following applies:

– If sps_chroma_vertical_collocated_flag is equal to 1, the following applies:

pSelDsY[ idx ] = ( F3[ 1 ][ 0 ] * pY[ − SubWidthC ][ SubHeightC * y − 1 ] +

F3[ 0 ][ 1 ] * pY[ −1 − SubWidthC ][ SubHeightC * y ] +
F3[ 1 ][ 1 ] * pY[ −SubWidthC ][ SubHeightC * y ] + (373)
F3[ 2 ][ 1 ] * pY[ 1 − SubWidthC ][ SubHeightC * y ] +
F3[ 1 ][ 2 ] * pY[ −SubWidthC ][ SubHeightC * y + 1 ] + 4 ) >> 3] ]

– Otherwise (sps_chroma_vertical_collocated_flag is equal to 0), the following applies:

pSelDsY[ idx ] = ( F4[ 0 ][ 1 ] * pY[ −1 − SubWidthC ][ SubHeightC * y ] +

F4[ 0 ][ 2 ] * pY[ −1 − SubWidthC ][ SubHeightC * y + 1 ] +
F4[ 1 ][ 1 ] * pY[ −SubWidthC ][ SubHeightC * y ] + (374)
F4[ 1 ][ 2 ] * pY[ −SubWidthC ][ SubHeightC * y + 1] +
F4[ 2 ][ 1 ] * pY[ 1 − SubWidthC ][ SubHeightC * y ] +
F4[ 2 ][ 2 ] * pY[ 1 − SubWidthC][ SubHeightC * y + 1 ] + 4 ) >> 3] ]

54. When numSampT is greater than 0, the selected neighbouring top chroma samples pSelC[ idx ] are set equal to p[ pickPosT[ idx − cntL ] ][ -1 ] with idx = cntL0..cntL + cntT − 1, and the down-sampled neighbouring top luma samples pSelDsY[ idx ] with idx = 0..cntL + cntT − 1 are specified as follows:

– The variable x is set equal to pickPosT[ idx − cntL ].
– If both SubWidthC and SubHeightC are equal to 1, the following applies:

pSelDsY[ idx ] = pY[ x ][ − 1] (375)

– Otherwise, the following applies:

– If sps_chroma_vertical_collocated_flag is equal to 1, the following applies:

– If bCTUboundary is equal to FALSE, the following applies:

pSelDsY[ idx ] = ( F3[ 1 ][ 0 ] * pY[ SubWidthC * x ][ − 1 − SubHeightC ] +

F3[ 0 ][ 1 ] * pY[ SubWidthC * x − 1 ][ −SubHeightC ] +
F3[ 1 ][ 1 ] * pY[ SubWidthC * x ][ −SubHeightC] + (376)
F3[ 2 ][ 1 ] * pY[ SubWidthC * x + 1 ][ −SubHeightC] +
F3[ 1 ][ 2 ] * pY[ SubWidthC * x ][ 1 − SubHeightC ] + 4 ) >> 3

– Otherwise (bCTUboundary is equal to TRUE), the following applies:

pSelDsY[ idx ] = ( F2[ 0 ] * pY[ SubWidthC * x − 1 ][ −1 ] +

F2[ 1 ] * pY[ SubWidthC * x ][ −1 ] + (377)
F2[ 2 ] * pY[ SubWidthC * x + 1 ][ −1 ] + 2 ) >> 2

– Otherwise (sps_chroma_vertical_collocated_flag is equal to 0), the following applies:

– If bCTUboundary is equal to FALSE, the following applies:

pSelDsY[ idx ] = ( F4[ 0 ][ 1 ] * pY[ SubWidthC x − 1 ][ −1 ] +

F4[ 0 ][ 2 ] * pY[ SubWidthC * x − 1 ][ −2 ] +
F4[ 1 ][ 1 ] * pY[ SubWidthC * x ][ −1 ] + (378)
F4[ 1 ][ 2 ] * pY[ SubWidthC * x ][ −2] +
F4[ 2 ][ 1 ] * pY[ SubWidthC * x + 1 ][ −1 ] +
F4[ 2 ][ 2 ] * pY[ SubWidthC * x + 1 ][ −2 ] + 4 ) >> 3

– Otherwise (bCTUboundary is equal to TRUE), the following applies:

pSelDsY[ idx ] = ( F2[ 0 ] * pY[ SubWidthC * x − 1 ][ −1 ] +

F2[ 1 ] * pY[ SubWidthC * x ][ −1 ] + (379)

5. When numSampL is greater than 0, the selected neighbouring left chroma samples pSelC[ idx ] are set equal to p[ −1 ][ pickPosL[ idx - cntT] ] with idx = cntT..cntT + cntL − 1, and the selected down-sampled neighbouring left luma samples pSelDsY[ idx ] with idx = cntT..cntT + cntL − 1 are derived as follows:

– The variable y is set equal to pickPosL[ idx - cntT ].
– If both SubWidthC and SubHeightC are equal to 1, the following applies:

pSelDsY[ idx ] = pY[ − 1][ y ] (372)

– Otherwise the following applies:

– If sps_chroma_vertical_collocated_flag is equal to 1, the following applies:

pSelDsY[ idx ] = ( F3[ 1 ][ 0 ] * pY[ − SubWidthC ][ SubHeightC * y − 1 ] +

F3[ 0 ][ 1 ] * pY[ −1 − SubWidthC ][ SubHeightC * y ] +
F3[ 1 ][ 1 ] * pY[ −SubWidthC ][ SubHeightC * y ] + (373)
F3[ 2 ][ 1 ] * pY[ 1 − SubWidthC ][ SubHeightC * y ] +
F3[ 1 ][ 2 ] * pY[ −SubWidthC ][ SubHeightC * y + 1 ] + 4 ) >> 3] ]

– Otherwise (sps_chroma_vertical_collocated_flag is equal to 0), the following applies:

pSelDsY[ idx ] = ( F4[ 0 ][ 1 ] * pY[ −1 − SubWidthC ][ SubHeightC * y ] +

F4[ 0 ][ 2 ] * pY[ −1 − SubWidthC ][ SubHeightC * y + 1 ] +
F4[ 1 ][ 1 ] * pY[ −SubWidthC ][ SubHeightC * y ] + (374)
F4[ 1 ][ 2 ] * pY[ −SubWidthC ][ SubHeightC * y + 1] +
F4[ 2 ][ 1 ] * pY[ 1 − SubWidthC ][ SubHeightC * y ] +
F4[ 2 ][ 2 ] * pY[ 1 − SubWidthC][ SubHeightC * y + 1 ] + 4 ) >> 3] ]

Change history (1)

comment:1 Changed 4 years ago by bbross

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

Good catch, thanks!

This is fixed in vB of D9, ie. JVET-R2001-v11.

Note: See TracTickets for help on using tickets.