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); }