2015-08-06 05:00:31 +03:00
|
|
|
/*
|
2016-09-02 22:04:54 +03:00
|
|
|
* Copyright (c) 2016, Alliance for Open Media. All rights reserved
|
2015-08-06 05:00:31 +03:00
|
|
|
*
|
2016-09-02 22:04:54 +03:00
|
|
|
* This source code is subject to the terms of the BSD 2 Clause License and
|
|
|
|
* the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
|
|
|
|
* was not distributed with this source code in the LICENSE file, you can
|
|
|
|
* obtain it at www.aomedia.org/license/software. If the Alliance for Open
|
|
|
|
* Media Patent License 1.0 was not distributed with this source code in the
|
|
|
|
* PATENTS file, you can obtain it at www.aomedia.org/license/patent.
|
2015-08-06 05:00:31 +03:00
|
|
|
*/
|
|
|
|
|
2016-08-23 02:08:15 +03:00
|
|
|
#include "av1/common/tile_common.h"
|
|
|
|
#include "av1/common/onyxc_int.h"
|
2016-08-31 00:01:10 +03:00
|
|
|
#include "aom_dsp/aom_dsp_common.h"
|
2015-08-06 05:00:31 +03:00
|
|
|
|
2016-08-31 00:01:10 +03:00
|
|
|
void av1_tile_set_row(TileInfo *tile, const AV1_COMMON *cm, int row) {
|
2016-03-11 20:42:49 +03:00
|
|
|
tile->mi_row_start = row * cm->tile_height;
|
2016-08-31 00:01:10 +03:00
|
|
|
tile->mi_row_end = AOMMIN(tile->mi_row_start + cm->tile_height, cm->mi_rows);
|
2015-08-06 05:00:31 +03:00
|
|
|
}
|
|
|
|
|
2016-08-31 00:01:10 +03:00
|
|
|
void av1_tile_set_col(TileInfo *tile, const AV1_COMMON *cm, int col) {
|
2016-03-11 20:42:49 +03:00
|
|
|
tile->mi_col_start = col * cm->tile_width;
|
2016-08-31 00:01:10 +03:00
|
|
|
tile->mi_col_end = AOMMIN(tile->mi_col_start + cm->tile_width, cm->mi_cols);
|
2015-08-06 05:00:31 +03:00
|
|
|
}
|
|
|
|
|
2017-02-09 09:37:47 +03:00
|
|
|
#if CONFIG_DEPENDENT_HORZTILES && CONFIG_TILE_GROUPS
|
|
|
|
void av1_tile_set_tg_boundary(TileInfo *tile, const AV1_COMMON *const cm,
|
|
|
|
int row, int col) {
|
|
|
|
if (row < cm->tile_rows - 1) {
|
|
|
|
tile->tg_horz_boundary =
|
|
|
|
col >= cm->tile_group_start_col[row][col]
|
|
|
|
? (row == cm->tile_group_start_row[row][col] ? 1 : 0)
|
|
|
|
: (row == cm->tile_group_start_row[row + 1][col] ? 1 : 0);
|
|
|
|
} else {
|
|
|
|
assert(col >= cm->tile_group_start_col[row][col]);
|
|
|
|
tile->tg_horz_boundary =
|
|
|
|
(row == cm->tile_group_start_row[row][col] ? 1 : 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
2016-08-31 00:01:10 +03:00
|
|
|
void av1_tile_init(TileInfo *tile, const AV1_COMMON *cm, int row, int col) {
|
|
|
|
av1_tile_set_row(tile, cm, row);
|
|
|
|
av1_tile_set_col(tile, cm, col);
|
2017-02-09 09:37:47 +03:00
|
|
|
#if CONFIG_DEPENDENT_HORZTILES && CONFIG_TILE_GROUPS
|
|
|
|
av1_tile_set_tg_boundary(tile, cm, row, col);
|
|
|
|
#endif
|
2015-08-06 05:00:31 +03:00
|
|
|
}
|
|
|
|
|
2016-03-11 20:42:49 +03:00
|
|
|
#if !CONFIG_EXT_TILE
|
Make superblock size variable at the frame level.
The uncompressed frame header contains a bit to signal whether the
frame is encoded using 64x64 or 128x128 superblocks. This can vary
between any 2 frames.
vpxenc gained the --sb-size={64,128,dynamic} option, which allows the
configuration of the superblock size used (default is dynamic). 64/128
will force the encoder to always use the specified superblock size.
Dynamic would enable the encoder to choose the sb size for each
frame, but this is not implemented yet (dynamic does the same as 128
for now).
Constraints on tile sizes depend on the superblock size, the following
is a summary of the current bitstream syntax and semantics:
If both --enable-ext-tile is OFF and --enable-ext-partition is OFF:
The tile coding in this case is the same as VP9. In particular,
tiles have a minimum width of 256 pixels and a maximum width of
4096 pixels. The tile width must be multiples of 64 pixels
(except for the rightmost tile column). There can be a maximum
of 64 tile columns and 4 tile rows.
If --enable-ext-tile is OFF and --enable-ext-partition is ON:
Same constraints as above, except that tile width must be
multiples of 128 pixels (except for the rightmost tile column).
There is no change in the bitstream syntax used for coding the tile
configuration if --enable-ext-tile is OFF.
If --enable-ext-tile is ON and --enable-ext-partition is ON:
This is the new large scale tile coding configuration. The
minimum/maximum tile width and height are 64/4096 pixels. Tile
width and height must be multiples of 64 pixels. The uncompressed
header contains two 6 bit fields that hold the tile width/heigh
in units of 64 pixels. The maximum number of tile rows/columns
is only limited by the maximum frame size of 65536x65536 pixels
that can be coded in the bitstream. This yields a maximum of
1024x1024 tile rows and columns (of 64x64 tiles in a 65536x65536
frame).
If both --enable-ext-tile is ON and --enable-ext-partition is ON:
Same applies as above, except that in the bitstream the 2 fields
containing the tile width/height are in units of the superblock
size, and the superblock size itself is also coded in the bitstream.
If the uncompressed header signals the use of 64x64 superblocks,
then the tile width/height fields are 6 bits wide and are in units
of 64 pixels. If the uncompressed header signals the use of 128x128
superblocks, then the tile width/height fields are 5 bits wide and
are in units of 128 pixels.
The above is a summary of the bitstream. The user interface to vpxenc
(and the equivalent encoder API) behaves a follows:
If --enable-ext-tile is OFF:
No change in the user interface. --tile-columns and --tile-rows
specify the base 2 logarithm of the desired number of tile columns
and tile rows. The actual number of tile rows and tile columns,
and the particular tile width and tile height are computed by the
codec ensuring all of the above constraints are respected.
If --enable-ext-tile is ON, but --enable-ext-partition is OFF:
No change in the user interface. --tile-columns and --tile-rows
specify the WIDTH and HEIGHT of the tiles in unit of 64 pixels.
The valid values are in the range [1, 64] (which corresponds to
[64, 4096] pixels in increments of 64.
If both --enable-ext-tile is ON and --enable-ext-partition is ON:
If --sb-size=64 (default):
The user interface is the same as in the previous point.
--tile-columns and --tile-rows specify tile WIDTH and HEIGHT,
in units of 64 pixels, in the range [1, 64] (which corresponds
to [64, 4096] pixels in increments of 64).
If --sb-size=128 or --sb-size=dynamic:
--tile-columns and --tile-rows specify tile WIDTH and HEIGHT,
in units of 128 pixels in the range [1, 32] (which corresponds
to [128, 4096] pixels in increments of 128).
Change-Id: Idc9beee1ad12ff1634e83671985d14c680f9179a
2016-03-24 16:56:05 +03:00
|
|
|
|
2016-08-12 04:55:00 +03:00
|
|
|
#if CONFIG_EXT_PARTITION
|
|
|
|
#define MIN_TILE_WIDTH_MAX_SB 2
|
|
|
|
#define MAX_TILE_WIDTH_MAX_SB 32
|
|
|
|
#else
|
|
|
|
#define MIN_TILE_WIDTH_MAX_SB 4
|
|
|
|
#define MAX_TILE_WIDTH_MAX_SB 64
|
|
|
|
#endif // CONFIG_EXT_PARTITION
|
Make superblock size variable at the frame level.
The uncompressed frame header contains a bit to signal whether the
frame is encoded using 64x64 or 128x128 superblocks. This can vary
between any 2 frames.
vpxenc gained the --sb-size={64,128,dynamic} option, which allows the
configuration of the superblock size used (default is dynamic). 64/128
will force the encoder to always use the specified superblock size.
Dynamic would enable the encoder to choose the sb size for each
frame, but this is not implemented yet (dynamic does the same as 128
for now).
Constraints on tile sizes depend on the superblock size, the following
is a summary of the current bitstream syntax and semantics:
If both --enable-ext-tile is OFF and --enable-ext-partition is OFF:
The tile coding in this case is the same as VP9. In particular,
tiles have a minimum width of 256 pixels and a maximum width of
4096 pixels. The tile width must be multiples of 64 pixels
(except for the rightmost tile column). There can be a maximum
of 64 tile columns and 4 tile rows.
If --enable-ext-tile is OFF and --enable-ext-partition is ON:
Same constraints as above, except that tile width must be
multiples of 128 pixels (except for the rightmost tile column).
There is no change in the bitstream syntax used for coding the tile
configuration if --enable-ext-tile is OFF.
If --enable-ext-tile is ON and --enable-ext-partition is ON:
This is the new large scale tile coding configuration. The
minimum/maximum tile width and height are 64/4096 pixels. Tile
width and height must be multiples of 64 pixels. The uncompressed
header contains two 6 bit fields that hold the tile width/heigh
in units of 64 pixels. The maximum number of tile rows/columns
is only limited by the maximum frame size of 65536x65536 pixels
that can be coded in the bitstream. This yields a maximum of
1024x1024 tile rows and columns (of 64x64 tiles in a 65536x65536
frame).
If both --enable-ext-tile is ON and --enable-ext-partition is ON:
Same applies as above, except that in the bitstream the 2 fields
containing the tile width/height are in units of the superblock
size, and the superblock size itself is also coded in the bitstream.
If the uncompressed header signals the use of 64x64 superblocks,
then the tile width/height fields are 6 bits wide and are in units
of 64 pixels. If the uncompressed header signals the use of 128x128
superblocks, then the tile width/height fields are 5 bits wide and
are in units of 128 pixels.
The above is a summary of the bitstream. The user interface to vpxenc
(and the equivalent encoder API) behaves a follows:
If --enable-ext-tile is OFF:
No change in the user interface. --tile-columns and --tile-rows
specify the base 2 logarithm of the desired number of tile columns
and tile rows. The actual number of tile rows and tile columns,
and the particular tile width and tile height are computed by the
codec ensuring all of the above constraints are respected.
If --enable-ext-tile is ON, but --enable-ext-partition is OFF:
No change in the user interface. --tile-columns and --tile-rows
specify the WIDTH and HEIGHT of the tiles in unit of 64 pixels.
The valid values are in the range [1, 64] (which corresponds to
[64, 4096] pixels in increments of 64.
If both --enable-ext-tile is ON and --enable-ext-partition is ON:
If --sb-size=64 (default):
The user interface is the same as in the previous point.
--tile-columns and --tile-rows specify tile WIDTH and HEIGHT,
in units of 64 pixels, in the range [1, 64] (which corresponds
to [64, 4096] pixels in increments of 64).
If --sb-size=128 or --sb-size=dynamic:
--tile-columns and --tile-rows specify tile WIDTH and HEIGHT,
in units of 128 pixels in the range [1, 32] (which corresponds
to [128, 4096] pixels in increments of 128).
Change-Id: Idc9beee1ad12ff1634e83671985d14c680f9179a
2016-03-24 16:56:05 +03:00
|
|
|
|
|
|
|
static int get_min_log2_tile_cols(const int max_sb_cols) {
|
2015-08-06 05:00:31 +03:00
|
|
|
int min_log2 = 0;
|
2016-08-12 04:55:00 +03:00
|
|
|
while ((MAX_TILE_WIDTH_MAX_SB << min_log2) < max_sb_cols) ++min_log2;
|
2015-08-06 05:00:31 +03:00
|
|
|
return min_log2;
|
|
|
|
}
|
|
|
|
|
Make superblock size variable at the frame level.
The uncompressed frame header contains a bit to signal whether the
frame is encoded using 64x64 or 128x128 superblocks. This can vary
between any 2 frames.
vpxenc gained the --sb-size={64,128,dynamic} option, which allows the
configuration of the superblock size used (default is dynamic). 64/128
will force the encoder to always use the specified superblock size.
Dynamic would enable the encoder to choose the sb size for each
frame, but this is not implemented yet (dynamic does the same as 128
for now).
Constraints on tile sizes depend on the superblock size, the following
is a summary of the current bitstream syntax and semantics:
If both --enable-ext-tile is OFF and --enable-ext-partition is OFF:
The tile coding in this case is the same as VP9. In particular,
tiles have a minimum width of 256 pixels and a maximum width of
4096 pixels. The tile width must be multiples of 64 pixels
(except for the rightmost tile column). There can be a maximum
of 64 tile columns and 4 tile rows.
If --enable-ext-tile is OFF and --enable-ext-partition is ON:
Same constraints as above, except that tile width must be
multiples of 128 pixels (except for the rightmost tile column).
There is no change in the bitstream syntax used for coding the tile
configuration if --enable-ext-tile is OFF.
If --enable-ext-tile is ON and --enable-ext-partition is ON:
This is the new large scale tile coding configuration. The
minimum/maximum tile width and height are 64/4096 pixels. Tile
width and height must be multiples of 64 pixels. The uncompressed
header contains two 6 bit fields that hold the tile width/heigh
in units of 64 pixels. The maximum number of tile rows/columns
is only limited by the maximum frame size of 65536x65536 pixels
that can be coded in the bitstream. This yields a maximum of
1024x1024 tile rows and columns (of 64x64 tiles in a 65536x65536
frame).
If both --enable-ext-tile is ON and --enable-ext-partition is ON:
Same applies as above, except that in the bitstream the 2 fields
containing the tile width/height are in units of the superblock
size, and the superblock size itself is also coded in the bitstream.
If the uncompressed header signals the use of 64x64 superblocks,
then the tile width/height fields are 6 bits wide and are in units
of 64 pixels. If the uncompressed header signals the use of 128x128
superblocks, then the tile width/height fields are 5 bits wide and
are in units of 128 pixels.
The above is a summary of the bitstream. The user interface to vpxenc
(and the equivalent encoder API) behaves a follows:
If --enable-ext-tile is OFF:
No change in the user interface. --tile-columns and --tile-rows
specify the base 2 logarithm of the desired number of tile columns
and tile rows. The actual number of tile rows and tile columns,
and the particular tile width and tile height are computed by the
codec ensuring all of the above constraints are respected.
If --enable-ext-tile is ON, but --enable-ext-partition is OFF:
No change in the user interface. --tile-columns and --tile-rows
specify the WIDTH and HEIGHT of the tiles in unit of 64 pixels.
The valid values are in the range [1, 64] (which corresponds to
[64, 4096] pixels in increments of 64.
If both --enable-ext-tile is ON and --enable-ext-partition is ON:
If --sb-size=64 (default):
The user interface is the same as in the previous point.
--tile-columns and --tile-rows specify tile WIDTH and HEIGHT,
in units of 64 pixels, in the range [1, 64] (which corresponds
to [64, 4096] pixels in increments of 64).
If --sb-size=128 or --sb-size=dynamic:
--tile-columns and --tile-rows specify tile WIDTH and HEIGHT,
in units of 128 pixels in the range [1, 32] (which corresponds
to [128, 4096] pixels in increments of 128).
Change-Id: Idc9beee1ad12ff1634e83671985d14c680f9179a
2016-03-24 16:56:05 +03:00
|
|
|
static int get_max_log2_tile_cols(const int max_sb_cols) {
|
2015-08-06 05:00:31 +03:00
|
|
|
int max_log2 = 1;
|
2016-08-12 04:55:00 +03:00
|
|
|
while ((max_sb_cols >> max_log2) >= MIN_TILE_WIDTH_MAX_SB) ++max_log2;
|
2015-08-06 05:00:31 +03:00
|
|
|
return max_log2 - 1;
|
|
|
|
}
|
|
|
|
|
2016-08-31 00:01:10 +03:00
|
|
|
void av1_get_tile_n_bits(const int mi_cols, int *min_log2_tile_cols,
|
|
|
|
int *max_log2_tile_cols) {
|
Make superblock size variable at the frame level.
The uncompressed frame header contains a bit to signal whether the
frame is encoded using 64x64 or 128x128 superblocks. This can vary
between any 2 frames.
vpxenc gained the --sb-size={64,128,dynamic} option, which allows the
configuration of the superblock size used (default is dynamic). 64/128
will force the encoder to always use the specified superblock size.
Dynamic would enable the encoder to choose the sb size for each
frame, but this is not implemented yet (dynamic does the same as 128
for now).
Constraints on tile sizes depend on the superblock size, the following
is a summary of the current bitstream syntax and semantics:
If both --enable-ext-tile is OFF and --enable-ext-partition is OFF:
The tile coding in this case is the same as VP9. In particular,
tiles have a minimum width of 256 pixels and a maximum width of
4096 pixels. The tile width must be multiples of 64 pixels
(except for the rightmost tile column). There can be a maximum
of 64 tile columns and 4 tile rows.
If --enable-ext-tile is OFF and --enable-ext-partition is ON:
Same constraints as above, except that tile width must be
multiples of 128 pixels (except for the rightmost tile column).
There is no change in the bitstream syntax used for coding the tile
configuration if --enable-ext-tile is OFF.
If --enable-ext-tile is ON and --enable-ext-partition is ON:
This is the new large scale tile coding configuration. The
minimum/maximum tile width and height are 64/4096 pixels. Tile
width and height must be multiples of 64 pixels. The uncompressed
header contains two 6 bit fields that hold the tile width/heigh
in units of 64 pixels. The maximum number of tile rows/columns
is only limited by the maximum frame size of 65536x65536 pixels
that can be coded in the bitstream. This yields a maximum of
1024x1024 tile rows and columns (of 64x64 tiles in a 65536x65536
frame).
If both --enable-ext-tile is ON and --enable-ext-partition is ON:
Same applies as above, except that in the bitstream the 2 fields
containing the tile width/height are in units of the superblock
size, and the superblock size itself is also coded in the bitstream.
If the uncompressed header signals the use of 64x64 superblocks,
then the tile width/height fields are 6 bits wide and are in units
of 64 pixels. If the uncompressed header signals the use of 128x128
superblocks, then the tile width/height fields are 5 bits wide and
are in units of 128 pixels.
The above is a summary of the bitstream. The user interface to vpxenc
(and the equivalent encoder API) behaves a follows:
If --enable-ext-tile is OFF:
No change in the user interface. --tile-columns and --tile-rows
specify the base 2 logarithm of the desired number of tile columns
and tile rows. The actual number of tile rows and tile columns,
and the particular tile width and tile height are computed by the
codec ensuring all of the above constraints are respected.
If --enable-ext-tile is ON, but --enable-ext-partition is OFF:
No change in the user interface. --tile-columns and --tile-rows
specify the WIDTH and HEIGHT of the tiles in unit of 64 pixels.
The valid values are in the range [1, 64] (which corresponds to
[64, 4096] pixels in increments of 64.
If both --enable-ext-tile is ON and --enable-ext-partition is ON:
If --sb-size=64 (default):
The user interface is the same as in the previous point.
--tile-columns and --tile-rows specify tile WIDTH and HEIGHT,
in units of 64 pixels, in the range [1, 64] (which corresponds
to [64, 4096] pixels in increments of 64).
If --sb-size=128 or --sb-size=dynamic:
--tile-columns and --tile-rows specify tile WIDTH and HEIGHT,
in units of 128 pixels in the range [1, 32] (which corresponds
to [128, 4096] pixels in increments of 128).
Change-Id: Idc9beee1ad12ff1634e83671985d14c680f9179a
2016-03-24 16:56:05 +03:00
|
|
|
const int max_sb_cols =
|
|
|
|
ALIGN_POWER_OF_TWO(mi_cols, MAX_MIB_SIZE_LOG2) >> MAX_MIB_SIZE_LOG2;
|
|
|
|
*min_log2_tile_cols = get_min_log2_tile_cols(max_sb_cols);
|
|
|
|
*max_log2_tile_cols = get_max_log2_tile_cols(max_sb_cols);
|
2015-08-06 05:00:31 +03:00
|
|
|
assert(*min_log2_tile_cols <= *max_log2_tile_cols);
|
|
|
|
}
|
2016-03-11 20:42:49 +03:00
|
|
|
#endif // !CONFIG_EXT_TILE
|
2016-12-09 08:08:31 +03:00
|
|
|
|
2017-01-31 02:52:20 +03:00
|
|
|
void av1_update_boundary_info(const struct AV1Common *cm,
|
|
|
|
const TileInfo *const tile_info, int mi_row,
|
|
|
|
int mi_col) {
|
2016-12-09 08:08:31 +03:00
|
|
|
int row, col;
|
|
|
|
for (row = mi_row; row < (mi_row + cm->mib_size); row++)
|
|
|
|
for (col = mi_col; col < (mi_col + cm->mib_size); col++) {
|
|
|
|
MODE_INFO *const mi = cm->mi + row * cm->mi_stride + col;
|
2017-01-31 02:52:20 +03:00
|
|
|
mi->mbmi.boundary_info = 0;
|
|
|
|
if (cm->tile_cols * cm->tile_rows > 1) {
|
2017-02-09 09:37:47 +03:00
|
|
|
#if CONFIG_DEPENDENT_HORZTILES
|
|
|
|
if (row == tile_info->mi_row_start &&
|
|
|
|
(!cm->dependent_horz_tiles || tile_info->tg_horz_boundary))
|
|
|
|
#if CONFIG_TILE_GROUPS
|
|
|
|
#else
|
|
|
|
if (row == tile_info->mi_row_start && !cm->dependent_horz_tiles)
|
|
|
|
#endif // CONFIG_TILE_GROUPS
|
|
|
|
#else
|
2017-01-31 02:52:20 +03:00
|
|
|
if (row == tile_info->mi_row_start)
|
2017-02-09 09:37:47 +03:00
|
|
|
#endif // CONFIG_DEPENDENT_HORZTILES
|
2017-01-31 02:52:20 +03:00
|
|
|
mi->mbmi.boundary_info |= TILE_ABOVE_BOUNDARY;
|
|
|
|
if (col == tile_info->mi_col_start)
|
|
|
|
mi->mbmi.boundary_info |= TILE_LEFT_BOUNDARY;
|
|
|
|
if ((row + 1) >= tile_info->mi_row_end)
|
|
|
|
mi->mbmi.boundary_info |= TILE_BOTTOM_BOUNDARY;
|
|
|
|
if ((col + 1) >= tile_info->mi_col_end)
|
|
|
|
mi->mbmi.boundary_info |= TILE_RIGHT_BOUNDARY;
|
|
|
|
}
|
|
|
|
// Frame boundary is treated as tile boundary
|
|
|
|
if (row == 0)
|
|
|
|
mi->mbmi.boundary_info |= FRAME_ABOVE_BOUNDARY | TILE_ABOVE_BOUNDARY;
|
|
|
|
if (col == 0)
|
|
|
|
mi->mbmi.boundary_info |= FRAME_LEFT_BOUNDARY | TILE_LEFT_BOUNDARY;
|
|
|
|
if ((row + 1) >= cm->mi_rows)
|
|
|
|
mi->mbmi.boundary_info |= FRAME_BOTTOM_BOUNDARY | TILE_BOTTOM_BOUNDARY;
|
|
|
|
if ((col + 1) >= cm->mi_cols)
|
|
|
|
mi->mbmi.boundary_info |= FRAME_RIGHT_BOUNDARY | TILE_RIGHT_BOUNDARY;
|
2016-12-09 08:08:31 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-31 02:52:20 +03:00
|
|
|
#if CONFIG_LOOPFILTERING_ACROSS_TILES
|
2016-12-09 08:08:31 +03:00
|
|
|
int av1_disable_loopfilter_on_tile_boundary(const struct AV1Common *cm) {
|
|
|
|
return (!cm->loop_filter_across_tiles_enabled &&
|
|
|
|
(cm->tile_cols * cm->tile_rows > 1));
|
|
|
|
}
|
2017-01-31 02:52:20 +03:00
|
|
|
#endif // CONFIG_LOOPFILTERING_ACROSS_TILES
|