Remove BitstreamLevel
Use AV1_LEVEL instead.
BUG=aomedia:2332
Change-Id: I183d297192fc4f5423e0c3c1e6e322460e01f17a
diff --git a/av1/common/enums.h b/av1/common/enums.h
index f1e0512..fbacc89 100644
--- a/av1/common/enums.h
+++ b/av1/common/enums.h
@@ -92,15 +92,6 @@
MAX_PROFILES,
} SENUM1BYTE(BITSTREAM_PROFILE);
-#define LEVEL_MAJOR_BITS 3
-#define LEVEL_MINOR_BITS 2
-#define LEVEL_BITS (LEVEL_MAJOR_BITS + LEVEL_MINOR_BITS)
-
-#define LEVEL_MAJOR_MIN 2
-#define LEVEL_MAJOR_MAX ((1 << LEVEL_MAJOR_BITS) - 1 + LEVEL_MAJOR_MIN)
-#define LEVEL_MINOR_MIN 0
-#define LEVEL_MINOR_MAX ((1 << LEVEL_MINOR_BITS) - 1)
-
#define OP_POINTS_CNT_MINUS_1_BITS 5
#define OP_POINTS_IDC_BITS 12
@@ -500,6 +491,8 @@
SEQ_LEVEL_MAX = 31
} UENUM1BYTE(AV1_LEVEL);
+#define LEVEL_BITS 5
+
#define DIRECTIONAL_MODES 8
#define MAX_ANGLE_DELTA 3
#define ANGLE_STEP 3
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index 553bd87..07ce416 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -194,11 +194,6 @@
InternalFrameBufferList int_frame_buffers;
} BufferPool;
-typedef struct BitstreamLevel {
- uint8_t major;
- uint8_t minor;
-} BitstreamLevel;
-
typedef struct {
int cdef_pri_damping;
int cdef_sec_damping;
@@ -280,7 +275,7 @@
int operating_point_idc[MAX_NUM_OPERATING_POINTS];
uint8_t display_model_info_present_flag;
uint8_t decoder_model_info_present_flag;
- BitstreamLevel level[MAX_NUM_OPERATING_POINTS];
+ AV1_LEVEL seq_level_idx[MAX_NUM_OPERATING_POINTS];
uint8_t tier[MAX_NUM_OPERATING_POINTS]; // seq_tier in the spec. One bit: 0
// or 1.
@@ -1389,17 +1384,8 @@
return coded_lossless;
}
-static INLINE int is_valid_seq_level_idx(uint8_t seq_level_idx) {
- return seq_level_idx < 24 || seq_level_idx == 31;
-}
-
-static INLINE uint8_t major_minor_to_seq_level_idx(BitstreamLevel bl) {
- assert(bl.major >= LEVEL_MAJOR_MIN && bl.major <= LEVEL_MAJOR_MAX);
- // Since bl.minor is unsigned a comparison will return a warning:
- // comparison is always true due to limited range of data type
- assert(LEVEL_MINOR_MIN == 0);
- assert(bl.minor <= LEVEL_MINOR_MAX);
- return ((bl.major - LEVEL_MAJOR_MIN) << LEVEL_MINOR_BITS) + bl.minor;
+static INLINE int is_valid_seq_level_idx(AV1_LEVEL seq_level_idx) {
+ return seq_level_idx < SEQ_LEVELS || seq_level_idx == SEQ_LEVEL_MAX;
}
#ifdef __cplusplus
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c
index 58f7d2c..aaea572 100644
--- a/av1/decoder/obu.c
+++ b/av1/decoder/obu.c
@@ -98,12 +98,10 @@
static uint32_t read_temporal_delimiter_obu() { return 0; }
// Returns a boolean that indicates success.
-static int read_bitstream_level(BitstreamLevel *bl,
+static int read_bitstream_level(AV1_LEVEL *seq_level_idx,
struct aom_read_bit_buffer *rb) {
- const uint8_t seq_level_idx = aom_rb_read_literal(rb, LEVEL_BITS);
- if (!is_valid_seq_level_idx(seq_level_idx)) return 0;
- bl->major = (seq_level_idx >> LEVEL_MINOR_BITS) + LEVEL_MAJOR_MIN;
- bl->minor = seq_level_idx & ((1 << LEVEL_MINOR_BITS) - 1);
+ *seq_level_idx = aom_rb_read_literal(rb, LEVEL_BITS);
+ if (!is_valid_seq_level_idx(*seq_level_idx)) return 0;
return 1;
}
@@ -151,7 +149,7 @@
seq_params->display_model_info_present_flag = 0;
seq_params->operating_points_cnt_minus_1 = 0;
seq_params->operating_point_idc[0] = 0;
- if (!read_bitstream_level(&seq_params->level[0], rb)) {
+ if (!read_bitstream_level(&seq_params->seq_level_idx[0], rb)) {
cm->error.error_code = AOM_CODEC_UNSUP_BITSTREAM;
return 0;
}
@@ -175,13 +173,13 @@
for (int i = 0; i < seq_params->operating_points_cnt_minus_1 + 1; i++) {
seq_params->operating_point_idc[i] =
aom_rb_read_literal(rb, OP_POINTS_IDC_BITS);
- if (!read_bitstream_level(&seq_params->level[i], rb)) {
+ if (!read_bitstream_level(&seq_params->seq_level_idx[i], rb)) {
cm->error.error_code = AOM_CODEC_UNSUP_BITSTREAM;
return 0;
}
// This is the seq_level_idx[i] > 7 check in the spec. seq_level_idx 7
// is equivalent to level 3.3.
- if (seq_params->level[i].major > 3)
+ if (seq_params->seq_level_idx[i] >= SEQ_LEVEL_4_0)
seq_params->tier[i] = aom_rb_read_bit(rb);
else
seq_params->tier[i] = 0;
@@ -195,10 +193,9 @@
if (cm->timing_info_present &&
(cm->timing_info.equal_picture_interval ||
cm->op_params[i].decoder_model_param_present_flag)) {
- cm->op_params[i].bitrate = max_level_bitrate(
- seq_params->profile,
- major_minor_to_seq_level_idx(seq_params->level[i]),
- seq_params->tier[i]);
+ cm->op_params[i].bitrate =
+ max_level_bitrate(seq_params->profile, seq_params->seq_level_idx[i],
+ seq_params->tier[i]);
// Level with seq_level_idx = 31 returns a high "dummy" bitrate to pass
// the check
if (cm->op_params[i].bitrate == 0)
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 766c9e0..0aad41e 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3279,9 +3279,8 @@
}
}
-static void write_bitstream_level(BitstreamLevel bl,
+static void write_bitstream_level(AV1_LEVEL seq_level_idx,
struct aom_write_bit_buffer *wb) {
- uint8_t seq_level_idx = major_minor_to_seq_level_idx(bl);
assert(is_valid_seq_level_idx(seq_level_idx));
aom_wb_write_literal(wb, seq_level_idx, LEVEL_BITS);
}
@@ -3304,7 +3303,7 @@
assert(cm->timing_info_present == 0);
assert(cm->seq_params.decoder_model_info_present_flag == 0);
assert(cm->seq_params.display_model_info_present_flag == 0);
- write_bitstream_level(cm->seq_params.level[0], &wb);
+ write_bitstream_level(cm->seq_params.seq_level_idx[0], &wb);
} else {
aom_wb_write_bit(&wb, cm->timing_info_present); // timing info present flag
@@ -3323,8 +3322,8 @@
for (i = 0; i < cm->seq_params.operating_points_cnt_minus_1 + 1; i++) {
aom_wb_write_literal(&wb, cm->seq_params.operating_point_idc[i],
OP_POINTS_IDC_BITS);
- write_bitstream_level(cm->seq_params.level[i], &wb);
- if (cm->seq_params.level[i].major > 3)
+ write_bitstream_level(cm->seq_params.seq_level_idx[i], &wb);
+ if (cm->seq_params.seq_level_idx[i] >= SEQ_LEVEL_4_0)
aom_wb_write_bit(&wb, cm->seq_params.tier[i]);
if (cm->seq_params.decoder_model_info_present_flag) {
aom_wb_write_bit(&wb,
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 56cf543..14f9ce3 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -962,76 +962,58 @@
// and max display sample rates.
// Need to add checks for max bit rate, max decoded luma sample rate, header
// rate, etc. that are not covered by this function.
- (void)oxcf;
- BitstreamLevel bl = { 9, 3 };
+ AV1_LEVEL level = SEQ_LEVEL_MAX;
if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate, 512,
288, 30.0, 4)) {
- bl.major = 2;
- bl.minor = 0;
+ level = SEQ_LEVEL_2_0;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
704, 396, 30.0, 4)) {
- bl.major = 2;
- bl.minor = 1;
+ level = SEQ_LEVEL_2_1;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
1088, 612, 30.0, 4)) {
- bl.major = 3;
- bl.minor = 0;
+ level = SEQ_LEVEL_3_0;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
1376, 774, 30.0, 4)) {
- bl.major = 3;
- bl.minor = 1;
+ level = SEQ_LEVEL_3_1;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
2048, 1152, 30.0, 3)) {
- bl.major = 4;
- bl.minor = 0;
+ level = SEQ_LEVEL_4_0;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
2048, 1152, 60.0, 3)) {
- bl.major = 4;
- bl.minor = 1;
+ level = SEQ_LEVEL_4_1;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
4096, 2176, 30.0, 2)) {
- bl.major = 5;
- bl.minor = 0;
+ level = SEQ_LEVEL_5_0;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
4096, 2176, 60.0, 2)) {
- bl.major = 5;
- bl.minor = 1;
+ level = SEQ_LEVEL_5_1;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
4096, 2176, 120.0, 2)) {
- bl.major = 5;
- bl.minor = 2;
+ level = SEQ_LEVEL_5_2;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
8192, 4352, 30.0, 2)) {
- bl.major = 6;
- bl.minor = 0;
+ level = SEQ_LEVEL_6_0;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
8192, 4352, 60.0, 2)) {
- bl.major = 6;
- bl.minor = 1;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
8192, 4352, 120.0, 2)) {
- bl.major = 6;
- bl.minor = 2;
+ level = SEQ_LEVEL_6_2;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
16384, 8704, 30.0, 2)) {
- bl.major = 7;
- bl.minor = 0;
+ level = SEQ_LEVEL_7_0;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
16384, 8704, 60.0, 2)) {
- bl.major = 7;
- bl.minor = 1;
+ level = SEQ_LEVEL_7_1;
} else if (does_level_match(oxcf->width, oxcf->height, oxcf->init_framerate,
16384, 8704, 120.0, 2)) {
- bl.major = 7;
- bl.minor = 2;
+ level = SEQ_LEVEL_7_2;
}
for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
- seq->level[i] = bl;
+ seq->seq_level_idx[i] = level;
// Set the maximum parameters for bitrate and buffer size for this profile,
// level, and tier
cm->op_params[i].bitrate = max_level_bitrate(
- cm->seq_params.profile, major_minor_to_seq_level_idx(seq->level[i]),
- seq->tier[i]);
+ cm->seq_params.profile, seq->seq_level_idx[i], seq->tier[i]);
// Level with seq_level_idx = 31 returns a high "dummy" bitrate to pass the
// check
if (cm->op_params[i].bitrate == 0)