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[] {}));
      }
    }
  }