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

Commit 149df9f0 authored by Andy Hung's avatar Andy Hung Committed by android-build-merger
Browse files

MediaBuffer: Only use shared memory for processes that export MediaBuffers am: cfa86b5e

am: fde5258b

Change-Id: I63edca0af5b025d650e9409045aa3b691555a21e
parents e3fd0d0c fde5258b
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -108,6 +108,14 @@ public:
        return reinterpret_cast<SharedControl *>(memory->pointer())->isDeadObject();
        return reinterpret_cast<SharedControl *>(memory->pointer())->isDeadObject();
    }
    }


    // Sticky on enabling of shared memory MediaBuffers. By default we don't use
    // shared memory for MediaBuffers, but we enable this for those processes
    // that export MediaBuffers.
    static void useSharedMemory() {
        std::atomic_store_explicit(
                &mUseSharedMemory, (int_least32_t)1, std::memory_order_seq_cst);
    }

protected:
protected:
    // MediaBuffer remote releases are handled through a
    // MediaBuffer remote releases are handled through a
    // pending release count variable stored in a SharedControl block
    // pending release count variable stored in a SharedControl block
@@ -161,6 +169,8 @@ private:


    MediaBuffer *mOriginal;
    MediaBuffer *mOriginal;


    static std::atomic_int_least32_t mUseSharedMemory;

    MediaBuffer(const MediaBuffer &);
    MediaBuffer(const MediaBuffer &);
    MediaBuffer &operator=(const MediaBuffer &);
    MediaBuffer &operator=(const MediaBuffer &);


+3 −0
Original line number Original line Diff line number Diff line
@@ -71,6 +71,9 @@ status_t BnMediaExtractorService::onTransact(
                ALOGE("Error reading source from parcel");
                ALOGE("Error reading source from parcel");
                return ret;
                return ret;
            }
            }
            // If we make an extractor through Binder, enabled shared memory
            // for MediaBuffers for this process.
            MediaBuffer::useSharedMemory();
            sp<IDataSource> source = interface_cast<IDataSource>(b);
            sp<IDataSource> source = interface_cast<IDataSource>(b);
            const char *mime = data.readCString();
            const char *mime = data.readCString();
            sp<IMediaExtractor> ex = makeExtractor(source, mime);
            sp<IMediaExtractor> ex = makeExtractor(source, mime);
+5 −1
Original line number Original line Diff line number Diff line
@@ -30,6 +30,9 @@


namespace android {
namespace android {


/* static */
std::atomic_int_least32_t MediaBuffer::mUseSharedMemory(0);

MediaBuffer::MediaBuffer(void *data, size_t size)
MediaBuffer::MediaBuffer(void *data, size_t size)
    : mObserver(NULL),
    : mObserver(NULL),
      mRefCount(0),
      mRefCount(0),
@@ -52,7 +55,8 @@ MediaBuffer::MediaBuffer(size_t size)
      mOwnsData(true),
      mOwnsData(true),
      mMetaData(new MetaData),
      mMetaData(new MetaData),
      mOriginal(NULL) {
      mOriginal(NULL) {
    if (size < kSharedMemThreshold) {
    if (size < kSharedMemThreshold
            || std::atomic_load_explicit(&mUseSharedMemory, std::memory_order_seq_cst) == 0) {
        mData = malloc(size);
        mData = malloc(size);
    } else {
    } else {
        ALOGV("creating memoryDealer");
        ALOGV("creating memoryDealer");