return SeekPoints directly for flacGetSeekPoints JNI method. update the proguard-rules.txt

This commit is contained in:
wingyippp 2019-09-10 20:19:51 +08:00
parent d9529479fa
commit 070aab7225
6 changed files with 35 additions and 23 deletions

View File

@ -19,6 +19,7 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.extractor.ExtractorInput; 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.FlacStreamMetadata;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.io.IOException; import java.io.IOException;
@ -220,11 +221,12 @@ import java.nio.ByteBuffer;
* stream. * stream.
* *
* @param timeUs A seek position in microseconds. * @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. * have a seek table.
*/ */
public long[] getSeekPosition(long timeUs) { public SeekMap.SeekPoints getSeekPoints(long timeUs) {
return flacGetSeekPosition(nativeDecoderContext, timeUs); return flacGetSeekPoints(nativeDecoderContext, timeUs);
} }
public String getStateString() { public String getStateString() {
@ -283,7 +285,7 @@ import java.nio.ByteBuffer;
private native long flacGetNextFrameFirstSampleIndex(long context); 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); private native String flacGetStateString(long context);

View File

@ -29,7 +29,6 @@ import com.google.android.exoplayer2.extractor.ExtractorsFactory;
import com.google.android.exoplayer2.extractor.Id3Peeker; import com.google.android.exoplayer2.extractor.Id3Peeker;
import com.google.android.exoplayer2.extractor.PositionHolder; import com.google.android.exoplayer2.extractor.PositionHolder;
import com.google.android.exoplayer2.extractor.SeekMap; 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.extractor.TrackOutput;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.id3.Id3Decoder; import com.google.android.exoplayer2.metadata.id3.Id3Decoder;
@ -276,8 +275,8 @@ public final class FlacExtractor implements Extractor {
FlacStreamMetadata streamMetadata, FlacStreamMetadata streamMetadata,
long streamLength, long streamLength,
ExtractorOutput output) { ExtractorOutput output) {
long[] result = decoderJni.getSeekPosition(/* timeUs= */ 0); SeekMap.SeekPoints seekPoints = decoderJni.getSeekPoints(/* timeUs= */ 0);
boolean hasSeekTable = result.length == 4 && result[1] != -1 && result[3] != -1; boolean hasSeekTable = seekPoints.first.position != -1 && seekPoints.second.position != -1;
FlacBinarySearchSeeker binarySearchSeeker = null; FlacBinarySearchSeeker binarySearchSeeker = null;
SeekMap seekMap; SeekMap seekMap;
if (hasSeekTable) { if (hasSeekTable) {
@ -342,12 +341,7 @@ public final class FlacExtractor implements Extractor {
@Override @Override
public SeekPoints getSeekPoints(long timeUs) { public SeekPoints getSeekPoints(long timeUs) {
long[] result = decoderJni.getSeekPosition(timeUs); return decoderJni.getSeekPoints(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 @Override

View File

@ -200,13 +200,19 @@ DECODER_FUNC(jlong, flacGetNextFrameFirstSampleIndex, jlong jContext) {
return context->parser->getNextFrameFirstSampleIndex(); return context->parser->getNextFrameFirstSampleIndex();
} }
DECODER_FUNC(jlongArray, flacGetSeekPosition, jlong jContext, jlong timeUs) { DECODER_FUNC(jobject, flacGetSeekPoints, jlong jContext, jlong timeUs) {
Context *context = reinterpret_cast<Context *>(jContext); Context *context = reinterpret_cast<Context *>(jContext);
int64_t *result = context->parser->getSeekPosition(timeUs); int64_t *result = context->parser->getSeekPositions(timeUs);
const jlong resultJLong[4] = {result[0], result[1], result[2], result[3]}; jclass seekPointClass = env->FindClass("com/google/android/exoplayer2/extractor/SeekPoint");
jlongArray resultArray = env->NewLongArray(4); jclass seekPointsClass = env->FindClass("com/google/android/exoplayer2/extractor/SeekMap$SeekPoints");
env->SetLongArrayRegion(resultArray, 0, 4, resultJLong); jmethodID cidSeekPoint = env->GetMethodID(seekPointClass, "<init>", "(JJ)V");
return resultArray; jmethodID cidSeekPoints = env->GetMethodID(seekPointsClass, "<init>", "(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) { DECODER_FUNC(jstring, flacGetStateString, jlong jContext) {

View File

@ -438,7 +438,7 @@ size_t FLACParser::readBuffer(void *output, size_t output_size) {
return bufferSize; return bufferSize;
} }
int64_t* FLACParser::getSeekPosition(int64_t timeUs) { int64_t* FLACParser::getSeekPositions(int64_t timeUs) {
int64_t *result = new int64_t[4]; int64_t *result = new int64_t[4];
memset(result, -1, sizeof(result)); memset(result, -1, sizeof(result));
if (!mSeekTable) { if (!mSeekTable) {
@ -466,9 +466,9 @@ int64_t* FLACParser::getSeekPosition(int64_t timeUs) {
return result; return result;
} }
} }
result[0] = timeUs; result[0] = 0;
result[1] = firstFrameOffset; result[1] = firstFrameOffset;
result[2] = timeUs; result[2] = 0;
result[3] = firstFrameOffset; result[3] = firstFrameOffset;
return result; return result;
} }

View File

@ -84,7 +84,7 @@ class FLACParser {
bool decodeMetadata(); bool decodeMetadata();
size_t readBuffer(void *output, size_t output_size); size_t readBuffer(void *output, size_t output_size);
int64_t* getSeekPosition(int64_t timeUs); int64_t* getSeekPositions(int64_t timeUs);
void flush() { void flush() {
reset(mCurrentPos); reset(mCurrentPos);

View File

@ -58,6 +58,16 @@
<init>(com.google.android.exoplayer2.upstream.DataSource$Factory); <init>(com.google.android.exoplayer2.upstream.DataSource$Factory);
} }
-dontnote com.google.android.exoplayer2.extractor.SeekPoint
-keepclasseswithmembers class com.google.android.exoplayer2.extractor.SeekPoint {
<init>(long, long);
}
-dontnote com.google.android.exoplayer2.extractor.SeekMap$SeekPoints
-keepclasseswithmembers class com.google.android.exoplayer2.extractor.SeekMap$SeekPoints {
<init>(com.google.android.exoplayer2.extractor.SeekPoint, com.google.android.exoplayer2.extractor.SeekPoint);
}
# Don't warn about checkerframework and Kotlin annotations # Don't warn about checkerframework and Kotlin annotations
-dontwarn org.checkerframework.** -dontwarn org.checkerframework.**
-dontwarn kotlin.annotations.jvm.** -dontwarn kotlin.annotations.jvm.**