Add MediaBufferBase and use it in MediaSource and MediaBufferGroup.
MediaBuffer class exposes internal classes, ABuffer and IMemory, which
we don't want to expose to plugins. This change introduces
MediaBufferBase which does not expose any classes from system library.
Test: build and post-submit media cts tests
Bug: 67908556
Change-Id: Ic9ee239caf9b84b2b3740e2d533257afa25c8784
diff --git a/media/libmediaextractor/Android.bp b/media/libmediaextractor/Android.bp
index 8f4ba70..79af058 100644
--- a/media/libmediaextractor/Android.bp
+++ b/media/libmediaextractor/Android.bp
@@ -25,6 +25,7 @@
srcs: [
"DataSourceBase.cpp",
"MediaBuffer.cpp",
+ "MediaBufferBase.cpp",
"MediaBufferGroup.cpp",
"MediaSourceBase.cpp",
"MediaSource.cpp",
diff --git a/media/libmediaextractor/MediaBuffer.cpp b/media/libmediaextractor/MediaBuffer.cpp
index 28fc760..dac3d50 100644
--- a/media/libmediaextractor/MediaBuffer.cpp
+++ b/media/libmediaextractor/MediaBuffer.cpp
@@ -177,7 +177,7 @@
mObserver = observer;
}
-MediaBuffer *MediaBuffer::clone() {
+MediaBufferBase *MediaBuffer::clone() {
MediaBuffer *buffer = new MediaBuffer(mData, mSize);
buffer->set_range(mRangeOffset, mRangeLength);
buffer->mMetaData = new MetaData(*mMetaData.get());
diff --git a/media/libmediaextractor/MediaBufferBase.cpp b/media/libmediaextractor/MediaBufferBase.cpp
new file mode 100644
index 0000000..a553289
--- /dev/null
+++ b/media/libmediaextractor/MediaBufferBase.cpp
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "MediaBufferBase"
+#include <utils/Log.h>
+
+#include <media/stagefright/MediaBuffer.h>
+#include <media/stagefright/MediaBufferBase.h>
+
+namespace android {
+
+//static
+MediaBufferBase *MediaBufferBase::Create(size_t size) {
+ return new (std::nothrow) MediaBuffer(size);
+}
+
+} // android
diff --git a/media/libmediaextractor/MediaBufferGroup.cpp b/media/libmediaextractor/MediaBufferGroup.cpp
index 22f01a5..2a8dd41 100644
--- a/media/libmediaextractor/MediaBufferGroup.cpp
+++ b/media/libmediaextractor/MediaBufferGroup.cpp
@@ -40,7 +40,7 @@
Mutex mLock;
Condition mCondition;
size_t mGrowthLimit; // Do not automatically grow group larger than this.
- std::list<MediaBuffer *> mBuffers;
+ std::list<MediaBufferBase *> mBuffers;
};
MediaBufferGroup::MediaBufferGroup(size_t growthLimit)
@@ -94,7 +94,7 @@
}
MediaBufferGroup::~MediaBufferGroup() {
- for (MediaBuffer *buffer : mInternal->mBuffers) {
+ for (MediaBufferBase *buffer : mInternal->mBuffers) {
if (buffer->refcount() != 0) {
const int localRefcount = buffer->localRefcount();
const int remoteRefcount = buffer->remoteRefcount();
@@ -119,7 +119,7 @@
delete mInternal;
}
-void MediaBufferGroup::add_buffer(MediaBuffer *buffer) {
+void MediaBufferGroup::add_buffer(MediaBufferBase *buffer) {
Mutex::Autolock autoLock(mInternal->mLock);
// if we're above our growth limit, release buffers if we can
@@ -144,7 +144,7 @@
if (mInternal->mBuffers.size() < mInternal->mGrowthLimit) {
return true; // We can add more buffers internally.
}
- for (MediaBuffer *buffer : mInternal->mBuffers) {
+ for (MediaBufferBase *buffer : mInternal->mBuffers) {
if (buffer->refcount() == 0) {
return true;
}
@@ -153,11 +153,11 @@
}
status_t MediaBufferGroup::acquire_buffer(
- MediaBuffer **out, bool nonBlocking, size_t requestedSize) {
+ MediaBufferBase **out, bool nonBlocking, size_t requestedSize) {
Mutex::Autolock autoLock(mInternal->mLock);
for (;;) {
size_t smallest = requestedSize;
- MediaBuffer *buffer = nullptr;
+ MediaBufferBase *buffer = nullptr;
auto free = mInternal->mBuffers.end();
for (auto it = mInternal->mBuffers.begin(); it != mInternal->mBuffers.end(); ++it) {
if ((*it)->refcount() == 0) {
@@ -217,7 +217,7 @@
return mInternal->mBuffers.size();
}
-void MediaBufferGroup::signalBufferReturned(MediaBuffer *) {
+void MediaBufferGroup::signalBufferReturned(MediaBufferBase *) {
Mutex::Autolock autoLock(mInternal->mLock);
mInternal->mCondition.signal();
}
diff --git a/media/libmediaextractor/include/media/MediaSourceBase.h b/media/libmediaextractor/include/media/MediaSourceBase.h
index 9db6099..ab56613 100644
--- a/media/libmediaextractor/include/media/MediaSourceBase.h
+++ b/media/libmediaextractor/include/media/MediaSourceBase.h
@@ -30,7 +30,7 @@
namespace android {
-class MediaBuffer;
+class MediaBufferBase;
class SourceBaseAllocTracker {
public:
@@ -111,7 +111,7 @@
// MediaSource has changed mid-stream, the client can continue reading
// but should be prepared for buffers of the new configuration.
virtual status_t read(
- MediaBuffer **buffer, const ReadOptions *options = NULL) = 0;
+ MediaBufferBase **buffer, const ReadOptions *options = NULL) = 0;
// Causes this source to suspend pulling data from its upstream source
// until a subsequent read-with-seek. This is currently not supported
diff --git a/media/libmediaextractor/include/media/stagefright/MediaBuffer.h b/media/libmediaextractor/include/media/stagefright/MediaBuffer.h
index a8f8375..85b4521 100644
--- a/media/libmediaextractor/include/media/stagefright/MediaBuffer.h
+++ b/media/libmediaextractor/include/media/stagefright/MediaBuffer.h
@@ -26,6 +26,7 @@
#include <binder/MemoryDealer.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
+#include <media/stagefright/MediaBufferBase.h>
namespace android {
@@ -34,19 +35,7 @@
class MediaBufferObserver;
class MetaData;
-class MediaBufferObserver {
-public:
- MediaBufferObserver() {}
- virtual ~MediaBufferObserver() {}
-
- virtual void signalBufferReturned(MediaBuffer *buffer) = 0;
-
-private:
- MediaBufferObserver(const MediaBufferObserver &);
- MediaBufferObserver &operator=(const MediaBufferObserver &);
-};
-
-class MediaBuffer {
+class MediaBuffer : public MediaBufferBase {
public:
// allocations larger than or equal to this will use shared memory.
static const size_t kSharedMemThreshold = 64 * 1024;
@@ -70,42 +59,42 @@
//
// If no MediaBufferGroup is set, the local reference count must be zero
// when called, whereupon the MediaBuffer is deleted.
- void release();
+ virtual void release();
// Increments the local reference count.
// Use only when MediaBufferGroup is set.
- void add_ref();
+ virtual void add_ref();
- void *data() const;
- size_t size() const;
+ virtual void *data() const;
+ virtual size_t size() const;
- size_t range_offset() const;
- size_t range_length() const;
+ virtual size_t range_offset() const;
+ virtual size_t range_length() const;
- void set_range(size_t offset, size_t length);
+ virtual void set_range(size_t offset, size_t length);
- sp<MetaData> meta_data();
+ virtual sp<MetaData> meta_data();
// Clears meta data and resets the range to the full extent.
- void reset();
+ virtual void reset();
- void setObserver(MediaBufferObserver *group);
+ virtual void setObserver(MediaBufferObserver *group);
// Returns a clone of this MediaBuffer increasing its reference count.
// The clone references the same data but has its own range and
// MetaData.
- MediaBuffer *clone();
+ virtual MediaBufferBase *clone();
// sum of localRefcount() and remoteRefcount()
- int refcount() const {
+ virtual int refcount() const {
return localRefcount() + remoteRefcount();
}
- int localRefcount() const {
+ virtual int localRefcount() const {
return mRefCount;
}
- int remoteRefcount() const {
+ virtual int remoteRefcount() const {
if (mMemory.get() == nullptr || mMemory->pointer() == nullptr) return 0;
int32_t remoteRefcount =
reinterpret_cast<SharedControl *>(mMemory->pointer())->getRemoteRefcount();
diff --git a/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h b/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h
new file mode 100644
index 0000000..81dd7d9
--- /dev/null
+++ b/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2009 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MEDIA_BUFFER_BASE_H_
+
+#define MEDIA_BUFFER_BASE_H_
+
+#include <utils/RefBase.h>
+
+namespace android {
+
+class MediaBufferBase;
+class MetaData;
+
+class MediaBufferObserver {
+public:
+ MediaBufferObserver() {}
+ virtual ~MediaBufferObserver() {}
+
+ virtual void signalBufferReturned(MediaBufferBase *buffer) = 0;
+
+private:
+ MediaBufferObserver(const MediaBufferObserver &);
+ MediaBufferObserver &operator=(const MediaBufferObserver &);
+};
+
+class MediaBufferBase {
+public:
+ static MediaBufferBase *Create(size_t size);
+
+ // If MediaBufferGroup is set, decrement the local reference count;
+ // if the local reference count drops to 0, return the buffer to the
+ // associated MediaBufferGroup.
+ //
+ // If no MediaBufferGroup is set, the local reference count must be zero
+ // when called, whereupon the MediaBuffer is deleted.
+ virtual void release() = 0;
+
+ // Increments the local reference count.
+ // Use only when MediaBufferGroup is set.
+ virtual void add_ref() = 0;
+
+ virtual void *data() const = 0;
+ virtual size_t size() const = 0;
+
+ virtual size_t range_offset() const = 0;
+ virtual size_t range_length() const = 0;
+
+ virtual void set_range(size_t offset, size_t length) = 0;
+
+ virtual sp<MetaData> meta_data() = 0;
+
+ // Clears meta data and resets the range to the full extent.
+ virtual void reset() = 0;
+
+ virtual void setObserver(MediaBufferObserver *group) = 0;
+
+ // Returns a clone of this MediaBufferBase increasing its reference
+ // count. The clone references the same data but has its own range and
+ // MetaData.
+ virtual MediaBufferBase *clone() = 0;
+
+ virtual int refcount() const = 0;
+
+ virtual int localRefcount() const = 0;
+ virtual int remoteRefcount() const = 0;
+
+ virtual ~MediaBufferBase() {};
+};
+
+} // namespace android
+
+#endif // MEDIA_BUFFER_BASE_H_
diff --git a/media/libmediaextractor/include/media/stagefright/MediaBufferGroup.h b/media/libmediaextractor/include/media/stagefright/MediaBufferGroup.h
index 63d0a18..75d5df7 100644
--- a/media/libmediaextractor/include/media/stagefright/MediaBufferGroup.h
+++ b/media/libmediaextractor/include/media/stagefright/MediaBufferGroup.h
@@ -18,11 +18,15 @@
#define MEDIA_BUFFER_GROUP_H_
-#include <media/stagefright/MediaBuffer.h>
+#include <list>
+
+#include <media/stagefright/MediaBufferBase.h>
+#include <utils/Errors.h>
+#include <utils/threads.h>
namespace android {
-class MediaBuffer;
+class MediaBufferBase;
class MediaBufferGroup : public MediaBufferObserver {
public:
@@ -33,7 +37,7 @@
~MediaBufferGroup();
- void add_buffer(MediaBuffer *buffer);
+ void add_buffer(MediaBufferBase *buffer);
bool has_buffers();
@@ -46,16 +50,14 @@
// If requestedSize is > 0, the returned MediaBuffer should have buffer
// size of at least requstedSize.
status_t acquire_buffer(
- MediaBuffer **buffer, bool nonBlocking = false, size_t requestedSize = 0);
+ MediaBufferBase **buffer, bool nonBlocking = false, size_t requestedSize = 0);
size_t buffers() const;
// If buffer is nullptr, have acquire_buffer() check for remote release.
- virtual void signalBufferReturned(MediaBuffer *buffer);
+ virtual void signalBufferReturned(MediaBufferBase *buffer);
private:
- friend class MediaBuffer;
-
struct InternalData;
InternalData *mInternal;