private uint CalculateNumDeltaPictureOrderCounts(IList <ShortTermRefPicSet> refPicSets, uint stRpsIdx, ShortTermRefPicSet result)
        {
            uint numDeltaPocs = 0;
            int  refRpsIdx    = (int)(stRpsIdx - (result.delta_idx_minus1 + 1));

            if (refPicSets[refRpsIdx].inter_ref_pic_set_prediction_flag)
            {
                for (int i = 0; i < refPicSets[refRpsIdx].used_by_curr_pic_flag.Count; i++)
                {
                    if (refPicSets[refRpsIdx].used_by_curr_pic_flag[i] || refPicSets[refRpsIdx].use_delta_flag[i])
                    {
                        numDeltaPocs++;
                    }
                }
            }
            else
            {
                numDeltaPocs = refPicSets[refRpsIdx].num_negative_pics + refPicSets[refRpsIdx].num_positive_pics;
            }

            return(numDeltaPocs);
        }
        /// <summary>
        /// Process the short term reference picture sets.
        /// </summary>
        /// <remarks>
        /// Reference:
        ///  7.3.7 Short-term reference picture set syntax
        ///  7.4.8 Short-term reference picture set semantics
        /// </remarks>
        private ShortTermRefPicSet ProcessShortTermRefPicSets(NalUnitBitstreamNavigator nav, SequenceParameterSet sps, uint stRpsIdx)
        {
            var result = new ShortTermRefPicSet();

            if (stRpsIdx != 0)
            {
                result.inter_ref_pic_set_prediction_flag = nav.ReadBit(); //inter_ref_pic_set_prediction_flag u(1)
            }

            if (result.inter_ref_pic_set_prediction_flag)
            {
                if (stRpsIdx == sps.num_short_term_ref_pic_sets)
                {
                    result.delta_idx_minus1 = nav.ReadNonNegativeExponentialGolombAsUInt32(); //delta_idx_minus1 ue(v)
                }

                result.delta_rps_sign       = nav.ReadBit() ? (byte)1 : (byte)0;              //delta_rps_sign u(1)
                result.abs_delta_rps_minus1 = nav.ReadNonNegativeExponentialGolombAsUInt32(); //abs_delta_rps_minus1 ue(v)
                // long deltaRps = (1 - 2 * delta_rps_sign) * (abs_delta_rps_minus1 + 1);

                uint numDeltaPocs = CalculateNumDeltaPictureOrderCounts(sps.ShortTermRefPicSets, stRpsIdx, result);
                for (int j = 0; j <= numDeltaPocs; j++)
                {
                    result.used_by_curr_pic_flag.Add(nav.ReadBit()); //used_by_curr_pic_flag[ j ] u(1)
                    if (!result.used_by_curr_pic_flag[j])
                    {
                        result.use_delta_flag.Add(nav.ReadBit());    //use_delta_flag[ j ] u(1)
                    }
                }
            }
            else
            {
                result.num_negative_pics = nav.ReadNonNegativeExponentialGolombAsUInt32(); //num_negative_pics ue(v)
                result.num_positive_pics = nav.ReadNonNegativeExponentialGolombAsUInt32(); //num_positive_pics ue(v)

                if (result.num_negative_pics > sps.sps_max_dec_pic_buffering_minus1[sps.sps_max_sub_layers_minus1])
                {
                    System.Console.WriteLine("ShortTermRefPicSet.num_negative_pics > sps_max_dec_pic_buffering_minus1");
                    return(result);
                }

                if (result.num_positive_pics > sps.sps_max_dec_pic_buffering_minus1[sps.sps_max_sub_layers_minus1])
                {
                    System.Console.WriteLine("ShortTermRefPicSet.num_positive_pics > sps_max_dec_pic_buffering_minus1");
                    return(result);
                }

                for (int i = 0; i < result.num_negative_pics; i++)
                {
                    result.delta_poc_s0_minus1.Add(nav.ReadNonNegativeExponentialGolombAsUInt32()); //delta_poc_s0_minus1[ i ] ue(v)
                    result.used_by_curr_pic_s0_flag.Add(nav.ReadBit());                             //used_by_curr_pic_s0_flag[ i ] u(1)
                }

                for (int i = 0; i < result.num_positive_pics; i++)
                {
                    result.delta_poc_s1_minus1.Add(nav.ReadNonNegativeExponentialGolombAsUInt32()); //delta_poc_s1_minus1[ i ] ue(v)
                    result.used_by_curr_pic_s1_flag.Add(nav.ReadBit());                             //used_by_curr_pic_s1_flag[ i ] u(1)
                }
            }

            return(result);
        }