summaryrefslogtreecommitdiffstats
path: root/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/hls/FullSegmentEncryptionKeyCache.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/hls/FullSegmentEncryptionKeyCache.java')
-rw-r--r--mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/hls/FullSegmentEncryptionKeyCache.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/hls/FullSegmentEncryptionKeyCache.java b/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/hls/FullSegmentEncryptionKeyCache.java
new file mode 100644
index 0000000000..eab538582d
--- /dev/null
+++ b/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/source/hls/FullSegmentEncryptionKeyCache.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.mozilla.thirdparty.com.google.android.exoplayer2.source.hls;
+
+import android.net.Uri;
+import androidx.annotation.Nullable;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.util.Assertions;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * LRU cache that holds up to {@code maxSize} full-segment-encryption keys. Which each addition,
+ * once the cache's size exceeds {@code maxSize}, the oldest item (according to insertion order) is
+ * removed.
+ */
+/* package */ final class FullSegmentEncryptionKeyCache {
+
+ private final LinkedHashMap<Uri, byte[]> backingMap;
+
+ public FullSegmentEncryptionKeyCache(int maxSize) {
+ backingMap =
+ new LinkedHashMap<Uri, byte[]>(
+ /* initialCapacity= */ maxSize + 1, /* loadFactor= */ 1, /* accessOrder= */ false) {
+ @Override
+ protected boolean removeEldestEntry(Map.Entry<Uri, byte[]> eldest) {
+ return size() > maxSize;
+ }
+ };
+ }
+
+ /**
+ * Returns the {@code encryptionKey} cached against this {@code uri}, or null if {@code uri} is
+ * null or not present in the cache.
+ */
+ @Nullable
+ public byte[] get(@Nullable Uri uri) {
+ if (uri == null) {
+ return null;
+ }
+ return backingMap.get(uri);
+ }
+
+ /**
+ * Inserts an entry into the cache.
+ *
+ * @throws NullPointerException if {@code uri} or {@code encryptionKey} are null.
+ */
+ @Nullable
+ public byte[] put(Uri uri, byte[] encryptionKey) {
+ return backingMap.put(Assertions.checkNotNull(uri), Assertions.checkNotNull(encryptionKey));
+ }
+
+ /**
+ * Returns true if {@code uri} is present in the cache.
+ *
+ * @throws NullPointerException if {@code uri} is null.
+ */
+ public boolean containsUri(Uri uri) {
+ return backingMap.containsKey(Assertions.checkNotNull(uri));
+ }
+
+ /**
+ * Removes {@code uri} from the cache. If {@code uri} was present in the cahce, this returns the
+ * corresponding {@code encryptionKey}, otherwise null.
+ *
+ * @throws NullPointerException if {@code uri} is null.
+ */
+ @Nullable
+ public byte[] remove(Uri uri) {
+ return backingMap.remove(Assertions.checkNotNull(uri));
+ }
+}