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

Commit f03606d9 authored by Dongwon Kang's avatar Dongwon Kang
Browse files

Move MediaBufferXXX from foundation to libmediaextractor

Removed MediaBufferBase in favor of MediaBufferHolder
which contains a MediaBuffer inside. Instead of set/getMediaBufferBase,
now it set/finds MediaBufferHolder in ABuffer->meta().

Test: build. pass MediaPlayerDrmTest and EncodeDecodeTest.
Bug: 67908542
Change-Id: Icb4f7ac350a7876f5e4596bae8be2a9e95956c2f
parent ae73ce1d
Loading
Loading
Loading
Loading
+1 −17
Original line number Diff line number Diff line
@@ -21,15 +21,13 @@
#include <media/MediaCodecBuffer.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/foundation/MediaBufferBase.h>

namespace android {

MediaCodecBuffer::MediaCodecBuffer(const sp<AMessage> &format, const sp<ABuffer> &buffer)
    : mMeta(new AMessage),
      mFormat(format),
      mBuffer(buffer),
      mMediaBufferBase(nullptr) {
      mBuffer(buffer) {
}

// ABuffer-like interface
@@ -58,20 +56,6 @@ status_t MediaCodecBuffer::setRange(size_t offset, size_t size) {
    return OK;
}

MediaBufferBase *MediaCodecBuffer::getMediaBufferBase() {
    if (mMediaBufferBase != NULL) {
        mMediaBufferBase->add_ref();
    }
    return mMediaBufferBase;
}

void MediaCodecBuffer::setMediaBufferBase(MediaBufferBase *mediaBuffer) {
    if (mMediaBufferBase != NULL) {
        mMediaBufferBase->release();
    }
    mMediaBufferBase = mediaBuffer;
}

sp<AMessage> MediaCodecBuffer::meta() {
    return mMeta;
}
+48 −0
Original line number Diff line number Diff line
/*
 * Copyright 2014 The Android Open Source Project
 * Copyright 2018, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -14,27 +14,35 @@
 * limitations under the License.
 */

#ifndef MEDIA_BUFFER_BASE_H_
#ifndef MEDIA_BUFFER_HOLDER_H_

#define MEDIA_BUFFER_BASE_H_
#define MEDIA_BUFFER_HOLDER_H_

#include <media/stagefright/MediaBuffer.h>
#include <utils/RefBase.h>

namespace android {

class MediaBufferBase {
public:
    MediaBufferBase() {}
struct MediaBufferHolder : public RefBase {
    MediaBufferHolder(MediaBuffer* buffer)
        : mMediaBuffer(buffer) {
        if (mMediaBuffer != nullptr) {
            mMediaBuffer->add_ref();
        }
    }

    virtual void release() = 0;
    virtual void add_ref() = 0;
    virtual ~MediaBufferHolder() {
        if (mMediaBuffer != nullptr) {
            mMediaBuffer->release();
        }
    }

protected:
    virtual ~MediaBufferBase() {}
    MediaBuffer* mediaBuffer() { return mMediaBuffer; }

private:
    MediaBufferBase(const MediaBufferBase &);
    MediaBufferBase &operator=(const MediaBufferBase &);
    MediaBuffer* const mMediaBuffer;
};

}  // namespace android
}  // android

#endif  // MEDIA_BUFFER_BASE_H_
#endif  // MEDIA_BUFFER_HOLDER_H_
+0 −4
Original line number Diff line number Diff line
@@ -50,9 +50,6 @@ public:
    size_t offset() const;
    // Default implementation calls ABuffer::setRange() and returns OK.
    virtual status_t setRange(size_t offset, size_t size);
    // TODO: These can be removed if we finish replacing all MediaBuffer's.
    MediaBufferBase *getMediaBufferBase();
    void setMediaBufferBase(MediaBufferBase *mediaBuffer);

    // TODO: Specify each field for meta/format.
    sp<AMessage> meta();
@@ -66,7 +63,6 @@ private:
    const sp<AMessage> mMeta;
    sp<AMessage> mFormat;
    const sp<ABuffer> mBuffer;
    MediaBufferBase *mMediaBufferBase;
};

}  // namespace android
+2 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <media/DataSource.h>
#include <media/MediaBufferHolder.h>
#include <media/IMediaExtractorService.h>
#include <media/MediaHTTPService.h>
#include <media/MediaExtractor.h>
@@ -1167,8 +1168,7 @@ sp<ABuffer> NuPlayer2::GenericSource::mediaBufferToABuffer(

        // data is already provided in the buffer
        ab = new ABuffer(NULL, mb->range_length());
        mb->add_ref();
        ab->setMediaBufferBase(mb);
        ab->meta()->setObject("mediaBufferHolder", new MediaBufferHolder(mb));

        // Modular DRM: Required b/c of the above add_ref.
        // If ref>0, there must be an observer, or it'll crash at release().
+6 −4
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include "NuPlayer2Source.h"

#include <cutils/properties.h>
#include <media/MediaBufferHolder.h>
#include <media/MediaCodecBuffer.h>
#include <media/NdkMediaCodec.h>
#include <media/NdkWrapper.h>
@@ -1081,16 +1082,17 @@ bool NuPlayer2::Decoder::onInputBufferFetched(const sp<AMessage> &msg) {
                memcpy(codecBuffer->data(), buffer->data(), buffer->size());
            } else { // No buffer->data()
                //Modular DRM
                mediaBuf = (MediaBuffer*)buffer->getMediaBufferBase();
                sp<RefBase> holder;
                if (buffer->meta()->findObject("mediaBufferHolder", &holder)) {
                    mediaBuf = (holder != nullptr) ?
                        static_cast<MediaBufferHolder*>(holder.get())->mediaBuffer() : nullptr;
                }
                if (mediaBuf != NULL) {
                    codecBuffer->setRange(0, mediaBuf->size());
                    memcpy(codecBuffer->data(), mediaBuf->data(), mediaBuf->size());

                    sp<MetaData> meta_data = mediaBuf->meta_data();
                    cryptInfo = AMediaCodecCryptoInfoWrapper::Create(meta_data);

                    // since getMediaBuffer() has incremented the refCount
                    mediaBuf->release();
                } else { // No mediaBuf
                    ALOGE("onInputBufferFetched: buffer->data()/mediaBuf are NULL for %p",
                            buffer.get());
Loading