diff --git a/extensions/flac/proguard-rules.txt b/extensions/flac/proguard-rules.txt index 3e52f643e7..b308b69a59 100644 --- a/extensions/flac/proguard-rules.txt +++ b/extensions/flac/proguard-rules.txt @@ -15,3 +15,13 @@ -keep class com.google.android.exoplayer2.metadata.flac.PictureFrame { *; } + +-dontnote com.google.android.exoplayer2.extractor.SeekPoint +-keepclasseswithmembers class com.google.android.exoplayer2.extractor.SeekPoint { + (long, long); +} + +-dontnote com.google.android.exoplayer2.extractor.SeekMap$SeekPoints +-keepclasseswithmembers class com.google.android.exoplayer2.extractor.SeekMap$SeekPoints { + (com.google.android.exoplayer2.extractor.SeekPoint, com.google.android.exoplayer2.extractor.SeekPoint); +} \ No newline at end of file diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoderJni.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoderJni.java index ce90f09d47..d4544e8700 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoderJni.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoderJni.java @@ -221,10 +221,10 @@ import java.nio.ByteBuffer; * stream. * * @param timeUs A seek position in microseconds. - * @return The corresponding SeekPoints in the flac seek table or - * {@link com.google.android.exoplayer2.extractor.SeekPoint#position} set -1 if the stream doesn't + * @return The corresponding SeekPoints in the flac seek table or null if the stream doesn't * have a seek table. */ + @Nullable public SeekMap.SeekPoints getSeekPoints(long timeUs) { return flacGetSeekPoints(nativeDecoderContext, timeUs); } diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java index 08343ab38c..658c628448 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java @@ -29,6 +29,7 @@ import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.extractor.Id3Peeker; import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.SeekMap; +import com.google.android.exoplayer2.extractor.SeekPoint; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.id3.Id3Decoder; @@ -341,7 +342,8 @@ public final class FlacExtractor implements Extractor { @Override public SeekPoints getSeekPoints(long timeUs) { - return decoderJni.getSeekPoints(timeUs); + @Nullable SeekPoints seekPoints = decoderJni.getSeekPoints(timeUs); + return seekPoints == null ? new SeekPoints(SeekPoint.START) : seekPoints; } @Override diff --git a/extensions/flac/src/main/jni/flac_jni.cc b/extensions/flac/src/main/jni/flac_jni.cc index 85f41ec6c1..8c3ec419bf 100644 --- a/extensions/flac/src/main/jni/flac_jni.cc +++ b/extensions/flac/src/main/jni/flac_jni.cc @@ -203,16 +203,20 @@ DECODER_FUNC(jlong, flacGetNextFrameFirstSampleIndex, jlong jContext) { DECODER_FUNC(jobject, flacGetSeekPoints, jlong jContext, jlong timeUs) { Context *context = reinterpret_cast(jContext); int64_t *result = context->parser->getSeekPositions(timeUs); - jclass seekPointClass = env->FindClass("com/google/android/exoplayer2/extractor/SeekPoint"); - jclass seekPointsClass = env->FindClass("com/google/android/exoplayer2/extractor/SeekMap$SeekPoints"); - jmethodID cidSeekPoint = env->GetMethodID(seekPointClass, "", "(JJ)V"); - jmethodID cidSeekPoints = env->GetMethodID(seekPointsClass, "", "(Lcom/google/android/exoplayer2/extractor/SeekPoint;Lcom/google/android/exoplayer2/extractor/SeekPoint;)V"); - jobject jSeekPointFirst = env->NewObject(seekPointClass, cidSeekPoint, (jlong) result[0], (jlong) result[1]); - jobject jSeekPointSecond = env->NewObject(seekPointClass, cidSeekPoint, (jlong) result[2], (jlong) result[3]); - jobject jSeekPoints = env->NewObject(seekPointsClass, cidSeekPoints, jSeekPointFirst, jSeekPointSecond); - env->DeleteLocalRef(jSeekPointFirst); - env->DeleteLocalRef(jSeekPointSecond); - return jSeekPoints; + if (result != NULL) { + jclass seekPointClass = env->FindClass("com/google/android/exoplayer2/extractor/SeekPoint"); + jclass seekPointsClass = env->FindClass("com/google/android/exoplayer2/extractor/SeekMap$SeekPoints"); + jmethodID cidSeekPoint = env->GetMethodID(seekPointClass, "", "(JJ)V"); + jmethodID cidSeekPoints = env->GetMethodID(seekPointsClass, "", "(Lcom/google/android/exoplayer2/extractor/SeekPoint;Lcom/google/android/exoplayer2/extractor/SeekPoint;)V"); + jobject jSeekPointFirst = env->NewObject(seekPointClass, cidSeekPoint, (jlong) result[0], (jlong) result[1]); + jobject jSeekPointSecond = env->NewObject(seekPointClass, cidSeekPoint, (jlong) result[2], (jlong) result[3]); + jobject jSeekPoints = env->NewObject(seekPointsClass, cidSeekPoints, jSeekPointFirst, jSeekPointSecond); + env->DeleteLocalRef(jSeekPointFirst); + env->DeleteLocalRef(jSeekPointSecond); + return jSeekPoints; + } else { + return NULL; + } } DECODER_FUNC(jstring, flacGetStateString, jlong jContext) { diff --git a/extensions/flac/src/main/jni/flac_parser.cc b/extensions/flac/src/main/jni/flac_parser.cc index 1d4daca6a0..77ce030d91 100644 --- a/extensions/flac/src/main/jni/flac_parser.cc +++ b/extensions/flac/src/main/jni/flac_parser.cc @@ -440,9 +440,8 @@ size_t FLACParser::readBuffer(void *output, size_t output_size) { int64_t* FLACParser::getSeekPositions(int64_t timeUs) { int64_t *result = new int64_t[4]; - memset(result, -1, sizeof(result)); if (!mSeekTable) { - return result; + return NULL; } int64_t sample = (timeUs * getSampleRate()) / 1000000LL; diff --git a/library/core/proguard-rules.txt b/library/core/proguard-rules.txt index c3d71f0715..ab3cc5fccd 100644 --- a/library/core/proguard-rules.txt +++ b/library/core/proguard-rules.txt @@ -58,16 +58,6 @@ (com.google.android.exoplayer2.upstream.DataSource$Factory); } --dontnote com.google.android.exoplayer2.extractor.SeekPoint --keepclasseswithmembers class com.google.android.exoplayer2.extractor.SeekPoint { - (long, long); -} - --dontnote com.google.android.exoplayer2.extractor.SeekMap$SeekPoints --keepclasseswithmembers class com.google.android.exoplayer2.extractor.SeekMap$SeekPoints { - (com.google.android.exoplayer2.extractor.SeekPoint, com.google.android.exoplayer2.extractor.SeekPoint); -} - # Don't warn about checkerframework and Kotlin annotations -dontwarn org.checkerframework.** -dontwarn kotlin.annotations.jvm.**