Support larger LEB128 integers.

Support values up to 2 ^ 56 - 1.

BUG=aomedia:1125

Change-Id: I7df39e5c918cc6f82d3911c8e91e0b5e529904d4
diff --git a/aom/aom_integer.h b/aom/aom_integer.h
index 57764b3..130b1b4 100644
--- a/aom/aom_integer.h
+++ b/aom/aom_integer.h
@@ -8,7 +8,6 @@
  * 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.
  */
-
 #ifndef AOM_AOM_INTEGER_H_
 #define AOM_AOM_INTEGER_H_
 
@@ -80,18 +79,18 @@
 #endif  // __cplusplus
 
 // Returns size of uint32_t when encoded using LEB128.
-size_t aom_uleb_size_in_bytes(uint32_t value);
+size_t aom_uleb_size_in_bytes(uint64_t value);
 
 // Returns decoded LEB128 value.
-void aom_uleb_decode(const uint8_t *buffer, size_t available, uint32_t *value);
+void aom_uleb_decode(const uint8_t *buffer, size_t available, uint64_t *value);
 
 // Encodes LEB128 integer. Returns 0 when successful, and -1 upon failure.
-int aom_uleb_encode(uint32_t value, size_t available, uint8_t *coded_value,
+int aom_uleb_encode(uint64_t value, size_t available, uint8_t *coded_value,
                     size_t *coded_size);
 
 // Encodes LEB128 integer to size specified. Returns 0 when successful, and -1
 // upon failure.
-int aom_uleb_encode_fixed_size(uint32_t value, size_t available,
+int aom_uleb_encode_fixed_size(uint64_t value, size_t available,
                                size_t pad_to_size, uint8_t *coded_value,
                                size_t *coded_size);
 
diff --git a/aom/src/aom_integer.c b/aom/src/aom_integer.c
index 23a0a8c..10b0003 100644
--- a/aom/src/aom_integer.c
+++ b/aom/src/aom_integer.c
@@ -10,12 +10,12 @@
  */
 #include "aom/aom_integer.h"
 
-static const size_t kMaximumLeb128Size = 4;
-static const size_t kMaximumLeb128Value = 0xFFFFFFF;  // 2^28 - 1
-static const uint8_t kLeb128ByteMask = 0x7f;          // Binary: 01111111
-static const uint8_t kLeb128PadByte = 0x80;           // Binary: 10000000
+static const size_t kMaximumLeb128Size = 8;
+static const uint64_t kMaximumLeb128Value = 0xFFFFFFFFFFFFFF;  // 2 ^ 56 - 1
+static const uint8_t kLeb128ByteMask = 0x7f;  // Binary: 01111111
+static const uint8_t kLeb128PadByte = 0x80;   // Binary: 10000000
 
-size_t aom_uleb_size_in_bytes(uint32_t value) {
+size_t aom_uleb_size_in_bytes(uint64_t value) {
   size_t size = 0;
   do {
     ++size;
@@ -23,7 +23,7 @@
   return size;
 }
 
-void aom_uleb_decode(const uint8_t *buffer, size_t available, uint32_t *value) {
+void aom_uleb_decode(const uint8_t *buffer, size_t available, uint64_t *value) {
   if (buffer && value) {
     for (size_t i = 0; i < kMaximumLeb128Size && i < available; ++i) {
       const uint8_t decoded_byte = *(buffer + i) & kLeb128ByteMask;
@@ -33,7 +33,7 @@
   }
 }
 
-int aom_uleb_encode(uint32_t value, size_t available, uint8_t *coded_value,
+int aom_uleb_encode(uint64_t value, size_t available, uint8_t *coded_value,
                     size_t *coded_size) {
   const size_t leb_size = aom_uleb_size_in_bytes(value);
   if (value > kMaximumLeb128Value || leb_size > kMaximumLeb128Size ||
@@ -54,7 +54,7 @@
   return 0;
 }
 
-int aom_uleb_encode_fixed_size(uint32_t value, size_t available,
+int aom_uleb_encode_fixed_size(uint64_t value, size_t available,
                                size_t pad_to_size, uint8_t *coded_value,
                                size_t *coded_size) {
   if (!coded_value || !coded_size || available < pad_to_size ||
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c
index e49faae..a435a3c 100644
--- a/av1/decoder/obu.c
+++ b/av1/decoder/obu.c
@@ -22,7 +22,7 @@
 #include "av1/decoder/decodeframe.h"
 
 #if CONFIG_SCALABILITY
-// picture prediction structures (0-12 are predefined) in scaiability metadata
+// Picture prediction structures (0-12 are predefined) in scalability metadata.
 typedef enum {
   SCALABILITY_L1T2 = 0,
   SCALABILITY_L1T3 = 1,
@@ -281,7 +281,7 @@
 
 #if CONFIG_OBU_SIZING
     // OBUs are preceded by an unsigned leb128 coded unsigned integer.
-    uint32_t u_obu_size = 0;
+    uint64_t u_obu_size = 0;
     aom_uleb_decode(data, bytes_available, &u_obu_size);
     const size_t obu_size = (size_t)u_obu_size;
     const size_t length_field_size = aom_uleb_size_in_bytes(u_obu_size);
diff --git a/test/aom_integer_test.cc b/test/aom_integer_test.cc
index 4daa64b..b46b3cc 100644
--- a/test/aom_integer_test.cc
+++ b/test/aom_integer_test.cc
@@ -18,7 +18,7 @@
 const uint32_t kSizeTestExpectedSizes[kSizeTestNumValues] = {
   1, 1, 2, 3, 4, 5
 };
-const uint32_t kSizeTestInputs[kSizeTestNumValues] = {
+const uint64_t kSizeTestInputs[kSizeTestNumValues] = {
   0, 0x7f, 0x3fff, 0x1fffff, 0xffffff, 0x10000000
 };
 }  // namespace
@@ -26,8 +26,8 @@
 TEST(AomLeb128, DecodeTest) {
   const size_t num_leb128_bytes = 3;
   const uint8_t leb128_bytes[num_leb128_bytes] = { 0xE5, 0x8E, 0x26 };
-  const uint32_t expected_value = 0x98765;  // 624485
-  uint32_t value = 0;
+  const uint64_t expected_value = 0x98765;  // 624485
+  uint64_t value = 0;
   aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes, &value);
   ASSERT_EQ(expected_value, value);
 
@@ -63,7 +63,7 @@
                             &bytes_written),
             0);
   ASSERT_EQ(bytes_written, 3u);
-  uint32_t decoded_value = 0;
+  uint64_t decoded_value = 0;
   aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value);
   ASSERT_EQ(value, decoded_value);
 }
@@ -96,7 +96,7 @@
                                  &write_buffer[0], &bytes_written),
       0);
   ASSERT_EQ(bytes_written, 4u);
-  uint32_t decoded_value = 0;
+  uint64_t decoded_value = 0;
   aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value);
   ASSERT_EQ(value, decoded_value);
 }
diff --git a/tools/obu_parser.cc b/tools/obu_parser.cc
index 667019a..0bef559 100644
--- a/tools/obu_parser.cc
+++ b/tools/obu_parser.cc
@@ -170,8 +170,8 @@
     }
 
 #if CONFIG_OBU_SIZING
-    uint32_t obu_size = 0;
-    aom_uleb_decode(data + consumed, sizeof(obu_size), &obu_size);
+    uint64_t obu_size = 0;
+    aom_uleb_decode(data + consumed, remaining, &obu_size);
     const int current_obu_length = static_cast<int>(obu_size);
     const size_t length_field_size = aom_uleb_size_in_bytes(obu_size);
 #else