Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc7431e7 authored by Andreas Huber's avatar Andreas Huber
Browse files

Make sure NuMediaExtractor is thread safe.

Change-Id: If261c4d87d5569a0d7cfd75afe311803a6ce0109
parent 0818e739
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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 @@ private:
        uint32_t mTrackFlags;  // bitmask of "TrackFlags"
    };

    mutable Mutex mLock;

    sp<DataSource> mDataSource;

    sp<MediaExtractor> mImpl;
+24 −0
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ NuMediaExtractor::~NuMediaExtractor() {

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(
}

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 @@ void NuMediaExtractor::updateDurationAndBitrate() {
}

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::getTrackFormat(
}

status_t NuMediaExtractor::selectTrack(size_t index) {
    Mutex::Autolock autoLock(mLock);

    if (mImpl == NULL) {
        return -EINVAL;
    }
@@ -438,6 +448,8 @@ ssize_t NuMediaExtractor::fetchTrackSamples(int64_t seekTimeUs) {
}

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::seekTo(int64_t timeUs) {
}

status_t NuMediaExtractor::advance() {
    Mutex::Autolock autoLock(mLock);

    ssize_t minIndex = fetchTrackSamples();

    if (minIndex < 0) {
@@ -464,6 +478,8 @@ status_t NuMediaExtractor::advance() {
}

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::readSampleData(const sp<ABuffer> &buffer) {
}

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::getSampleTrackIndex(size_t *trackIndex) {
}

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::getSampleTime(int64_t *sampleTimeUs) {
}

status_t NuMediaExtractor::getSampleMeta(sp<MetaData> *sampleMeta) {
    Mutex::Autolock autoLock(mLock);

    *sampleMeta = NULL;

    ssize_t minIndex = fetchTrackSamples();
@@ -566,6 +588,8 @@ bool NuMediaExtractor::getTotalBitrate(int64_t *bitrate) const {
// 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 =