gint max_width /* maxWidth */ , max_height /* maxHeight */ ;
gint size_sb /* sizeSb */ ;
gint widest_tile_sb /* widestTileSb */ ;
- gint min_inner_tile_width = G_MAXINT /* min width of non-rightmost tile */ ;
g_assert (parser->seq_header);
seq_header = parser->seq_header;
}
parser->state.mi_col_starts[i] = parser->state.mi_cols;
parser->state.tile_cols = i;
- if (parser->state.tile_cols > 1)
- min_inner_tile_width = tile_width_sb << sb_size;
+
+ while (i >= 1) {
+ tile_info->width_in_sbs_minus_1[i - 1] =
+ ((parser->state.mi_col_starts[i] - parser->state.mi_col_starts[i - 1]
+ + ((1 << sb_shift) - 1)) >> sb_shift) - 1;
+ i--;
+ }
min_log2_tile_rows = MAX (min_log2_tiles - parser->state.tile_cols_log2, 0);
parser->state.tile_rows_log2 = min_log2_tile_rows;
}
parser->state.mi_row_starts[i] = parser->state.mi_rows;
parser->state.tile_rows = i;
+ while (i >= 1) {
+ tile_info->height_in_sbs_minus_1[i - 1] =
+ ((parser->state.mi_row_starts[i] - parser->state.mi_row_starts[i - 1]
+ + ((1 << sb_shift) - 1)) >> sb_shift) - 1;
+ i--;
+ }
} else {
widest_tile_sb = 0;
start_sb = 0;
size_sb = tile_info->width_in_sbs_minus_1[i] + 1;
widest_tile_sb = MAX (size_sb, widest_tile_sb);
start_sb += size_sb;
- if (i > 0 && ((size_sb << sb_size) < min_inner_tile_width))
- min_inner_tile_width = size_sb << sb_size;
}
parser->state.mi_col_starts[i] = parser->state.mi_cols;
parser->state.tile_cols = i;
tile_info->context_update_tile_id = 0;
}
- if (min_inner_tile_width < (64 << (parser->state.upscaled_width !=
- parser->state.frame_width))) {
- GST_INFO ("Minimum tile width requirement not satisfied");
- retval = GST_AV1_PARSER_BITSTREAM_ERROR;
- goto error;
- }
-
memcpy (tile_info->mi_col_starts, parser->state.mi_col_starts,
sizeof (guint32) * (GST_AV1_MAX_TILE_COLS + 1));
memcpy (tile_info->mi_row_starts, parser->state.mi_row_starts,
goto error;
}
+ if (tile_group->tg_end < tile_group->tg_start) {
+ retval = GST_AV1_PARSER_NO_MORE_DATA;
+ goto error;
+ }
+
if (!gst_bit_reader_skip_to_byte (br)) {
retval = GST_AV1_PARSER_NO_MORE_DATA;
goto error;
end_bit_pos = gst_bit_reader_get_pos (br);
header_bytes = (end_bit_pos - start_bitpos) / 8;
sz -= header_bytes;
+
for (tile_num = tile_group->tg_start; tile_num <= tile_group->tg_end;
tile_num++) {
tile_row = tile_num / parser->state.tile_cols;
sz -= tile_size - parser->state.tile_size_bytes;
}
+ tile_group->entry[tile_num].tile_size = tile_size;
+ tile_group->entry[tile_num].tile_offset = gst_bit_reader_get_pos (br) / 8;
+ tile_group->entry[tile_num].tile_row = tile_row;
+ tile_group->entry[tile_num].tile_col = tile_col;
+
tile_group->entry[tile_num].mi_row_start =
parser->state.mi_row_starts[tile_row];
tile_group->entry[tile_num].mi_row_end =
*/
/* Skip the real data to the next one */
- if (!gst_bit_reader_skip (br, tile_size)) {
+ if (tile_num < tile_group->tg_end &&
+ !gst_bit_reader_skip (br, tile_size * 8)) {
retval = GST_AV1_PARSER_NO_MORE_DATA;
goto error;
}
* It is a requirement of bitstream conformance that the value of tg_end is greater
* than or equal to tg_start. It is a requirement of bitstream conformance that the
* value of tg_end for the last tile group in each frame is equal to num_tiles-1.
+ * @tile_offset: Offset from the OBU data, the real data start of this tile.
+ * @tg_size: Data size of this tile.
+ * @tile_row: Tile index in row.
+ * @tile_col: Tile index in column.
* @mi_row_start: start position in mi rows
* @mi_row_end: end position in mi rows
* @mi_col_start: start position in mi cols
guint8 tg_start;
guint8 tg_end;
struct {
+ guint32 tile_offset; /* Tile data offset from the OBU data. */
+ guint32 tile_size; /* Data size of this tile */
+ guint32 tile_row; /* tileRow */
+ guint32 tile_col; /* tileCol */
/* global varialbes */
guint32 mi_row_start; /* MiRowStart */
guint32 mi_row_end; /* MiRowEnd */