ref: 69a6871904aa63691e29244f7ab99161c35f36f0
parent: 20d0f2b92f8328cf1fc7128be26e86ab81092776
author: Yaowu Xu <yaowu@google.com>
date: Mon Feb 10 12:19:36 EST 2014
Fixed a bug where no valid partition is allowed Change-Id: I4d2729dc5c46db2847700256941a66b0957c105d
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1528,6 +1528,15 @@
}
}
+// Next square block size less or equal than current block size.
+static const BLOCK_SIZE next_square_size[BLOCK_SIZES] = {
+ BLOCK_4X4, BLOCK_4X4, BLOCK_4X4,
+ BLOCK_8X8, BLOCK_8X8, BLOCK_8X8,
+ BLOCK_16X16, BLOCK_16X16, BLOCK_16X16,
+ BLOCK_32X32, BLOCK_32X32, BLOCK_32X32,
+ BLOCK_64X64
+};
+
// Look at neighboring blocks and set a min and max partition size based on
// what they chose.
static void rd_auto_partition_range(VP9_COMP *cpi, const TileInfo *const tile,
@@ -1594,6 +1603,14 @@
row8x8_remaining, col8x8_remaining,
&bh, &bw);
*min_block_size = MIN(*min_block_size, *max_block_size);
+
+ // When use_square_partition_only is true, make sure at least one square
+ // partition is allowed by selecting the next smaller square size as
+ // *min_block_size.
+ if (cpi->sf.use_square_partition_only &&
+ (*max_block_size - *min_block_size) < 2) {
+ *min_block_size = next_square_size[*min_block_size];
+ }
}
static void compute_fast_motion_search_level(VP9_COMP *cpi, BLOCK_SIZE bsize) {
--
⑨