From d9529479fac6e91a002b215d71027159ffa25cda Mon Sep 17 00:00:00 2001 From: wingyippp Date: Wed, 4 Sep 2019 00:32:16 +0800 Subject: [PATCH] get 2 SeekPoints from the getSeekPosition() in flac_parser --- .../exoplayer2/ext/flac/FlacDecoderJni.java | 4 ++-- .../exoplayer2/ext/flac/FlacExtractor.java | 11 ++++++--- extensions/flac/src/main/jni/flac_jni.cc | 8 +++++-- extensions/flac/src/main/jni/flac_parser.cc | 23 +++++++++++++++---- .../flac/src/main/jni/include/flac_parser.h | 2 +- 5 files changed, 36 insertions(+), 12 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 f454e28c68..6df783da78 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 @@ -223,7 +223,7 @@ import java.nio.ByteBuffer; * @return The corresponding position (byte offset) in the flac stream or -1 if the stream doesn't * have a seek table. */ - public long getSeekPosition(long timeUs) { + public long[] getSeekPosition(long timeUs) { return flacGetSeekPosition(nativeDecoderContext, timeUs); } @@ -283,7 +283,7 @@ import java.nio.ByteBuffer; private native long flacGetNextFrameFirstSampleIndex(long context); - private native long flacGetSeekPosition(long context, long timeUs); + private native long[] flacGetSeekPosition(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 cd91b06288..03416abd06 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 @@ -276,7 +276,8 @@ public final class FlacExtractor implements Extractor { FlacStreamMetadata streamMetadata, long streamLength, ExtractorOutput output) { - boolean hasSeekTable = decoderJni.getSeekPosition(/* timeUs= */ 0) != -1; + long[] result = decoderJni.getSeekPosition(/* timeUs= */ 0); + boolean hasSeekTable = result.length == 4 && result[1] != -1 && result[3] != -1; FlacBinarySearchSeeker binarySearchSeeker = null; SeekMap seekMap; if (hasSeekTable) { @@ -341,8 +342,12 @@ public final class FlacExtractor implements Extractor { @Override public SeekPoints getSeekPoints(long timeUs) { - // TODO: Access the seek table via JNI to return two seek points when appropriate. - return new SeekPoints(new SeekPoint(timeUs, decoderJni.getSeekPosition(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())); + } } @Override diff --git a/extensions/flac/src/main/jni/flac_jni.cc b/extensions/flac/src/main/jni/flac_jni.cc index d60a7cead2..0bea30752a 100644 --- a/extensions/flac/src/main/jni/flac_jni.cc +++ b/extensions/flac/src/main/jni/flac_jni.cc @@ -200,9 +200,13 @@ DECODER_FUNC(jlong, flacGetNextFrameFirstSampleIndex, jlong jContext) { return context->parser->getNextFrameFirstSampleIndex(); } -DECODER_FUNC(jlong, flacGetSeekPosition, jlong jContext, jlong timeUs) { +DECODER_FUNC(jlongArray, flacGetSeekPosition, jlong jContext, jlong timeUs) { Context *context = reinterpret_cast(jContext); - return context->parser->getSeekPosition(timeUs); + 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; } 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 830f3e2178..dc0a685951 100644 --- a/extensions/flac/src/main/jni/flac_parser.cc +++ b/extensions/flac/src/main/jni/flac_parser.cc @@ -438,9 +438,11 @@ size_t FLACParser::readBuffer(void *output, size_t output_size) { return bufferSize; } -int64_t FLACParser::getSeekPosition(int64_t timeUs) { +int64_t* FLACParser::getSeekPosition(int64_t timeUs) { + int64_t *result = new int64_t[4]; + memset(result, -1, sizeof(result)); if (!mSeekTable) { - return -1; + return result; } int64_t sample = (timeUs * getSampleRate()) / 1000000LL; @@ -452,8 +454,21 @@ int64_t FLACParser::getSeekPosition(int64_t timeUs) { for (unsigned i = mSeekTable->num_points; i > 0; ) { i--; if (points[i].sample_number <= sample) { - return firstFrameOffset + points[i].stream_offset; + result[0] = points[i].sample_number / getSampleRate() * 1000000LL; + result[1] = firstFrameOffset + points[i].stream_offset; + if (i + 1 <= mSeekTable->num_points) { + result[2] = points[i + 1].sample_number / getSampleRate() * 1000000LL; + result[3] = firstFrameOffset + points[i + 1].stream_offset; + } else { + result[2] = result[0]; + result[3] = result[1]; + } + return result; } } - return firstFrameOffset; + result[0] = timeUs; + result[1] = firstFrameOffset; + result[2] = timeUs; + 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 fd3e36a806..ac6e3e26d8 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* getSeekPosition(int64_t timeUs); void flush() { reset(mCurrentPos);