private static void readDecoderPicMarking(NALUnit nalUnit, SliceHeader sh, BitReader in) { if (nalUnit.type == NALUnitType.IDR_SLICE) { boolean no_output_of_prior_pics_flag = readBool(in, "SH: no_output_of_prior_pics_flag"); boolean long_term_reference_flag = readBool(in, "SH: long_term_reference_flag"); sh.refPicMarkingIDR = new RefPicMarkingIDR(no_output_of_prior_pics_flag, long_term_reference_flag); } else { boolean adaptive_ref_pic_marking_mode_flag = readBool(in, "SH: adaptive_ref_pic_marking_mode_flag"); if (adaptive_ref_pic_marking_mode_flag) { ArrayList<Instruction> mmops = new ArrayList<Instruction>(); int memory_management_control_operation; do { memory_management_control_operation = readUE(in, "SH: memory_management_control_operation"); Instruction instr = null; switch (memory_management_control_operation) { case 1: instr = new RefPicMarking.Instruction( InstrType.REMOVE_SHORT, readUE(in, "SH: difference_of_pic_nums_minus1") + 1, 0); break; case 2: instr = new RefPicMarking.Instruction( InstrType.REMOVE_LONG, readUE(in, "SH: long_term_pic_num"), 0); break; case 3: instr = new RefPicMarking.Instruction( InstrType.CONVERT_INTO_LONG, readUE(in, "SH: difference_of_pic_nums_minus1") + 1, readUE(in, "SH: long_term_frame_idx")); break; case 4: instr = new RefPicMarking.Instruction( InstrType.TRUNK_LONG, readUE(in, "SH: max_long_term_frame_idx_plus1") - 1, 0); break; case 5: instr = new RefPicMarking.Instruction(InstrType.CLEAR, 0, 0); break; case 6: instr = new RefPicMarking.Instruction( InstrType.MARK_LONG, readUE(in, "SH: long_term_frame_idx"), 0); break; } if (instr != null) mmops.add(instr); } while (memory_management_control_operation != 0); sh.refPicMarkingNonIDR = new RefPicMarking(mmops.toArray(new Instruction[] {})); } } }