mirror of
https://github.com/androidx/media.git
synced 2025-05-06 23:20:42 +08:00
Roll forward of []
Set content length and redirect uri in a single transaction. New: Fixed the code where DataSpec.uri is set to null in [] Automated g4 rollback of changelist 196765970. *** Reason for rollback *** Fixed the code where DataSpec.uri is set to null in [] *** Original change description *** Automated g4 rollback of changelist 194932235. *** Reason for rollback *** This CL breaks the playability of Mango's offlined progressive videos. *** Original change description *** Set content length and redirect uri in a single transaction NORELNOTES=true NO_BUG *** *** ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=198370211
This commit is contained in:
parent
3974a8464a
commit
1d7ecd73b7
@ -18,7 +18,6 @@ package com.google.android.exoplayer2.upstream.cache;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.IntDef;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.util.Log;
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.upstream.DataSink;
|
||||
import com.google.android.exoplayer2.upstream.DataSource;
|
||||
@ -52,8 +51,6 @@ public final class CacheDataSource implements DataSource {
|
||||
*/
|
||||
public static final long DEFAULT_MAX_CACHE_FILE_SIZE = 2 * 1024 * 1024;
|
||||
|
||||
private static final String TAG = "CacheDataSource";
|
||||
|
||||
/**
|
||||
* Flags controlling the cache's behavior.
|
||||
*/
|
||||
@ -221,7 +218,7 @@ public final class CacheDataSource implements DataSource {
|
||||
try {
|
||||
key = CacheUtil.getKey(dataSpec);
|
||||
uri = dataSpec.uri;
|
||||
actualUri = loadRedirectedUriOrReturnGivenUri(cache, key, uri);
|
||||
actualUri = getRedirectedUriOrDefault(cache, key, /* defaultUri= */ uri);
|
||||
flags = dataSpec.flags;
|
||||
readPosition = dataSpec.position;
|
||||
|
||||
@ -272,7 +269,7 @@ public final class CacheDataSource implements DataSource {
|
||||
bytesRemaining -= bytesRead;
|
||||
}
|
||||
} else if (currentDataSpecLengthUnset) {
|
||||
setBytesRemainingAndMaybeStoreLength(0);
|
||||
setNoBytesRemainingAndMaybeStoreLength();
|
||||
} else if (bytesRemaining > 0 || bytesRemaining == C.LENGTH_UNSET) {
|
||||
closeCurrentSource();
|
||||
openNextSource(false);
|
||||
@ -281,7 +278,7 @@ public final class CacheDataSource implements DataSource {
|
||||
return bytesRead;
|
||||
} catch (IOException e) {
|
||||
if (currentDataSpecLengthUnset && isCausedByPositionOutOfRange(e)) {
|
||||
setBytesRemainingAndMaybeStoreLength(0);
|
||||
setNoBytesRemainingAndMaybeStoreLength();
|
||||
return C.RESULT_END_OF_INPUT;
|
||||
}
|
||||
handleBeforeThrow(e);
|
||||
@ -402,46 +399,38 @@ public final class CacheDataSource implements DataSource {
|
||||
currentDataSource = nextDataSource;
|
||||
currentDataSpecLengthUnset = nextDataSpec.length == C.LENGTH_UNSET;
|
||||
long resolvedLength = nextDataSource.open(nextDataSpec);
|
||||
if (currentDataSpecLengthUnset && resolvedLength != C.LENGTH_UNSET) {
|
||||
setBytesRemainingAndMaybeStoreLength(resolvedLength);
|
||||
}
|
||||
// TODO find a way to store length and redirected uri in one metadata mutation.
|
||||
maybeUpdateActualUriFieldAndRedirectedUriMetadata();
|
||||
}
|
||||
|
||||
private void maybeUpdateActualUriFieldAndRedirectedUriMetadata() {
|
||||
if (!isReadingFromUpstream()) {
|
||||
return;
|
||||
}
|
||||
actualUri = currentDataSource.getUri();
|
||||
maybeUpdateRedirectedUriMetadata();
|
||||
}
|
||||
|
||||
private void maybeUpdateRedirectedUriMetadata() {
|
||||
if (!isWritingToCache()) {
|
||||
return;
|
||||
}
|
||||
// Update bytesRemaining, actualUri and (if writing to cache) the cache metadata.
|
||||
ContentMetadataMutations mutations = new ContentMetadataMutations();
|
||||
if (currentDataSpecLengthUnset && resolvedLength != C.LENGTH_UNSET) {
|
||||
bytesRemaining = resolvedLength;
|
||||
ContentMetadataInternal.setContentLength(mutations, readPosition + bytesRemaining);
|
||||
}
|
||||
if (isReadingFromUpstream()) {
|
||||
actualUri = currentDataSource.getUri();
|
||||
boolean isRedirected = !uri.equals(actualUri);
|
||||
if (isRedirected) {
|
||||
ContentMetadataInternal.setRedirectedUri(mutations, actualUri);
|
||||
} else {
|
||||
ContentMetadataInternal.removeRedirectedUri(mutations);
|
||||
}
|
||||
try {
|
||||
}
|
||||
if (isWritingToCache()) {
|
||||
cache.applyContentMetadataMutations(key, mutations);
|
||||
} catch (CacheException e) {
|
||||
String message =
|
||||
"Couldn't update redirected URI. "
|
||||
+ "This might cause relative URIs get resolved incorrectly.";
|
||||
Log.w(TAG, message, e);
|
||||
}
|
||||
}
|
||||
|
||||
private static Uri loadRedirectedUriOrReturnGivenUri(Cache cache, String key, Uri uri) {
|
||||
private void setNoBytesRemainingAndMaybeStoreLength() throws IOException {
|
||||
bytesRemaining = 0;
|
||||
if (isWritingToCache()) {
|
||||
cache.setContentLength(key, readPosition);
|
||||
}
|
||||
}
|
||||
|
||||
private static Uri getRedirectedUriOrDefault(Cache cache, String key, Uri defaultUri) {
|
||||
ContentMetadata contentMetadata = cache.getContentMetadata(key);
|
||||
Uri redirectedUri = ContentMetadataInternal.getRedirectedUri(contentMetadata);
|
||||
return redirectedUri == null ? uri : redirectedUri;
|
||||
return redirectedUri == null ? defaultUri : redirectedUri;
|
||||
}
|
||||
|
||||
private static boolean isCausedByPositionOutOfRange(IOException e) {
|
||||
@ -458,13 +447,6 @@ public final class CacheDataSource implements DataSource {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void setBytesRemainingAndMaybeStoreLength(long bytesRemaining) throws IOException {
|
||||
this.bytesRemaining = bytesRemaining;
|
||||
if (isWritingToCache()) {
|
||||
cache.setContentLength(key, readPosition + bytesRemaining);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isReadingFromUpstream() {
|
||||
return !isReadingFromCache();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user