Opened 4 years ago

Closed 4 years ago

#1241 closed defect (fixed)

Deblocking and joint CbCr (8.8.3.5)

Reported by: fbossen Owned by:
Priority: minor Milestone:
Component: spec Version: VVC D10 vE
Keywords: Cc: ksuehring, bbross, XiangLi, fbossen, jvet@…

Description

In 8.8.3.5 there is a condition checking for nonzero transform coefficients:
– Otherwise, if the block edge is also a transform block edge and the sample p0 or q0 is in a transform block which contains one or more non-zero transform coefficient levels, bS[ xDi ][ yDj ] is set equal to 1.

It is unclear what happens when the joint CbCr mode is used.

We have:

tu_cb_coded_flag[ x0 ][ y0 ] equal to 1 specifies that the Cb transform block contains one or more transform coefficient levels not equal to 0. The array indices x0, y0 specify the top-left location ( x0, y0 ) of the considered transform block.
When tu_cb_coded_flag[ x0 ][ y0 ] is not present, its value is inferred to be equal to 0.

tu_cr_coded_flag[ x0 ][ y0 ] equal to 1 specifies that the Cr transform block contains one or more transform coefficient levels not equal to 0. The array indices x0, y0 specify the top-left location ( x0, y0 ) of the considered transform block.
When tu_cr_coded_flag[ x0 ][ y0 ] is not present, its value is inferred to be equal to 0.

tu_y_coded_flag[ x0 ][ y0 ] equal to 1 specifies that the luma transform block contains one or more transform coefficient levels not equal to 0. The array indices x0, y0 specify the location ( x0, y0 ) of the top-left luma sample of the considered transform block relative to the top-left luma sample of the picture.

The semantics of tu_joint_cbcr_residual_flag[ x0 ][ y0 ] are silent about "one or more transform coefficient levels not equal to 0".

My understanding is that when the joint CbCr mode is used, both corresponding Cb and Cr blocks are considered to contain "one or more transform coefficient levels not equal to 0".
The deblocking condition could be clarified to something like:

– Otherwise, if the block edge is also a transform block edge, cIdx is equal to 0, and tu_y_coded_flag[ x0 ][ y0 ] + tu_y_coded_flag[ x1 ][ y1 ] is greater than 0, bS[ xDi ][ yDj ] is set equal to 1, where ( x0, y0 ) is the luma location of the top-left sample of the luma transform block containing sample p0 and ( x1, y1 ) is the luma location of the top-left sample of the luma transform block containing sample q0.
– Otherwise, if the block edge is also a transform block edge, cIdx is equal to 1, and tu_cb_coded_flag[ x0 ][ y0 ] + tu_joint_cbcr_residual_flag[ x0 ][ y0 ] + tu_cb_coded_flag[ x1 ][ y1 ] + tu_joint_cbcr_residual_flag[ x1 ][ y1 ] is greater than 0, bS[ xDi ][ yDj ] is set equal to 1, where ( x0, y0 ) is the luma location corresponding to the top-left sample of the Cb transform block containing chroma sample p0 and ( x1, y1 ) is the luma location corresponding the top-left sample of the Cb transform block containing chroma sample q0.
– Otherwise, if the block edge is also a transform block edge, cIdx is equal to 2, and tu_cr_coded_flag[ x0 ][ y0 ] + tu_joint_cbcr_residual_flag[ x0 ][ y0 ] + tu_cr_coded_flag[ x1 ][ y1 ] + tu_joint_cbcr_residual_flag[ x1 ][ y1 ] is greater than 0, bS[ xDi ][ yDj ] is set equal to 1, where ( x0, y0 ) is the luma location corresponding to the top-left sample of the Cr transform block containing chroma sample p0 and ( x1, y1 ) is the luma location corresponding to the top-left sample of the Cr transform block containing chroma sample q0.

Change history (3)

comment:1 Changed 4 years ago by jlchen

Hi Frank,

I think your suggestion is technically reasonable. One thing needs to be confirmed is how software handle this aspect.

comment:2 Changed 4 years ago by fbossen

Hi Jianle, this is what the software does:

  if (m_aapucBS[edgeDir][rasterIdx] && (TU::getCbf(tuQ, COMPONENT_Cb) || TU::getCbf(tuP, COMPONENT_Cb) || tuQ.jointCbCr || tuP.jointCbCr))
  {
    tmpBs += BsSet(1, COMPONENT_Cb);
  }
  // V
  if (m_aapucBS[edgeDir][rasterIdx] && (TU::getCbf(tuQ, COMPONENT_Cr) || TU::getCbf(tuP, COMPONENT_Cr) || tuQ.jointCbCr || tuP.jointCbCr))
  {
    tmpBs += BsSet(1, COMPONENT_Cr);
  }

comment:3 Changed 4 years ago by jlchen

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

Thanks Frank, The text should be fixed as you suggested to match the software.

Note: See TracTickets for help on using tickets.