Make sure NuMediaExtractor is thread safe.

Change-Id: If261c4d87d5569a0d7cfd75afe311803a6ce0109
diff --git a/include/media/stagefright/NuMediaExtractor.h b/include/media/stagefright/NuMediaExtractor.h
index d46ce36..e197134 100644
--- a/include/media/stagefright/NuMediaExtractor.h
+++ b/include/media/stagefright/NuMediaExtractor.h
@@ -22,6 +22,7 @@
 #include <utils/KeyedVector.h>
 #include <utils/RefBase.h>
 #include <utils/String8.h>
+#include <utils/threads.h>
 #include <utils/Vector.h>
 
 namespace android {
@@ -81,6 +82,8 @@
         uint32_t mTrackFlags;  // bitmask of "TrackFlags"
     };
 
+    mutable Mutex mLock;
+
     sp<DataSource> mDataSource;
 
     sp<MediaExtractor> mImpl;
diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp
index 123e510..5d218e4 100644
--- a/media/libstagefright/NuMediaExtractor.cpp
+++ b/media/libstagefright/NuMediaExtractor.cpp
@@ -59,6 +59,8 @@
 
 status_t NuMediaExtractor::setDataSource(
         const char *path, const KeyedVector<String8, String8> *headers) {
+    Mutex::Autolock autoLock(mLock);
+
     if (mImpl != NULL) {
         return -EINVAL;
     }
@@ -104,6 +106,8 @@
 }
 
 status_t NuMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) {
+    Mutex::Autolock autoLock(mLock);
+
     if (mImpl != NULL) {
         return -EINVAL;
     }
@@ -155,11 +159,15 @@
 }
 
 size_t NuMediaExtractor::countTracks() const {
+    Mutex::Autolock autoLock(mLock);
+
     return mImpl == NULL ? 0 : mImpl->countTracks();
 }
 
 status_t NuMediaExtractor::getTrackFormat(
         size_t index, sp<AMessage> *format) const {
+    Mutex::Autolock autoLock(mLock);
+
     *format = NULL;
 
     if (mImpl == NULL) {
@@ -335,6 +343,8 @@
 }
 
 status_t NuMediaExtractor::selectTrack(size_t index) {
+    Mutex::Autolock autoLock(mLock);
+
     if (mImpl == NULL) {
         return -EINVAL;
     }
@@ -438,6 +448,8 @@
 }
 
 status_t NuMediaExtractor::seekTo(int64_t timeUs) {
+    Mutex::Autolock autoLock(mLock);
+
     ssize_t minIndex = fetchTrackSamples(timeUs);
 
     if (minIndex < 0) {
@@ -448,6 +460,8 @@
 }
 
 status_t NuMediaExtractor::advance() {
+    Mutex::Autolock autoLock(mLock);
+
     ssize_t minIndex = fetchTrackSamples();
 
     if (minIndex < 0) {
@@ -464,6 +478,8 @@
 }
 
 status_t NuMediaExtractor::readSampleData(const sp<ABuffer> &buffer) {
+    Mutex::Autolock autoLock(mLock);
+
     ssize_t minIndex = fetchTrackSamples();
 
     if (minIndex < 0) {
@@ -508,6 +524,8 @@
 }
 
 status_t NuMediaExtractor::getSampleTrackIndex(size_t *trackIndex) {
+    Mutex::Autolock autoLock(mLock);
+
     ssize_t minIndex = fetchTrackSamples();
 
     if (minIndex < 0) {
@@ -521,6 +539,8 @@
 }
 
 status_t NuMediaExtractor::getSampleTime(int64_t *sampleTimeUs) {
+    Mutex::Autolock autoLock(mLock);
+
     ssize_t minIndex = fetchTrackSamples();
 
     if (minIndex < 0) {
@@ -534,6 +554,8 @@
 }
 
 status_t NuMediaExtractor::getSampleMeta(sp<MetaData> *sampleMeta) {
+    Mutex::Autolock autoLock(mLock);
+
     *sampleMeta = NULL;
 
     ssize_t minIndex = fetchTrackSamples();
@@ -566,6 +588,8 @@
 // Returns true iff cached duration is available/applicable.
 bool NuMediaExtractor::getCachedDuration(
         int64_t *durationUs, bool *eos) const {
+    Mutex::Autolock autoLock(mLock);
+
     int64_t bitrate;
     if (mIsWidevineExtractor) {
         sp<WVMExtractor> wvmExtractor =