diff options
| -rw-r--r-- | media/java/android/media/MediaPlayer2Impl.java | 65 | ||||
| -rw-r--r-- | media/jni/android_media_MediaPlayer2.cpp | 33 |
2 files changed, 65 insertions, 33 deletions
diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java index 5adbc156689c..a0da33014b03 100644 --- a/media/java/android/media/MediaPlayer2Impl.java +++ b/media/java/android/media/MediaPlayer2Impl.java @@ -682,7 +682,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { case DataSourceDesc.TYPE_CALLBACK: handleDataSource(isCurrent, srcId, - dsd.getMedia2DataSource()); + dsd.getMedia2DataSource(), + dsd.getStartPosition(), + dsd.getEndPosition()); break; case DataSourceDesc.TYPE_FD: @@ -690,7 +692,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { srcId, dsd.getFileDescriptor(), dsd.getFileDescriptorOffset(), - dsd.getFileDescriptorLength()); + dsd.getFileDescriptorLength(), + dsd.getStartPosition(), + dsd.getEndPosition()); break; case DataSourceDesc.TYPE_URI: @@ -699,7 +703,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { dsd.getUriContext(), dsd.getUri(), dsd.getUriHeaders(), - dsd.getUriCookies()); + dsd.getUriCookies(), + dsd.getStartPosition(), + dsd.getEndPosition()); break; default: @@ -729,7 +735,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { private void handleDataSource( boolean isCurrent, long srcId, @NonNull Context context, @NonNull Uri uri, - @Nullable Map<String, String> headers, @Nullable List<HttpCookie> cookies) + @Nullable Map<String, String> headers, @Nullable List<HttpCookie> cookies, + long startPos, long endPos) throws IOException { // The context and URI usually belong to the calling user. Get a resolver for that user // and strip out the userId from the URI if present. @@ -737,7 +744,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { final String scheme = uri.getScheme(); final String authority = ContentProvider.getAuthorityWithoutUserId(uri.getAuthority()); if (ContentResolver.SCHEME_FILE.equals(scheme)) { - handleDataSource(isCurrent, srcId, uri.getPath(), null, null); + handleDataSource(isCurrent, srcId, uri.getPath(), null, null, startPos, endPos); return; } @@ -751,7 +758,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { afd = resolver.openAssetFileDescriptor(uri, "r"); } if (afd != null) { - handleDataSource(isCurrent, srcId, afd); + handleDataSource(isCurrent, srcId, afd, startPos, endPos); return; } } catch (NullPointerException | SecurityException | IOException ex) { @@ -762,29 +769,35 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { afd.close(); } } - handleDataSource(isCurrent, srcId, uri.toString(), headers, cookies); + handleDataSource(isCurrent, srcId, uri.toString(), headers, cookies, startPos, endPos); } - private void handleDataSource(boolean isCurrent, long srcId, AssetFileDescriptor afd) + private void handleDataSource(boolean isCurrent, long srcId, AssetFileDescriptor afd, + long startPos, long endPos) throws IOException { if (afd.getDeclaredLength() < 0) { handleDataSource(isCurrent, srcId, afd.getFileDescriptor(), 0, - DataSourceDesc.LONG_MAX); + DataSourceDesc.LONG_MAX, + startPos, + endPos); } else { handleDataSource(isCurrent, srcId, afd.getFileDescriptor(), afd.getStartOffset(), - afd.getDeclaredLength()); + afd.getDeclaredLength(), + startPos, + endPos); } } private void handleDataSource( boolean isCurrent, long srcId, - String path, Map<String, String> headers, List<HttpCookie> cookies) + String path, Map<String, String> headers, List<HttpCookie> cookies, + long startPos, long endPos) throws IOException { String[] keys = null; String[] values = null; @@ -800,11 +813,12 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { ++i; } } - handleDataSource(isCurrent, srcId, path, keys, values, cookies); + handleDataSource(isCurrent, srcId, path, keys, values, cookies, startPos, endPos); } private void handleDataSource(boolean isCurrent, long srcId, - String path, String[] keys, String[] values, List<HttpCookie> cookies) + String path, String[] keys, String[] values, List<HttpCookie> cookies, + long startPos, long endPos) throws IOException { final Uri uri = Uri.parse(path); final String scheme = uri.getScheme(); @@ -818,7 +832,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { Media2HTTPService.createHTTPService(path, cookies), path, keys, - values); + values, + startPos, + endPos); return; } @@ -826,7 +842,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { if (file.exists()) { FileInputStream is = new FileInputStream(file); FileDescriptor fd = is.getFD(); - handleDataSource(isCurrent, srcId, fd, 0, DataSourceDesc.LONG_MAX); + handleDataSource(isCurrent, srcId, fd, 0, DataSourceDesc.LONG_MAX, startPos, endPos); is.close(); } else { throw new IOException("handleDataSource failed."); @@ -835,7 +851,8 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { private native void nativeHandleDataSourceUrl( boolean isCurrent, long srcId, - Media2HTTPService httpService, String path, String[] keys, String[] values) + Media2HTTPService httpService, String path, String[] keys, String[] values, + long startPos, long endPos) throws IOException; /** @@ -849,23 +866,27 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { */ private void handleDataSource( boolean isCurrent, long srcId, - FileDescriptor fd, long offset, long length) throws IOException { - nativeHandleDataSourceFD(isCurrent, srcId, fd, offset, length); + FileDescriptor fd, long offset, long length, + long startPos, long endPos) throws IOException { + nativeHandleDataSourceFD(isCurrent, srcId, fd, offset, length, startPos, endPos); } private native void nativeHandleDataSourceFD(boolean isCurrent, long srcId, - FileDescriptor fd, long offset, long length) throws IOException; + FileDescriptor fd, long offset, long length, + long startPos, long endPos) throws IOException; /** * @throws IllegalStateException if it is called in an invalid state * @throws IllegalArgumentException if dataSource is not a valid Media2DataSource */ - private void handleDataSource(boolean isCurrent, long srcId, Media2DataSource dataSource) { - nativeHandleDataSourceCallback(isCurrent, srcId, dataSource); + private void handleDataSource(boolean isCurrent, long srcId, Media2DataSource dataSource, + long startPos, long endPos) { + nativeHandleDataSourceCallback(isCurrent, srcId, dataSource, startPos, endPos); } private native void nativeHandleDataSourceCallback( - boolean isCurrent, long srcId, Media2DataSource dataSource); + boolean isCurrent, long srcId, Media2DataSource dataSource, + long startPos, long endPos); /** * @return true if there is a next data source, false otherwise. diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp index 352df811d42f..61c28eddfeac 100644 --- a/media/jni/android_media_MediaPlayer2.cpp +++ b/media/jni/android_media_MediaPlayer2.cpp @@ -283,7 +283,8 @@ static void process_media_player_call( static void android_media_MediaPlayer2_handleDataSourceUrl( JNIEnv *env, jobject thiz, jboolean isCurrent, jlong srcId, - jobject httpServiceObj, jstring path, jobjectArray keys, jobjectArray values) { + jobject httpServiceObj, jstring path, jobjectArray keys, jobjectArray values, + jlong startPos, jlong endPos) { sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); if (mp == NULL) { @@ -300,7 +301,8 @@ android_media_MediaPlayer2_handleDataSourceUrl( if (tmp == NULL) { // Out of memory return; } - ALOGV("handleDataSourceUrl: path %s, srcId %lld", tmp, (long long)srcId); + ALOGV("handleDataSourceUrl: path %s, srcId %lld, start %lld, end %lld", + tmp, (long long)srcId, (long long)startPos, (long long)endPos); if (strncmp(tmp, "content://", 10) == 0) { ALOGE("handleDataSourceUrl: content scheme is not supported in native code"); @@ -313,6 +315,8 @@ android_media_MediaPlayer2_handleDataSourceUrl( dsd->mId = srcId; dsd->mType = DataSourceDesc::TYPE_URL; dsd->mUrl = tmp; + dsd->mStartPositionMs = startPos; + dsd->mEndPositionMs = endPos; env->ReleaseStringUTFChars(path, tmp); tmp = NULL; @@ -341,9 +345,9 @@ android_media_MediaPlayer2_handleDataSourceUrl( static void android_media_MediaPlayer2_handleDataSourceFD( - JNIEnv *env, jobject thiz, jboolean isCurrent, jlong srcId, - jobject fileDescriptor, jlong offset, jlong length) -{ + JNIEnv *env, jobject thiz, jboolean isCurrent, jlong srcId, + jobject fileDescriptor, jlong offset, jlong length, + jlong startPos, jlong endPos) { sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); @@ -355,8 +359,10 @@ android_media_MediaPlayer2_handleDataSourceFD( return; } int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); - ALOGV("handleDataSourceFD: srcId=%lld, fd=%d (%s), offset=%lld, length=%lld", - (long long)srcId, fd, nameForFd(fd).c_str(), (long long)offset, (long long)length); + ALOGV("handleDataSourceFD: srcId=%lld, fd=%d (%s), offset=%lld, length=%lld, " + "start=%lld, end=%lld", + (long long)srcId, fd, nameForFd(fd).c_str(), (long long)offset, (long long)length, + (long long)startPos, (long long)endPos); struct stat sb; int ret = fstat(fd, &sb); @@ -389,6 +395,8 @@ android_media_MediaPlayer2_handleDataSourceFD( dsd->mFD = fd; dsd->mFDOffset = offset; dsd->mFDLength = length; + dsd->mStartPositionMs = startPos; + dsd->mEndPositionMs = endPos; status_t err; if (isCurrent) { @@ -402,7 +410,8 @@ android_media_MediaPlayer2_handleDataSourceFD( static void android_media_MediaPlayer2_handleDataSourceCallback( - JNIEnv *env, jobject thiz, jboolean isCurrent, jlong srcId, jobject dataSource) + JNIEnv *env, jobject thiz, jboolean isCurrent, jlong srcId, jobject dataSource, + jlong startPos, jlong endPos) { sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { @@ -419,6 +428,8 @@ android_media_MediaPlayer2_handleDataSourceCallback( dsd->mId = srcId; dsd->mType = DataSourceDesc::TYPE_CALLBACK; dsd->mCallbackSource = callbackDataSource; + dsd->mStartPositionMs = startPos; + dsd->mEndPositionMs = endPos; status_t err; if (isCurrent) { @@ -1442,17 +1453,17 @@ static const JNINativeMethod gMethods[] = { { "nativeHandleDataSourceUrl", "(ZJLandroid/media/Media2HTTPService;Ljava/lang/String;[Ljava/lang/String;" - "[Ljava/lang/String;)V", + "[Ljava/lang/String;JJ)V", (void *)android_media_MediaPlayer2_handleDataSourceUrl }, { "nativeHandleDataSourceFD", - "(ZJLjava/io/FileDescriptor;JJ)V", + "(ZJLjava/io/FileDescriptor;JJJJ)V", (void *)android_media_MediaPlayer2_handleDataSourceFD }, { "nativeHandleDataSourceCallback", - "(ZJLandroid/media/Media2DataSource;)V", + "(ZJLandroid/media/Media2DataSource;JJ)V", (void *)android_media_MediaPlayer2_handleDataSourceCallback }, {"nativePlayNextDataSource", "(J)V", (void *)android_media_MediaPlayer2_playNextDataSource}, |