add scalability experiment
cmake: -DCONFIG_SCALABILITY=1
Change-Id: Ifa908f809bcf904bdf0ed87b351e1ef3accc2b3f
diff --git a/obudec.c b/obudec.c
index 8f1ca00..f859a68 100644
--- a/obudec.c
+++ b/obudec.c
@@ -19,10 +19,17 @@
#include "av1/common/common.h"
#define OBU_HEADER_SIZE_BYTES 1
+#if CONFIG_SCALABILITY
+#define OBU_HEADER_EXTENSION_SIZE_BYTES 1
+#endif
#if CONFIG_OBU_NO_IVF
int obu_read_temporal_unit(FILE *infile, uint8_t **buffer, size_t *bytes_read,
+#if CONFIG_SCALABILITY
+ size_t *buffer_size, int last_layer_id) {
+#else
size_t *buffer_size) {
+#endif
size_t ret;
const size_t obu_length_header_size =
PRE_OBU_SIZE_BYTES + OBU_HEADER_SIZE_BYTES;
@@ -60,6 +67,26 @@
break;
}
+#if CONFIG_SCALABILITY
+ // break if obu_extension_flag is found and enhancement_id change
+ if ((data[PRE_OBU_SIZE_BYTES] & 0x1)) {
+ uint8_t obu_extension_header;
+ int total_obu_header_size =
+ (int)obu_length_header_size + OBU_HEADER_EXTENSION_SIZE_BYTES;
+ int curr_layer_id;
+ fread(&obu_extension_header, 1, OBU_HEADER_EXTENSION_SIZE_BYTES, infile);
+ curr_layer_id = (obu_extension_header >> 3) & 0x3;
+ if (curr_layer_id && (curr_layer_id > last_layer_id)) {
+ // new enhancement layer
+ *bytes_read -= obu_length_header_size;
+ fseek(infile, -total_obu_header_size, SEEK_CUR);
+ break;
+ } else {
+ fseek(infile, -OBU_HEADER_EXTENSION_SIZE_BYTES, SEEK_CUR);
+ }
+ }
+#endif
+
// otherwise, read the OBU payload into memory
#if CONFIG_OBU_SIZING
aom_uleb_decode(data, PRE_OBU_SIZE_BYTES, &obu_size);
@@ -112,6 +139,7 @@
return 0;
}
// fprintf(stderr, "Starting to parse OBU stream\n");
+
return 1;
}