Opened 7 years ago

Closed 7 years ago

#107 closed clean up required (fixed)

Missing derivation on OlsIdxToLsIdx[]

Reported by: Tomohiro Ikai Owned by: tech
Priority: minor Component: HTM software
Version: Keywords:
Cc: tech, jct-3v@…

Description

According the verion 2 spec, the OlsIdxToLsIdx[] is derived as
"OlsIdxToLsIdx[ i ] = ( i < NumLayerSets ) ? i : ( layer_set_idx_for_ols_minus1[ i ] + 1 )".

However, in the HTM, the derivation is missing when layer_set_idx_for_ols_minus1 is not present. The inference of layer_set_idx_for_ols_minus1 is also missing ("When not present, the value of layer_set_idx_for_ols_minus1[ i ] is inferred to be equal to 0"). In the current HTM, the OlsIdxToLsIdx[] seems not affect decoding/encoding process but it should be fixed to avoid future confusion.

A patch is attached.

Attachments (1)

ticket107.patch (1.2 KB) - added by Tomohiro Ikai 7 years ago.

Download all attachments as: .zip

Change history (6)

Changed 7 years ago by Tomohiro Ikai

comment:1 Changed 7 years ago by tech

There actually seems to be no problem.

OlsIdxToLsIdx is provided by the function

Int     olsIdxToLsIdx( Int i ) const { return ( i < getNumLayerSets() ) ? i  : getLayerSetIdxForOlsMinus1( i ) + 1 ; };

in TComSlice.h, which can also be invoked for the index 0 and matches the spec.

Moreover, layer_set_idx_for_ols_minus1[ i ] is set equal to 0 in the TComVPS constructor, and thus by default equal to 0 when not present.

  for( Int i = 0; i < MAX_VPS_OP_SETS_PLUS1; i++ )
  {
    m_vpsProfilePresentFlag   [i] = false;
    m_layerSetIdxForOlsMinus1       [i] = 0;
    for( Int j = 0; j < MAX_VPS_NUH_LAYER_ID_PLUS1; j++ )
    {
      m_outputLayerFlag[i][j] = false;
    }
  }

However, I found also an earlier statement in the constructor setting m_layerSetIdxForOlsMinus1 equal to -1. Nevertheless, this has no effect and will be removed as clean up.

Please, let me know if you agree.

comment:2 Changed 7 years ago by tech

  • Type changed from defect to clean up required

comment:3 Changed 7 years ago by Tomohiro Ikai

Ok, the function olsIdxToLsIdx() and the initialization handle the cases (thanks!). In case of clean-up, SHM's fix might be good.

The following is just my note.
The case of two layers seems ok, in which the idx for OLS[1] and [2] is omitted and should be inferred to '1'. In SW, the OLS[1] was handled by i < getNumLayerSets() ('1' < '2') and OLS[2] was initialized to '1' (idx minus 1 was initialized to 0).

LS[0] = {0}
LS[1] = {0, 1}
OLS[1] = {0, 1}, output_layer_flag = {1, 1} LS[1]
OLS[2] = {0, 1}, output_layer_flag = {0, 1}
LS[1]

The case of OLS[2] is forbidden in Multiview Main profile (*1) but it is OK in 3D Main profile.
*1)– When NumLayersInIdList[ OlsIdxToLsIdx[ olsIdx ] ] is equal to 2, output_layer_flag[ olsIdx ][ j ] derived according to any active VPS shall be equal to 1 for j in the range of 0 to 1, inclusive, for subBitstream.

comment:4 Changed 7 years ago by tech

When defaultOutputLayerIdc is not equal to 2 and vps_num_layer_sets_minus1 greater than or equal to 2, the values of the output_layer_flag syntax elements are actually neither present nor inferred for OLS[ 2 ]. This makes the profile constraint somehow useless.

However, the variable OutputLayerFlag is derived. Maybe the spec should use this variable to specify the constraint instead of using the syntax element output_layer_flag.

comment:5 Changed 7 years ago by tech

  • Resolution set to fixed
  • Status changed from new to closed
Note: See TracTickets for help on using tickets.

This list contains all users that will be notified about changes made to this ticket.

These roles will be notified: Reporter, Owner, Subscriber, Participant

  • Gerhard Tech(Owner, Subscriber, Participant, Always)
  • jct-3v@…(Subscriber)
  • Karsten Suehring(Always)
  • Tomohiro Ikai(Reporter, Participant)