diff options
| author | 2019-01-25 16:54:51 -0800 | |
|---|---|---|
| committer | 2019-01-28 22:47:03 +0000 | |
| commit | 5f1cca657f412ebc145e5f03fae888f586272c94 (patch) | |
| tree | 60046e1ebdf0548bfe8030ccf71f5cd59731bdf5 | |
| parent | 98d92aa5d3f13124b364b2e58de2df0283b2c1d0 (diff) | |
Get ProtoOutputStream size without compressing it
The current implementation of the ProtoOutputStream compresses the
buffer in order to return its correct size.
For some use cases the compression is too expensive and it is more
useful to have a faster but overestimated size to a precise but slower
one.
This implementation adds a `getRawSize` method which returns the buffer
size without compressing it. If the buffer has already been compressed
the returned size is the same as the one from the `getSize`. If the
buffer is not yet compressed the size may diverge.
This implementation will be used to support a ring buffer for window
transitions on the Window Manager.
Bug: 123535780
Test: Check the getSize method from the EncodedBuffer and the getRawSize
from the ProtoOutputStream.
Change-Id: Ied24742a14b76980afdf6d6d22d67ade15ba7aad
| -rw-r--r-- | api/test-current.txt | 2 | ||||
| -rw-r--r-- | core/java/android/util/proto/EncodedBuffer.java | 8 | ||||
| -rw-r--r-- | core/java/android/util/proto/ProtoOutputStream.java | 12 |
3 files changed, 22 insertions, 0 deletions
diff --git a/api/test-current.txt b/api/test-current.txt index 049e0025a59b..c821ffa18567 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2077,6 +2077,7 @@ package android.util.proto { method public static int getRawZigZag64Size(long); method public int getReadPos(); method public int getReadableSize(); + method public int getSize(); method public int getWriteBufIndex(); method public int getWriteIndex(); method public int getWritePos(); @@ -2136,6 +2137,7 @@ package android.util.proto { method @Deprecated public void endRepeatedObject(long); method public void flush(); method public byte[] getBytes(); + method public int getRawSize(); method public static long makeFieldId(int, long); method public long start(long); method @Deprecated public long startObject(long); diff --git a/core/java/android/util/proto/EncodedBuffer.java b/core/java/android/util/proto/EncodedBuffer.java index ed38e6ffd302..56a0bfa2adb1 100644 --- a/core/java/android/util/proto/EncodedBuffer.java +++ b/core/java/android/util/proto/EncodedBuffer.java @@ -147,6 +147,14 @@ public final class EncodedBuffer { return mReadableSize; } + /** + * Returns the buffer size + * @return the buffer size + */ + public int getSize() { + return ((mBufferCount - 1) * mChunkSize) + mWriteIndex; + } + // // Reading from the read position. // diff --git a/core/java/android/util/proto/ProtoOutputStream.java b/core/java/android/util/proto/ProtoOutputStream.java index a1ee61c15f24..6efcfbfd05f8 100644 --- a/core/java/android/util/proto/ProtoOutputStream.java +++ b/core/java/android/util/proto/ProtoOutputStream.java @@ -188,6 +188,18 @@ public final class ProtoOutputStream extends ProtoStream { } /** + * Returns the uncompressed buffer size + * @return the uncompressed buffer size + */ + public int getRawSize() { + if (mCompacted) { + return getBytes().length; + } else { + return mBuffer.getSize(); + } + } + + /** * Write a value for the given fieldId. * * Will automatically convert for the following field types, and |