Opened 2 years ago

Closed 2 years ago

#1559 closed defect (fixed)

Problem with inference of NoOutputOfPriorPicsFlag

Reported by: nikolai.shostak Owned by:
Priority: minor Milestone:
Component: VTM Version: VTM-17.1
Keywords: Cc: ksuehring, XiangLi, fbossen, jvet@…

Description

Version VTM-17.0

After sh_no_output_of_prior_pics_flag is parsed

READ_FLAG(uiCode, "sh_no_output_of_prior_pics_flag");   pcSlice->setNoOutputOfPriorPicsFlag(uiCode != 0);

it is soon reset like this:

    //the inference for NoOutputOfPriorPicsFlag
    if( !m_firstSliceInBitstream && m_picHeader.getNoOutputBeforeRecoveryFlag() )
    {
      m_apcSlicePilot->setNoOutputOfPriorPicsFlag(true);
    }
    else
    {
      m_apcSlicePilot->setNoOutputOfPriorPicsFlag(false);
    }

where NoOutputBeforeRecoveryFlag is set to 1 for every IDR slice.

So it doesn't matter what value was signaled for sh_no_output_of_prior_pics_flag.

This cause lost frames in Multilayer streams when dpb_max_dec_pic_buffering and dpb_max_num_reorder_pics are greater than necessary.

Consider 2 layers, both AllIntra

Layer0: LId0-POC0(IDR) LId0-POC1(IDR)
Layer1: LId1-POC0(IDR) LId1-POC1(IDR)

dpb_max_dec_pic_buffering = dpb_max_num_reorder_pics = 5 (or anything >1)

Pictures encoded in following order:

  • LId0-POC0 (IDR)
  • LId1-POC0 (IDR)
  • LId0-POC1 (IDR)
  • LId1-POC1 (IDR)

When decoder starts decoding picture LId0-POC1 it will output LId0-POC0 via xFlushOutput since LId0-POC1 is an IDR. But not LId1-POC0, since it is from different layer.

Then decoder derives NoOutputOfPriorPicsFlag = true and calls checkNoOutputPriorPics() which sets neededForOutput=false for all frames in DPB.

As a result, LId1-POC0 is never outputted.

Change history (3)

comment:2 Changed 2 years ago by nikolai.shostak

  • Version changed from VTM-16.0 to VTM-17.1

comment:3 Changed 2 years ago by ksuehring

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

Agreed. Fixed as suggested.

Note: See TracTickets for help on using tickets.