Loading media/libmedia/MediaCodecBuffer.cpp +1 −17 Original line number Original line Diff line number Diff line Loading @@ -21,15 +21,13 @@ #include <media/MediaCodecBuffer.h> #include <media/MediaCodecBuffer.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/foundation/MediaBufferBase.h> namespace android { namespace android { MediaCodecBuffer::MediaCodecBuffer(const sp<AMessage> &format, const sp<ABuffer> &buffer) MediaCodecBuffer::MediaCodecBuffer(const sp<AMessage> &format, const sp<ABuffer> &buffer) : mMeta(new AMessage), : mMeta(new AMessage), mFormat(format), mFormat(format), mBuffer(buffer), mBuffer(buffer) { mMediaBufferBase(nullptr) { } } // ABuffer-like interface // ABuffer-like interface Loading Loading @@ -58,20 +56,6 @@ status_t MediaCodecBuffer::setRange(size_t offset, size_t size) { return OK; 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() { sp<AMessage> MediaCodecBuffer::meta() { return mMeta; return mMeta; } } Loading media/libstagefright/foundation/include/media/stagefright/foundation/MediaBufferBase.h→media/libmedia/include/media/MediaBufferHolder.h +48 −0 Original line number Original line 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"); * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License. Loading @@ -14,27 +14,35 @@ * limitations under the License. * 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 { namespace android { class MediaBufferBase { struct MediaBufferHolder : public RefBase { public: MediaBufferHolder(MediaBuffer* buffer) MediaBufferBase() {} : mMediaBuffer(buffer) { if (mMediaBuffer != nullptr) { mMediaBuffer->add_ref(); } } virtual void release() = 0; virtual ~MediaBufferHolder() { virtual void add_ref() = 0; if (mMediaBuffer != nullptr) { mMediaBuffer->release(); } } protected: MediaBuffer* mediaBuffer() { return mMediaBuffer; } virtual ~MediaBufferBase() {} private: private: MediaBufferBase(const MediaBufferBase &); MediaBuffer* const mMediaBuffer; MediaBufferBase &operator=(const MediaBufferBase &); }; }; } // namespace android } // android #endif // MEDIA_BUFFER_BASE_H_ #endif // MEDIA_BUFFER_HOLDER_H_ media/libmedia/include/media/MediaCodecBuffer.h +0 −4 Original line number Original line Diff line number Diff line Loading @@ -50,9 +50,6 @@ public: size_t offset() const; size_t offset() const; // Default implementation calls ABuffer::setRange() and returns OK. // Default implementation calls ABuffer::setRange() and returns OK. virtual status_t setRange(size_t offset, size_t size); 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. // TODO: Specify each field for meta/format. sp<AMessage> meta(); sp<AMessage> meta(); Loading @@ -66,7 +63,6 @@ private: const sp<AMessage> mMeta; const sp<AMessage> mMeta; sp<AMessage> mFormat; sp<AMessage> mFormat; const sp<ABuffer> mBuffer; const sp<ABuffer> mBuffer; MediaBufferBase *mMediaBufferBase; }; }; } // namespace android } // namespace android Loading media/libmedia/nuplayer2/GenericSource.cpp +2 −2 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <binder/IServiceManager.h> #include <binder/IServiceManager.h> #include <cutils/properties.h> #include <cutils/properties.h> #include <media/DataSource.h> #include <media/DataSource.h> #include <media/MediaBufferHolder.h> #include <media/IMediaExtractorService.h> #include <media/IMediaExtractorService.h> #include <media/MediaHTTPService.h> #include <media/MediaHTTPService.h> #include <media/MediaExtractor.h> #include <media/MediaExtractor.h> Loading Loading @@ -1167,8 +1168,7 @@ sp<ABuffer> NuPlayer2::GenericSource::mediaBufferToABuffer( // data is already provided in the buffer // data is already provided in the buffer ab = new ABuffer(NULL, mb->range_length()); ab = new ABuffer(NULL, mb->range_length()); mb->add_ref(); ab->meta()->setObject("mediaBufferHolder", new MediaBufferHolder(mb)); ab->setMediaBufferBase(mb); // Modular DRM: Required b/c of the above add_ref. // Modular DRM: Required b/c of the above add_ref. // If ref>0, there must be an observer, or it'll crash at release(). // If ref>0, there must be an observer, or it'll crash at release(). Loading media/libmedia/nuplayer2/NuPlayer2Decoder.cpp +6 −4 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include "NuPlayer2Source.h" #include "NuPlayer2Source.h" #include <cutils/properties.h> #include <cutils/properties.h> #include <media/MediaBufferHolder.h> #include <media/MediaCodecBuffer.h> #include <media/MediaCodecBuffer.h> #include <media/NdkMediaCodec.h> #include <media/NdkMediaCodec.h> #include <media/NdkWrapper.h> #include <media/NdkWrapper.h> Loading Loading @@ -1081,16 +1082,17 @@ bool NuPlayer2::Decoder::onInputBufferFetched(const sp<AMessage> &msg) { memcpy(codecBuffer->data(), buffer->data(), buffer->size()); memcpy(codecBuffer->data(), buffer->data(), buffer->size()); } else { // No buffer->data() } else { // No buffer->data() //Modular DRM //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) { if (mediaBuf != NULL) { codecBuffer->setRange(0, mediaBuf->size()); codecBuffer->setRange(0, mediaBuf->size()); memcpy(codecBuffer->data(), mediaBuf->data(), mediaBuf->size()); memcpy(codecBuffer->data(), mediaBuf->data(), mediaBuf->size()); sp<MetaData> meta_data = mediaBuf->meta_data(); sp<MetaData> meta_data = mediaBuf->meta_data(); cryptInfo = AMediaCodecCryptoInfoWrapper::Create(meta_data); cryptInfo = AMediaCodecCryptoInfoWrapper::Create(meta_data); // since getMediaBuffer() has incremented the refCount mediaBuf->release(); } else { // No mediaBuf } else { // No mediaBuf ALOGE("onInputBufferFetched: buffer->data()/mediaBuf are NULL for %p", ALOGE("onInputBufferFetched: buffer->data()/mediaBuf are NULL for %p", buffer.get()); buffer.get()); Loading Loading
media/libmedia/MediaCodecBuffer.cpp +1 −17 Original line number Original line Diff line number Diff line Loading @@ -21,15 +21,13 @@ #include <media/MediaCodecBuffer.h> #include <media/MediaCodecBuffer.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/ABuffer.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/foundation/AMessage.h> #include <media/stagefright/foundation/MediaBufferBase.h> namespace android { namespace android { MediaCodecBuffer::MediaCodecBuffer(const sp<AMessage> &format, const sp<ABuffer> &buffer) MediaCodecBuffer::MediaCodecBuffer(const sp<AMessage> &format, const sp<ABuffer> &buffer) : mMeta(new AMessage), : mMeta(new AMessage), mFormat(format), mFormat(format), mBuffer(buffer), mBuffer(buffer) { mMediaBufferBase(nullptr) { } } // ABuffer-like interface // ABuffer-like interface Loading Loading @@ -58,20 +56,6 @@ status_t MediaCodecBuffer::setRange(size_t offset, size_t size) { return OK; 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() { sp<AMessage> MediaCodecBuffer::meta() { return mMeta; return mMeta; } } Loading
media/libstagefright/foundation/include/media/stagefright/foundation/MediaBufferBase.h→media/libmedia/include/media/MediaBufferHolder.h +48 −0 Original line number Original line 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"); * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License. Loading @@ -14,27 +14,35 @@ * limitations under the License. * 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 { namespace android { class MediaBufferBase { struct MediaBufferHolder : public RefBase { public: MediaBufferHolder(MediaBuffer* buffer) MediaBufferBase() {} : mMediaBuffer(buffer) { if (mMediaBuffer != nullptr) { mMediaBuffer->add_ref(); } } virtual void release() = 0; virtual ~MediaBufferHolder() { virtual void add_ref() = 0; if (mMediaBuffer != nullptr) { mMediaBuffer->release(); } } protected: MediaBuffer* mediaBuffer() { return mMediaBuffer; } virtual ~MediaBufferBase() {} private: private: MediaBufferBase(const MediaBufferBase &); MediaBuffer* const mMediaBuffer; MediaBufferBase &operator=(const MediaBufferBase &); }; }; } // namespace android } // android #endif // MEDIA_BUFFER_BASE_H_ #endif // MEDIA_BUFFER_HOLDER_H_
media/libmedia/include/media/MediaCodecBuffer.h +0 −4 Original line number Original line Diff line number Diff line Loading @@ -50,9 +50,6 @@ public: size_t offset() const; size_t offset() const; // Default implementation calls ABuffer::setRange() and returns OK. // Default implementation calls ABuffer::setRange() and returns OK. virtual status_t setRange(size_t offset, size_t size); 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. // TODO: Specify each field for meta/format. sp<AMessage> meta(); sp<AMessage> meta(); Loading @@ -66,7 +63,6 @@ private: const sp<AMessage> mMeta; const sp<AMessage> mMeta; sp<AMessage> mFormat; sp<AMessage> mFormat; const sp<ABuffer> mBuffer; const sp<ABuffer> mBuffer; MediaBufferBase *mMediaBufferBase; }; }; } // namespace android } // namespace android Loading
media/libmedia/nuplayer2/GenericSource.cpp +2 −2 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <binder/IServiceManager.h> #include <binder/IServiceManager.h> #include <cutils/properties.h> #include <cutils/properties.h> #include <media/DataSource.h> #include <media/DataSource.h> #include <media/MediaBufferHolder.h> #include <media/IMediaExtractorService.h> #include <media/IMediaExtractorService.h> #include <media/MediaHTTPService.h> #include <media/MediaHTTPService.h> #include <media/MediaExtractor.h> #include <media/MediaExtractor.h> Loading Loading @@ -1167,8 +1168,7 @@ sp<ABuffer> NuPlayer2::GenericSource::mediaBufferToABuffer( // data is already provided in the buffer // data is already provided in the buffer ab = new ABuffer(NULL, mb->range_length()); ab = new ABuffer(NULL, mb->range_length()); mb->add_ref(); ab->meta()->setObject("mediaBufferHolder", new MediaBufferHolder(mb)); ab->setMediaBufferBase(mb); // Modular DRM: Required b/c of the above add_ref. // Modular DRM: Required b/c of the above add_ref. // If ref>0, there must be an observer, or it'll crash at release(). // If ref>0, there must be an observer, or it'll crash at release(). Loading
media/libmedia/nuplayer2/NuPlayer2Decoder.cpp +6 −4 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include "NuPlayer2Source.h" #include "NuPlayer2Source.h" #include <cutils/properties.h> #include <cutils/properties.h> #include <media/MediaBufferHolder.h> #include <media/MediaCodecBuffer.h> #include <media/MediaCodecBuffer.h> #include <media/NdkMediaCodec.h> #include <media/NdkMediaCodec.h> #include <media/NdkWrapper.h> #include <media/NdkWrapper.h> Loading Loading @@ -1081,16 +1082,17 @@ bool NuPlayer2::Decoder::onInputBufferFetched(const sp<AMessage> &msg) { memcpy(codecBuffer->data(), buffer->data(), buffer->size()); memcpy(codecBuffer->data(), buffer->data(), buffer->size()); } else { // No buffer->data() } else { // No buffer->data() //Modular DRM //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) { if (mediaBuf != NULL) { codecBuffer->setRange(0, mediaBuf->size()); codecBuffer->setRange(0, mediaBuf->size()); memcpy(codecBuffer->data(), mediaBuf->data(), mediaBuf->size()); memcpy(codecBuffer->data(), mediaBuf->data(), mediaBuf->size()); sp<MetaData> meta_data = mediaBuf->meta_data(); sp<MetaData> meta_data = mediaBuf->meta_data(); cryptInfo = AMediaCodecCryptoInfoWrapper::Create(meta_data); cryptInfo = AMediaCodecCryptoInfoWrapper::Create(meta_data); // since getMediaBuffer() has incremented the refCount mediaBuf->release(); } else { // No mediaBuf } else { // No mediaBuf ALOGE("onInputBufferFetched: buffer->data()/mediaBuf are NULL for %p", ALOGE("onInputBufferFetched: buffer->data()/mediaBuf are NULL for %p", buffer.get()); buffer.get()); Loading