C-ify MediaBuffer
Bug: 111407253
Test: CTS, manual
Change-Id: Id20094f23d9d0dc0ec23127bbedc62c6e29944bd
diff --git a/media/libmediaextractor/MediaBufferGroup.cpp b/media/libmediaextractor/MediaBufferGroup.cpp
index 62b83cc..4e6beca 100644
--- a/media/libmediaextractor/MediaBufferGroup.cpp
+++ b/media/libmediaextractor/MediaBufferGroup.cpp
@@ -44,12 +44,16 @@
};
MediaBufferGroup::MediaBufferGroup(size_t growthLimit)
- : mInternal(new InternalData()) {
+ : mWrapper(nullptr), mInternal(new InternalData()) {
mInternal->mGrowthLimit = growthLimit;
}
MediaBufferGroup::MediaBufferGroup(size_t buffers, size_t buffer_size, size_t growthLimit)
- : mInternal(new InternalData()) {
+ : mWrapper(nullptr), mInternal(new InternalData()) {
+ init(buffers, buffer_size, growthLimit);
+}
+
+void MediaBufferGroup::init(size_t buffers, size_t buffer_size, size_t growthLimit) {
mInternal->mGrowthLimit = growthLimit;
if (mInternal->mGrowthLimit > 0 && buffers > mInternal->mGrowthLimit) {
diff --git a/media/libmediaextractor/include/media/DataSource.h b/media/libmediaextractor/include/media/DataSource.h
index cb96ff5..1f7a473 100644
--- a/media/libmediaextractor/include/media/DataSource.h
+++ b/media/libmediaextractor/include/media/DataSource.h
@@ -22,7 +22,7 @@
#include <media/stagefright/MediaErrors.h>
#include <media/DataSourceBase.h>
#include <media/IDataSource.h>
-#include <media/MediaExtractorPluginHelper.h>
+#include <media/MediaExtractorPluginApi.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
#include <utils/threads.h>
diff --git a/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h b/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h
index 6c8d94a..d67ddbd 100644
--- a/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h
+++ b/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h
@@ -18,6 +18,10 @@
#define MEDIA_BUFFER_BASE_H_
+#include <media/MediaExtractorPluginApi.h>
+#include <media/stagefright/foundation/AMessage.h>
+#include <media/NdkMediaFormatPriv.h>
+
namespace android {
class MediaBufferBase;
@@ -77,6 +81,48 @@
virtual int remoteRefcount() const = 0;
virtual ~MediaBufferBase() {};
+
+ CMediaBufferV3 *wrap() {
+ if (mWrapper) {
+ return mWrapper;
+ }
+ mWrapper = new CMediaBufferV3;
+ mWrapper->handle = this;
+
+ mWrapper->release = [](void *handle) -> void {
+ ((MediaBufferBase*)handle)->release();
+ };
+
+ mWrapper->data = [](void *handle) -> void * {
+ return ((MediaBufferBase*)handle)->data();
+ };
+
+ mWrapper->size = [](void *handle) -> size_t {
+ return ((MediaBufferBase*)handle)->size();
+ };
+
+ mWrapper->set_range = [](void *handle, size_t offset, size_t length) -> void {
+ return ((MediaBufferBase*)handle)->set_range(offset, length);
+ };
+
+ mWrapper->meta_data = [](void *handle) -> AMediaFormat* {
+ if (((MediaBufferBase*)handle)->mFormat == nullptr) {
+ sp<AMessage> msg = new AMessage();
+ ((MediaBufferBase*)handle)->mFormat = AMediaFormat_fromMsg(&msg);
+ }
+ return ((MediaBufferBase*)handle)->mFormat;
+ };
+
+ return mWrapper;
+ }
+protected:
+ MediaBufferBase() {
+ mWrapper = nullptr;
+ mFormat = nullptr;
+ }
+private:
+ CMediaBufferV3 *mWrapper;
+ AMediaFormat *mFormat;
};
} // namespace android
diff --git a/media/libmediaextractor/include/media/stagefright/MediaBufferGroup.h b/media/libmediaextractor/include/media/stagefright/MediaBufferGroup.h
index 75d5df7..dc04556 100644
--- a/media/libmediaextractor/include/media/stagefright/MediaBufferGroup.h
+++ b/media/libmediaextractor/include/media/stagefright/MediaBufferGroup.h
@@ -20,6 +20,8 @@
#include <list>
+#include <media/MediaExtractorPluginApi.h>
+#include <media/NdkMediaErrorPriv.h>
#include <media/stagefright/MediaBufferBase.h>
#include <utils/Errors.h>
#include <utils/threads.h>
@@ -57,12 +59,54 @@
// If buffer is nullptr, have acquire_buffer() check for remote release.
virtual void signalBufferReturned(MediaBufferBase *buffer);
+ CMediaBufferGroupV3 *wrap() {
+ if (mWrapper) {
+ return mWrapper;
+ }
+
+ mWrapper = new CMediaBufferGroupV3;
+ mWrapper->handle = this;
+
+ mWrapper->add_buffer = [](void *handle, size_t size) -> void {
+ MediaBufferBase *buf = MediaBufferBase::Create(size);
+ ((MediaBufferGroup*)handle)->add_buffer(buf);
+ };
+
+ mWrapper->init = [](void *handle,
+ size_t buffers, size_t buffer_size, size_t growthLimit) -> bool {
+ ((MediaBufferGroup*)handle)->init(buffers, buffer_size, growthLimit);
+ // ((MediaBufferGroup*)handle)->mWrapper->init = nullptr; // enforce call-once
+ return true;
+ };
+
+ mWrapper->acquire_buffer = [](void *handle,
+ CMediaBufferV3 **buf, bool nonBlocking, size_t requestedSize) -> media_status_t {
+ MediaBufferBase *acquiredBuf = nullptr;
+ status_t err = ((MediaBufferGroup*)handle)->acquire_buffer(
+ &acquiredBuf, nonBlocking, requestedSize);
+ if (err == OK && acquiredBuf != nullptr) {
+ *buf = acquiredBuf->wrap();
+ } else {
+ *buf = nullptr;
+ }
+ return translate_error(err);
+ };
+
+ mWrapper->has_buffers = [](void *handle) -> bool {
+ return ((MediaBufferGroup*)handle)->has_buffers();
+ };
+
+ return mWrapper;
+ }
+
private:
+ CMediaBufferGroupV3 *mWrapper;
struct InternalData;
InternalData *mInternal;
MediaBufferGroup(const MediaBufferGroup &);
MediaBufferGroup &operator=(const MediaBufferGroup &);
+ void init(size_t buffers, size_t buffer_size, size_t growthLimit);
};
} // namespace android