From 070aab7225a5ca7d75c11b06f882e1b8316f11e4 Mon Sep 17 00:00:00 2001 From: wingyippp Date: Tue, 10 Sep 2019 20:19:51 +0800 Subject: [PATCH] return SeekPoints directly for flacGetSeekPoints JNI method. update the proguard-rules.txt --- .../exoplayer2/ext/flac/FlacDecoderJni.java | 10 ++++++---- .../exoplayer2/ext/flac/FlacExtractor.java | 12 +++--------- extensions/flac/src/main/jni/flac_jni.cc | 18 ++++++++++++------ extensions/flac/src/main/jni/flac_parser.cc | 6 +++--- .../flac/src/main/jni/include/flac_parser.h | 2 +- library/core/proguard-rules.txt | 10 ++++++++++ 6 files changed, 35 insertions(+), 23 deletions(-) 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 6df783da78..ce90f09d47 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 @@ -19,6 +19,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.extractor.ExtractorInput; +import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.util.FlacStreamMetadata; import com.google.android.exoplayer2.util.Util; import java.io.IOException; @@ -220,11 +221,12 @@ import java.nio.ByteBuffer; * stream. * * @param timeUs A seek position in microseconds. - * @return The corresponding position (byte offset) in the flac stream or -1 if the stream doesn't + * @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 * have a seek table. */ - public long[] getSeekPosition(long timeUs) { - return flacGetSeekPosition(nativeDecoderContext, timeUs); + public SeekMap.SeekPoints getSeekPoints(long timeUs) { + return flacGetSeekPoints(nativeDecoderContext, timeUs); } public String getStateString() { @@ -283,7 +285,7 @@ import java.nio.ByteBuffer; private native long flacGetNextFrameFirstSampleIndex(long context); - private native long[] flacGetSeekPosition(long context, long timeUs); + private native SeekMap.SeekPoints flacGetSeekPoints(long context, long timeUs); private native String flacGetStateString(long context); 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 03416abd06..08343ab38c 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,7 +29,6 @@ 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; @@ -276,8 +275,8 @@ public final class FlacExtractor implements Extractor { FlacStreamMetadata streamMetadata, long streamLength, ExtractorOutput output) { - long[] result = decoderJni.getSeekPosition(/* timeUs= */ 0); - boolean hasSeekTable = result.length == 4 && result[1] != -1 && result[3] != -1; + SeekMap.SeekPoints seekPoints = decoderJni.getSeekPoints(/* timeUs= */ 0); + boolean hasSeekTable = seekPoints.first.position != -1 && seekPoints.second.position != -1; FlacBinarySearchSeeker binarySearchSeeker = null; SeekMap seekMap; if (hasSeekTable) { @@ -342,12 +341,7 @@ public final class FlacExtractor implements Extractor { @Override public SeekPoints getSeekPoints(long timeUs) { - long[] result = decoderJni.getSeekPosition(timeUs); - if (result.length == 4) { - return new SeekPoints(new SeekPoint(result[0], result[1]), new SeekPoint(result[2], result[3])); - } else { - return new SeekPoints(new SeekPoint(timeUs, decoderJni.getDecodePosition())); - } + return decoderJni.getSeekPoints(timeUs); } @Override diff --git a/extensions/flac/src/main/jni/flac_jni.cc b/extensions/flac/src/main/jni/flac_jni.cc index 0bea30752a..85f41ec6c1 100644 --- a/extensions/flac/src/main/jni/flac_jni.cc +++ b/extensions/flac/src/main/jni/flac_jni.cc @@ -200,13 +200,19 @@ DECODER_FUNC(jlong, flacGetNextFrameFirstSampleIndex, jlong jContext) { return context->parser->getNextFrameFirstSampleIndex(); } -DECODER_FUNC(jlongArray, flacGetSeekPosition, jlong jContext, jlong timeUs) { +DECODER_FUNC(jobject, flacGetSeekPoints, jlong jContext, jlong timeUs) { Context *context = reinterpret_cast(jContext); - int64_t *result = context->parser->getSeekPosition(timeUs); - const jlong resultJLong[4] = {result[0], result[1], result[2], result[3]}; - jlongArray resultArray = env->NewLongArray(4); - env->SetLongArrayRegion(resultArray, 0, 4, resultJLong); - return resultArray; + 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; } 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 dc0a685951..1d4daca6a0 100644 --- a/extensions/flac/src/main/jni/flac_parser.cc +++ b/extensions/flac/src/main/jni/flac_parser.cc @@ -438,7 +438,7 @@ size_t FLACParser::readBuffer(void *output, size_t output_size) { return bufferSize; } -int64_t* FLACParser::getSeekPosition(int64_t timeUs) { +int64_t* FLACParser::getSeekPositions(int64_t timeUs) { int64_t *result = new int64_t[4]; memset(result, -1, sizeof(result)); if (!mSeekTable) { @@ -466,9 +466,9 @@ int64_t* FLACParser::getSeekPosition(int64_t timeUs) { return result; } } - result[0] = timeUs; + result[0] = 0; result[1] = firstFrameOffset; - result[2] = timeUs; + result[2] = 0; result[3] = firstFrameOffset; return result; } diff --git a/extensions/flac/src/main/jni/include/flac_parser.h b/extensions/flac/src/main/jni/include/flac_parser.h index ac6e3e26d8..c1880f67d7 100644 --- a/extensions/flac/src/main/jni/include/flac_parser.h +++ b/extensions/flac/src/main/jni/include/flac_parser.h @@ -84,7 +84,7 @@ class FLACParser { bool decodeMetadata(); size_t readBuffer(void *output, size_t output_size); - int64_t* getSeekPosition(int64_t timeUs); + int64_t* getSeekPositions(int64_t timeUs); void flush() { reset(mCurrentPos); diff --git a/library/core/proguard-rules.txt b/library/core/proguard-rules.txt index ab3cc5fccd..c3d71f0715 100644 --- a/library/core/proguard-rules.txt +++ b/library/core/proguard-rules.txt @@ -58,6 +58,16 @@ (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.**