summaryrefslogtreecommitdiffstats
path: root/media/jni
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2015-07-01 16:35:49 -0700
committerLajos Molnar <lajos@google.com>2015-07-16 17:09:20 -0700
commitd08debcf42d820fa8ef9916077a7bfc0a36f2db5 (patch)
tree4923d9a9db4571a465e7b7b678b621c247b973cb /media/jni
parent6f561a24c97d25a858cf98eef5c502ef8d80cfc1 (diff)
downloadframeworks_base-d08debcf42d820fa8ef9916077a7bfc0a36f2db5.zip
frameworks_base-d08debcf42d820fa8ef9916077a7bfc0a36f2db5.tar.gz
frameworks_base-d08debcf42d820fa8ef9916077a7bfc0a36f2db5.tar.bz2
MediaSync: fix flush handling and deadlock
- clear pending video frames - flush audio track - reset clock - restart audio track after flush - don't hold lock during callback Bug: 22234976 Change-Id: I681df950b67d7f9f77a9c5783279f1c8c91be856
Diffstat (limited to 'media/jni')
-rw-r--r--media/jni/android_media_MediaSync.cpp16
-rw-r--r--media/jni/android_media_MediaSync.h2
2 files changed, 18 insertions, 0 deletions
diff --git a/media/jni/android_media_MediaSync.cpp b/media/jni/android_media_MediaSync.cpp
index 8e0ed64..893c414 100644
--- a/media/jni/android_media_MediaSync.cpp
+++ b/media/jni/android_media_MediaSync.cpp
@@ -102,6 +102,10 @@ float JMediaSync::getVideoFrameRate() {
return mSync->getVideoFrameRate();
}
+void JMediaSync::flush() {
+ mSync->flush();
+}
+
status_t JMediaSync::updateQueuedAudioData(
int sizeInBytes, int64_t presentationTimeUs) {
return mSync->updateQueuedAudioData(sizeInBytes, presentationTimeUs);
@@ -464,6 +468,16 @@ static jobject android_media_MediaSync_getSyncParams(JNIEnv *env, jobject thiz)
return scs.asJobject(env, gSyncParamsFields);
}
+static void android_media_MediaSync_native_flush(JNIEnv *env, jobject thiz) {
+ sp<JMediaSync> sync = getMediaSync(env, thiz);
+ if (sync == NULL) {
+ throwExceptionAsNecessary(env, INVALID_OPERATION);
+ return;
+ }
+
+ sync->flush();
+}
+
static void android_media_MediaSync_native_init(JNIEnv *env) {
ScopedLocalRef<jclass> clazz(env, env->FindClass("android/media/MediaSync"));
CHECK(clazz.get() != NULL);
@@ -524,6 +538,8 @@ static JNINativeMethod gMethods[] = {
"()J",
(void *)android_media_MediaSync_native_getPlayTimeForPendingAudioFrames },
+ { "native_flush", "()V", (void *)android_media_MediaSync_native_flush },
+
{ "native_init", "()V", (void *)android_media_MediaSync_native_init },
{ "native_setup", "()V", (void *)android_media_MediaSync_native_setup },
diff --git a/media/jni/android_media_MediaSync.h b/media/jni/android_media_MediaSync.h
index 22c77c7..6f80885 100644
--- a/media/jni/android_media_MediaSync.h
+++ b/media/jni/android_media_MediaSync.h
@@ -49,6 +49,8 @@ struct JMediaSync : public RefBase {
status_t setVideoFrameRateHint(float rate);
float getVideoFrameRate();
+ void flush();
+
sp<const MediaClock> getMediaClock();
protected: