Use local lock for most MediaMetadataRetriever methods. Bug 2560834.

MediaMetadataRetriever uses a single static lock for all operations.
This effectively serializes all metadata retrieval operations in a
single process. This patch uses the object level lock for all normal
operations and only uses the static lock to serialize calls to
release.

Change-Id: I81c9f234c2f0007a26d18e1398c709b41a4dbbd7
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index 3e9ba33..efea802 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -76,7 +76,6 @@
 static void android_media_MediaMetadataRetriever_setDataSource(JNIEnv *env, jobject thiz, jstring path)
 {
     LOGV("setDataSource");
-    Mutex::Autolock lock(sLock);
     MediaMetadataRetriever* retriever = getRetriever(env, thiz);
     if (retriever == 0) {
         jniThrowException(env, "java/lang/IllegalStateException", "No retriever available");
@@ -105,7 +104,6 @@
 static void android_media_MediaMetadataRetriever_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length)
 {
     LOGV("setDataSource");
-    Mutex::Autolock lock(sLock);
     MediaMetadataRetriever* retriever = getRetriever(env, thiz);
     if (retriever == 0) {
         jniThrowException(env, "java/lang/IllegalStateException", "No retriever available");
@@ -135,7 +133,6 @@
 static void android_media_MediaMetadataRetriever_setMode(JNIEnv *env, jobject thiz, jint mode)
 {
     LOGV("setMode");
-    Mutex::Autolock lock(sLock);
     MediaMetadataRetriever* retriever = getRetriever(env, thiz);
     if (retriever == 0) {
         jniThrowException(env, "java/lang/IllegalStateException", "No retriever available");
@@ -147,7 +144,6 @@
 static int android_media_MediaMetadataRetriever_getMode(JNIEnv *env, jobject thiz)
 {
     LOGV("getMode");
-    Mutex::Autolock lock(sLock);
     MediaMetadataRetriever* retriever = getRetriever(env, thiz);
     if (retriever == 0) {
         jniThrowException(env, "java/lang/IllegalStateException", "No retriever available");
@@ -161,7 +157,6 @@
 static jobject android_media_MediaMetadataRetriever_captureFrame(JNIEnv *env, jobject thiz)
 {
     LOGV("captureFrame");
-    Mutex::Autolock lock(sLock);
     MediaMetadataRetriever* retriever = getRetriever(env, thiz);
     if (retriever == 0) {
         jniThrowException(env, "java/lang/IllegalStateException", "No retriever available");
@@ -202,7 +197,6 @@
 static jbyteArray android_media_MediaMetadataRetriever_extractAlbumArt(JNIEnv *env, jobject thiz)
 {
     LOGV("extractAlbumArt");
-    Mutex::Autolock lock(sLock);
     MediaMetadataRetriever* retriever = getRetriever(env, thiz);
     if (retriever == 0) {
         jniThrowException(env, "java/lang/IllegalStateException", "No retriever available");
@@ -238,7 +232,6 @@
 static jobject android_media_MediaMetadataRetriever_extractMetadata(JNIEnv *env, jobject thiz, jint keyCode)
 {
     LOGV("extractMetadata");
-    Mutex::Autolock lock(sLock);
     MediaMetadataRetriever* retriever = getRetriever(env, thiz);
     if (retriever == 0) {
         jniThrowException(env, "java/lang/IllegalStateException", "No retriever available");
diff --git a/media/libmedia/mediametadataretriever.cpp b/media/libmedia/mediametadataretriever.cpp
index d34a8ed..e2712ba 100644
--- a/media/libmedia/mediametadataretriever.cpp
+++ b/media/libmedia/mediametadataretriever.cpp
@@ -95,6 +95,7 @@
 status_t MediaMetadataRetriever::setDataSource(const char* srcUrl)
 {
     LOGV("setDataSource");
+    Mutex::Autolock _l(mLock);
     if (mRetriever == 0) {
         LOGE("retriever is not initialized");
         return INVALID_OPERATION;
@@ -110,6 +111,7 @@
 status_t MediaMetadataRetriever::setDataSource(int fd, int64_t offset, int64_t length)
 {
     LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
+    Mutex::Autolock _l(mLock);
     if (mRetriever == 0) {
         LOGE("retriever is not initialized");
         return INVALID_OPERATION;
@@ -124,6 +126,7 @@
 status_t MediaMetadataRetriever::setMode(int mode)
 {
     LOGV("setMode(%d)", mode);
+    Mutex::Autolock _l(mLock);
     if (mRetriever == 0) {
         LOGE("retriever is not initialized");
         return INVALID_OPERATION;
@@ -134,6 +137,7 @@
 status_t MediaMetadataRetriever::getMode(int* mode)
 {
     LOGV("getMode");
+    Mutex::Autolock _l(mLock);
     if (mRetriever == 0) {
         LOGE("retriever is not initialized");
         return INVALID_OPERATION;
@@ -144,6 +148,7 @@
 sp<IMemory> MediaMetadataRetriever::captureFrame()
 {
     LOGV("captureFrame");
+    Mutex::Autolock _l(mLock);
     if (mRetriever == 0) {
         LOGE("retriever is not initialized");
         return NULL;
@@ -154,6 +159,7 @@
 const char* MediaMetadataRetriever::extractMetadata(int keyCode)
 {
     LOGV("extractMetadata(%d)", keyCode);
+    Mutex::Autolock _l(mLock);
     if (mRetriever == 0) {
         LOGE("retriever is not initialized");
         return NULL;
@@ -164,6 +170,7 @@
 sp<IMemory> MediaMetadataRetriever::extractAlbumArt()
 {
     LOGV("extractAlbumArt");
+    Mutex::Autolock _l(mLock);
     if (mRetriever == 0) {
         LOGE("retriever is not initialized");
         return NULL;