Arbitrary wedge: use 4x4 pixel unit.
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 5d6af0b..bac0c30 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -832,12 +832,11 @@
/*!
* Mask for this block used for compound prediction.
*/
- DECLARE_ALIGNED(16, uint8_t, seg_mask[2 * MAX_SB_SQUARE]);
+ DECLARE_ALIGNED(16, uint8_t, seg_mask[2 * MAX_SB_SQUARE >> 4]);
#if CONFIG_ARBITRARY_WEDGE
// Only used for arbitrary wedge. Derived from 'seg_mask' by extending binary
// mask range, and then smoothing to get a contiguous soft mask.
- // TODO(urvang): Does size need to be 2 times?
DECLARE_ALIGNED(16, uint8_t, seg_mask_smoothed[2 * MAX_SB_SQUARE]);
#endif // CONFIG_ARBITRARY_WEDGE
diff --git a/av1/encoder/compound_type.c b/av1/encoder/compound_type.c
index 470d377..d6448dd 100644
--- a/av1/encoder/compound_type.c
+++ b/av1/encoder/compound_type.c
@@ -320,33 +320,50 @@
"/tmp/1.source.yuv");
#endif // DUMP_SEGMENT_MASKS
+ // Create a downscaled src buffer (2X downscaling each direction).
+ DECLARE_ALIGNED(16, uint8_t, downscaled_src_buf[MAX_SB_SQUARE >> 4]);
+ const int downscaled_bh = bh >> 2;
+ const int downscaled_bw = bw >> 2;
+ const int downscaled_N = downscaled_bw * downscaled_bh;
+ av1_resize_plane(x->plane[0].src.buf, bh, bw, x->plane[0].src.stride,
+ downscaled_src_buf, downscaled_bh, downscaled_bw,
+ downscaled_bw);
+
+#if DUMP_SEGMENT_MASKS
+ av1_dump_raw_y_plane(downscaled_src_buf, downscaled_bw, downscaled_bh,
+ downscaled_bw, "/tmp/2.downscaled_source.yuv");
+#endif // DUMP_SEGMENT_MASKS
+
// Get segment mask from helper library.
Av1SegmentParams params;
av1_get_default_segment_params(¶ms);
params.k = 5000; // TODO(urvang): Temporary hack to get 2 components.
int num_components = -1;
- av1_get_segments(x->plane[0].src.buf, bw, bh, x->plane[0].src.stride, ¶ms,
- seg_mask_smoothed, &num_components);
+ av1_get_segments(downscaled_src_buf, downscaled_bw, downscaled_bh,
+ downscaled_bw, ¶ms,
+ seg_mask, &num_components);
if (num_components >= 2) {
// TODO(urvang): Convert more than 2 components to 2 components.
if (num_components == 2) {
- // Save the raw mask to 'seg_mask', as that is the one to be used for
+ // Keep the raw mask in 'seg_mask', as that is the one to be used for
// signaling in the bitstream.
- memcpy(seg_mask, seg_mask_smoothed, N * sizeof(*seg_mask));
+ // Now, upscale the raw mask into 'seg_mask_smoothed'.
+ av1_resize_plane(seg_mask, downscaled_bh, downscaled_bw,
+ downscaled_bw, seg_mask_smoothed, bh, bw, bw);
// TODO(urvang): Refactor part below.
// Convert binary mask with values {0, 1} to one with values {0, 64}.
av1_extend_binary_mask_range(seg_mask_smoothed, bw, bh);
#if DUMP_SEGMENT_MASKS
- av1_dump_raw_y_plane(seg_mask_smoothed, bw, bh, bw, "/tmp/2.binary_mask.yuv");
+ av1_dump_raw_y_plane(seg_mask_smoothed, bw, bh, bw, "/tmp/3.binary_mask.yuv");
#endif // DUMP_SEGMENT_MASKS
// Get a smooth mask from the binary mask.
av1_apply_box_blur(seg_mask_smoothed, bw, bh);
#if DUMP_SEGMENT_MASKS
- av1_dump_raw_y_plane(seg_mask_smoothed, bw, bh, bw, "/tmp/3.smooth_mask.yuv");
+ av1_dump_raw_y_plane(seg_mask_smoothed, bw, bh, bw, "/tmp/4.smooth_mask.yuv");
#endif // DUMP_SEGMENT_MASKS
// Get RDCost
@@ -1133,14 +1150,14 @@
#if CONFIG_ARBITRARY_WEDGE
if (av1_wedge_params_lookup[mbmi->sb_type].codebook == NULL) {
// We are using an arbitrary mask, so need to run RLE to compute rate.
- const int bw = block_size_wide[mbmi->sb_type];
- const int bh = block_size_high[mbmi->sb_type];
+ const int downscaled_bw = block_size_wide[mbmi->sb_type] >> 2;
+ const int downscaled_bh = block_size_high[mbmi->sb_type] >> 2;
// For input of length n, max length of run-length encoded string is
// 3*n, as storing each length takes 2 bytes.
- uint8_t rle_buf[3 * MAX_SB_SQUARE];
+ uint8_t rle_buf[3 * (MAX_SB_SQUARE >> 4)];
int rle_size = 0;
int rle_rate = INT_MAX;
- av1_run_length_encode(mbmi->interinter_comp.seg_mask, bw, bh, bw, rle_buf,
+ av1_run_length_encode(mbmi->interinter_comp.seg_mask, downscaled_bw, downscaled_bh, downscaled_bw, rle_buf,
&rle_size, &rle_rate);
return rle_rate;
}
diff --git a/av1/encoder/segment_patch.cc b/av1/encoder/segment_patch.cc
index d71750d..d3e01bb 100644
--- a/av1/encoder/segment_patch.cc
+++ b/av1/encoder/segment_patch.cc
@@ -176,9 +176,9 @@
int num_bits = 0;
const int bits_per_symbol = 1; // Assuming 2 segments exactly.
// Assuming 64x64 or 128x128 block sizes only.
- assert((width == 64 && height == 64) || (width == 128 && height == 128));
+ assert((width == 16 && height == 16) || (width == 32 && height == 32));
const int bits_per_run_len =
- (width == 128 && height == 128) ? 14 : 12; // log2(width * height)
+ (width == 32 && height == 32) ? 10 : 8; // log2(width * height)
for (int r = 0; r < height; ++r) {
for (int c = (r == 0) ? 1 : 0; c < width; ++c) {
@@ -197,7 +197,9 @@
}
}
out[out_idx++] = prev_val;
+ num_bits += bits_per_symbol;
write_run_length(run_len, out, &out_idx);
+ num_bits += bits_per_run_len;
*out_size = out_idx;
*out_rate = av1_cost_literal(num_bits);
}