update_engine: use compression_factor

Use compression factor in update_engine. This change allows
update_enginge to read from dynamic_partitions_info.txt the build prop
that customizes the compression factor.

Test: th
Change-Id: I834917ddc44003b22623605f3c80d448a16b7ef3
diff --git a/payload_generator/cow_size_estimator.cc b/payload_generator/cow_size_estimator.cc
index 9ab2b87..da4f896 100644
--- a/payload_generator/cow_size_estimator.cc
+++ b/payload_generator/cow_size_estimator.cc
@@ -146,11 +146,13 @@
     std::string compression,
     const size_t partition_size,
     const bool xor_enabled,
-    uint32_t cow_version) {
+    uint32_t cow_version,
+    uint64_t compression_factor) {
   android::snapshot::CowOptions options{
       .block_size = static_cast<uint32_t>(block_size),
       .compression = std::move(compression),
-      .max_blocks = (partition_size / block_size)};
+      .max_blocks = (partition_size / block_size),
+      .compression_factor = compression_factor};
   auto cow_writer = CreateCowEstimator(cow_version, options);
   CHECK_NE(cow_writer, nullptr) << "Could not create cow estimator";
   CHECK(CowDryRun(source_fd,
diff --git a/payload_generator/cow_size_estimator.h b/payload_generator/cow_size_estimator.h
index 7cb3485..060da43 100644
--- a/payload_generator/cow_size_estimator.h
+++ b/payload_generator/cow_size_estimator.h
@@ -38,7 +38,8 @@
     std::string compression,
     const size_t partition_size,
     bool xor_enabled,
-    uint32_t cow_version);
+    uint32_t cow_version,
+    uint64_t compression_factor);
 
 // Convert InstallOps to CowOps and apply the converted cow op to |cow_writer|
 bool CowDryRun(
diff --git a/payload_generator/delta_diff_generator.cc b/payload_generator/delta_diff_generator.cc
index 0da929e..fb967fd 100644
--- a/payload_generator/delta_diff_generator.cc
+++ b/payload_generator/delta_diff_generator.cc
@@ -143,7 +143,8 @@
         config_.target.dynamic_partition_metadata->vabc_compression_param(),
         new_part_.size,
         config_.enable_vabc_xor,
-        config_.target.dynamic_partition_metadata->cow_version());
+        config_.target.dynamic_partition_metadata->cow_version(),
+        config_.target.dynamic_partition_metadata->compression_factor());
 
     // ops buffer size == 0 for v2 version of cow format
     LOG(INFO) << "Estimated COW size for partition: " << new_part_.name << " "
diff --git a/payload_generator/payload_generation_config.cc b/payload_generator/payload_generation_config.cc
index a974180..f9352cc 100644
--- a/payload_generator/payload_generation_config.cc
+++ b/payload_generator/payload_generation_config.cc
@@ -221,6 +221,16 @@
       android::base::ParseUint(cow_version, &cow_version_num);
       metadata->set_cow_version(cow_version_num);
     }
+    std::string compression_factor;
+    if (store.GetString("virtual_ab_compression_factor", &compression_factor)) {
+      LOG(INFO) << "Using VABC compression factor " << compression_factor;
+    } else {
+      LOG(INFO) << "No compression factor specified. Defaulting to 4k";
+      compression_factor = "4096";
+    }
+    size_t compression_factor_value{};
+    android::base::ParseUint(compression_factor, &compression_factor_value);
+    metadata->set_compression_factor(compression_factor_value);
   }
   dynamic_partition_metadata = std::move(metadata);
   return true;
diff --git a/update_metadata.proto b/update_metadata.proto
index 535f386..6d16da4 100644
--- a/update_metadata.proto
+++ b/update_metadata.proto
@@ -372,6 +372,10 @@
 
   // A collection of knobs to tune Virtual AB Compression
   optional VABCFeatureSet vabc_feature_set = 6;
+
+  // Max bytes to be compressed at once during ota. Options: 4k, 8k, 16k, 32k,
+  // 64k, 128k
+  optional uint64 compression_factor = 7;
 }
 
 // Definition has been duplicated from